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/04/06 08:28:19 UTC

[15/31] atlas git commit: ATLAS-2122 OMAG Server Application and OMRS APIs

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSMetadataCollection.java
----------------------------------------------------------------------
diff --git a/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSMetadataCollection.java b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSMetadataCollection.java
index a46c28e..544085a 100644
--- a/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSMetadataCollection.java
+++ b/omrs/src/main/java/org/apache/atlas/omrs/localrepository/repositoryconnector/LocalOMRSMetadataCollection.java
@@ -21,13 +21,15 @@ import org.apache.atlas.omrs.eventmanagement.OMRSRepositoryEventProcessor;
 import org.apache.atlas.omrs.ffdc.*;
 import org.apache.atlas.omrs.ffdc.exception.*;
 import org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSRepositoryContentManager;
+import org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSRepositoryHelper;
+import org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSRepositoryValidator;
 import org.apache.atlas.omrs.metadatacollection.OMRSMetadataCollection;
 import org.apache.atlas.omrs.metadatacollection.properties.MatchCriteria;
 import org.apache.atlas.omrs.metadatacollection.properties.SequencingOrder;
 import org.apache.atlas.omrs.metadatacollection.properties.instances.*;
 import org.apache.atlas.omrs.metadatacollection.properties.typedefs.*;
 
