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);
+}