You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by da...@apache.org on 2018/02/16 09:52:27 UTC
[11/30] atlas git commit: ATLAS-2246: OMRS Connector API plus REST
and IGC Connector skeleton - 15th February 2018
http://git-wip-us.apache.org/repos/asf/atlas/blob/8a57e657/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSRepositoryConnector.java
----------------------------------------------------------------------
diff --git a/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSRepositoryConnector.java b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSRepositoryConnector.java
new file mode 100644
index 0000000..752a090
--- /dev/null
+++ b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSRepositoryConnector.java
@@ -0,0 +1,259 @@
+/*
+ * 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.omrs.localrepository.repositoryconnector;
+
+import org.apache.atlas.ocf.ffdc.ConnectorCheckedException;
+import org.apache.atlas.ocf.properties.Connection;
+import org.apache.atlas.omrs.eventmanagement.*;
+import org.apache.atlas.omrs.eventmanagement.events.OMRSInstanceEventProcessor;
+import org.apache.atlas.omrs.eventmanagement.events.OMRSTypeDefEventProcessor;
+import org.apache.atlas.omrs.eventmanagement.repositoryeventmapper.OMRSRepositoryEventMapper;
+import org.apache.atlas.omrs.localrepository.OMRSLocalRepository;
+import org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSRepositoryContentManager;
+import org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSTypeDefValidator;
+import org.apache.atlas.omrs.metadatacollection.OMRSMetadataCollection;
+import org.apache.atlas.omrs.metadatacollection.repositoryconnector.OMRSRepositoryConnector;
+
+
+/**
+ * LocalOMRSRepositoryConnector provides access the local metadata repository plus manages outbound
+ * repository events.
+ *
+ * It passes each request to both the real OMRS connector for the local metadata repository and an
+ * OMRSEventPublisher. The OMRSEventPublisher will use its configuration to decide if it needs to
+ * pass on the request to the rest of the metadata repository cohort.
+ */
+public class LocalOMRSRepositoryConnector extends OMRSRepositoryConnector implements OMRSLocalRepository
+{
+ private String localServerName = null;
+ private String localServerType = null;
+ private String localOrganizationName = null;
+ private OMRSRepositoryEventMapper repositoryEventMapper = null;
+ private OMRSRepositoryContentManager localTypeDefManager = null;
+ private OMRSInstanceEventProcessor incomingInstanceEventProcessor = null;
+ private OMRSRepositoryEventManager outboundRepositoryEventManager = null;
+ private OMRSRepositoryEventProcessor outboundRepositoryEventProcessor = null;
+
+ private String localMetadataCollectionId = null;
+ private LocalOMRSMetadataCollection metadataCollection = null;
+
+ private OMRSRepositoryConnector realLocalConnector = null;
+ private OMRSMetadataCollection realMetadataCollection = null;
+
+ /**
+ * Constructor used by the LocalOMRSConnectorProvider. It provides the information necessary to run the
+ * local repository.
+ *
+ * @param localServerName - name of the local server
+ * @param localServerType - type of the local server
+ * @param localOrganizationName - name of organization that owns the server
+ * @param realLocalConnector - connector to the local repository
+ * @param repositoryEventMapper - optional event mapper for local repository
+ * @param outboundRepositoryEventManager - event manager to call for outbound events.
+ * @param localTypeDefManager - localTypeDefManager for supporting OMRS in managing TypeDefs.
+ * @param saveExchangeRule - rule to determine what events to save to the local repository.
+ */
+ protected LocalOMRSRepositoryConnector(String localServerName,
+ String localServerType,
+ String localOrganizationName,
+ OMRSRepositoryConnector realLocalConnector,
+ OMRSRepositoryEventMapper repositoryEventMapper,
+ OMRSRepositoryEventManager outboundRepositoryEventManager,
+ OMRSRepositoryContentManager localTypeDefManager,
+ OMRSRepositoryEventExchangeRule saveExchangeRule)
+ {
+ this.localServerName = localServerName;
+ this.localServerType = localServerType;
+ this.localOrganizationName = localOrganizationName;
+
+ this.realLocalConnector = realLocalConnector;
+ this.realMetadataCollection = realLocalConnector.getMetadataCollection();
+ this.repositoryEventMapper = repositoryEventMapper;
+ this.outboundRepositoryEventManager = outboundRepositoryEventManager;
+
+ /*
+ * Incoming events are processed directly with real local connector to avoid the outbound event
+ * propagation managed by LocalOMRSMetadataCollection.
+ */
+ this.localTypeDefManager = localTypeDefManager;
+ if (localTypeDefManager != null)
+ {
+ localTypeDefManager.setupEventProcessor(this,
+ realLocalConnector,
+ saveExchangeRule,
+ outboundRepositoryEventManager);
+
+ }
+
+ this.incomingInstanceEventProcessor = new LocalOMRSInstanceEventProcessor(localMetadataCollectionId,
+ realLocalConnector,
+ localTypeDefManager,
+ saveExchangeRule);
+
+ /*
+ * The repositoryEventMapper is a plug-in component that handles repository events for
+ * repository that have additional APIs for managing metadata and need their own mechanism for
+ * sending OMRS Repository Events. If there is no repositoryEventMapper then the localOMRSMetadataCollection
+ * will send the outbound repository events.
+ */
+ if (repositoryEventMapper != null)
+ {
+ repositoryEventMapper.setRepositoryEventProcessor(outboundRepositoryEventManager);
+ }
+ else
+ {
+ /*
+ * When outboundRepositoryEventProcessor is not null then the local metadata collection creates events.
+ * Otherwise it assumes the event mapper will produce events.
+ */
+ this.outboundRepositoryEventProcessor = outboundRepositoryEventManager;
+ }
+ }
+
+
+ /**
+ * Free up any resources held since the connector is no longer needed.
+ *
+ * @throws ConnectorCheckedException - there is a problem disconnecting the connector.
+ */
+ public void disconnect() throws ConnectorCheckedException
+ {
+ if (realLocalConnector != null)
+ {
+ realLocalConnector.disconnect();
+ }
+ }
+
+
+ /*
+ * ==============================
+ * OMRSMetadataCollectionManager
+ */
+
+ /**
+ * Set up the unique Id for this metadata collection.
+ *
+ * @param metadataCollectionId - String unique Id
+ */
+ public void setMetadataCollectionId(String metadataCollectionId)
+ {
+ this.localMetadataCollectionId = metadataCollectionId;
+
+ /*
+ * Initialize the metadata collection only once the connector is properly set up.
+ */
+ metadataCollection = new LocalOMRSMetadataCollection(localMetadataCollectionId,
+ localServerName,
+ localServerType,
+ localOrganizationName,
+ realMetadataCollection,
+ outboundRepositoryEventProcessor,
+ localTypeDefManager);
+
+ }
+
+ /**
+ * Returns the metadata collection object that provides an OMRS abstraction of the metadata within
+ * a metadata repository.
+ *
+ * @return OMRSMetadataCollection - metadata information retrieved from the metadata repository.
+ */
+ public OMRSMetadataCollection getMetadataCollection()
+ {
+ if (metadataCollection == null)
+ {
+ // TODO Throw Error
+ }
+
+ return metadataCollection;
+ }
+
+ /*
+ * ====================================
+ * OMRSLocalRepository
+ */
+
+ /**
+ * Returns the unique identifier (guid) of the local repository's metadata collection.
+ *
+ * @return String guid
+ */
+ public String getMetadataCollectionId()
+ {
+ return localMetadataCollectionId;
+ }
+
+
+ /**
+ * Returns the Connection to the local repository that can be used by remote servers to create
+ * an OMRS repository connector to call this server in order to access the local repository.
+ *
+ * @return Connection object
+ */
+ public Connection getLocalRepositoryRemoteConnection()
+ {
+ return super.connection;
+ }
+
+
+ /**
+ * Return the TypeDefValidator. This is used to validate that a list of type definitions (TypeDefs) are
+ * compatible with the local repository.
+ *
+ * @return OMRSTypeDefValidator object for the local repository.
+ */
+ public OMRSTypeDefValidator getTypeDefValidator()
+ {
+ return localTypeDefManager;
+ }
+
+
+ /**
+ * Return the event manager that the local repository uses to distribute events from the local repository.
+ *
+ * @return outbound repository event manager
+ */
+ public OMRSRepositoryEventManager getOutboundRepositoryEventManager()
+ {
+ return outboundRepositoryEventManager;
+ }
+
+
+ /**
+ * Return the TypeDef event processor that should be passed all incoming TypeDef events received
+ * from the cohorts that this server is a member of.
+ *
+ * @return OMRSTypeDefEventProcessor for the local repository.
+ */
+ public OMRSTypeDefEventProcessor getIncomingTypeDefEventProcessor()
+ {
+ return localTypeDefManager;
+ }
+
+
+ /**
+ * Return the instance event processor that should be passed all incoming instance events received
+ * from the cohorts that this server is a member of.
+ *
+ * @return OMRSInstanceEventProcessor for the local repository.
+ */
+ public OMRSInstanceEventProcessor getIncomingInstanceEventProcessor()
+ {
+ return incomingInstanceEventProcessor;
+ }
+}
http://git-wip-us.apache.org/repos/asf/atlas/blob/8a57e657/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/OMRSInstanceRetrievalEventProcessor.java
----------------------------------------------------------------------
diff --git a/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/OMRSInstanceRetrievalEventProcessor.java b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/OMRSInstanceRetrievalEventProcessor.java
new file mode 100644
index 0000000..2518397
--- /dev/null
+++ b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/OMRSInstanceRetrievalEventProcessor.java
@@ -0,0 +1,78 @@
+/*
+ * 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.omrs.localrepository.repositoryconnector;
+
+import org.apache.atlas.omrs.metadatacollection.properties.instances.EntityDetail;
+import org.apache.atlas.omrs.metadatacollection.properties.instances.Relationship;
+
+import java.util.ArrayList;
+
+
+/**
+ * OMRSInstanceRetrievalEventProcessor defines the interface used by the Enterprise OMRS Repository Connector
+ * to pass instance metadata retrieved from remote open metadata repository connectors.
+ */
+public interface OMRSInstanceRetrievalEventProcessor
+{
+ /**
+ * Pass an entity that has been retrieved from a remote open metadata repository so it can be validated and
+ * (if the rules permit) cached in the local repository.
+ *
+ * @param metadataCollectionId - unique identifier for the metadata from the remote repository
+ * @param entity - the retrieved entity.
+ * @return Validated and processed entity.
+ */
+ EntityDetail processRetrievedEntity(String metadataCollectionId,
+ EntityDetail entity);
+
+
+ /**
+ * Pass a list of entities that have been retrieved from a remote open metadata repository so they can be
+ * validated and (if the rules permit) cached in the local repository.
+ *
+ * @param metadataCollectionId - unique identifier for the metadata from the remote repository
+ * @param entities - the retrieved relationships
+ * @return the validated and processed relationships
+ */
+ ArrayList<EntityDetail> processRetrievedEntities(String metadataCollectionId,
+ ArrayList<EntityDetail> entities);
+
+
+ /**
+ * Pass a relationship that has been retrieved from a remote open metadata repository so it can be validated and
+ * (if the rules permit) cached in the local repository.
+ *
+ * @param metadataCollectionId - unique identifier for the metadata from the remote repository
+ * @param relationship - the retrieved relationship
+ * @return the validated and processed relationship
+ */
+ Relationship processRetrievedRelationship(String metadataCollectionId,
+ Relationship relationship);
+
+
+ /**
+ * Pass a list of relationships that have been retrieved from a remote open metadata repository so they can be
+ * validated and (if the rules permit) cached in the local repository.
+ *
+ * @param metadataCollectionId - unique identifier for the metadata from the remote repository
+ * @param relationships - the list of retrieved relationships
+ * @return the validated and processed relationships
+ */
+ ArrayList<Relationship> processRetrievedRelationships(String metadataCollectionId,
+ ArrayList<Relationship> relationships);
+}
http://git-wip-us.apache.org/repos/asf/atlas/blob/8a57e657/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositorycontentmanager/OMRSInstanceHelper.java
----------------------------------------------------------------------
diff --git a/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositorycontentmanager/OMRSInstanceHelper.java b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositorycontentmanager/OMRSInstanceHelper.java
new file mode 100644
index 0000000..5478249
--- /dev/null
+++ b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositorycontentmanager/OMRSInstanceHelper.java
@@ -0,0 +1,149 @@
+/*
+ * 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.omrs.localrepository.repositorycontentmanager;
+
+
+import org.apache.atlas.omrs.ffdc.exception.TypeErrorException;
+import org.apache.atlas.omrs.metadatacollection.properties.instances.*;
+
+import java.util.ArrayList;
+
+
+/**
+ * OMRSInstanceHelper provides methods to help OMRS connectors and adapters ensure the content of
+ * entities and relationships match the type definitions recorded in the TypeDefs.
+ */
+public interface OMRSInstanceHelper
+{
+ /**
+ * Return an entity with the header and type information filled out. The caller only needs to add properties
+ * and classifications to complete the set up of the entity.
+ *
+ * @param sourceName - source of the request (used for logging)
+ * @param metadataCollectionId - unique identifier for the home metadata collection
+ * @param provenanceType - origin of the entity
+ * @param userName - name of the creator
+ * @param typeName - name of the type
+ * @return partially filled out entity - needs classifications and properties
+ * @throws TypeErrorException - the type name is not recognized.
+ */
+ EntityDetail getSkeletonEntity(String sourceName,
+ String metadataCollectionId,
+ InstanceProvenanceType provenanceType,
+ String userName,
+ String typeName) throws TypeErrorException;
+
+
+ /**
+ * Return a classification with the header and type information filled out. The caller only needs to add properties
+ * and possibility origin information if it is propagated to complete the set up of the classification.
+ *
+ * @param sourceName - source of the request (used for logging)
+ * @param userName - name of the creator
+ * @param classificationTypeName - name of the classification type
+ * @param entityTypeName - name of the type for the entity that this classification is to be attached to.
+ * @return partially filled out classification - needs properties and possibly origin information
+ * @throws TypeErrorException - the type name is not recognized as a classification type.
+ */
+ Classification getSkeletonClassification(String sourceName,
+ String userName,
+ String classificationTypeName,
+ String entityTypeName) throws TypeErrorException;
+
+
+ /**
+ * Return a relationship with the header and type information filled out. The caller only needs to add properties
+ * to complete the set up of the relationship.
+ *
+ * @param sourceName - source of the request (used for logging)
+ * @param metadataCollectionId - unique identifier for the home metadata collection
+ * @param provenanceType - origin type of the relationship
+ * @param userName - name of the creator
+ * @param typeName - name of the relationship's type
+ * @return partially filled out relationship - needs properties
+ * @throws TypeErrorException - the type name is not recognized as a relationship type.
+ */
+ Relationship getSkeletonRelationship(String sourceName,
+ String metadataCollectionId,
+ InstanceProvenanceType provenanceType,
+ String userName,
+ String typeName) throws TypeErrorException;
+
+
+ /**
+ * Return a filled out entity. It just needs to add the classifications.
+ *
+ * @param sourceName - source of the request (used for logging)
+ * @param metadataCollectionId - unique identifier for the home metadata collection
+ * @param provenanceType - origin of the entity
+ * @param userName - name of the creator
+ * @param typeName - name of the type
+ * @param properties - properties for the entity
+ * @param classifications - list of classifications for the entity
+ * @return an entity that is filled out
+ * @throws TypeErrorException - the type name is not recognized as an entity type
+ */
+ EntityDetail getNewEntity(String sourceName,
+ String metadataCollectionId,
+ InstanceProvenanceType provenanceType,
+ String userName,
+ String typeName,
+ InstanceProperties properties,
+ ArrayList<Classification> classifications) throws TypeErrorException;
+
+
+ /**
+ * Return a filled out relationship.
+ *
+ * @param sourceName - source of the request (used for logging)
+ * @param metadataCollectionId - unique identifier for the home metadata collection
+ * @param provenanceType - origin of the relationship
+ * @param userName - name of the creator
+ * @param typeName - name of the type
+ * @param properties - properties for the relationship
+ * @return a relationship that is filled out
+ * @throws TypeErrorException - the type name is not recognized as a relationship type
+ */
+ Relationship getNewRelationship(String sourceName,
+ String metadataCollectionId,
+ InstanceProvenanceType provenanceType,
+ String userName,
+ String typeName,
+ InstanceProperties properties) throws TypeErrorException;
+
+
+ /**
+ * Return a classification with the header and type information filled out. The caller only needs to add properties
+ * to complete the set up of the classification.
+ *
+ * @param sourceName - source of the request (used for logging)
+ * @param userName - name of the creator
+ * @param typeName - name of the type
+ * @param entityTypeName - name of the type for the entity that this classification is to be attached to.
+ * @param properties - properties for the classification
+ * @return partially filled out classification - needs properties and possibly origin information
+ * @throws TypeErrorException - the type name is not recognized as a classification type.
+ */
+ Classification getNewClassification(String sourceName,
+ String userName,
+ String typeName,
+ String entityTypeName,
+ ClassificationOrigin classificationOrigin,
+ String classificationOriginGUID,
+ InstanceProperties properties) throws TypeErrorException;
+}
http://git-wip-us.apache.org/repos/asf/atlas/blob/8a57e657/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositorycontentmanager/OMRSInstanceValidator.java
----------------------------------------------------------------------
diff --git a/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositorycontentmanager/OMRSInstanceValidator.java b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositorycontentmanager/OMRSInstanceValidator.java
new file mode 100644
index 0000000..02561ab
--- /dev/null
+++ b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositorycontentmanager/OMRSInstanceValidator.java
@@ -0,0 +1,69 @@
+/*
+ * 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.omrs.localrepository.repositorycontentmanager;
+
+import org.apache.atlas.omrs.metadatacollection.properties.instances.EntityDetail;
+import org.apache.atlas.omrs.metadatacollection.properties.instances.InstanceType;
+import org.apache.atlas.omrs.metadatacollection.properties.instances.Relationship;
+import org.apache.atlas.omrs.metadatacollection.properties.typedefs.TypeDef;
+import org.apache.atlas.omrs.metadatacollection.properties.typedefs.TypeDefCategory;
+
+
+/**
+ * OMRSInstanceValidator provides method to validate entities and relationships match their type definition
+ * (TypeDef).
+ */
+public interface OMRSInstanceValidator
+{
+ /**
+ * Test that the supplied entity is valid.
+ *
+ * @param sourceName - source of the entity (used for logging)
+ * @param entity - entity to test
+ * @return boolean result
+ */
+ boolean validEntity(String sourceName,
+ EntityDetail entity);
+
+
+ /**
+ * Test that the supplied relationship is valid.
+ *
+ * @param sourceName - source of the relationship (used for logging)
+ * @param relationship - relationship to test
+ * @return boolean result
+ */
+ boolean validRelationship(String sourceName,
+ Relationship relationship);
+
+ /**
+ * Verify that the identifiers for an instance are correct.
+ *
+ * @param sourceName - source of the instance (used for logging)
+ * @param typeDefGUID - unique identifier for the type.
+ * @param typeDefName - unique name for the type.
+ * @param category - expected category of the instance.
+ * @param instanceGUID - unique identifier for the instance.
+ * @return boolean indicating whether the identifiers are ok.
+ */
+ boolean validInstanceId(String sourceName,
+ String typeDefGUID,
+ String typeDefName,
+ TypeDefCategory category,
+ String instanceGUID);
+}