-import java.util.ArrayList;
+import java.util.List;
 import java.util.Date;
 
 /**
@@ -36,14 +38,16 @@ import java.util.Date;
  */
 public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
 {
-    private static final String  sourceName = "Local Repository";
+    private static final String repositoryName = "Local Repository";
 
-    private OMRSMetadataCollection       realMetadataCollection           = null;
-    private String                       localServerName                  = null;
-    private String                       localServerType                  = null;
-    private String                       localOrganizationName            = null;
-    private OMRSRepositoryEventProcessor outboundRepositoryEventProcessor = null;
-    private OMRSRepositoryContentManager localRepositoryContentManager    = null;
+    private OMRSMetadataCollection       realMetadataCollection;
+    private String                       localServerName;
+    private String                       localServerType;
+    private String                       localOrganizationName;
+    private OMRSRepositoryEventProcessor outboundRepositoryEventProcessor;
+    private OMRSRepositoryContentManager localRepositoryContentManager;
+    private OMRSRepositoryValidator      repositoryValidator;
+    private OMRSRepositoryHelper         repositoryHelper;
 
 
     /**
@@ -53,7 +57,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @param localServerName - name of the local server.
      * @param localServerType - type of the local server.
      * @param localOrganizationName - name of the organization that owns the local server.
-     * @param realMetadataCollection - metadata collection of the rela local connector.
+     * @param realMetadataCollection - metadata collection of the real local connector.
      * @param outboundRepositoryEventProcessor - outbound event processor
      *                                         (may be null if a repository event mapper is deployed).
      * @param repositoryContentManager - manager of in-memory cache of type definitions (TypeDefs).
@@ -72,13 +76,13 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
         super(localMetadataConnectionId);
 
         /*
-         * Save the metadata collection object for the real repository.  This is the metadata that does all of the
-         * work.  LocalOMRSMetadataCollection is just a wrapper for managing repository events and debug and
-         * audit logging.
+         * Save the metadata collection object for the real repository.  This is the metadata collection that
+         * does all of the work.  LocalOMRSMetadataCollection is just a wrapper for managing repository events
+         * and debug and audit logging.
          */
         if (realMetadataCollection == null)
         {
-            String            actionDescription = "Local OMRS Metadata Collection Constructor";
+            final String      actionDescription = "Local OMRS Metadata Collection Constructor";
 
             OMRSErrorCode errorCode = OMRSErrorCode.NULL_LOCAL_METADATA_COLLECTION;
             String        errorMessage = errorCode.getErrorMessageId()
@@ -101,6 +105,8 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
         this.localOrganizationName = localOrganizationName;
         this.outboundRepositoryEventProcessor = outboundRepositoryEventProcessor;
         this.localRepositoryContentManager = repositoryContentManager;
+        this.repositoryValidator = new OMRSRepositoryValidator(repositoryContentManager);
+        this.repositoryHelper = new OMRSRepositoryHelper(repositoryContentManager);
     }
 
 
@@ -121,8 +127,13 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public TypeDefGallery getAllTypes(String userId) throws RepositoryErrorException,
-                                                                UserNotAuthorizedException
+                                                            UserNotAuthorizedException
     {
+        final String methodName = "getAllTypes";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getAllTypes(userId);
     }
 
@@ -144,6 +155,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                    RepositoryErrorException,
                                                                    UserNotAuthorizedException
     {
+        final String methodName = "findTypesByName";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.findTypesByName(userId, name);
     }
 
@@ -158,11 +174,16 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
-    public ArrayList<TypeDef> findTypeDefsByCategory(String          userId,
-                                                     TypeDefCategory category) throws InvalidParameterException,
-                                                                                      RepositoryErrorException,
-                                                                                      UserNotAuthorizedException
+    public List<TypeDef> findTypeDefsByCategory(String          userId,
+                                                TypeDefCategory category) throws InvalidParameterException,
+                                                                                 RepositoryErrorException,
+                                                                                 UserNotAuthorizedException
     {
+        final String methodName = "findTypeDefsByCategory";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.findTypeDefsByCategory(userId, category);
     }
 
@@ -177,11 +198,16 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
-    public ArrayList<AttributeTypeDef> findAttributeTypeDefsByCategory(String                   userId,
-                                                                       AttributeTypeDefCategory category) throws InvalidParameterException,
-                                                                                                                 RepositoryErrorException,
-                                                                                                                 UserNotAuthorizedException
+    public List<AttributeTypeDef> findAttributeTypeDefsByCategory(String                   userId,
+                                                                  AttributeTypeDefCategory category) throws InvalidParameterException,
+                                                                                                            RepositoryErrorException,
+                                                                                                            UserNotAuthorizedException
     {
+        final String methodName = "findAttributeTypeDefsByCategory";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.findAttributeTypeDefsByCategory(userId, category);
     }
 
@@ -197,11 +223,16 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
-    public ArrayList<TypeDef> findTypeDefsByProperty(String            userId,
-                                                     TypeDefProperties matchCriteria) throws InvalidParameterException,
-                                                                                             RepositoryErrorException,
-                                                                                             UserNotAuthorizedException
+    public List<TypeDef> findTypeDefsByProperty(String            userId,
+                                                TypeDefProperties matchCriteria) throws InvalidParameterException,
+                                                                                        RepositoryErrorException,
+                                                                                        UserNotAuthorizedException
     {
+        final String methodName = "findTypeDefsByProperty";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.findTypeDefsByProperty(userId, matchCriteria);
     }
 
@@ -219,13 +250,18 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
-    public TypeDefGallery findTypesByExternalID(String    userId,
-                                                String    standard,
-                                                String    organization,
-                                                String    identifier) throws InvalidParameterException,
-                                                                             RepositoryErrorException,
-                                                                             UserNotAuthorizedException
+    public List<TypeDef> findTypesByExternalID(String    userId,
+                                               String    standard,
+                                               String    organization,
+                                               String    identifier) throws InvalidParameterException,
+                                                                            RepositoryErrorException,
+                                                                            UserNotAuthorizedException
     {
+        final String methodName = "findTypesByExternalID";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.findTypesByExternalID(userId, standard, organization, identifier);
     }
 
@@ -240,11 +276,16 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
-    public ArrayList<TypeDef> searchForTypeDefs(String    userId,
-                                                String    searchCriteria) throws InvalidParameterException,
-                                                                                 RepositoryErrorException,
-                                                                                 UserNotAuthorizedException
+    public List<TypeDef> searchForTypeDefs(String    userId,
+                                           String    searchCriteria) throws InvalidParameterException,
+                                                                            RepositoryErrorException,
+                                                                            UserNotAuthorizedException
     {
+        final String methodName = "searchForTypeDefs";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.searchForTypeDefs(userId, searchCriteria);
     }
 
@@ -267,6 +308,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                            TypeDefNotKnownException,
                                                            UserNotAuthorizedException
     {
+        final String methodName = "getTypeDefByGUID";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getTypeDefByGUID(userId, guid);
     }
 
@@ -289,6 +335,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                               TypeDefNotKnownException,
                                                                               UserNotAuthorizedException
     {
+        final String methodName = "getAttributeTypeDefByGUID";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getAttributeTypeDefByGUID(userId, guid);
     }
 
@@ -311,6 +362,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                            TypeDefNotKnownException,
                                                            UserNotAuthorizedException
     {
+        final String methodName = "getTypeDefByName";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getTypeDefByName(userId, name);
     }
 
@@ -333,6 +389,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                               TypeDefNotKnownException,
                                                                               UserNotAuthorizedException
     {
+        final String methodName = "getAttributeTypeDefByName";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getAttributeTypeDefByName(userId, name);
     }
 
@@ -341,7 +402,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * Create a collection of related types.
      *
      * @param userId - unique identifier for requesting user.
-     * @param newTypes - TypeDefGallery structure describing the new AttributeTypeDefs and TypeDefs.
+     * @param newTypes - TypeDefGalleryResponse structure describing the new AttributeTypeDefs and TypeDefs.
      * @throws InvalidParameterException - the new TypeDef is null.
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository where
      *                                  the metadata collection is stored.
@@ -349,6 +410,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws TypeDefKnownException - the TypeDef is already stored in the repository.
      * @throws TypeDefConflictException - the new TypeDef conflicts with an existing TypeDef.
      * @throws InvalidTypeDefException - the new TypeDef has invalid contents.
+     * @throws FunctionNotSupportedException - the repository does not support this call.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public  void addTypeDefGallery(String          userId,
@@ -358,9 +420,49 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                     TypeDefKnownException,
                                                                     TypeDefConflictException,
                                                                     InvalidTypeDefException,
+                                                                    FunctionNotSupportedException,
                                                                     UserNotAuthorizedException
     {
+        final String methodName = "addTypeDefGallery";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
+        if (newTypes != null)
+        {
+            List<AttributeTypeDef>   attributeTypeDefs = newTypes.getAttributeTypeDefs();
+
+            if (attributeTypeDefs != null)
+            {
+                for (AttributeTypeDef   attributeTypeDef : attributeTypeDefs)
+                {
+                    this.addAttributeTypeDef(userId, attributeTypeDef);
+                }
+            }
+
+            List<TypeDef>   typeDefs = newTypes.getTypeDefs();
+
+            if (typeDefs != null)
+            {
+                for (TypeDef   typeDef : typeDefs)
+                {
+                    this.addTypeDef(userId, typeDef);
+                }
+            }
+        }
+        else
+        {
+            OMRSErrorCode errorCode = OMRSErrorCode.NULL_TYPEDEF_GALLERY;
+            String        errorMessage = errorCode.getErrorMessageId()
+                                       + errorCode.getFormattedErrorMessage();
 
+            throw new InvalidParameterException(errorCode.getHTTPErrorCode(),
+                                                this.getClass().getName(),
+                                                methodName,
+                                                errorMessage,
+                                                errorCode.getSystemAction(),
+                                                errorCode.getUserAction());
+        }
     }
 
 
@@ -376,6 +478,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws TypeDefKnownException - the TypeDef is already stored in the repository.
      * @throws TypeDefConflictException - the new TypeDef conflicts with an existing TypeDef.
      * @throws InvalidTypeDefException - the new TypeDef has invalid contents.
+     * @throws FunctionNotSupportedException - the repository does not support this call.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public void addTypeDef(String    userId,
@@ -385,18 +488,24 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                         TypeDefKnownException,
                                                         TypeDefConflictException,
                                                         InvalidTypeDefException,
+                                                        FunctionNotSupportedException,
                                                         UserNotAuthorizedException
     {
+        final String methodName = "addTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         realMetadataCollection.addTypeDef(userId, newTypeDef);
 
         if (localRepositoryContentManager != null)
         {
-            localRepositoryContentManager.addTypeDef(sourceName, newTypeDef);
+            localRepositoryContentManager.addTypeDef(repositoryName, newTypeDef);
         }
 
         if (outboundRepositoryEventProcessor != null)
         {
-            outboundRepositoryEventProcessor.processNewTypeDefEvent(sourceName,
+            outboundRepositoryEventProcessor.processNewTypeDefEvent(repositoryName,
                                                                     metadataCollectionId,
                                                                     localServerName,
                                                                     localServerType,
@@ -417,6 +526,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws TypeDefKnownException - the TypeDef is already stored in the repository.
      * @throws TypeDefConflictException - the new TypeDef conflicts with an existing TypeDef.
      * @throws InvalidTypeDefException - the new TypeDef has invalid contents.
+     * @throws FunctionNotSupportedException - the repository does not support this call.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public  void addAttributeTypeDef(String             userId,
@@ -426,18 +536,24 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                                     TypeDefKnownException,
                                                                                     TypeDefConflictException,
                                                                                     InvalidTypeDefException,
+                                                                                    FunctionNotSupportedException,
                                                                                     UserNotAuthorizedException
     {
+        final String methodName = "addAttributeTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         realMetadataCollection.addAttributeTypeDef(userId, newAttributeTypeDef);
 
         if (localRepositoryContentManager != null)
         {
-            localRepositoryContentManager.addAttributeTypeDef(sourceName, newAttributeTypeDef);
+            localRepositoryContentManager.addAttributeTypeDef(repositoryName, newAttributeTypeDef);
         }
 
         if (outboundRepositoryEventProcessor != null)
         {
-            outboundRepositoryEventProcessor.processNewAttributeTypeDefEvent(sourceName,
+            outboundRepositoryEventProcessor.processNewAttributeTypeDefEvent(repositoryName,
                                                                              metadataCollectionId,
                                                                              localServerName,
                                                                              localServerType,
@@ -469,6 +585,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                            InvalidTypeDefException,
                                                            UserNotAuthorizedException
     {
+        final String methodName = "verifyTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.verifyTypeDef(userId, typeDef);
     }
 
@@ -495,6 +616,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                                       InvalidTypeDefException,
                                                                                       UserNotAuthorizedException
     {
+        final String methodName = "verifyAttributeTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.verifyAttributeTypeDef(userId, attributeTypeDef);
     }
 
@@ -512,6 +638,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws TypeDefNotKnownException - the requested TypeDef is not found in the metadata collection.
      * @throws PatchErrorException - the TypeDef can not be updated because the supplied patch is incompatible
      *                               with the stored TypeDef.
+     * @throws FunctionNotSupportedException - the repository does not support this call.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public TypeDef updateTypeDef(String       userId,
@@ -519,18 +646,24 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                    RepositoryErrorException,
                                                                    TypeDefNotKnownException,
                                                                    PatchErrorException,
+                                                                   FunctionNotSupportedException,
                                                                    UserNotAuthorizedException
     {
+        final String methodName = "updateTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         TypeDef   updatedTypeDef = realMetadataCollection.updateTypeDef(userId, typeDefPatch);
 
         if (localRepositoryContentManager != null)
         {
-            localRepositoryContentManager.updateTypeDef(sourceName, updatedTypeDef);
+            localRepositoryContentManager.updateTypeDef(repositoryName, updatedTypeDef);
         }
 
         if (outboundRepositoryEventProcessor != null)
         {
-            outboundRepositoryEventProcessor.processUpdatedTypeDefEvent(sourceName,
+            outboundRepositoryEventProcessor.processUpdatedTypeDefEvent(repositoryName,
                                                                         metadataCollectionId,
                                                                         localServerName,
                                                                         localServerType,
@@ -556,6 +689,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws TypeDefInUseException - the TypeDef can not be deleted because there are instances of this type in the
      *                                 the metadata collection.  These instances need to be purged before the
      *                                 TypeDef can be deleted.
+     * @throws FunctionNotSupportedException - the repository does not support this call.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public void deleteTypeDef(String    userId,
@@ -564,11 +698,26 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                     RepositoryErrorException,
                                                                     TypeDefNotKnownException,
                                                                     TypeDefInUseException,
+                                                                    FunctionNotSupportedException,
                                                                     UserNotAuthorizedException
     {
+        final String methodName = "deleteTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         if ((obsoleteTypeDefGUID == null) || (obsoleteTypeDefName == null))
         {
-            // TODO Throw InvalidParameterException
+            OMRSErrorCode errorCode = OMRSErrorCode.NULL_TYPEDEF_IDENTIFIER;
+            String        errorMessage = errorCode.getErrorMessageId()
+                                       + errorCode.getFormattedErrorMessage();
+
+            throw new InvalidParameterException(errorCode.getHTTPErrorCode(),
+                                                this.getClass().getName(),
+                                                methodName,
+                                                errorMessage,
+                                                errorCode.getSystemAction(),
+                                                errorCode.getUserAction());
         }
 
         realMetadataCollection.deleteTypeDef(userId,
@@ -577,14 +726,14 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
 
         if (localRepositoryContentManager != null)
         {
-            localRepositoryContentManager.deleteTypeDef(sourceName,
+            localRepositoryContentManager.deleteTypeDef(repositoryName,
                                                         obsoleteTypeDefGUID,
                                                         obsoleteTypeDefName);
         }
 
         if (outboundRepositoryEventProcessor != null)
         {
-            outboundRepositoryEventProcessor.processDeletedTypeDefEvent(sourceName,
+            outboundRepositoryEventProcessor.processDeletedTypeDefEvent(repositoryName,
                                                                         metadataCollectionId,
                                                                         localServerName,
                                                                         localServerType,
@@ -609,6 +758,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws TypeDefInUseException - the AttributeTypeDef can not be deleted because there are instances of this type in the
      *                                 the metadata collection.  These instances need to be purged before the
      *                                 AttributeTypeDef can be deleted.
+     * @throws FunctionNotSupportedException - the repository does not support this call.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public void deleteAttributeTypeDef(String    userId,
@@ -617,11 +767,27 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                              RepositoryErrorException,
                                                                              TypeDefNotKnownException,
                                                                              TypeDefInUseException,
+                                                                             FunctionNotSupportedException,
                                                                              UserNotAuthorizedException
     {
+        final String methodName = "deleteAttributeTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         if ((obsoleteTypeDefGUID == null) || (obsoleteTypeDefName == null))
         {
-            // TODO Throw InvalidParameterException
+            OMRSErrorCode errorCode = OMRSErrorCode.NULL_TYPEDEF_IDENTIFIER;
+            String        errorMessage = errorCode.getErrorMessageId()
+                                       + errorCode.getFormattedErrorMessage();
+
+            throw new InvalidParameterException(errorCode.getHTTPErrorCode(),
+                                                this.getClass().getName(),
+                                                methodName,
+                                                errorMessage,
+                                                errorCode.getSystemAction(),
+                                                errorCode.getUserAction());
+
         }
 
         realMetadataCollection.deleteAttributeTypeDef(userId,
@@ -630,14 +796,14 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
 
         if (localRepositoryContentManager != null)
         {
-            localRepositoryContentManager.deleteAttributeTypeDef(sourceName,
+            localRepositoryContentManager.deleteAttributeTypeDef(repositoryName,
                                                                  obsoleteTypeDefGUID,
                                                                  obsoleteTypeDefName);
         }
 
         if (outboundRepositoryEventProcessor != null)
         {
-            outboundRepositoryEventProcessor.processDeletedAttributeTypeDefEvent(sourceName,
+            outboundRepositoryEventProcessor.processDeletedAttributeTypeDefEvent(repositoryName,
                                                                                  metadataCollectionId,
                                                                                  localServerName,
                                                                                  localServerType,
@@ -664,6 +830,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      *                                    the metadata collection is stored.
      * @throws TypeDefNotKnownException - the TypeDef identified by the original guid/name is not found
      *                                    in the metadata collection.
+     * @throws FunctionNotSupportedException - the repository does not support this call.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public  TypeDef reIdentifyTypeDef(String     userId,
@@ -673,12 +840,27 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                       String     newTypeDefName) throws InvalidParameterException,
                                                                         RepositoryErrorException,
                                                                         TypeDefNotKnownException,
+                                                                        FunctionNotSupportedException,
                                                                         UserNotAuthorizedException
     {
+        final String methodName = "reIdentifyTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         if ((originalTypeDefGUID == null) || (originalTypeDefName == null) ||
                  (newTypeDefGUID == null) || (newTypeDefName == null))
         {
-            // TODO Throw InvalidParameterException
+            OMRSErrorCode errorCode = OMRSErrorCode.NULL_TYPEDEF_IDENTIFIER;
+            String        errorMessage = errorCode.getErrorMessageId()
+                                       + errorCode.getFormattedErrorMessage();
+
+            throw new InvalidParameterException(errorCode.getHTTPErrorCode(),
+                                                this.getClass().getName(),
+                                                methodName,
+                                                errorMessage,
+                                                errorCode.getSystemAction(),
+                                                errorCode.getUserAction());
         }
 
         TypeDef   originalTypeDef = realMetadataCollection.getTypeDefByGUID(userId, originalTypeDefGUID);
@@ -691,7 +873,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
 
         if (localRepositoryContentManager != null)
         {
-            localRepositoryContentManager.reIdentifyTypeDef(sourceName,
+            localRepositoryContentManager.reIdentifyTypeDef(repositoryName,
                                                             originalTypeDefGUID,
                                                             originalTypeDefName,
                                                             newTypeDef);
@@ -699,7 +881,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
 
         if (outboundRepositoryEventProcessor != null)
         {
-            outboundRepositoryEventProcessor.processReIdentifiedTypeDefEvent(sourceName,
+            outboundRepositoryEventProcessor.processReIdentifiedTypeDefEvent(repositoryName,
                                                                              metadataCollectionId,
                                                                              localServerName,
                                                                              localServerType,
@@ -728,6 +910,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      *                                    the metadata collection is stored.
      * @throws TypeDefNotKnownException - the AttributeTypeDef identified by the original guid/name is not
      *                                    found in the metadata collection.
+     * @throws FunctionNotSupportedException - the repository does not support this call.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public  AttributeTypeDef reIdentifyAttributeTypeDef(String     userId,
@@ -737,12 +920,27 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                         String     newAttributeTypeDefName) throws InvalidParameterException,
                                                                                                    RepositoryErrorException,
                                                                                                    TypeDefNotKnownException,
+                                                                                                   FunctionNotSupportedException,
                                                                                                    UserNotAuthorizedException
     {
+        final String methodName = "reIdentifyAttributeTypeDef";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         if ((originalAttributeTypeDefGUID == null) || (originalAttributeTypeDefName == null) ||
                  (newAttributeTypeDefGUID == null) || (newAttributeTypeDefName == null))
         {
-            // TODO Throw InvalidParameterException
+            OMRSErrorCode errorCode = OMRSErrorCode.NULL_TYPEDEF_IDENTIFIER;
+            String        errorMessage = errorCode.getErrorMessageId()
+                                       + errorCode.getFormattedErrorMessage();
+
+            throw new InvalidParameterException(errorCode.getHTTPErrorCode(),
+                                                this.getClass().getName(),
+                                                methodName,
+                                                errorMessage,
+                                                errorCode.getSystemAction(),
+                                                errorCode.getUserAction());
         }
 
         AttributeTypeDef   originalAttributeTypeDef = realMetadataCollection.getAttributeTypeDefByGUID(userId, originalAttributeTypeDefGUID);
@@ -755,7 +953,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
 
         if (localRepositoryContentManager != null)
         {
-            localRepositoryContentManager.reIdentifyAttributeTypeDef(sourceName,
+            localRepositoryContentManager.reIdentifyAttributeTypeDef(repositoryName,
                                                                      originalAttributeTypeDefGUID,
                                                                      originalAttributeTypeDefName,
                                                                      newAttributeTypeDef);
@@ -763,7 +961,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
 
         if (outboundRepositoryEventProcessor != null)
         {
-            outboundRepositoryEventProcessor.processReIdentifiedAttributeTypeDefEvent(sourceName,
+            outboundRepositoryEventProcessor.processReIdentifiedAttributeTypeDefEvent(repositoryName,
                                                                                       metadataCollectionId,
                                                                                       localServerName,
                                                                                       localServerType,
@@ -798,6 +996,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                               RepositoryErrorException,
                                                               UserNotAuthorizedException
     {
+        final String methodName = "isEntityKnown";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         EntityDetail   entity = realMetadataCollection.isEntityKnown(userId, guid);
 
         if (entity != null)
@@ -837,6 +1040,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                  EntityNotKnownException,
                                                                  UserNotAuthorizedException
     {
+        final String methodName = "getEntitySummary";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         EntitySummary  entity =  realMetadataCollection.getEntitySummary(userId, guid);
 
         if (entity != null)
@@ -868,14 +1076,21 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository where
      *                                 the metadata collection is stored.
      * @throws EntityNotKnownException - the requested entity instance is not known in the metadata collection.
+     * @throws EntityProxyOnlyException - the requested entity instance is only a proxy in the metadata collection.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public EntityDetail getEntityDetail(String    userId,
                                         String    guid) throws InvalidParameterException,
                                                                RepositoryErrorException,
                                                                EntityNotKnownException,
+                                                               EntityProxyOnlyException,
                                                                UserNotAuthorizedException
     {
+        final String methodName = "getEntityDetail";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         EntityDetail   entity = realMetadataCollection.getEntityDetail(userId, guid);
 
         if (entity != null)
@@ -904,12 +1119,13 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @param guid - String unique identifier for the entity.
      * @param asOfTime - the time used to determine which version of the entity that is desired.
      * @return EntityDetail structure.
-     * @throws InvalidParameterException - the guid or date is null.
+     * @throws InvalidParameterException - the guid or date is null or the date is for a future time.
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository where
      *                                 the metadata collection is stored.
      * @throws EntityNotKnownException - the requested entity instance is not known in the metadata collection
      *                                   at the time requested.
-     * @throws PropertyErrorException - the asOfTime property is for a future time
+     * @throws EntityProxyOnlyException - the requested entity instance is only a proxy in the metadata collection.
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public  EntityDetail getEntityDetail(String    userId,
@@ -917,49 +1133,16 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                          Date      asOfTime) throws InvalidParameterException,
                                                                     RepositoryErrorException,
                                                                     EntityNotKnownException,
-                                                                    PropertyErrorException,
+                                                                    EntityProxyOnlyException,
+                                                                    FunctionNotSupportedException,
                                                                     UserNotAuthorizedException
     {
-        EntityDetail   entity = realMetadataCollection.getEntityDetail(userId, guid, asOfTime);
-
-        if (entity != null)
-        {
-            /*
-             * Ensure the provenance of the entity is correctly set.  A repository may not support the storing of
-             * the metadata collection id in the repository (or uses null to mean "local").  When the entity
-             * detail is sent out, it must have its home metadata collection id set up.  So LocalOMRSMetadataCollection
-             * fixes up the provenance.
-             */
-            if (entity.getMetadataCollectionId() == null)
-            {
-                entity.setMetadataCollectionId(metadataCollectionId);
-                entity.setInstanceProvenanceType(InstanceProvenanceType.LOCAL_COHORT);
-            }
-        }
-
-        return entity;
-    }
+        final String methodName = "getEntityDetail";
 
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
 
-    /**
-     * Return the header, classifications, properties and relationships for a specific entity.
-     *
-     * @param userId - unique identifier for requesting user.
-     * @param guid - String unique identifier for the entity.
-     * @return EntityUniverse structure.
-     * @throws InvalidParameterException - the guid is null.
-     * @throws RepositoryErrorException - there is a problem communicating with the metadata repository where
-     *                                    the metadata collection is stored.
-     * @throws EntityNotKnownException - the requested entity instance is not known in the metadata collection.
-     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
-     */
-    public EntityUniverse getEntityUniverse(String    userId,
-                                            String    guid) throws InvalidParameterException,
-                                                                   RepositoryErrorException,
-                                                                   EntityNotKnownException,
-                                                                   UserNotAuthorizedException
-    {
-        EntityUniverse entity = realMetadataCollection.getEntityUniverse(userId, guid);
+        EntityDetail   entity = realMetadataCollection.getEntityDetail(userId, guid, asOfTime);
 
         if (entity != null)
         {
@@ -985,6 +1168,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      *
      * @param userId - unique identifier for requesting user.
      * @param entityGUID - String unique identifier for the entity.
+     * @param relationshipTypeGUID - String GUID of the the type of relationship required (null for all).
      * @param fromRelationshipElement - the starting element number of the relationships to return.
      *                                This is used when retrieving elements
      *                                beyond the first page of results. Zero means start from the first element.
@@ -1005,24 +1189,33 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws EntityNotKnownException - the requested entity instance is not known in the metadata collection.
      * @throws PropertyErrorException - the sequencing property is not valid for the attached classifications.
      * @throws PagingErrorException - the paging/sequencing parameters are set up incorrectly.
-     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
-     */
-    public ArrayList<Relationship> getRelationshipsForEntity(String                     userId,
-                                                             String                     entityGUID,
-                                                             int                        fromRelationshipElement,
-                                                             ArrayList<InstanceStatus>  limitResultsByStatus,
-                                                             Date                       asOfTime,
-                                                             String                     sequencingProperty,
-                                                             SequencingOrder            sequencingOrder,
-                                                             int                        pageSize) throws InvalidParameterException,
-                                                                                                         RepositoryErrorException,
-                                                                                                         EntityNotKnownException,
-                                                                                                         PropertyErrorException,
-                                                                                                         PagingErrorException,
-                                                                                                         UserNotAuthorizedException
-    {
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
+     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
+     */
+    public List<Relationship> getRelationshipsForEntity(String                     userId,
+                                                        String                     entityGUID,
+                                                        String                     relationshipTypeGUID,
+                                                        int                        fromRelationshipElement,
+                                                        List<InstanceStatus>       limitResultsByStatus,
+                                                        Date                       asOfTime,
+                                                        String                     sequencingProperty,
+                                                        SequencingOrder            sequencingOrder,
+                                                        int                        pageSize) throws InvalidParameterException,
+                                                                                                    RepositoryErrorException,
+                                                                                                    EntityNotKnownException,
+                                                                                                    PropertyErrorException,
+                                                                                                    PagingErrorException,
+                                                                                                    FunctionNotSupportedException,
+                                                                                                    UserNotAuthorizedException
+    {
+        final String methodName = "getRelationshipsForEntity";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getRelationshipsForEntity(userId,
                                                                 entityGUID,
+                                                                relationshipTypeGUID,
                                                                 fromRelationshipElement,
                                                                 limitResultsByStatus,
                                                                 asOfTime,
@@ -1040,7 +1233,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @param entityTypeGUID - String unique identifier for the entity type of interest (null means any entity type).
      * @param matchProperties - List of entity properties to match to (null means match on entityTypeGUID only).
      * @param matchCriteria - Enum defining how the properties should be matched to the entities in the repository.
-     * @param fromEntityDetailElement - the starting element number of the entities to return.
+     * @param fromEntityElement - the starting element number of the entities to return.
      *                                This is used when retrieving elements
      *                                beyond the first page of results. Zero means start from the first element.
      * @param limitResultsByStatus - By default, entities in all statuses are returned.  However, it is possible
@@ -1063,30 +1256,37 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws PropertyErrorException - the properties specified are not valid for any of the requested types of
      *                                  entity.
      * @throws PagingErrorException - the paging/sequencing parameters are set up incorrectly.
-     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
-     */
-    public  ArrayList<EntityDetail> findEntitiesByProperty(String                    userId,
-                                                           String                    entityTypeGUID,
-                                                           InstanceProperties        matchProperties,
-                                                           MatchCriteria             matchCriteria,
-                                                           int                       fromEntityDetailElement,
-                                                           ArrayList<InstanceStatus> limitResultsByStatus,
-                                                           ArrayList<String>         limitResultsByClassification,
-                                                           Date                      asOfTime,
-                                                           String                    sequencingProperty,
-                                                           SequencingOrder           sequencingOrder,
-                                                           int                       pageSize) throws InvalidParameterException,
-                                                                                                      RepositoryErrorException,
-                                                                                                      TypeErrorException,
-                                                                                                      PropertyErrorException,
-                                                                                                      PagingErrorException,
-                                                                                                      UserNotAuthorizedException
-    {
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
+     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
+     */
+    public  List<EntityDetail> findEntitiesByProperty(String                    userId,
+                                                      String                    entityTypeGUID,
+                                                      InstanceProperties        matchProperties,
+                                                      MatchCriteria             matchCriteria,
+                                                      int                       fromEntityElement,
+                                                      List<InstanceStatus>      limitResultsByStatus,
+                                                      List<String>              limitResultsByClassification,
+                                                      Date                      asOfTime,
+                                                      String                    sequencingProperty,
+                                                      SequencingOrder           sequencingOrder,
+                                                      int                       pageSize) throws InvalidParameterException,
+                                                                                                 RepositoryErrorException,
+                                                                                                 TypeErrorException,
+                                                                                                 PropertyErrorException,
+                                                                                                 PagingErrorException,
+                                                                                                 FunctionNotSupportedException,
+                                                                                                 UserNotAuthorizedException
+    {
+        final String methodName = "findEntitiesByProperty";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.findEntitiesByProperty(userId,
                                                              entityTypeGUID,
                                                              matchProperties,
                                                              matchCriteria,
-                                                             fromEntityDetailElement,
+                                                             fromEntityElement,
                                                              limitResultsByStatus,
                                                              limitResultsByClassification,
                                                              asOfTime,
@@ -1104,7 +1304,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @param classificationName - name of the classification - a null is not valid.
      * @param matchClassificationProperties - list of classification properties used to narrow the search.
      * @param matchCriteria - Enum defining how the properties should be matched to the classifications in the repository.
-     * @param fromEntityDetailElement - the starting element number of the entities to return.
+     * @param fromEntityElement - the starting element number of the entities to return.
      *                                This is used when retrieving elements
      *                                beyond the first page of results. Zero means start from the first element.
      * @param limitResultsByStatus - By default, entities in all statuses are returned.  However, it is possible
@@ -1127,36 +1327,43 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws PropertyErrorException - the properties specified are not valid for the requested type of
      *                                  classification.
      * @throws PagingErrorException - the paging/sequencing parameters are set up incorrectly.
-     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
-     */
-    public  ArrayList<EntityDetail> findEntitiesByClassification(String                    userId,
-                                                                 String                    entityTypeGUID,
-                                                                 String                    classificationName,
-                                                                 InstanceProperties        matchClassificationProperties,
-                                                                 MatchCriteria             matchCriteria,
-                                                                 ArrayList<InstanceStatus> limitResultsByStatus,
-                                                                 Date                      asOfTime,
-                                                                 String                    sequencingProperty,
-                                                                 SequencingOrder           sequencingOrder,
-                                                                 int                       fromEntityDetailElement,
-                                                                 int                       pageSize) throws InvalidParameterException,
-                                                                                                            RepositoryErrorException,
-                                                                                                            TypeErrorException,
-                                                                                                            ClassificationErrorException,
-                                                                                                            PropertyErrorException,
-                                                                                                            PagingErrorException,
-                                                                                                            UserNotAuthorizedException
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
+     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
+     */
+    public  List<EntityDetail> findEntitiesByClassification(String                    userId,
+                                                            String                    entityTypeGUID,
+                                                            String                    classificationName,
+                                                            InstanceProperties        matchClassificationProperties,
+                                                            MatchCriteria             matchCriteria,
+                                                            int                       fromEntityElement,
+                                                            List<InstanceStatus>      limitResultsByStatus,
+                                                            Date                      asOfTime,
+                                                            String                    sequencingProperty,
+                                                            SequencingOrder           sequencingOrder,
+                                                            int                       pageSize) throws InvalidParameterException,
+                                                                                                       RepositoryErrorException,
+                                                                                                       TypeErrorException,
+                                                                                                       ClassificationErrorException,
+                                                                                                       PropertyErrorException,
+                                                                                                       PagingErrorException,
+                                                                                                       FunctionNotSupportedException,
+                                                                                                       UserNotAuthorizedException
     {
+        final String methodName = "findEntitiesByClassification";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.findEntitiesByClassification(userId,
                                                                    entityTypeGUID,
                                                                    classificationName,
                                                                    matchClassificationProperties,
                                                                    matchCriteria,
+                                                                   fromEntityElement,
                                                                    limitResultsByStatus,
                                                                    asOfTime,
                                                                    sequencingProperty,
                                                                    sequencingOrder,
-                                                                   fromEntityDetailElement,
                                                                    pageSize);
     }
 
@@ -1166,7 +1373,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      *
      * @param userId - unique identifier for requesting user.
      * @param searchCriteria - String expression of the characteristics of the required relationships.
-     * @param fromEntityDetailElement - the starting element number of the entities to return.
+     * @param fromEntityElement - the starting element number of the entities to return.
      *                                This is used when retrieving elements
      *                                beyond the first page of results. Zero means start from the first element.
      * @param limitResultsByStatus - By default, entities in all statuses are returned.  However, it is possible
@@ -1187,25 +1394,32 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws PropertyErrorException - the sequencing property specified is not valid for any of the requested types of
      *                                  entity.
      * @throws PagingErrorException - the paging/sequencing parameters are set up incorrectly.
-     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
-     */
-    public  ArrayList<EntityDetail> searchForEntities(String                          userId,
-                                                      String                          searchCriteria,
-                                                      int                             fromEntityDetailElement,
-                                                      ArrayList<InstanceStatus>       limitResultsByStatus,
-                                                      ArrayList<String>               limitResultsByClassification,
-                                                      Date                            asOfTime,
-                                                      String                          sequencingProperty,
-                                                      SequencingOrder                 sequencingOrder,
-                                                      int                             pageSize) throws InvalidParameterException,
-                                                                                                       RepositoryErrorException,
-                                                                                                       PropertyErrorException,
-                                                                                                       PagingErrorException,
-                                                                                                       UserNotAuthorizedException
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
+     * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
+     */
+    public  List<EntityDetail> searchForEntities(String                     userId,
+                                                 String                     searchCriteria,
+                                                 int                        fromEntityElement,
+                                                 List<InstanceStatus>       limitResultsByStatus,
+                                                 List<String>               limitResultsByClassification,
+                                                 Date                       asOfTime,
+                                                 String                     sequencingProperty,
+                                                 SequencingOrder            sequencingOrder,
+                                                 int                        pageSize) throws InvalidParameterException,
+                                                                                             RepositoryErrorException,
+                                                                                             PropertyErrorException,
+                                                                                             PagingErrorException,
+                                                                                             FunctionNotSupportedException,
+                                                                                             UserNotAuthorizedException
     {
+        final String methodName = "searchForEntities";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.searchForEntities(userId,
                                                         searchCriteria,
-                                                        fromEntityDetailElement,
+                                                        fromEntityElement,
                                                         limitResultsByStatus,
                                                         limitResultsByClassification,
                                                         asOfTime,
@@ -1231,6 +1445,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                     RepositoryErrorException,
                                                                     UserNotAuthorizedException
     {
+        final String methodName = "isRelationshipKnown";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.isRelationshipKnown(userId, guid);
     }
 
@@ -1254,6 +1473,11 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                                                RelationshipNotKnownException,
                                                                UserNotAuthorizedException
     {
+        final String methodName = "getRelationship";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getRelationship(userId, guid);
     }
 
@@ -1264,13 +1488,13 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @param userId - unique identifier for requesting user.
      * @param guid - String unique identifier for the relationship.
      * @param asOfTime - the time used to determine which version of the entity that is desired.
-     * @return EntityDetail structure.
-     * @throws InvalidParameterException - the guid or date is null.
+     * @return Relationship structure.
+     * @throws InvalidParameterException - the guid or date is null or the date is for a future time.
      * @throws RepositoryErrorException - there is a problem communicating with the metadata repository where
      *                                 the metadata collection is stored.
      * @throws RelationshipNotKnownException - the requested entity instance is not known in the metadata collection
      *                                   at the time requested.
-     * @throws PropertyErrorException - the asOfTime property is for a future time.
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public  Relationship getRelationship(String    userId,
@@ -1278,9 +1502,14 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
                                          Date      asOfTime) throws InvalidParameterException,
                                                                     RepositoryErrorException,
                                                                     RelationshipNotKnownException,
-                                                                    PropertyErrorException,
+                                                                    FunctionNotSupportedException,
                                                                     UserNotAuthorizedException
     {
+        final String methodName = "getRelationship";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getRelationship(userId, guid, asOfTime);
     }
 
@@ -1293,7 +1522,7 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @param relationshipTypeGUID - unique identifier (guid) for the new relationship's type.
      * @param matchProperties - list of  properties used to narrow the search.
      * @param matchCriteria - Enum defining how the properties should be matched to the relationships in the repository.
-     * @param fromEntityDetailElement - the starting element number of the entities to return.
+     * @param fromRelationshipElement - the starting element number of the entities to return.
      *                                This is used when retrieving elements
      *                                beyond the first page of results. Zero means start from the first element.
      * @param limitResultsByStatus - By default, relationships in all statuses are returned.  However, it is possible
@@ -1315,29 +1544,36 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws PropertyErrorException - the properties specified are not valid for any of the requested types of
      *                                  relationships.
      * @throws PagingErrorException - the paging/sequencing parameters are set up incorrectly.
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
-    public  ArrayList<Relationship> findRelationshipsByProperty(String                    userId,
-                                                                String                    relationshipTypeGUID,
-                                                                InstanceProperties        matchProperties,
-                                                                MatchCriteria             matchCriteria,
-                                                                int                       fromEntityDetailElement,
-                                                                ArrayList<InstanceStatus> limitResultsByStatus,
-                                                                Date                      asOfTime,
-                                                                String                    sequencingProperty,
-                                                                SequencingOrder           sequencingOrder,
-                                                                int                       pageSize) throws InvalidParameterException,
-                                                                                                           RepositoryErrorException,
-                                                                                                           TypeErrorException,
-                                                                                                           PropertyErrorException,
-                                                                                                           PagingErrorException,
-                                                                                                           UserNotAuthorizedException
+    public  List<Relationship> findRelationshipsByProperty(String                    userId,
+                                                           String                    relationshipTypeGUID,
+                                                           InstanceProperties        matchProperties,
+                                                           MatchCriteria             matchCriteria,
+                                                           int                       fromRelationshipElement,
+                                                           List<InstanceStatus>      limitResultsByStatus,
+                                                           Date                      asOfTime,
+                                                           String                    sequencingProperty,
+                                                           SequencingOrder           sequencingOrder,
+                                                           int                       pageSize) throws InvalidParameterException,
+                                                                                                      RepositoryErrorException,
+                                                                                                      TypeErrorException,
+                                                                                                      PropertyErrorException,
+                                                                                                      PagingErrorException,
+                                                                                                      FunctionNotSupportedException,
+                                                                                                      UserNotAuthorizedException
     {
+        final String methodName = "findRelationshipsByProperty";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.findRelationshipsByProperty(userId,
                                                                   relationshipTypeGUID,
                                                                   matchProperties,
                                                                   matchCriteria,
-                                                                  fromEntityDetailElement,
+                                                                  fromRelationshipElement,
                                                                   limitResultsByStatus,
                                                                   asOfTime,
                                                                   sequencingProperty,
@@ -1370,21 +1606,28 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      *                                  the metadata collection is stored.
      * @throws PropertyErrorException - there is a problem with one of the other parameters.
      * @throws PagingErrorException - the paging/sequencing parameters are set up incorrectly.
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
-    public  ArrayList<Relationship> searchForRelationships(String                    userId,
-                                                           String                    searchCriteria,
-                                                           int                       fromRelationshipElement,
-                                                           ArrayList<InstanceStatus> limitResultsByStatus,
-                                                           Date                      asOfTime,
-                                                           String                    sequencingProperty,
-                                                           SequencingOrder           sequencingOrder,
-                                                           int                       pageSize) throws InvalidParameterException,
-                                                                                                      RepositoryErrorException,
-                                                                                                      PropertyErrorException,
-                                                                                                      PagingErrorException,
-                                                                                                      UserNotAuthorizedException
+    public  List<Relationship> searchForRelationships(String                    userId,
+                                                      String                    searchCriteria,
+                                                      int                       fromRelationshipElement,
+                                                      List<InstanceStatus>      limitResultsByStatus,
+                                                      Date                      asOfTime,
+                                                      String                    sequencingProperty,
+                                                      SequencingOrder           sequencingOrder,
+                                                      int                       pageSize) throws InvalidParameterException,
+                                                                                                 RepositoryErrorException,
+                                                                                                 PropertyErrorException,
+                                                                                                 PagingErrorException,
+                                                                                                 FunctionNotSupportedException,
+                                                                                                 UserNotAuthorizedException
     {
+        final String methodName = "searchForRelationships";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.searchForRelationships(userId,
                                                              searchCriteria,
                                                              fromRelationshipElement,
@@ -1414,18 +1657,25 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      * @throws EntityNotKnownException - the entity identified by either the startEntityGUID or the endEntityGUID
      *                                   is not found in the metadata collection.
      * @throws PropertyErrorException - there is a problem with one of the other parameters.
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
     public  InstanceGraph getLinkingEntities(String                    userId,
                                              String                    startEntityGUID,
                                              String                    endEntityGUID,
-                                             ArrayList<InstanceStatus> limitResultsByStatus,
+                                             List<InstanceStatus>      limitResultsByStatus,
                                              Date                      asOfTime) throws InvalidParameterException,
                                                                                         RepositoryErrorException,
                                                                                         EntityNotKnownException,
                                                                                         PropertyErrorException,
+                                                                                        FunctionNotSupportedException,
                                                                                         UserNotAuthorizedException
     {
+        final String methodName = "getLinkingEntities";
+
+        validateRepository(methodName);
+        repositoryValidator.validateUserId(repositoryName, userId, methodName);
+
         return realMetadataCollection.getLinkingEntities(userId,
                                                          startEntityGUID,
                                                          endEntityGUID,
@@ -1460,22 +1710,29 @@ public class LocalOMRSMetadataCollection extends OMRSMetadataCollection
      *                              metadata collection.
      * @throws EntityNotKnownException - the entity identified by the entityGUID is not found in the metadata collection.
      * @throws PropertyErrorException - there is a problem with one of the other parameters.
+     * @throws FunctionNotSupportedException - the repository does not support the asOfTime parameter.
      * @throws UserNotAuthorizedException - the userId is not permitted to perform this operation.
      */
-    public  InstanceGraph getEntityNeighborhood(String                    userId,
-                                                String                    entityGUID,
-                                                ArrayList<String>         entityTypeGUIDs,
-                                                ArrayList<String>         relationshipTypeGUIDs,
-                                                ArrayList<InstanceStatus> limitResultsByStatus,
-                                                ArrayList<String>         limitResultsByClassification,
-                                                Date                      asOfTime,
-                                                int                       level) throws InvalidParameterException,
-                                                                                        RepositoryErrorException,
-                                                                                        TypeErrorException,
-                                                                                        En

<TRUNCATED>