Commit 31125c58 by Ashutosh Mestry

ATLAS-4024: Export Service: Export of terms.

parent 9cdc31d5
...@@ -20,6 +20,7 @@ package org.apache.atlas.repository.impexp; ...@@ -20,6 +20,7 @@ package org.apache.atlas.repository.impexp;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import org.apache.atlas.RequestContext; import org.apache.atlas.RequestContext;
import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.glossary.GlossaryService;
import org.apache.atlas.model.impexp.AtlasExportRequest; import org.apache.atlas.model.impexp.AtlasExportRequest;
import org.apache.atlas.model.impexp.AtlasExportResult; import org.apache.atlas.model.impexp.AtlasExportResult;
import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasEntity;
...@@ -38,6 +39,7 @@ import org.apache.atlas.repository.util.UniqueList; ...@@ -38,6 +39,7 @@ import org.apache.atlas.repository.util.UniqueList;
import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.atlas.type.AtlasTypeRegistry;
import org.apache.atlas.util.AtlasGremlinQueryProvider; import org.apache.atlas.util.AtlasGremlinQueryProvider;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -65,14 +67,17 @@ public class ExportService { ...@@ -65,14 +67,17 @@ public class ExportService {
private final EntityGraphRetriever entityGraphRetriever; private final EntityGraphRetriever entityGraphRetriever;
private ExportTypeProcessor exportTypeProcessor; private ExportTypeProcessor exportTypeProcessor;
private final HdfsPathEntityCreator hdfsPathEntityCreator; private final HdfsPathEntityCreator hdfsPathEntityCreator;
private final GlossaryService glossaryService;
@Inject @Inject
public ExportService(final AtlasTypeRegistry typeRegistry, AtlasGraph graph, public ExportService(final AtlasTypeRegistry typeRegistry, AtlasGraph graph,
AuditsWriter auditsWriter, HdfsPathEntityCreator hdfsPathEntityCreator) { AuditsWriter auditsWriter, HdfsPathEntityCreator hdfsPathEntityCreator,
GlossaryService glossaryService) {
this.typeRegistry = typeRegistry; this.typeRegistry = typeRegistry;
this.entityGraphRetriever = new EntityGraphRetriever(graph, this.typeRegistry); this.entityGraphRetriever = new EntityGraphRetriever(graph, this.typeRegistry);
this.auditsWriter = auditsWriter; this.auditsWriter = auditsWriter;
this.hdfsPathEntityCreator = hdfsPathEntityCreator; this.hdfsPathEntityCreator = hdfsPathEntityCreator;
this.glossaryService = glossaryService;
this.startEntityFetchByExportRequest = new StartEntityFetchByExportRequest(graph, typeRegistry, AtlasGremlinQueryProvider.INSTANCE); this.startEntityFetchByExportRequest = new StartEntityFetchByExportRequest(graph, typeRegistry, AtlasGremlinQueryProvider.INSTANCE);
this.entitiesExtractor = new EntitiesExtractor(graph, typeRegistry); this.entitiesExtractor = new EntitiesExtractor(graph, typeRegistry);
} }
...@@ -84,7 +89,7 @@ public class ExportService { ...@@ -84,7 +89,7 @@ public class ExportService {
hostName, startTime, getCurrentChangeMarker()); hostName, startTime, getCurrentChangeMarker());
ExportContext context = new ExportContext(result, exportSink); ExportContext context = new ExportContext(result, exportSink);
exportTypeProcessor = new ExportTypeProcessor(typeRegistry); exportTypeProcessor = new ExportTypeProcessor(typeRegistry, glossaryService);
try { try {
LOG.info("==> export(user={}, from={})", userName, requestingIP); LOG.info("==> export(user={}, from={})", userName, requestingIP);
...@@ -264,8 +269,12 @@ public class ExportService { ...@@ -264,8 +269,12 @@ public class ExportService {
} }
public void processEntity(AtlasEntityWithExtInfo entityWithExtInfo, ExportContext context) throws AtlasBaseException { public void processEntity(AtlasEntityWithExtInfo entityWithExtInfo, ExportContext context) throws AtlasBaseException {
addEntity(entityWithExtInfo, context);
exportTypeProcessor.addTypes(entityWithExtInfo.getEntity(), context); exportTypeProcessor.addTypes(entityWithExtInfo.getEntity(), context);
if (MapUtils.isNotEmpty(context.termsGlossary)) {
addGlossaryEntities(context);
}
addEntity(entityWithExtInfo, context);
context.guidsProcessed.add(entityWithExtInfo.getEntity().getGuid()); context.guidsProcessed.add(entityWithExtInfo.getEntity().getGuid());
entitiesExtractor.get(entityWithExtInfo.getEntity(), context); entitiesExtractor.get(entityWithExtInfo.getEntity(), context);
...@@ -280,6 +289,28 @@ public class ExportService { ...@@ -280,6 +289,28 @@ public class ExportService {
} }
} }
private void addGlossaryEntities(ExportContext context) {
try {
for (String termGuid : context.termsGlossary.keySet()) {
try {
String glossaryGuid = context.termsGlossary.get(termGuid);
if (!context.sink.hasEntity(glossaryGuid)) {
AtlasEntity glossary = entityGraphRetriever.toAtlasEntity(glossaryGuid);
addEntity(new AtlasEntityWithExtInfo(glossary), context);
}
if (!context.sink.hasEntity(termGuid)) {
AtlasEntity term = entityGraphRetriever.toAtlasEntity(termGuid);
addEntity(new AtlasEntityWithExtInfo(term), context);
}
} catch (AtlasBaseException exception) {
LOG.error("Error fetching Glossary for term: {}", termGuid);
}
}
} finally {
context.clearTerms();
}
}
private void addEntity(AtlasEntityWithExtInfo entityWithExtInfo, ExportContext context) throws AtlasBaseException { private void addEntity(AtlasEntityWithExtInfo entityWithExtInfo, ExportContext context) throws AtlasBaseException {
if(context.sink.hasEntity(entityWithExtInfo.getEntity().getGuid())) { if(context.sink.hasEntity(entityWithExtInfo.getEntity().getGuid())) {
...@@ -355,6 +386,8 @@ public class ExportService { ...@@ -355,6 +386,8 @@ public class ExportService {
final Set<String> enumTypes = new HashSet<>(); final Set<String> enumTypes = new HashSet<>();
final Set<String> relationshipTypes = new HashSet<>(); final Set<String> relationshipTypes = new HashSet<>();
final Set<String> businessMetadataTypes = new HashSet<>(); final Set<String> businessMetadataTypes = new HashSet<>();
final Map<String, String> termsGlossary = new HashMap<>();
final AtlasExportResult result; final AtlasExportResult result;
private final ZipSink sink; private final ZipSink sink;
...@@ -471,5 +504,9 @@ public class ExportService { ...@@ -471,5 +504,9 @@ public class ExportService {
public void addToEntityCreationOrder(String guid) { public void addToEntityCreationOrder(String guid) {
entityCreationOrder.add(guid); entityCreationOrder.add(guid);
} }
public void clearTerms() {
termsGlossary.clear();
}
} }
} }
...@@ -19,9 +19,13 @@ ...@@ -19,9 +19,13 @@
package org.apache.atlas.repository.impexp; package org.apache.atlas.repository.impexp;
import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.glossary.GlossaryService;
import org.apache.atlas.model.TypeCategory; import org.apache.atlas.model.TypeCategory;
import org.apache.atlas.model.glossary.AtlasGlossaryTerm;
import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.AtlasClassification;
import org.apache.atlas.model.instance.AtlasEntity; import org.apache.atlas.model.instance.AtlasEntity;
import org.apache.atlas.model.instance.AtlasObjectId;
import org.apache.atlas.model.instance.AtlasRelatedObjectId;
import org.apache.atlas.model.typedef.AtlasStructDef; import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.type.AtlasArrayType; import org.apache.atlas.type.AtlasArrayType;
import org.apache.atlas.type.AtlasBusinessMetadataType; import org.apache.atlas.type.AtlasBusinessMetadataType;
...@@ -37,15 +41,21 @@ import org.apache.commons.collections.CollectionUtils; ...@@ -37,15 +41,21 @@ import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map; import java.util.Map;
class ExportTypeProcessor { class ExportTypeProcessor {
private static final Logger LOG = LoggerFactory.getLogger(ExportTypeProcessor.class); private static final Logger LOG = LoggerFactory.getLogger(ExportTypeProcessor.class);
private static final String RELATIONSHIP_ATTR_MEANINGS = "meanings";
private AtlasTypeRegistry typeRegistry; private AtlasTypeRegistry typeRegistry;
private GlossaryService glossaryService;
ExportTypeProcessor(AtlasTypeRegistry typeRegistry) { ExportTypeProcessor(AtlasTypeRegistry typeRegistry, GlossaryService glossaryService) {
this.typeRegistry = typeRegistry; this.typeRegistry = typeRegistry;
this.glossaryService = glossaryService;
} }
public void addTypes(AtlasEntity entity, ExportService.ExportContext context) { public void addTypes(AtlasEntity entity, ExportService.ExportContext context) {
...@@ -56,6 +66,34 @@ class ExportTypeProcessor { ...@@ -56,6 +66,34 @@ class ExportTypeProcessor {
addClassificationType(c.getTypeName(), context); addClassificationType(c.getTypeName(), context);
} }
} }
addTerms(entity, context);
}
private void addTerms(AtlasEntity entity, ExportService.ExportContext context) {
Object relAttrMeanings = entity.getRelationshipAttribute(RELATIONSHIP_ATTR_MEANINGS);
if (relAttrMeanings == null || !(relAttrMeanings instanceof List)) {
return;
}
List list = (List) relAttrMeanings;
if (CollectionUtils.isEmpty(list)) {
return;
}
for (Object objectId : list) {
if (objectId instanceof AtlasRelatedObjectId) {
AtlasRelatedObjectId termObjectId = (AtlasRelatedObjectId) objectId;
try {
AtlasGlossaryTerm term = glossaryService.getTerm(termObjectId.getGuid());
context.termsGlossary.put(termObjectId.getGuid(), term.getAnchor().getGlossaryGuid());
}
catch (AtlasBaseException e) {
LOG.warn("Error fetching term details: {}", termObjectId);
}
}
}
} }
private void addType(String typeName, ExportService.ExportContext context) { private void addType(String typeName, ExportService.ExportContext context) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment