blob: be89bd1b60b682b8a21c185dd317e30c4a8a1b57 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.atlas.examples.sampleapp;
import com.sun.jersey.core.util.MultivaluedMapImpl;
import org.apache.atlas.AtlasClientV2;
import org.apache.atlas.AtlasServiceException;
import org.apache.atlas.model.SearchFilter;
import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
import org.apache.atlas.model.typedef.AtlasBusinessMetadataDef;
import org.apache.atlas.model.typedef.AtlasClassificationDef;
import org.apache.atlas.model.typedef.AtlasEntityDef;
import org.apache.atlas.model.typedef.AtlasEnumDef;
import org.apache.atlas.model.typedef.AtlasRelationshipDef;
import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
import org.apache.atlas.model.typedef.AtlasTypesDef;
import org.apache.atlas.type.AtlasTypeUtil;
import javax.ws.rs.core.MultivaluedMap;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.apache.atlas.examples.sampleapp.SampleAppConstants.*;
import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.*;
import static org.apache.atlas.model.typedef.AtlasRelationshipDef.RelationshipCategory.AGGREGATION;
import static org.apache.atlas.model.typedef.AtlasRelationshipDef.RelationshipCategory.COMPOSITION;
import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality.SET;
import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE;
import static org.apache.atlas.type.AtlasTypeUtil.createBusinessMetadataDef;
import static org.apache.atlas.type.AtlasTypeUtil.createOptionalAttrDef;
import static org.apache.atlas.type.AtlasTypeUtil.createRelationshipEndDef;
import static org.apache.atlas.type.AtlasTypeUtil.createRelationshipTypeDef;
import static org.apache.atlas.type.AtlasTypeUtil.createTraitTypeDef;
public class TypeDefExample {
private static final String[] SAMPLE_APP_TYPES = {
SampleAppConstants.DATABASE_TYPE,
SampleAppConstants.TABLE_TYPE,
SampleAppConstants.COLUMN_TYPE,
SampleAppConstants.PROCESS_TYPE,
SampleAppConstants.PII_TAG,
SampleAppConstants.CLASSIFIED_TAG,
SampleAppConstants.FINANCE_TAG,
SampleAppConstants.METRIC_TAG
};
private final AtlasClientV2 client;
private AtlasTypesDef typesDef;
TypeDefExample(AtlasClientV2 client) {
this.client = client;
}
public void createTypeDefinitions() throws Exception {
AtlasEntityDef databaseDef = createDatabaseDef();
AtlasEntityDef tableDef = createTableDef();
AtlasEntityDef columnDef = createColumnDef();
AtlasEntityDef processDef = createProcessDef();
AtlasStructDef serDeDef = createSerDeDef();
AtlasEnumDef tableTypeDef = createTableTypeEnumDef();
List<AtlasClassificationDef> classificationDefs = createClassificationDefs();
List<AtlasBusinessMetadataDef> businessMetadataDef = createBusinessMetadataDefs();
List<AtlasRelationshipDef> relationshipDefs = createAtlasRelationshipDef();
AtlasTypesDef typesDef = new AtlasTypesDef(Collections.singletonList(tableTypeDef),
Collections.singletonList(serDeDef),
classificationDefs,
Arrays.asList(databaseDef, tableDef, columnDef, processDef),
relationshipDefs,
businessMetadataDef);
this.typesDef = batchCreateTypes(typesDef);
}
public void printTypeDefinitions() throws AtlasServiceException {
for (String typeName : SAMPLE_APP_TYPES) {
MultivaluedMap<String, String> searchParams = new MultivaluedMapImpl();
searchParams.add(SearchFilter.PARAM_NAME, typeName);
SearchFilter searchFilter = new SearchFilter(searchParams);
AtlasTypesDef typesDef = client.getAllTypeDefs(searchFilter);
assert (!typesDef.isEmpty());
SampleApp.log("Created type: " + typeName);
}
}
public void removeTypeDefinitions() throws AtlasServiceException {
if (typesDef != null) {
client.deleteAtlasTypeDefs(typesDef);
typesDef = null;
SampleApp.log("Deleted TypesDef successfully!");
}
}
private AtlasEntityDef createDatabaseDef() {
return AtlasTypeUtil.createClassTypeDef(SampleAppConstants.DATABASE_TYPE,
Collections.singleton(ENTITY_TYPE_DATASET),
AtlasTypeUtil.createOptionalAttrDef("locationUri", "string"),
AtlasTypeUtil.createOptionalAttrDef(ATTR_CREATE_TIME, "long"),
new AtlasAttributeDef(ATTR_RANDOM_TABLE,
AtlasBaseTypeDef.getArrayTypeName(SampleAppConstants.TABLE_TYPE),
true, AtlasAttributeDef.Cardinality.SET));
}
private AtlasEntityDef createTableDef() {
return AtlasTypeUtil.createClassTypeDef(SampleAppConstants.TABLE_TYPE,
Collections.singleton(ENTITY_TYPE_DATASET),
createOptionalAttrDef(ATTR_CREATE_TIME, "long"),
createOptionalAttrDef(ATTR_LAST_ACCESS_TIME, "date"),
createOptionalAttrDef(ATTR_TEMPORARY, "boolean"),
createOptionalAttrDef(ATTR_TABLE_TYPE, ENUM_TABLE_TYPE),
createOptionalAttrDef(ATTR_SERDE1, STRUCT_TYPE_SERDE),
createOptionalAttrDef(ATTR_SERDE2, STRUCT_TYPE_SERDE));
}
private AtlasEntityDef createColumnDef() {
return AtlasTypeUtil.createClassTypeDef(SampleAppConstants.COLUMN_TYPE,
Collections.singleton(ENTITY_TYPE_DATASET),
AtlasTypeUtil.createOptionalAttrDef(ATTR_DATA_TYPE, "string"),
AtlasTypeUtil.createOptionalAttrDef(ATTR_COMMENT, "string"));
}
private AtlasEntityDef createProcessDef() {
return AtlasTypeUtil.createClassTypeDef(SampleAppConstants.PROCESS_TYPE,
Collections.singleton(ENTITY_TYPE_PROCESS),
AtlasTypeUtil.createOptionalAttrDef(ATTR_USERNAME, "string"),
AtlasTypeUtil.createOptionalAttrDef(ATTR_START_TIME, "long"),
AtlasTypeUtil.createOptionalAttrDef(ATTR_END_TIME, "long"),
AtlasTypeUtil.createRequiredAttrDef(ATTR_QUERY_TEXT, "string"),
AtlasTypeUtil.createRequiredAttrDef(ATTR_QUERY_PLAN, "string"),
AtlasTypeUtil.createRequiredAttrDef(ATTR_QUERY_ID, "string"),
AtlasTypeUtil.createRequiredAttrDef(ATTR_QUERY_GRAPH, "string"));
}
private AtlasStructDef createSerDeDef() {
return AtlasTypeUtil.createStructTypeDef(SampleAppConstants.STRUCT_TYPE_SERDE,
AtlasTypeUtil.createRequiredAttrDef(SampleAppConstants.ATTR_NAME, "string"),
AtlasTypeUtil.createRequiredAttrDef(ATTR_SERDE, "string"));
}
private AtlasEnumDef createTableTypeEnumDef() {
return new AtlasEnumDef(SampleAppConstants.ENUM_TABLE_TYPE,
SampleAppConstants.ATTR_DESCRIPTION,
Arrays.asList(new AtlasEnumDef.AtlasEnumElementDef("MANAGED", null, 1),
new AtlasEnumDef.AtlasEnumElementDef("EXTERNAL", null, 2)));
}
private List<AtlasClassificationDef> createClassificationDefs() {
AtlasClassificationDef classification = createTraitTypeDef(SampleAppConstants.CLASSIFIED_TAG, Collections.<String>emptySet(), AtlasTypeUtil.createRequiredAttrDef("tag", "string"));
AtlasClassificationDef pii = createTraitTypeDef(SampleAppConstants.PII_TAG, Collections.<String>emptySet());
AtlasClassificationDef finance = createTraitTypeDef(SampleAppConstants.FINANCE_TAG, Collections.<String>emptySet());
AtlasClassificationDef metric = createTraitTypeDef(SampleAppConstants.METRIC_TAG, Collections.emptySet());
return Arrays.asList(classification, pii, finance, metric);
}
private List<AtlasBusinessMetadataDef> createBusinessMetadataDefs() {
String description = "description";
Map<String, String> options = new HashMap<>();
options.put("maxStrLength", "20");
options.put("applicableEntityTypes", "[\"" + SampleAppConstants.DATABASE_TYPE + "\",\"" + SampleAppConstants.TABLE_TYPE + "\"]");
AtlasBusinessMetadataDef bmWithAllTypes = createBusinessMetadataDef(SampleAppConstants.BUSINESS_METADATA_TYPE,
description,
"1.0",
createOptionalAttrDef(ATTR_ATTR1, ATLAS_TYPE_BOOLEAN, options, description),
createOptionalAttrDef(ATTR_ATTR2, ATLAS_TYPE_BYTE, options, description),
createOptionalAttrDef(ATTR_ATTR8, ATLAS_TYPE_STRING, options, description));
AtlasBusinessMetadataDef bmWithAllTypesMV = createBusinessMetadataDef(SampleAppConstants.BUSINESS_METADATA_TYPE_MV,
description,
"1.0",
createOptionalAttrDef(ATTR_ATTR11, "array<boolean>", options, description),
createOptionalAttrDef(ATTR_ATTR18, "array<string>", options, description));
return Arrays.asList(bmWithAllTypes, bmWithAllTypesMV);
}
private List<AtlasRelationshipDef> createAtlasRelationshipDef() {
AtlasRelationshipDef dbTablesDef = createRelationshipTypeDef(SampleAppConstants.TABLE_DATABASE_TYPE, SampleAppConstants.TABLE_DATABASE_TYPE,
"1.0", AGGREGATION, AtlasRelationshipDef.PropagateTags.NONE,
createRelationshipEndDef(SampleAppConstants.TABLE_TYPE, "db", SINGLE, false),
createRelationshipEndDef(SampleAppConstants.DATABASE_TYPE, "tables", SET, true));
AtlasRelationshipDef tableColumnsDef = createRelationshipTypeDef(SampleAppConstants.TABLE_COLUMNS_TYPE, SampleAppConstants.TABLE_COLUMNS_TYPE,
"1.0", COMPOSITION, AtlasRelationshipDef.PropagateTags.NONE,
createRelationshipEndDef(SampleAppConstants.TABLE_TYPE, "columns", SET, true),
createRelationshipEndDef(SampleAppConstants.COLUMN_TYPE, "table", SINGLE, false));
return Arrays.asList(dbTablesDef, tableColumnsDef);
}
private AtlasTypesDef batchCreateTypes(AtlasTypesDef typesDef) throws AtlasServiceException {
AtlasTypesDef typesToCreate = new AtlasTypesDef();
for (AtlasEnumDef enumDef : typesDef.getEnumDefs()) {
if (client.typeWithNameExists(enumDef.getName())) {
SampleApp.log(enumDef.getName() + ": type already exists. Skipping");
} else {
typesToCreate.getEnumDefs().add(enumDef);
}
}
for (AtlasStructDef structDef : typesDef.getStructDefs()) {
if (client.typeWithNameExists(structDef.getName())) {
SampleApp.log(structDef.getName() + ": type already exists. Skipping");
} else {
typesToCreate.getStructDefs().add(structDef);
}
}
for (AtlasEntityDef entityDef : typesDef.getEntityDefs()) {
if (client.typeWithNameExists(entityDef.getName())) {
SampleApp.log(entityDef.getName() + ": type already exists. Skipping");
} else {
typesToCreate.getEntityDefs().add(entityDef);
}
}
for (AtlasClassificationDef classificationDef : typesDef.getClassificationDefs()) {
if (client.typeWithNameExists(classificationDef.getName())) {
SampleApp.log(classificationDef.getName() + ": type already exists. Skipping");
} else {
typesToCreate.getClassificationDefs().add(classificationDef);
}
}
for (AtlasRelationshipDef relationshipDef : typesDef.getRelationshipDefs()) {
if (client.typeWithNameExists(relationshipDef.getName())) {
SampleApp.log(relationshipDef.getName() + ": type already exists. Skipping");
} else {
typesToCreate.getRelationshipDefs().add(relationshipDef);
}
}
for (AtlasBusinessMetadataDef businessMetadataDef : typesDef.getBusinessMetadataDefs()) {
if (client.typeWithNameExists(businessMetadataDef.getName())) {
SampleApp.log(businessMetadataDef.getName() + ": type already exists. Skipping");
} else {
typesToCreate.getBusinessMetadataDefs().add(businessMetadataDef);
}
}
return client.createAtlasTypeDefs(typesToCreate);
}
}