http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/README.md
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/README.md
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/README.md
new file mode 100644
index 0000000..ae9feac
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/README.md
@@ -0,0 +1,46 @@
+<!--
+  ~ 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
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ 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.
+  -->
+
+# AssetConsumer OMAS FFDC
+
+Package org.apache.atlas.omas.assetconsumer.ffdc provides the
+first failure data capture support for the AssetConsumer OMAS module.
+This includes an error code enum,
+a runtime exception, a base class for checked exceptions plus
+implementation of each specific checked exception.
+
+The error code enum (AssetConsumerErrorCode) has an entry for each unique 
situation
+where an exception is returned.  Each entry defines:
+
+* A unique id for the error
+* An HTTP error code for rest calls
+* A unique message Id
+* Message text with place holders for specific values
+* A description of the cause of the error and system action as a result.
+* A description of how to correct the error (if known)
+
+Each exception (whether a checked or runtime exception) has two constructors.
+
+* The first constructor is used when a new error has been detected.
+
+* The second constructor is used when another exception has been caught.
+This caught exception is passed on the constructor so it is effectively
+embedded in the AssetConsumer OMAS exception.
+
+Both constructors take the values from the AssetConsumerErrorCode
+enum to define the cause and resolution.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AmbiguousConnectionNameException.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AmbiguousConnectionNameException.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AmbiguousConnectionNameException.java
new file mode 100644
index 0000000..1215eda
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AmbiguousConnectionNameException.java
@@ -0,0 +1,59 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+
+/**
+ * The AmbiguousConnectionNameException is thrown by the Asset Consumer OMAS 
when a connection name used (typically the
+ * displayName) to request a connector instance is not unique and so the Asset 
Consumer OMAS is not able to determine
+ * which connection to use.
+ */
+public class AmbiguousConnectionNameException extends 
AssetConsumerCheckedExceptionBase
+{
+    /**
+     * This is the typical constructor used for creating a 
AmbiguousConnectionNameException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public AmbiguousConnectionNameException(int  httpCode, String className, 
String  actionDescription, String errorMessage, String systemAction, String 
userAction)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction);
+    }
+
+
+    /**
+     * This is the constructor used for creating a 
AmbiguousConnectionNameException that resulted from a previous error.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - the error that resulted in this exception.
+     * */
+    public AmbiguousConnectionNameException(int  httpCode, String className, 
String  actionDescription, String errorMessage, String systemAction, String 
userAction, Throwable caughtError)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction, caughtError);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AssetConsumerCheckedExceptionBase.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AssetConsumerCheckedExceptionBase.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AssetConsumerCheckedExceptionBase.java
new file mode 100644
index 0000000..4e22fb8
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AssetConsumerCheckedExceptionBase.java
@@ -0,0 +1,173 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+/**
+ * AssetConsumerCheckedExceptionBase provides a checked exception for 
reporting errors found when using
+ * the Asset Consumer OMAS services.
+ *
+ * Typically these errors are either configuration or operational errors that 
can be fixed by an administrator
+ * or power AssetConsumerInterface.  However, there may be the odd bug that 
surfaces here. The AssetConsumerErrorCode can be used with
+ * this exception to populate it with standard messages.  The aim is to be 
able to uniquely identify the cause
+ * and remedy for the error.
+ */
+public class AssetConsumerCheckedExceptionBase extends Exception
+{
+    /*
+     * These default values are only seen if this exception is initialized 
using one of its superclass constructors.
+     */
+    private int       reportedHTTPCode;
+    private String    reportingClassName;
+    private String    reportingActionDescription;
+    private String    reportedErrorMessage;
+    private String    reportedSystemAction;
+    private String    reportedUserAction;
+    private Throwable reportedCaughtException = null;
+
+
+    /**
+     * This is the typical constructor used for creating a 
ConnectionCheckedException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public AssetConsumerCheckedExceptionBase(int    httpCode,
+                                             String className,
+                                             String actionDescription,
+                                             String errorMessage,
+                                             String systemAction,
+                                             String userAction)
+    {
+        super(errorMessage);
+        this.reportedHTTPCode = httpCode;
+        this.reportingClassName = className;
+        this.reportingActionDescription = actionDescription;
+        this.reportedErrorMessage = errorMessage;
+        this.reportedSystemAction = systemAction;
+        this.reportedUserAction = userAction;
+    }
+
+
+    /**
+     * This is the  constructor used for creating a ConnectionCheckedException 
that resulted from a previous error.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - the error that resulted in this exception.
+     */
+    public AssetConsumerCheckedExceptionBase(int       httpCode,
+                                             String    className,
+                                             String    actionDescription,
+                                             String    errorMessage,
+                                             String    systemAction,
+                                             String    userAction,
+                                             Throwable caughtError)
+    {
+        super(errorMessage, caughtError);
+        this.reportedHTTPCode = httpCode;
+        this.reportingClassName = className;
+        this.reportingActionDescription = actionDescription;
+        this.reportedErrorMessage = errorMessage;
+        this.reportedSystemAction = systemAction;
+        this.reportedUserAction = userAction;
+        this.reportedCaughtException = caughtError;
+    }
+
+
+    /**
+     * Return the HTTP response code to use with this exception.
+     *
+     * @return reportedHTTPCode
+     */
+    public int getReportedHTTPCode()
+    {
+        return reportedHTTPCode;
+    }
+
+    /**
+     * The class that created this exception.
+     *
+     * @return reportingClassName
+     */
+    public String getReportingClassName()
+    {
+        return reportingClassName;
+    }
+
+
+    /**
+     * The type of request that the class was performing when the condition 
occurred that resulted in this
+     * exception.
+     *
+     * @return reportingActionDescription
+     */
+    public String getReportingActionDescription()
+    {
+        return reportingActionDescription;
+    }
+
+
+    /**
+     * A formatted short description of the cause of the condition that 
resulted in this exception.
+     *
+     * @return reportedErrorMessage
+     */
+    public String getErrorMessage()
+    {
+        return reportedErrorMessage;
+    }
+
+
+    /**
+     * A description of the action that the system took as a result of the 
error condition.
+     *
+     * @return reportedSystemAction
+     */
+    public String getReportedSystemAction()
+    {
+        return reportedSystemAction;
+    }
+
+
+    /**
+     * A description of the action necessary to correct the error.
+     *
+     * @return reportedUserAction
+     */
+    public String getReportedUserAction()
+    {
+        return reportedUserAction;
+    }
+
+
+    /**
+     * An exception that was caught and wrapped by this exception.  If a null 
is returned, then this exception is
+     * newly created and not the result of a previous exception.
+     *
+     * @return reportedCaughtException
+     */
+    public Throwable getReportedCaughtException() { return 
reportedCaughtException; }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AssetConsumerRuntimeException.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AssetConsumerRuntimeException.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AssetConsumerRuntimeException.java
new file mode 100644
index 0000000..d8444b4
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/AssetConsumerRuntimeException.java
@@ -0,0 +1,158 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+/**
+ * AssetConsumerRuntimeException is used for all runtime exceptions generated 
by the connected asset OMAS.
+ * It is used in conjunction with the AssetConsumerErrorCode to provide first 
failure data capture for these errors.
+ */
+public class AssetConsumerRuntimeException extends RuntimeException
+{
+    /*
+     * These default values are only seen if this exception is initialized 
using one of its superclass constructors.
+     */
+    private int       reportedHTTPCode = 500;
+    private String    reportingClassName = "<Unknown>";
+    private String    reportingActionDescription = "<Unknown>";
+    private String    reportedErrorMessage = "<Unknown>";
+    private String    reportedSystemAction = "<Unknown>";
+    private String    reportedUserAction = "<Unknown>";
+    private Throwable reportedCaughtException = null;
+
+
+    /**
+     * This is the typical constructor used for creating an 
AssetConsumerRuntimeException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public AssetConsumerRuntimeException(int  httpCode, String className, 
String  actionDescription, String errorMessage, String systemAction, String 
userAction)
+    {
+        super(errorMessage);
+        this.reportedHTTPCode = httpCode;
+        this.reportingClassName = className;
+        this.reportingActionDescription = actionDescription;
+        this.reportedErrorMessage = errorMessage;
+        this.reportedSystemAction = systemAction;
+        this.reportedUserAction = userAction;
+    }
+
+
+    /**
+     * This is the constructor used for creating a 
AssetConsumerRuntimeException when an unexpected error has been
+     * caught.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - previous error causing this exception
+     */
+    public AssetConsumerRuntimeException(int  httpCode, String className, 
String  actionDescription, String errorMessage, String systemAction, String 
userAction, Throwable caughtError)
+    {
+        super(errorMessage, caughtError);
+        this.reportedHTTPCode = httpCode;
+        this.reportingClassName = className;
+        this.reportingActionDescription = actionDescription;
+        this.reportedErrorMessage = errorMessage;
+        this.reportedSystemAction = systemAction;
+        this.reportedUserAction = userAction;
+        this.reportedCaughtException = caughtError;
+    }
+
+
+    /**
+     * Return the HTTP response code to use with this exception.
+     *
+     * @return reportedHTTPCode
+     */
+    public int getReportedHTTPCode()
+    {
+        return reportedHTTPCode;
+    }
+
+    /**
+     * The class that created this exception.
+     *
+     * @return reportingClassName
+     */
+    public String getReportingClassName()
+    {
+        return reportingClassName;
+    }
+
+
+    /**
+     * The type of request that the class was performing when the condition 
occurred that resulted in this
+     * exception.
+     *
+     * @return reportingActionDescription
+     */
+    public String getReportingActionDescription()
+    {
+        return reportingActionDescription;
+    }
+
+
+    /**
+     * A formatted short description of the cause of the condition that 
resulted in this exception.
+     *
+     * @return reportedErrorMessage
+     */
+    public String getErrorMessage()
+    {
+        return reportedErrorMessage;
+    }
+
+
+    /**
+     * A description of the action that the system took as a result of the 
error condition.
+     *
+     * @return reportedSystemAction
+     */
+    public String getReportedSystemAction()
+    {
+        return reportedSystemAction;
+    }
+
+
+    /**
+     * A description of the action necessary to correct the error.
+     *
+     * @return reportedUserAction
+     */
+    public String getReportedUserAction()
+    {
+        return reportedUserAction;
+    }
+
+
+    /**
+     * An exception that was caught and wrapped by this exception.  If a null 
is returned, then this exception is
+     * newly created and not the result of a previous exception.
+     *
+     * @return reportedCaughtException
+     */
+    public Throwable getReportedCaughtException() { return 
reportedCaughtException; }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/InvalidParameterException.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/InvalidParameterException.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/InvalidParameterException.java
new file mode 100644
index 0000000..084fb8b
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/InvalidParameterException.java
@@ -0,0 +1,58 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+
+/**
+ * The InvalidParameterException is thrown by the Asset Consumer OMAS when a 
parameters is null or an invalid
+ * value.
+ */
+public class InvalidParameterException extends 
AssetConsumerCheckedExceptionBase
+{
+    /**
+     * This is the typical constructor used for creating a 
InvalidParameterException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public InvalidParameterException(int  httpCode, String className, String  
actionDescription, String errorMessage, String systemAction, String userAction)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction);
+    }
+
+
+    /**
+     * This is the constructor used for creating a InvalidParameterException 
that resulted from a previous error.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - the error that resulted in this exception.
+     * */
+    public InvalidParameterException(int  httpCode, String className, String  
actionDescription, String errorMessage, String systemAction, String userAction, 
Throwable caughtError)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction, caughtError);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/PropertyServerException.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/PropertyServerException.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/PropertyServerException.java
new file mode 100644
index 0000000..fc74608
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/PropertyServerException.java
@@ -0,0 +1,58 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+
+/**
+ * The PropertyServerException is thrown by the Asset Consumer OMAS when it is 
not able to communicate with the
+ * property server.
+ */
+public class PropertyServerException extends AssetConsumerCheckedExceptionBase
+{
+    /**
+     * This is the typical constructor used for creating a 
PropertyServerException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public PropertyServerException(int  httpCode, String className, String  
actionDescription, String errorMessage, String systemAction, String userAction)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction);
+    }
+
+
+    /**
+     * This is the constructor used for creating a PropertyServerException 
that resulted from a previous error.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - the error that resulted in this exception.
+     * */
+    public PropertyServerException(int  httpCode, String className, String  
actionDescription, String errorMessage, String systemAction, String userAction, 
Throwable caughtError)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction, caughtError);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionGUIDException.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionGUIDException.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionGUIDException.java
new file mode 100644
index 0000000..3af8474
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionGUIDException.java
@@ -0,0 +1,59 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+
+/**
+ * The UnrecognizedConnectionGUIDException is thrown by the Asset Consumer 
OMAS when the unique identifier (guid)
+ * used to request a connection object from the property server is either 
unrecognized, or is the identifier
+ * for a different type of object.
+ */
+public class UnrecognizedConnectionGUIDException extends 
AssetConsumerCheckedExceptionBase
+{
+    /**
+     * This is the typical constructor used for creating a 
UnrecognizedConnectionGUIDException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public UnrecognizedConnectionGUIDException(int  httpCode, String 
className, String  actionDescription, String errorMessage, String systemAction, 
String userAction)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction);
+    }
+
+
+    /**
+     * This is the constructor used for creating a 
UnrecognizedConnectionGUIDException that resulted from a previous error.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - the error that resulted in this exception.
+     */
+    public UnrecognizedConnectionGUIDException(int  httpCode, String 
className, String  actionDescription, String errorMessage, String systemAction, 
String userAction, Throwable caughtError)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction, caughtError);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionNameException.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionNameException.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionNameException.java
new file mode 100644
index 0000000..3e29fa5
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionNameException.java
@@ -0,0 +1,58 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+/**
+ * The UnrecognizedConnectionNameException is thrown by the Asset Consumer 
OMAS when a connection name used
+ * to request a Connection or Connector is not recognized and so the Asset 
Consumer OMAS is not able to determine
+ * which connection to use.
+ */
+public class UnrecognizedConnectionNameException extends 
AssetConsumerCheckedExceptionBase
+{
+    /**
+     * This is the typical constructor used for creating a 
UnrecognizedConnectionNameException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public UnrecognizedConnectionNameException(int  httpCode, String 
className, String  actionDescription, String errorMessage, String systemAction, 
String userAction)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction);
+    }
+
+
+    /**
+     * This is the constructor used for creating a 
UnrecognizedConnectionNameException that resulted from a previous error.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - the error that resulted in this exception.
+     */
+    public UnrecognizedConnectionNameException(int  httpCode, String 
className, String  actionDescription, String errorMessage, String systemAction, 
String userAction, Throwable caughtError)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction, caughtError);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionURLException.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionURLException.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionURLException.java
new file mode 100644
index 0000000..668e28c
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UnrecognizedConnectionURLException.java
@@ -0,0 +1,58 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+/**
+ * The UnrecognizedConnectionURLException is thrown by the Asset Consumer OMAS 
when a connection URL used
+ * to request a Connection or Connector is not recognized and so the Asset 
Consumer OMAS is not able to determine
+ * which connection to use.
+ */
+public class UnrecognizedConnectionURLException extends 
AssetConsumerCheckedExceptionBase
+{
+    /**
+     * This is the typical constructor used for creating a 
UnrecognizedConnectionURLException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public UnrecognizedConnectionURLException(int  httpCode, String className, 
String  actionDescription, String errorMessage, String systemAction, String 
userAction)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction);
+    }
+
+
+    /**
+     * This is the constructor used for creating a 
UnrecognizedConnectionURLException that resulted from a previous error.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - the error that resulted in this exception.
+     */
+    public UnrecognizedConnectionURLException(int  httpCode, String className, 
String  actionDescription, String errorMessage, String systemAction, String 
userAction, Throwable caughtError)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction, caughtError);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UserNotAuthorizedException.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UserNotAuthorizedException.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UserNotAuthorizedException.java
new file mode 100644
index 0000000..9441940
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/ffdc/exceptions/UserNotAuthorizedException.java
@@ -0,0 +1,58 @@
+/*
+ * 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.omas.assetconsumer.ffdc.exceptions;
+
+
+/**
+ * The UserNotAuthorizedException is thrown by the Asset Consumer OMAS when a 
userId passed on a request is not
+ * authorized to perform the requested action.
+ */
+public class UserNotAuthorizedException extends 
AssetConsumerCheckedExceptionBase
+{
+    /**
+     * This is the typical constructor used for creating a 
UserNotAuthorizedException.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     */
+    public UserNotAuthorizedException(int  httpCode, String className, String  
actionDescription, String errorMessage, String systemAction, String userAction)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction);
+    }
+
+
+    /**
+     * This is the constructor used for creating a UserNotAuthorizedException 
that resulted from a previous error.
+     *
+     * @param httpCode - http response code to use if this exception flows 
over a rest call
+     * @param className - name of class reporting error
+     * @param actionDescription - description of function it was performing 
when error detected
+     * @param errorMessage - description of error
+     * @param systemAction - actions of the system as a result of the error
+     * @param userAction - instructions for correcting the error
+     * @param caughtError - the error that resulted in this exception.
+     * */
+    public UserNotAuthorizedException(int  httpCode, String className, String  
actionDescription, String errorMessage, String systemAction, String userAction, 
Throwable caughtError)
+    {
+        super(httpCode, className, actionDescription, errorMessage, 
systemAction, userAction, caughtError);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/listener/AssetConsumerOMRSTopicListener.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/listener/AssetConsumerOMRSTopicListener.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/listener/AssetConsumerOMRSTopicListener.java
new file mode 100644
index 0000000..3eb4cad
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/listener/AssetConsumerOMRSTopicListener.java
@@ -0,0 +1,249 @@
+/*
+ * 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.omas.assetconsumer.listener;
+
+import org.apache.atlas.ocf.properties.Connection;
+import org.apache.atlas.omas.assetconsumer.publisher.AssetConsumerPublisher;
+import org.apache.atlas.omrs.eventmanagement.events.OMRSEventOriginator;
+import org.apache.atlas.omrs.eventmanagement.events.OMRSInstanceEvent;
+import org.apache.atlas.omrs.eventmanagement.events.OMRSInstanceEventType;
+import org.apache.atlas.omrs.eventmanagement.events.v1.OMRSEventV1;
+import 
org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSRepositoryHelper;
+import 
org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSRepositoryValidator;
+import org.apache.atlas.omrs.topicconnectors.OMRSTopicListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AssetConsumerOMRSTopicListener implements OMRSTopicListener
+{
+    private static final Logger log = 
LoggerFactory.getLogger(AssetConsumerOMRSTopicListener.class);
+
+    private AssetConsumerPublisher   publisher;
+
+
+    /**
+     * The constructor is given the connection to the out topic for Asset 
Consumer OMAS
+     * along with classes for testing and manipulating instances.
+     *
+     * @param assetConsumerOutTopic - connection to the out topic
+     * @param repositoryHelper - provides methods for working with metadata 
instances
+     * @param repositoryValidator - provides validation of metadata instance
+     * @param componentName - name of component
+     */
+    public AssetConsumerOMRSTopicListener(Connection              
assetConsumerOutTopic,
+                                          OMRSRepositoryHelper    
repositoryHelper,
+                                          OMRSRepositoryValidator 
repositoryValidator,
+                                          String                  
componentName)
+    {
+        publisher = new AssetConsumerPublisher(assetConsumerOutTopic,
+                                               repositoryHelper,
+                                               repositoryValidator,
+                                               componentName);
+    }
+
+
+    /**
+     * Method to pass an event received on topic.
+     *
+     * @param event - inbound event
+     */
+    public void processEvent(OMRSEventV1 event)
+    {
+        /*
+         * The event should not be null but worth checking.
+         */
+        if (event != null)
+        {
+            /*
+             * Determine the category of event to process.
+             */
+            switch (event.getEventCategory())
+            {
+                case REGISTRY:
+                    if (log.isDebugEnabled())
+                    {
+                        log.debug("Ignoring registry event: " + 
event.toString());
+                    }
+                    break;
+
+                case TYPEDEF:
+                    if (log.isDebugEnabled())
+                    {
+                        log.debug("Ignoring type event: " + event.toString());
+                    }
+                    break;
+
+                case INSTANCE:
+                    this.processInstanceEvent(new OMRSInstanceEvent(event));
+                    break;
+
+                default:
+                    if (log.isDebugEnabled())
+                    {
+                        log.debug("Unknown event received :|");
+                    }
+            }
+        }
+        else
+        {
+            if (log.isDebugEnabled())
+            {
+                log.debug("Null OMRS Event received :(");
+            }
+        }
+    }
+
+
+    /**
+     * Unpack and deliver an instance event to the InstanceEventProcessor
+     *
+     * @param instanceEvent - event to unpack
+     */
+    private void processInstanceEvent(OMRSInstanceEvent  instanceEvent)
+    {
+        if (log.isDebugEnabled())
+        {
+            log.debug("Processing instance event", instanceEvent);
+        }
+
+        if (instanceEvent == null)
+        {
+            if (log.isDebugEnabled())
+            {
+                log.debug("Null instance event - ignoring event");
+            }
+        }
+        else
+        {
+            OMRSInstanceEventType instanceEventType       = 
instanceEvent.getInstanceEventType();
+            OMRSEventOriginator   instanceEventOriginator = 
instanceEvent.getEventOriginator();
+
+            if ((instanceEventType != null) && (instanceEventOriginator != 
null))
+            {
+                switch (instanceEventType)
+                {
+                    case NEW_ENTITY_EVENT:
+                        publisher.processNewEntity(instanceEvent.getEntity());
+                        break;
+
+                    case UPDATED_ENTITY_EVENT:
+                        
publisher.processUpdatedEntity(instanceEvent.getEntity());
+                        break;
+
+                    case CLASSIFIED_ENTITY_EVENT:
+                        
publisher.processUpdatedEntity(instanceEvent.getEntity());
+                        break;
+
+                    case RECLASSIFIED_ENTITY_EVENT:
+                        
publisher.processUpdatedEntity(instanceEvent.getEntity());
+                        break;
+
+                    case DECLASSIFIED_ENTITY_EVENT:
+                        
publisher.processUpdatedEntity(instanceEvent.getEntity());
+                        break;
+
+                    case DELETED_ENTITY_EVENT:
+                        
publisher.processDeletedEntity(instanceEvent.getEntity());
+                        break;
+
+                    case PURGED_ENTITY_EVENT:
+                        if (log.isDebugEnabled())
+                        {
+                            log.debug("Ignoring entity purge events");
+                        }
+                        break;
+
+                    case UNDONE_ENTITY_EVENT:
+                        
publisher.processUpdatedEntity(instanceEvent.getEntity());
+                        break;
+
+                    case RESTORED_ENTITY_EVENT:
+                        
publisher.processRestoredEntity(instanceEvent.getEntity());
+                        break;
+
+                    case REFRESH_ENTITY_REQUEST:
+                    case REFRESHED_ENTITY_EVENT:
+                    case RE_HOMED_ENTITY_EVENT:
+                    case RETYPED_ENTITY_EVENT:
+                    case RE_IDENTIFIED_ENTITY_EVENT:
+                        if (log.isDebugEnabled())
+                        {
+                            log.debug("Ignoring entity repository maintenance 
events");
+                        }
+                        break;
+
+                    case NEW_RELATIONSHIP_EVENT:
+                        
publisher.processNewRelationship(instanceEvent.getRelationship());
+                        break;
+
+                    case UPDATED_RELATIONSHIP_EVENT:
+                        
publisher.processUpdatedRelationship(instanceEvent.getRelationship());
+                        break;
+
+                    case UNDONE_RELATIONSHIP_EVENT:
+                        
publisher.processUpdatedRelationship(instanceEvent.getRelationship());
+                        break;
+
+                    case DELETED_RELATIONSHIP_EVENT:
+                        
publisher.processDeletedRelationship(instanceEvent.getRelationship());
+
+                        break;
+
+                    case PURGED_RELATIONSHIP_EVENT:
+                        if (log.isDebugEnabled())
+                        {
+                            log.debug("Ignoring relationship purge events");
+                        }
+                        break;
+
+                    case RESTORED_RELATIONSHIP_EVENT:
+                        
publisher.processRestoredRelationship(instanceEvent.getRelationship());
+
+                        break;
+
+                    case REFRESH_RELATIONSHIP_REQUEST:
+                    case REFRESHED_RELATIONSHIP_EVENT:
+                    case RE_IDENTIFIED_RELATIONSHIP_EVENT:
+                    case RE_HOMED_RELATIONSHIP_EVENT:
+                    case RETYPED_RELATIONSHIP_EVENT:
+
+                        if (log.isDebugEnabled())
+                        {
+                            log.debug("Ignoring relationship repository 
maintenance events");
+                        }
+                        break;
+
+                    case INSTANCE_ERROR_EVENT:
+
+                        if (log.isDebugEnabled())
+                        {
+                            log.debug("Ignoring instance error events");
+                        }
+                        break;
+                }
+            }
+            else
+            {
+                if (log.isDebugEnabled())
+                {
+                    log.debug("Ignored instance event - null type");
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/properties/Asset.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/properties/Asset.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/properties/Asset.java
new file mode 100644
index 0000000..7a69604
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/properties/Asset.java
@@ -0,0 +1,179 @@
+/*
+ * 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.omas.assetconsumer.properties;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
+/**
+ * Asset describes the basic properties of an Asset
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class Asset
+{
+    /*
+     * URL where the metadata about the asset is located.  It remains null if 
no repository is known.
+     */
+
+    /*
+     * Unique id for the asset.
+     */
+    protected String url              = null;
+    protected String guid             = null;
+    protected String typeId           = null;
+    protected String typeName         = null;
+    protected long   typeVersion      = 0;
+    protected String typeDescription  = null;
+    protected String qualifiedName    = null;
+    protected String displayName      = null;
+    protected String description      = null;
+    protected String owner            = null;
+
+    /**
+     * Default constructor
+     */
+    public Asset()
+    {
+    }
+
+    public String getURL()
+    {
+        return url;
+    }
+
+    public void setURL(String url)
+    {
+        this.url = url;
+    }
+
+    public String getGUID()
+    {
+        return guid;
+    }
+
+    public void setGUID(String guid)
+    {
+        this.guid = guid;
+    }
+
+    public String getTypeId()
+    {
+        return typeId;
+    }
+
+    public void setTypeId(String typeId)
+    {
+        this.typeId = typeId;
+    }
+
+    public String getTypeName()
+    {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName)
+    {
+        this.typeName = typeName;
+    }
+
+    public long getTypeVersion()
+    {
+        return typeVersion;
+    }
+
+    public void setTypeVersion(long typeVersion)
+    {
+        this.typeVersion = typeVersion;
+    }
+
+    public String getTypeDescription()
+    {
+        return typeDescription;
+    }
+
+    public void setTypeDescription(String typeDescription)
+    {
+        this.typeDescription = typeDescription;
+    }
+
+    public String getQualifiedName()
+    {
+        return qualifiedName;
+    }
+
+    public void setQualifiedName(String qualifiedName)
+    {
+        this.qualifiedName = qualifiedName;
+    }
+
+    public String getDisplayName()
+    {
+        return displayName;
+    }
+
+    public void setDisplayName(String displayName)
+    {
+        this.displayName = displayName;
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+    public String getOwner()
+    {
+        return owner;
+    }
+
+    public void setOwner(String owner)
+    {
+        this.owner = owner;
+    }
+
+
+    @Override
+    public String toString()
+    {
+        return "Asset{" +
+                "url='" + url + '\'' +
+                ", guid='" + guid + '\'' +
+                ", typeId='" + typeId + '\'' +
+                ", typeName='" + typeName + '\'' +
+                ", typeVersion=" + typeVersion +
+                ", typeDescription='" + typeDescription + '\'' +
+                ", qualifiedName='" + qualifiedName + '\'' +
+                ", displayName='" + displayName + '\'' +
+                ", description='" + description + '\'' +
+                ", owner='" + owner + '\'' +
+                ", URL='" + getURL() + '\'' +
+                ", GUID='" + getGUID() + '\'' +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/f57fd7f0/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/publisher/AssetConsumerPublisher.java
----------------------------------------------------------------------
diff --git 
a/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/publisher/AssetConsumerPublisher.java
 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/publisher/AssetConsumerPublisher.java
new file mode 100644
index 0000000..d14fd1d
--- /dev/null
+++ 
b/omas-assetconsumer/src/main/java/org/apache/atlas/omas/assetconsumer/publisher/AssetConsumerPublisher.java
@@ -0,0 +1,319 @@
+/*
+ * 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.omas.assetconsumer.publisher;
+
+
+import org.apache.atlas.ocf.properties.Connection;
+import org.apache.atlas.omas.assetconsumer.properties.Asset;
+import 
org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSRepositoryHelper;
+import 
org.apache.atlas.omrs.localrepository.repositorycontentmanager.OMRSRepositoryValidator;
+import org.apache.atlas.omrs.metadatacollection.properties.instances.*;
+import 
org.apache.atlas.omrs.metadatacollection.properties.typedefs.TypeDefLink;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * AssetConsumerPublisher is responsible for publishing events about assets.  
It is called
+ * when an interesting OMRS Event is added to the Enterprise OMRS Topic.  It 
adds events to the Asset Consumer OMAS
+ * out topic.
+ */
+public class AssetConsumerPublisher
+{
+    private static final String assetTypeName                  = "Asset";
+    private static final String assetPropertyNameQualifiedName = 
"qualifiedName";
+    private static final String assetPropertyNameDisplayName   = "name";
+    private static final String assetPropertyNameOwner         = "owner";
+    private static final String assetPropertyNameDescription   = "description";
+
+    private static final Logger log = 
LoggerFactory.getLogger(AssetConsumerPublisher.class);
+
+    private Connection              assetConsumerOutTopic;
+    private OMRSRepositoryHelper    repositoryHelper;
+    private OMRSRepositoryValidator repositoryValidator;
+    private String                  componentName;
+
+
+    /**
+     * The constructor is given the connection to the out topic for Asset 
Consumer OMAS
+     * along with classes for testing and manipulating instances.
+     *
+     * @param assetConsumerOutTopic - connection to the out topic
+     * @param repositoryHelper - provides methods for working with metadata 
instances
+     * @param repositoryValidator - provides validation of metadata instance
+     * @param componentName - name of component
+     */
+    public AssetConsumerPublisher(Connection              
assetConsumerOutTopic,
+                                  OMRSRepositoryHelper    repositoryHelper,
+                                  OMRSRepositoryValidator repositoryValidator,
+                                  String                  componentName)
+    {
+        this.assetConsumerOutTopic = assetConsumerOutTopic;
+        this.repositoryHelper = repositoryHelper;
+        this.repositoryValidator = repositoryValidator;
+        this.componentName = componentName;
+    }
+
+
+    /**
+     * Determine whether a new entity is an Asset.  If it is then publish an 
Asset Consumer Event about it.
+     *
+     * @param entity - entity object that has just been created.
+     */
+    public void processNewEntity(EntityDetail   entity)
+    {
+        String assetType = getAssetType(entity);
+
+        if (assetType != null)
+        {
+            this.processNewAsset(this.getAsset(entity));
+        }
+    }
+
+
+    /**
+     * Determine whether an updated entity is an Asset.  If it is then publish 
an Asset Consumer Event about it.
+     *
+     * @param entity - entity object that has just been updated.
+     */
+    public void processUpdatedEntity(EntityDetail   entity)
+    {
+        String assetType = getAssetType(entity);
+
+        if (assetType != null)
+        {
+            this.processUpdatedAsset(this.getAsset(entity));
+        }
+    }
+
+
+    /**
+     * Determine whether a deleted entity is an Asset.  If it is then publish 
an Asset Consumer Event about it.
+     *
+     * @param entity - entity object that has just been deleted.
+     */
+    public void processDeletedEntity(EntityDetail   entity)
+    {
+        String assetType = getAssetType(entity);
+
+        if (assetType != null)
+        {
+            this.processDeletedAsset(this.getAsset(entity));
+        }
+    }
+
+
+    /**
+     * Determine whether a restored entity is an Asset.  If it is then publish 
an Asset Consumer Event about it.
+     *
+     * @param entity - entity object that has just been restored.
+     */
+    public void processRestoredEntity(EntityDetail   entity)
+    {
+        String assetType = getAssetType(entity);
+
+        if (assetType != null)
+        {
+            this.processRestoredAsset(this.getAsset(entity));
+        }
+    }
+
+
+    /**
+     * Determine whether a new relationship is related to an Asset.
+     * If it is then publish an Asset Consumer Event about it.
+     *
+     * @param relationship - relationship object that has just been created.
+     */
+    public void processNewRelationship(Relationship   relationship)
+    {
+        // todo
+    }
+
+
+    /**
+     * Determine whether an updated relationship is related to an Asset.
+     * If it is then publish an Asset Consumer Event about it.
+     *
+     * @param relationship - relationship object that has just been updated.
+     */
+    public void processUpdatedRelationship(Relationship   relationship)
+    {
+        // todo
+    }
+
+
+    /**
+     * Determine whether a deleted relationship is related to an Asset.
+     * If it is then publish an Asset Consumer Event about it.
+     *
+     * @param relationship - relationship object that has just been deleted.
+     */
+    public void processDeletedRelationship(Relationship   relationship)
+    {
+        // todo
+    }
+
+
+    /**
+     * Determine whether a restored relationship is related to an Asset.
+     * If it is then publish an Asset Consumer Event about it.
+     *
+     * @param relationship - relationship object that has just been restored.
+     */
+    public void processRestoredRelationship(Relationship   relationship)
+    {
+        // todo
+    }
+
+
+    /**
+     * Return the name of the Asset type if this entity has a type that 
inherits from Asset.
+     *
+     * @param entity - entity to test
+     * @return String containing Asset type name, or null if not an Asset.
+     */
+    private String getAssetType(EntityDetail  entity)
+    {
+        final   String   methodName = "getAssetType";
+
+        if (repositoryValidator.isATypeOf(componentName, entity, 
assetTypeName, methodName))
+        {
+            InstanceType   entityType = entity.getType();
+
+            if (entityType != null)
+            {
+                return entityType.getTypeDefName();
+            }
+        }
+
+        return null;
+    }
+
+
+    /**
+     * Return an Asset object extracted from the supplied entity object
+     * @param entity - entity describing the asset
+     * @return Asset object
+     */
+    private Asset getAsset(EntityDetail   entity)
+    {
+        Asset   asset = new Asset();
+
+        if (entity != null)
+        {
+            asset.setURL(entity.getInstanceURL());
+            asset.setGUID(entity.getGUID());
+
+            InstanceType  instanceType = entity.getType();
+            if (instanceType != null)
+            {
+                asset.setTypeId(instanceType.getTypeDefGUID());
+                asset.setTypeName(instanceType.getTypeDefName());
+                asset.setTypeVersion(instanceType.getTypeDefVersion());
+                asset.setTypeDescription(instanceType.getTypeDefDescription());
+            }
+
+            InstanceProperties instanceProperties = entity.getProperties();
+
+            if (instanceProperties != null)
+            {
+                InstancePropertyValue  instancePropertyValue;
+
+                instancePropertyValue = 
instanceProperties.getPropertyValue(assetPropertyNameQualifiedName);
+
+                if (instancePropertyValue != null)
+                {
+                    PrimitivePropertyValue  primitivePropertyValue = 
(PrimitivePropertyValue)instancePropertyValue;
+                    asset.setQualifiedName(primitivePropertyValue.toString());
+                }
+
+                instancePropertyValue = 
instanceProperties.getPropertyValue(assetPropertyNameDisplayName);
+
+                if (instancePropertyValue != null)
+                {
+                    PrimitivePropertyValue  primitivePropertyValue = 
(PrimitivePropertyValue)instancePropertyValue;
+                    asset.setDisplayName(primitivePropertyValue.toString());
+                }
+
+                instancePropertyValue = 
instanceProperties.getPropertyValue(assetPropertyNameOwner);
+
+                if (instancePropertyValue != null)
+                {
+                    PrimitivePropertyValue  primitivePropertyValue = 
(PrimitivePropertyValue)instancePropertyValue;
+                    asset.setOwner(primitivePropertyValue.toString());
+                }
+
+                instancePropertyValue = 
instanceProperties.getPropertyValue(assetPropertyNameDescription);
+
+                if (instancePropertyValue != null)
+                {
+                    PrimitivePropertyValue  primitivePropertyValue = 
(PrimitivePropertyValue)instancePropertyValue;
+                    asset.setDescription(primitivePropertyValue.toString());
+                }
+            }
+        }
+
+        return asset;
+    }
+
+
+    /**
+     * Publish event about a new asset.
+     *
+     * @param asset - asset to report on.
+     */
+    private void processNewAsset(Asset   asset)
+    {
+        log.info("Asset Consumer Event => New Asset: " + asset.toString());
+    }
+
+
+    /**
+     * Publish event about an updated asset.
+     *
+     * @param asset - asset to report on.
+     */
+    private void processUpdatedAsset(Asset   asset)
+    {
+        log.info("Asset Consumer Event => Updated Asset: " + asset.toString());
+    }
+
+
+    /**
+     * Publish event about a deleted asset.
+     *
+     * @param asset - asset to report on.
+     */
+    private void processDeletedAsset(Asset   asset)
+    {
+        log.info("Asset Consumer Event => Deleted Asset: " + asset.toString());
+    }
+
+
+    /**
+     * Publish event about a restored asset.
+     *
+     * @param asset - asset to report on.
+     */
+    private void processRestoredAsset(Asset   asset)
+    {
+        log.info("Asset Consumer Event => Restored Asset: " + 
asset.toString());
+    }
+}

Reply via email to