http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/MatchCriteria.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/MatchCriteria.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/MatchCriteria.java
index b60558e..300f28a 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/MatchCriteria.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/MatchCriteria.java
@@ -18,8 +18,15 @@
 package org.apache.atlas.omrs.metadatacollection.properties;
 
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * The MatchCriteria enum defines how the metadata instances in the metadata 
collection should be matched
  * against the properties supplied on the search request.
@@ -29,6 +36,9 @@ import java.io.Serializable;
  *     <li>NONE means return instances where none of the supplied properties 
match.</li>
  * </ul>
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum MatchCriteria implements Serializable
 {
     ALL  (0, "All",  "All properties must match."),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/SequencingOrder.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/SequencingOrder.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/SequencingOrder.java
index 9ed91c7..5c1998f 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/SequencingOrder.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/SequencingOrder.java
@@ -17,8 +17,15 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * SequencingOrder is used for search requests against a metadata collection.  
It defines how the results should
  * to be ordered before they are returned.  This is particularly important 
when the results are to returned
@@ -55,6 +62,9 @@ import java.io.Serializable;
  *     </li>
  * </ul>
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum SequencingOrder implements Serializable
 {
     ANY                  (0, "Any Order",                       "Any order."),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ArrayPropertyValue.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ArrayPropertyValue.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ArrayPropertyValue.java
index 055293d..154eb16 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ArrayPropertyValue.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ArrayPropertyValue.java
@@ -17,14 +17,25 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import org.apache.atlas.omrs.ffdc.OMRSErrorCode;
 import org.apache.atlas.omrs.ffdc.exception.OMRSRuntimeException;
 
+import java.util.Objects;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * ArrayPropertyValue stores the values of an array within an entity, struct 
or relationship properties.
  * The elements of the array are stored in an InstanceProperties map where the 
property name is set to the element
  * number and the property value is set to the value of the element in the 
array.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class ArrayPropertyValue extends InstancePropertyValue
 {
     private  int                   arrayCount = 0;
@@ -152,4 +163,29 @@ public class ArrayPropertyValue extends 
InstancePropertyValue
                 ", typeName='" + getTypeName() + '\'' +
                 '}';
     }
+
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+        ArrayPropertyValue that = (ArrayPropertyValue) o;
+        return arrayCount == that.arrayCount &&
+                Objects.equals(arrayValues, that.arrayValues);
+    }
+
+
+    @Override
+    public int hashCode()
+    {
+
+        return Objects.hash(arrayCount, arrayValues);
+    }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Classification.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Classification.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Classification.java
index 98d41f3..0b994dc 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Classification.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Classification.java
@@ -17,9 +17,15 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import org.apache.atlas.omrs.ffdc.OMRSErrorCode;
 import org.apache.atlas.omrs.ffdc.exception.OMRSRuntimeException;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 
 /**
  * The Classification class stores information about a classification assigned 
to an entity.  The Classification
@@ -29,6 +35,9 @@ import 
org.apache.atlas.omrs.ffdc.exception.OMRSRuntimeException;
  *
  * Note: it is not valid to have a classification with a null or blank name.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class Classification extends InstanceAuditHeader
 {
     private String               classificationName       = null;
@@ -52,7 +61,7 @@ public class Classification extends InstanceAuditHeader
              * Build and throw exception.  This should not happen - likely to 
be a problem in the
              * repository connector.
              */
-            OMRSErrorCode errorCode = OMRSErrorCode.NULL_CLASSIFICATION_NAME;
+            OMRSErrorCode errorCode = 
OMRSErrorCode.NULL_CLASSIFICATION_PROPERTY_NAME;
             String       errorMessage = errorCode.getErrorMessageId()
                                       + errorCode.getFormattedErrorMessage();
 
@@ -116,7 +125,7 @@ public class Classification extends InstanceAuditHeader
              * Build and throw exception.  This should not happen - likely to 
be a problem in the
              * repository connector.
              */
-            OMRSErrorCode errorCode = OMRSErrorCode.NULL_CLASSIFICATION_NAME;
+            OMRSErrorCode errorCode = 
OMRSErrorCode.NULL_CLASSIFICATION_PROPERTY_NAME;
             String        errorMessage = errorCode.getErrorMessageId()
                                        + 
errorCode.getFormattedErrorMessage("<Unknown>");
 

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ClassificationOrigin.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ClassificationOrigin.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ClassificationOrigin.java
index d78f261..dd4ffbc 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ClassificationOrigin.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/ClassificationOrigin.java
@@ -17,8 +17,15 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * ClassificationOrigin describes the provenance of a classification attached 
to an entity.  Most classifications
  * are explicitly assigned to an entity.  However, it is possible for some 
classifications to flow along
@@ -29,6 +36,9 @@ import java.io.Serializable;
  * relationships attached to the entity.  The ClassificationPropagateRule in 
the relationship's RelationshipDef
  * defines where the classification can flow to.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum ClassificationOrigin implements Serializable
 {
     ASSIGNED       (0, "Assigned",   "The classification is explicitly 
assigned to the entity"),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityDetail.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityDetail.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityDetail.java
index 95e08d2..45e7398 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityDetail.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityDetail.java
@@ -17,10 +17,20 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+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;
+
 /**
  * EntityDetail stores all of the type-specific properties for the entity.  
These properties can be
  * requested in an InstanceProperties object on request.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class EntityDetail extends EntitySummary
 {
     private   InstanceProperties    entityProperties = null;

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityProxy.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityProxy.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityProxy.java
index 09c0de7..9bb3a91 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityProxy.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityProxy.java
@@ -17,13 +17,23 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+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;
+
 /**
  * EntityProxy summarizes an entity instance.  It is used to describe one of 
the entities connected together by a
  * relationship.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class EntityProxy extends EntitySummary
 {
-    private InstanceProperties  uniqueAttributes = null;
+    private InstanceProperties uniqueProperties = null;
 
 
     /**
@@ -46,25 +56,36 @@ public class EntityProxy extends EntitySummary
 
         if (template == null)
         {
-            this.uniqueAttributes = template.getUniqueAttributes();
+            this.uniqueProperties = template.getUniqueProperties();
         }
     }
 
 
     /**
+     * Copy/clone constructor for the entity proxy.
+     *
+     * @param template - entity summary to copy
+     */
+    public EntityProxy(EntitySummary   template)
+    {
+        super(template);
+    }
+
+
+    /**
      * Return a copy of the unique attributes for the entity.
      *
      * @return InstanceProperties iterator
      */
-    public InstanceProperties getUniqueAttributes()
+    public InstanceProperties getUniqueProperties()
     {
-        if (uniqueAttributes == null)
+        if (uniqueProperties == null)
         {
-            return uniqueAttributes;
+            return uniqueProperties;
         }
         else
         {
-            return new InstanceProperties(uniqueAttributes);
+            return new InstanceProperties(uniqueProperties);
         }
     }
 
@@ -75,7 +96,7 @@ public class EntityProxy extends EntitySummary
      *
      * @param uniqueAttributes - InstanceProperties iterator
      */
-    public void setUniqueAttributes(InstanceProperties uniqueAttributes) { 
this.uniqueAttributes = uniqueAttributes; }
+    public void setUniqueProperties(InstanceProperties uniqueAttributes) { 
this.uniqueProperties = uniqueAttributes; }
 
 
 
@@ -88,7 +109,7 @@ public class EntityProxy extends EntitySummary
     public String toString()
     {
         return "EntityProxy{" +
-                "uniqueAttributes=" + uniqueAttributes +
+                "uniqueProperties=" + uniqueProperties +
                 ", classifications=" + getClassifications() +
                 ", type=" + getType() +
                 ", instanceProvenanceType=" + getInstanceProvenanceType() +

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntitySummary.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntitySummary.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntitySummary.java
index 056ea42..408279c 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntitySummary.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntitySummary.java
@@ -17,7 +17,15 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.util.ArrayList;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
 
 
 /**
@@ -25,6 +33,9 @@ import java.util.ArrayList;
  * This includes a summary of its type, its unique
  * identifier (guid) last update data and a list of the classifications for 
the entity.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class EntitySummary extends InstanceHeader
 {
     /*
@@ -55,7 +66,7 @@ public class EntitySummary extends InstanceHeader
 
         if (templateElement != null)
         {
-            classifications = templateElement.getClassifications();
+            this.setClassifications(templateElement.getClassifications());
         }
     }
 
@@ -66,11 +77,11 @@ public class EntitySummary extends InstanceHeader
      *
      * @return Classifications iterator
      */
-    public ArrayList<Classification> getClassifications()
+    public List<Classification> getClassifications()
     {
         if (classifications == null)
         {
-            return classifications;
+            return null;
         }
         else
         {
@@ -84,7 +95,17 @@ public class EntitySummary extends InstanceHeader
      *
      * @param classifications - Classifications list
      */
-    public void setClassifications(ArrayList<Classification> classifications) 
{ this.classifications = classifications; }
+    public void setClassifications(List<Classification> classifications)
+    {
+        if (classifications == null)
+        {
+            this.classifications = null;
+        }
+        else
+        {
+            this.classifications = new ArrayList<>(classifications);
+        }
+    }
 
 
     /**

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityUniverse.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityUniverse.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityUniverse.java
index a5af8f9..3402a52 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityUniverse.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EntityUniverse.java
@@ -17,12 +17,23 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.util.ArrayList;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
 
 /**
  * EntityUniverse extends EntityDetail to add the relationships that this 
entity has.  These are available
  * in an iterator to make them easy to process.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class EntityUniverse extends EntityDetail
 {
     private ArrayList<Relationship>  entityRelationships = null;
@@ -48,7 +59,7 @@ public class EntityUniverse extends EntityDetail
 
         if (templateElement != null)
         {
-            entityRelationships = templateElement.getEntityRelationships();
+            
this.setEntityRelationships(templateElement.getEntityRelationships());
         }
     }
 
@@ -69,9 +80,16 @@ public class EntityUniverse extends EntityDetail
      *
      * @return Relationships list.
      */
-    public ArrayList<Relationship> getEntityRelationships()
+    public List<Relationship> getEntityRelationships()
     {
-        return entityRelationships;
+        if (entityRelationships == null)
+        {
+            return null;
+        }
+        else
+        {
+            return new ArrayList<>(entityRelationships);
+        }
     }
 
 
@@ -80,9 +98,16 @@ public class EntityUniverse extends EntityDetail
      *
      * @param entityRelationships - Relationships list
      */
-    public void setEntityRelationships(ArrayList<Relationship> 
entityRelationships)
+    public void setEntityRelationships(List<Relationship> entityRelationships)
     {
-        this.entityRelationships = entityRelationships;
+        if (entityRelationships == null)
+        {
+            this.entityRelationships = null;
+        }
+        else
+        {
+            this.entityRelationships = new ArrayList<>(entityRelationships);
+        }
     }
 
 

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EnumPropertyValue.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EnumPropertyValue.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EnumPropertyValue.java
index 7d433d2..85ca6fa 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EnumPropertyValue.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/EnumPropertyValue.java
@@ -17,9 +17,19 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+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;
+
 /**
  * An EnumPropertyValue stores the value for an enum property.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class EnumPropertyValue extends InstancePropertyValue
 {
     private int     ordinal = 99;

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceAuditHeader.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceAuditHeader.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceAuditHeader.java
index f79aeba..0940795 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceAuditHeader.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceAuditHeader.java
@@ -17,14 +17,23 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
-import java.util.ArrayList;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.util.Date;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * InstanceAuditHeader manages the attributes that are common to 
classifications and "proper" instances, ie
  * as entities and relationships.  We need to be able to audit when these 
fundamental elements change and
  * by whom.  Thus they share this header.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public abstract class InstanceAuditHeader extends InstanceElementHeader
 {
     /*
@@ -39,7 +48,7 @@ public abstract class InstanceAuditHeader extends 
InstanceElementHeader
     protected String                    updatedBy       = null;
     protected Date                      createTime      = null;
     protected Date                      updateTime      = null;
-    protected Long                      version         = 0L;
+    protected long                      version         = 0L;
 
     protected InstanceStatus            currentStatus   = 
InstanceStatus.UNKNOWN;
 
@@ -215,7 +224,7 @@ public abstract class InstanceAuditHeader extends 
InstanceElementHeader
      *
      * @return Long versionName number
      */
-    public Long getVersion() { return version; }
+    public long getVersion() { return version; }
 
 
     /**
@@ -223,7 +232,7 @@ public abstract class InstanceAuditHeader extends 
InstanceElementHeader
      *
      * @param version - Long versionName number
      */
-    public void setVersion(Long version) { this.version = version; }
+    public void setVersion(long version) { this.version = version; }
 
 
     /**

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceElementHeader.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceElementHeader.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceElementHeader.java
index 0ffef54..a31b7e0 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceElementHeader.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceElementHeader.java
@@ -17,12 +17,22 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * InstanceElementHeader provides a common base for all instance information 
from the metadata collection.
  * It implements Serializable.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public abstract class InstanceElementHeader implements Serializable
 {
     private static final long serialVersionUID = 1L;

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceGraph.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceGraph.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceGraph.java
index 11fc7e1..3cd5baa 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceGraph.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceGraph.java
@@ -18,7 +18,15 @@
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.util.ArrayList;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
 
 /**
  * InstanceGraph stores a subgraph of entities and relationships and provides 
methods to access its content.
@@ -26,6 +34,9 @@ import java.util.ArrayList;
  * of these two lists, or request elements that link to a specific element.  
For example, request the relationships
  * that link to an entity or the entity at a specific end of a relationship.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class InstanceGraph extends InstanceElementHeader
 {
     private ArrayList<EntityDetail>   entityElementList = null;
@@ -33,17 +44,39 @@ public class InstanceGraph extends InstanceElementHeader
 
 
     /**
-     * Default Constructor creates a graph with the supplied list of elements. 
 It assumes the caller has supplied
+     * Default constructor
+     */
+    public InstanceGraph()
+    {
+    }
+
+    /**
+     * Typical Constructor creates a graph with the supplied list of elements. 
 It assumes the caller has supplied
      * elements that do link together.  However, this graph supports graph 
fragments.
      *
      * @param entityElementList - list of entity elements to add to the list
      * @param relationshipElementList - list of relationship elements to add 
to the list
      */
-    public InstanceGraph(ArrayList<EntityDetail>      entityElementList,
-                         ArrayList<Relationship>      relationshipElementList)
+    public InstanceGraph(List<EntityDetail> entityElementList,
+                         List<Relationship> relationshipElementList)
     {
-        this.entityElementList = entityElementList;
-        this.relationshipElementList = relationshipElementList;
+        if (entityElementList == null)
+        {
+            this.entityElementList = null;
+        }
+        else
+        {
+            this.entityElementList = new ArrayList<>(entityElementList);
+        }
+
+        if (relationshipElementList == null)
+        {
+            this.relationshipElementList = null;
+        }
+        else
+        {
+            this.relationshipElementList = new 
ArrayList<>(relationshipElementList);
+        }
     }
 
 
@@ -56,8 +89,8 @@ public class InstanceGraph extends InstanceElementHeader
     {
         if (templateGraph != null)
         {
-            entityElementList = templateGraph.getEntities();
-            relationshipElementList = templateGraph.getRelationships();
+            setEntities(templateGraph.getEntities());
+            setRelationships(templateGraph.getRelationships());
         }
     }
 
@@ -67,46 +100,70 @@ public class InstanceGraph extends InstanceElementHeader
      *
      * @return EntityDetails - entity list
      */
-    public ArrayList<EntityDetail> getEntities()
+    public List<EntityDetail> getEntities()
     {
-        if (entityElementList != null)
+        if (entityElementList == null)
         {
-            ArrayList<EntityDetail>   entities = new ArrayList<>();
+            return null;
+        }
+        else
+        {
+            return new ArrayList<>(entityElementList);
+        }
+    }
 
-            for (EntityDetail  entity : entityElementList)
-            {
-                entities.add(new EntityDetail(entity));
-            }
-            return entities;
+
+    /**
+     * Set up the list of entities for this instance graph.
+     *
+     * @param entityElementList - list of entities
+     */
+    public void setEntities(List<EntityDetail> entityElementList)
+    {
+        if (entityElementList == null)
+        {
+            this.entityElementList = null;
         }
         else
         {
-            return entityElementList;
+            this.entityElementList = new ArrayList<>(entityElementList);
         }
     }
 
 
+
     /**
      * Return the list of all relationships (edges/links) in the instance 
graph. Null means a disconnected/empty graph.
      *
      * @return Relationships - relationship list
      */
-    public ArrayList<Relationship> getRelationships()
+    public List<Relationship> getRelationships()
     {
-        if (relationshipElementList != null)
+        if (relationshipElementList == null)
+        {
+            return null;
+        }
+        else
         {
-            ArrayList<Relationship>  relationships = new ArrayList<>();
+            return new ArrayList<>(relationshipElementList);
+        }
+    }
 
-            for (Relationship  relationship : relationshipElementList)
-            {
-                relationships.add(new Relationship(relationship));
-            }
 
-            return relationships;
+    /**
+     * Set up the list of relationships in this instance graph.
+     *
+     * @param relationshipElementList - list of relationships
+     */
+    public void setRelationships(List<Relationship> relationshipElementList)
+    {
+        if (relationshipElementList == null)
+        {
+            this.relationshipElementList = null;
         }
         else
         {
-            return relationshipElementList;
+            this.relationshipElementList = new 
ArrayList<>(relationshipElementList);
         }
     }
 
@@ -117,7 +174,7 @@ public class InstanceGraph extends InstanceElementHeader
      * @param anchorEntityGUID - unique identifier for an entity
      * @return Relationships - relationship iterator
      */
-    public ArrayList<Relationship> getRelationshipsForEntity(String  
anchorEntityGUID)
+    public List<Relationship> getRelationshipsForEntity(String  
anchorEntityGUID)
     {
         ArrayList<Relationship> matchingRelationships = new ArrayList<>();
 

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceHeader.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceHeader.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceHeader.java
index 934974d..1a62baf 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceHeader.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceHeader.java
@@ -18,10 +18,20 @@
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
 
+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;
+
 /**
  * InstanceHeader manages the attributes that are common to entities and 
relationship instances.  This includes
  * information abut its type, provenance and change history.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public abstract class InstanceHeader extends InstanceAuditHeader
 {
     /*

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProperties.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProperties.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProperties.java
index bc228d3..2964f14 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProperties.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProperties.java
@@ -18,6 +18,9 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import org.apache.atlas.omrs.ffdc.OMRSErrorCode;
 import org.apache.atlas.omrs.ffdc.exception.OMRSRuntimeException;
 
@@ -25,6 +28,9 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 
 /**
  * The InstanceProperties class provides support for arbitrary properties to 
be added to an entity,
@@ -55,6 +61,9 @@ import java.util.Map;
  *     </li>
  * </ul>
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class InstanceProperties extends InstanceElementHeader
 {
     /*
@@ -147,7 +156,7 @@ public class InstanceProperties extends 
InstanceElementHeader
          */
             OMRSErrorCode errorCode = OMRSErrorCode.NULL_PROPERTY_NAME;
             String        errorMessage = errorCode.getErrorMessageId()
-                    + errorCode.getFormattedErrorMessage();
+                                       + errorCode.getFormattedErrorMessage();
 
             throw new OMRSRuntimeException(errorCode.getHTTPErrorCode(),
                                            this.getClass().getName(),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyCategory.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyCategory.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyCategory.java
index f7393eb..3f21239 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyCategory.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyCategory.java
@@ -17,12 +17,22 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * The InstancePropertyCategory defines the list of value types for the 
properties for open metadata.
  * It is used in the InstancePropertyValue class to distinguish its subclasses.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum InstancePropertyCategory implements Serializable
 {
     UNKNOWN     (0, "<Unknown>", "Uninitialized InstancePropertyValue 
object."),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyValue.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyValue.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyValue.java
index 08ec988..27e82c8 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyValue.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstancePropertyValue.java
@@ -17,6 +17,19 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+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;
+
+/**
+ * InstancePropertyValue provides a common class for holding an instance type 
and value.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class InstancePropertyValue extends InstanceElementHeader
 {
     /*

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProvenanceType.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProvenanceType.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProvenanceType.java
index 1715cbf..735dc4b 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProvenanceType.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceProvenanceType.java
@@ -17,8 +17,15 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * InstanceProvenanceType defines where the metadata comes from and, hence if 
it can be updated.
  * <ul>
@@ -47,6 +54,9 @@ import java.io.Serializable;
  *     </li>
  * </ul>
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum InstanceProvenanceType implements Serializable
 {
     UNKNOWN                 (0, "<Unknown>",               "Unknown 
provenance"),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceStatus.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceStatus.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceStatus.java
index 645bd4c..44b3993 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceStatus.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceStatus.java
@@ -17,8 +17,15 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * The InstanceStatus defines the status of a relationship or an entity in the 
metadata collection.  It effectively
  * defines its visibility to different types of queries.  Most queries by 
default will only return instances in the
@@ -33,6 +40,9 @@ import java.io.Serializable;
  *     to support a restore request.  It is not returned on normal 
queries.</li>
  * </ul>
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum InstanceStatus implements Serializable
 {
     UNKNOWN (0, "<Unknown>", "Unknown instance status."),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceType.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceType.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceType.java
index edd786a..26a7510 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceType.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/InstanceType.java
@@ -17,14 +17,24 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import 
org.apache.atlas.omrs.metadatacollection.properties.typedefs.TypeDefCategory;
 import 
org.apache.atlas.omrs.metadatacollection.properties.typedefs.TypeDefLink;
 
 import java.util.ArrayList;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
 
 /**
  * InstanceType contains information from the instance's TypeDef that are 
useful for processing the instance.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class InstanceType extends InstanceElementHeader
 {
     private TypeDefCategory           typeDefCategory         = 
TypeDefCategory.UNKNOWN_DEF;
@@ -65,9 +75,9 @@ public class InstanceType extends InstanceElementHeader
                         long                      typeDefVersion,
                         String                    typeDefDescription,
                         String                    typeDefDescriptionGUID,
-                        ArrayList<TypeDefLink>    typeDefSuperTypes,
-                        ArrayList<InstanceStatus> validStatusList,
-                        ArrayList<String>         validInstanceProperties)
+                        List<TypeDefLink>         typeDefSuperTypes,
+                        List<InstanceStatus>      validStatusList,
+                        List<String>              validInstanceProperties)
     {
         this.typeDefCategory = typeDefCategory;
         this.typeDefGUID = typeDefGUID;
@@ -75,9 +85,9 @@ public class InstanceType extends InstanceElementHeader
         this.typeDefVersion = typeDefVersion;
         this.typeDefDescription = typeDefDescription;
         this.typeDefDescriptionGUID = typeDefDescriptionGUID;
-        this.typeDefSuperTypes = typeDefSuperTypes;
-        this.validStatusList = validStatusList;
-        this.validInstanceProperties = validInstanceProperties;
+        this.setTypeDefSuperTypes(typeDefSuperTypes);
+        this.setValidStatusList(validStatusList);
+        this.setValidInstanceProperties(validInstanceProperties);
     }
 
 
@@ -96,9 +106,9 @@ public class InstanceType extends InstanceElementHeader
             typeDefVersion = template.getTypeDefVersion();
             typeDefDescription = template.getTypeDefDescription();
             typeDefDescriptionGUID = template.getTypeDefDescriptionGUID();
-            typeDefSuperTypes = template.getTypeDefSuperTypes();
-            validStatusList = template.getValidStatusList();
-            validInstanceProperties = template.getValidInstanceProperties();
+            setTypeDefSuperTypes(template.getTypeDefSuperTypes());
+            setValidStatusList(template.getValidStatusList());
+            setValidInstanceProperties(template.getValidInstanceProperties());
         }
     }
 
@@ -180,9 +190,16 @@ public class InstanceType extends InstanceElementHeader
      *
      * @return list of types
      */
-    public ArrayList<TypeDefLink> getTypeDefSuperTypes()
+    public List<TypeDefLink> getTypeDefSuperTypes()
     {
-        return typeDefSuperTypes;
+        if (typeDefSuperTypes == null)
+        {
+            return null;
+        }
+        else
+        {
+            return new ArrayList<>(typeDefSuperTypes);
+        }
     }
 
 
@@ -191,11 +208,19 @@ public class InstanceType extends InstanceElementHeader
      *
      * @param typeDefSuperTypes - list of type names
      */
-    public void setTypeDefSuperTypes(ArrayList<TypeDefLink> typeDefSuperTypes)
+    public void setTypeDefSuperTypes(List<TypeDefLink> typeDefSuperTypes)
     {
-        this.typeDefSuperTypes = typeDefSuperTypes;
+        if (typeDefSuperTypes == null)
+        {
+            this.typeDefSuperTypes = null;
+        }
+        else
+        {
+            this.typeDefSuperTypes = new ArrayList<>(typeDefSuperTypes);
+        }
     }
 
+
     /**
      * Return the description for the TypeDef.
      *
@@ -245,11 +270,11 @@ public class InstanceType extends InstanceElementHeader
      *
      * @return InstanceStatus array of supported status.
      */
-    public ArrayList<InstanceStatus> getValidStatusList()
+    public List<InstanceStatus> getValidStatusList()
     {
         if ( validStatusList == null)
         {
-            return validStatusList;
+            return null;
         }
         else
         {
@@ -263,7 +288,17 @@ public class InstanceType extends InstanceElementHeader
      *
      * @param validStatusList - InstanceStatus Array
      */
-    public void setValidStatusList(ArrayList<InstanceStatus> validStatusList) 
{ this.validStatusList = validStatusList; }
+    public void setValidStatusList(List<InstanceStatus> validStatusList)
+    {
+        if (validStatusList == null)
+        {
+            this.validStatusList = null;
+        }
+        else
+        {
+            this.validStatusList = new ArrayList<>(validStatusList);
+        }
+    }
 
 
     /**
@@ -271,9 +306,16 @@ public class InstanceType extends InstanceElementHeader
      *
      * @return array of property names.
      */
-    public ArrayList<String> getValidInstanceProperties()
+    public List<String> getValidInstanceProperties()
     {
-        return validInstanceProperties;
+        if (validInstanceProperties == null)
+        {
+            return null;
+        }
+        else
+        {
+            return new ArrayList<>(validInstanceProperties);
+        }
     }
 
 
@@ -282,9 +324,16 @@ public class InstanceType extends InstanceElementHeader
      *
      * @param validInstanceProperties - array of property names.
      */
-    public void setValidInstanceProperties(ArrayList<String> 
validInstanceProperties)
+    public void setValidInstanceProperties(List<String> 
validInstanceProperties)
     {
-        this.validInstanceProperties = validInstanceProperties;
+        if (validInstanceProperties == null)
+        {
+            this.validInstanceProperties = null;
+        }
+        else
+        {
+            this.validInstanceProperties = new 
ArrayList<>(validInstanceProperties);
+        }
     }
 
 

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/MapPropertyValue.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/MapPropertyValue.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/MapPropertyValue.java
index 4bebb02..51e9c4d 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/MapPropertyValue.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/MapPropertyValue.java
@@ -18,10 +18,22 @@
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.Objects;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * MapPropertyValue stores the values of a map within an entity, struct or 
relationship properties.
  * The elements of the map are stored in an InstanceProperties map.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class MapPropertyValue extends InstancePropertyValue
 {
     private  InstanceProperties    mapValues = null;
@@ -130,4 +142,26 @@ public class MapPropertyValue extends InstancePropertyValue
                 ", typeName='" + getTypeName() + '\'' +
                 '}';
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+        MapPropertyValue that = (MapPropertyValue) o;
+        return Objects.equals(mapValues, that.mapValues);
+    }
+
+    @Override
+    public int hashCode()
+    {
+
+        return Objects.hash(mapValues);
+    }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/PrimitivePropertyValue.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/PrimitivePropertyValue.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/PrimitivePropertyValue.java
index fb40758..7ecdb81 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/PrimitivePropertyValue.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/PrimitivePropertyValue.java
@@ -17,18 +17,31 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import org.apache.atlas.omrs.ffdc.OMRSErrorCode;
+import org.apache.atlas.omrs.ffdc.exception.InvalidParameterException;
+import org.apache.atlas.omrs.ffdc.exception.OMRSLogicErrorException;
 import org.apache.atlas.omrs.ffdc.exception.OMRSRuntimeException;
 import 
org.apache.atlas.omrs.metadatacollection.properties.typedefs.PrimitiveDefCategory;
 
+import java.util.Objects;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 
 /**
  * PrimitivePropertyValue stores a single primitive property.  This is stored 
in the specific Java class
  * for the property value's type although it is stored as an object.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class PrimitivePropertyValue extends InstancePropertyValue
 {
-    private  PrimitiveDefCategory   primitiveDefCategory = 
PrimitiveDefCategory.OM_PRIMITIVE_TYPE_UNKNOWN;
+    private  PrimitiveDefCategory   primitiveDefCategory = null;
     private  Object                 primitiveValue = null;
 
 
@@ -68,13 +81,21 @@ public class PrimitivePropertyValue extends 
InstancePropertyValue
 
 
     /**
-     * Set up the category of the primitive typ.  This sets the name and Java 
Class used for
+     * Set up the category of the primitive type.  This sets the name and Java 
Class used for
      * the primitive value.
      *
      * @param primitiveDefCategory - PrimitiveDefCategory enum
      */
     public void setPrimitiveDefCategory(PrimitiveDefCategory 
primitiveDefCategory)
     {
+        /*
+         * Tests that type and value are consistent
+         */
+        validateValueAgainstType(primitiveDefCategory, primitiveValue);
+
+        /*
+         * All ok so set the category
+         */
         this.primitiveDefCategory = primitiveDefCategory;
     }
 
@@ -90,13 +111,83 @@ public class PrimitivePropertyValue extends 
InstancePropertyValue
 
     /**
      * Set up the primitive value.   Although it is passed in as a 
java.lang.Object, it should be the correct
-     * type as defined by the PrimitiveDefCategory.   This is validated in 
this method so it is important to call
-     * setPrimitiveDefCategory() before setPrimitiveValue().
+     * type as defined by the PrimitiveDefCategory.
      *
      * @param primitiveValue - object contain the primitive value
      */
     public void setPrimitiveValue(Object primitiveValue)
     {
+        /*
+         * Tests that type and value are consistent
+         */
+        validateValueAgainstType(primitiveDefCategory, primitiveValue);
+
+        /*
+         * The primitive value is of the correct type so save it.
+         */
+        this.primitiveValue = primitiveValue;
+    }
+
+
+    /**
+     * Standard toString method.
+     *
+     * @return JSON style description of variables.
+     */
+    @Override
+    public String toString()
+    {
+        return "PrimitivePropertyValue{" +
+                "primitiveDefCategory=" + primitiveDefCategory +
+                ", primitiveValue=" + primitiveValue +
+                ", instancePropertyCategory=" + getInstancePropertyCategory() +
+                ", typeGUID='" + getTypeGUID() + '\'' +
+                ", typeName='" + getTypeName() + '\'' +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+        PrimitivePropertyValue that = (PrimitivePropertyValue) o;
+        return primitiveDefCategory == that.primitiveDefCategory &&
+                Objects.equals(primitiveValue, that.primitiveValue);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(primitiveDefCategory, primitiveValue);
+    }
+
+
+    /**
+     * Ensure that the type and value supplied are compatible.
+     *
+     * @param primitiveDefCategory - category to test
+     * @param primitiveValue - value to test
+     */
+    private void validateValueAgainstType(PrimitiveDefCategory   
primitiveDefCategory,
+                                          Object                 
primitiveValue)
+    {
+        final String  methodName = "setPrimitiveValue()";
+
+        /*
+         * Return if one of the values is missing
+         */
+        if ((primitiveDefCategory == null) || (primitiveValue == null))
+        {
+            return;
+        }
+
         try
         {
             Class    testJavaClass = 
Class.forName(primitiveDefCategory.getJavaClassName());
@@ -106,6 +197,17 @@ public class PrimitivePropertyValue extends 
InstancePropertyValue
                 /*
                  * The primitive value supplied is the wrong type.  Throw an 
exception.
                  */
+                OMRSErrorCode errorCode    = 
OMRSErrorCode.INVALID_PRIMITIVE_VALUE;
+                String        errorMessage = errorCode.getErrorMessageId()
+                                           + 
errorCode.getFormattedErrorMessage(primitiveDefCategory.getJavaClassName(),
+                                                                               
 primitiveDefCategory.getName());
+
+                throw new OMRSLogicErrorException(errorCode.getHTTPErrorCode(),
+                                                  this.getClass().getName(),
+                                                  methodName,
+                                                  errorMessage,
+                                                  errorCode.getSystemAction(),
+                                                  errorCode.getUserAction());
             }
         }
         catch (ClassNotFoundException    unknownPrimitiveClass)
@@ -116,57 +218,33 @@ public class PrimitivePropertyValue extends 
InstancePropertyValue
              */
             OMRSErrorCode errorCode    = 
OMRSErrorCode.INVALID_PRIMITIVE_CLASS_NAME;
             String        errorMessage = errorCode.getErrorMessageId()
-                                       + 
errorCode.getFormattedErrorMessage(primitiveDefCategory.getJavaClassName(),
-                                                                            
primitiveDefCategory.getName());
-
-            throw new OMRSRuntimeException(errorCode.getHTTPErrorCode(),
-                                           this.getClass().getName(),
-                                           "setPrimitiveValue",
-                                           errorMessage,
-                                           errorCode.getSystemAction(),
-                                           errorCode.getUserAction(),
-                                           unknownPrimitiveClass);
+                    + 
errorCode.getFormattedErrorMessage(primitiveDefCategory.getJavaClassName(),
+                                                         
primitiveDefCategory.getName());
+
+            throw new OMRSLogicErrorException(errorCode.getHTTPErrorCode(),
+                                              this.getClass().getName(),
+                                              methodName,
+                                              errorMessage,
+                                              errorCode.getSystemAction(),
+                                              errorCode.getUserAction(),
+                                              unknownPrimitiveClass);
         }
-        catch (Error    invalidPrimitiveValue)
+        catch (Error    invalidPrimitiveCategory)
         {
             /*
              * Some unexpected exception occurred when manipulating the Java 
Classes.  Probably a coding error.
              */
-            OMRSErrorCode errorCode    = OMRSErrorCode.INVALID_PRIMITIVE_VALUE;
+            OMRSErrorCode errorCode    = 
OMRSErrorCode.INVALID_PRIMITIVE_CATEGORY;
             String        errorMessage = errorCode.getErrorMessageId()
-                                       + 
errorCode.getFormattedErrorMessage(primitiveDefCategory.getJavaClassName(),
-                                                                            
primitiveDefCategory.getName());
-
-            throw new OMRSRuntimeException(errorCode.getHTTPErrorCode(),
-                                           this.getClass().getName(),
-                                           "setPrimitiveValue",
-                                           errorMessage,
-                                           errorCode.getSystemAction(),
-                                           errorCode.getUserAction(),
-                                           invalidPrimitiveValue);
+                        + 
errorCode.getFormattedErrorMessage(primitiveDefCategory.getName());
+
+            throw new OMRSLogicErrorException(errorCode.getHTTPErrorCode(),
+                                              this.getClass().getName(),
+                                              methodName,
+                                              errorMessage,
+                                              errorCode.getSystemAction(),
+                                              errorCode.getUserAction(),
+                                              invalidPrimitiveCategory);
         }
-
-        /*
-         * The primitive value is of the correct type so save it.
-         */
-        this.primitiveValue = primitiveValue;
-    }
-
-
-    /**
-     * Standard toString method.
-     *
-     * @return JSON style description of variables.
-     */
-    @Override
-    public String toString()
-    {
-        return "PrimitivePropertyValue{" +
-                "primitiveDefCategory=" + primitiveDefCategory +
-                ", primitiveValue=" + primitiveValue +
-                ", instancePropertyCategory=" + getInstancePropertyCategory() +
-                ", typeGUID='" + getTypeGUID() + '\'' +
-                ", typeName='" + getTypeName() + '\'' +
-                '}';
     }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Relationship.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Relationship.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Relationship.java
index cd56bbd..9a27f33 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Relationship.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/Relationship.java
@@ -18,10 +18,20 @@
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
 
+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;
+
 /**
  * Relationship is a POJO that manages the properties of an open metadata 
relationship.  This includes information
  * about the relationship type, the two entities it connects and the 
properties it holds.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class Relationship extends InstanceHeader
 {
     private   InstanceProperties    relationshipProperties = null;

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/StructPropertyValue.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/StructPropertyValue.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/StructPropertyValue.java
index cd8bff9..a706229 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/StructPropertyValue.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/instances/StructPropertyValue.java
@@ -18,10 +18,22 @@
 package org.apache.atlas.omrs.metadatacollection.properties.instances;
 
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.util.Objects;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * StructPropertyValue supports the value part of property that is defined as 
a complex structure.
  * It manages a list of properties that cover the fields in the structure.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class StructPropertyValue extends InstancePropertyValue
 {
     private InstanceProperties  attributes = null;
@@ -92,4 +104,25 @@ public class StructPropertyValue extends 
InstancePropertyValue
                 ", typeName='" + getTypeName() + '\'' +
                 '}';
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+        StructPropertyValue that = (StructPropertyValue) o;
+        return Objects.equals(attributes, that.attributes);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(attributes);
+    }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeCardinality.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeCardinality.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeCardinality.java
index 9ca7b80..23f1e47 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeCardinality.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeCardinality.java
@@ -17,8 +17,15 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.typedefs;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * AttributeCardinality is used on a association from one TypeDef to another.  
It defines how many instances the "linked to" TypeDef
  * are permitted to be connected to the "linked from" TypeDef:
@@ -54,6 +61,9 @@ import java.io.Serializable;
  *     </li>
  * </ul>
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum AttributeCardinality implements Serializable
 {
     UNKNOWN                (0, "<Unknown>",                "Unknown or 
uninitialized cardinality"),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDef.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDef.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDef.java
index d68d233..b0490e9 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDef.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDef.java
@@ -18,8 +18,15 @@
 package org.apache.atlas.omrs.metadatacollection.properties.typedefs;
 
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.util.Objects;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * The AttributeTypeDef class is used to identify the type of an attribute.  
These can be:
  * <ul>
@@ -28,8 +35,13 @@ import java.util.Objects;
  *     <li>EnumDef</li>
  * </ul>
  */
-public abstract class AttributeTypeDef extends TypeDefElementHeader
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class AttributeTypeDef extends TypeDefElementHeader
 {
+    protected long                     version         = 0L;
+    protected String                   versionName     = null;
     protected AttributeTypeDefCategory category        = 
AttributeTypeDefCategory.UNKNOWN_DEF;
     protected String                   guid            = null;
     protected String                   name            = null;
@@ -38,6 +50,14 @@ public abstract class AttributeTypeDef extends 
TypeDefElementHeader
 
 
     /**
+     * Default constructor
+     */
+    public AttributeTypeDef()
+    {
+    }
+
+
+    /**
      * Minimal constructor is passed the category of the attribute type
      *
      * @param category - category of this TypeDef
@@ -78,6 +98,8 @@ public abstract class AttributeTypeDef extends 
TypeDefElementHeader
 
         if (template != null)
         {
+            this.version = template.getVersion();
+            this.versionName = template.getVersionName();
             this.category = template.getCategory();
             this.guid = template.getGUID();
             this.name = template.getName();
@@ -88,6 +110,54 @@ public abstract class AttributeTypeDef extends 
TypeDefElementHeader
 
 
     /**
+     * Return the version of the AttributeTypeDef.  Versions are created when 
an AttributeTypeDef's properties
+     * are changed.  If a description is updated, then this does not create a 
new version.
+     *
+     * @return String version number
+     */
+    public long getVersion()
+    {
+        return version;
+    }
+
+
+    /**
+     * Set up the version of the AttributeTypeDef.  Versions are created when 
an AttributeTypeDef's properties
+     * are changed.  If a description is updated, then this does not create a 
new version.
+     *
+     * @param version - long version number
+     */
+    public void setVersion(long version)
+    {
+        this.version = version;
+    }
+
+
+    /**
+     * Return the version name, which is a more of a human readable form of 
the version number.
+     * It can be used to show whether the change is a minor or major update.
+     *
+     * @return String version name
+     */
+    public String getVersionName()
+    {
+        return versionName;
+    }
+
+
+    /**
+     * Set up the version name, which is a more of a human readable form of 
the version number.
+     * It can be used to show whether the change is a minor or major update.
+     *
+     * @param versionName - String version name
+     */
+    public void setVersionName(String versionName)
+    {
+        this.versionName = versionName;
+    }
+
+
+    /**
      * Return the category of the TypeDef.
      *
      * @return AttributeTypeDefCategory enum
@@ -139,26 +209,52 @@ public abstract class AttributeTypeDef extends 
TypeDefElementHeader
     public void setName(String name) { this.name = name; }
 
 
+    /**
+     * Return the short description of this AttributeTypeDef.
+     *
+     * @return - String description
+     */
     public String getDescription()
     {
         return description;
     }
 
+
+    /**
+     * Set up the short description of this AttributeTypeDef.
+     *
+     * @param description - String description
+     */
     public void setDescription(String description)
     {
         this.description = description;
     }
 
+
+    /**
+     * Return the unique identifier of the glossary term that describes this 
AttributeTypeDef.  Null means there
+     * is no known glossary term.
+     *
+     * @return String guid
+     */
     public String getDescriptionGUID()
     {
         return descriptionGUID;
     }
 
+
+    /**
+     * Set up the unique identifier of the glossary term that describes this 
AttributeTypeDef.  Null means there
+     * is no known glossary term.
+     *
+     * @param descriptionGUID - String guid
+     */
     public void setDescriptionGUID(String descriptionGUID)
     {
         this.descriptionGUID = descriptionGUID;
     }
 
+
     /**
      * Standard toString method.
      *
@@ -168,7 +264,9 @@ public abstract class AttributeTypeDef extends 
TypeDefElementHeader
     public String toString()
     {
         return "AttributeTypeDef{" +
-                "category=" + category +
+                "version=" + version +
+                ", versionName='" + versionName + '\'' +
+                ", category=" + category +
                 ", guid='" + guid + '\'' +
                 ", name='" + name + '\'' +
                 ", description='" + description + '\'' +
@@ -176,7 +274,6 @@ public abstract class AttributeTypeDef extends 
TypeDefElementHeader
                 '}';
     }
 
-
     /**
      * Validated that the GUID, name and version number of a TypeDef are equal.
      *
@@ -195,12 +292,15 @@ public abstract class AttributeTypeDef extends 
TypeDefElementHeader
             return false;
         }
         AttributeTypeDef that = (AttributeTypeDef) object;
-        return category == that.category &&
+        return version == that.version &&
+                Objects.equals(versionName, that.versionName) &&
+                category == that.category &&
                 Objects.equals(guid, that.guid) &&
-                Objects.equals(name, that.name);
+                Objects.equals(name, that.name) &&
+                Objects.equals(description, that.description) &&
+                Objects.equals(descriptionGUID, that.descriptionGUID);
     }
 
-
     /**
      * Using the GUID as a hashcode - it should be unique if all connected 
metadata repositories are behaving properly.
      *

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDefCategory.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDefCategory.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDefCategory.java
index 22ddf42..12e0c33 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDefCategory.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/AttributeTypeDefCategory.java
@@ -17,11 +17,21 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.typedefs;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * The AttributeTypeDefCategory defines the list of valid types of a attribute 
(property) for an open metadata instance.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum AttributeTypeDefCategory implements Serializable
 {
     UNKNOWN_DEF        (0, "<Unknown>",         "Uninitialized 
AttributeTypeDef object."),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationDef.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationDef.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationDef.java
index cfb2143..566bc59 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationDef.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationDef.java
@@ -18,13 +18,24 @@
 package org.apache.atlas.omrs.metadatacollection.properties.typedefs;
 
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.util.ArrayList;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
 
 /**
  * ClassificationDef stores the properties for the definition of a type of 
classification.  Many of the properties
  * are inherited from TypeDef.  ClassificationDef adds a list of Entity Types 
that this Classification can be
  * connected to and a boolean to indicate if this classification is 
propagatable.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class ClassificationDef extends TypeDef
 {
     private   ArrayList<TypeDefLink>     validEntityDefs = null;
@@ -70,7 +81,8 @@ public class ClassificationDef extends TypeDef
 
         if (template != null)
         {
-            validEntityDefs = template.getValidEntityDefs();
+            this.setValidEntityDefs(template.getValidEntityDefs());
+
             propagatable = template.isPropagatable();
         }
     }
@@ -81,11 +93,11 @@ public class ClassificationDef extends TypeDef
      *
      * @return List of entity type identifiers
      */
-    public ArrayList<TypeDefLink> getValidEntityDefs()
+    public List<TypeDefLink> getValidEntityDefs()
     {
         if (validEntityDefs == null)
         {
-            return validEntityDefs;
+            return null;
         }
         else
         {
@@ -99,9 +111,16 @@ public class ClassificationDef extends TypeDef
      *
      * @param validEntityDefs - List of entity type identifiers
      */
-    public void setValidEntityDefs(ArrayList<TypeDefLink> validEntityDefs)
+    public void setValidEntityDefs(List<TypeDefLink> validEntityDefs)
     {
-        this.validEntityDefs = validEntityDefs;
+        if (validEntityDefs == null)
+        {
+            this.validEntityDefs = null;
+        }
+        else
+        {
+            this.validEntityDefs = new ArrayList<>(validEntityDefs);
+        }
     }
 
 

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationPropagationRule.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationPropagationRule.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationPropagationRule.java
index 71d6f91..7134973 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationPropagationRule.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/ClassificationPropagationRule.java
@@ -17,8 +17,15 @@
  */
 package org.apache.atlas.omrs.metadatacollection.properties.typedefs;
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.io.Serializable;
 
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
 /**
  * ClassificationPropagationRule is part of a relationship definition 
(RelationshipDef).
  * It indicates whether classifications from one entity should propagate 
across a relationship instance.
@@ -33,6 +40,9 @@ import java.io.Serializable;
  *     <li>BOTH - two way propagation.</li>
  * </ul>
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public enum ClassificationPropagationRule implements Serializable
 {
     NONE       (0, "NONE",       "No classification propagation"),

http://git-wip-us.apache.org/repos/asf/atlas/blob/a1fd4068/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/CollectionDef.java
----------------------------------------------------------------------
diff --git 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/CollectionDef.java
 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/CollectionDef.java
index cca95f7..ab95757 100644
--- 
a/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/CollectionDef.java
+++ 
b/omrs/src/main/java/org/apache/atlas/omrs/metadatacollection/properties/typedefs/CollectionDef.java
@@ -18,13 +18,24 @@
 package org.apache.atlas.omrs.metadatacollection.properties.typedefs;
 
 
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
 import java.util.ArrayList;
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
 
 /**
  * CollectionDef supports the definition of a collection type.  This 
information about the generic
  * collection type is managed in the CollectionDefCategory.  It is 
instantiated with specific primitive
  * types when it is linked to a specific TypeDefAttribute.
  */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, 
fieldVisibility=NONE)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
 public class CollectionDef extends AttributeTypeDef
 {
     private CollectionDefCategory           collectionDefCategory = null;
@@ -68,7 +79,7 @@ public class CollectionDef extends AttributeTypeDef
         {
             this.collectionDefCategory = template.getCollectionDefCategory();
             this.argumentCount = template.getArgumentCount();
-            this.argumentTypes = template.getArgumentTypes();
+            this.setArgumentTypes(template.getArgumentTypes());
         }
     }
 
@@ -97,11 +108,11 @@ public class CollectionDef extends AttributeTypeDef
      *
      * @return list of argument type
      */
-    public ArrayList<PrimitiveDefCategory> getArgumentTypes()
+    public List<PrimitiveDefCategory> getArgumentTypes()
     {
         if (argumentTypes == null)
         {
-            return argumentTypes;
+            return null;
         }
         else
         {
@@ -115,9 +126,16 @@ public class CollectionDef extends AttributeTypeDef
      *
      * @param argumentTypes - list of argument types
      */
-    public void setArgumentTypes(ArrayList<PrimitiveDefCategory> argumentTypes)
+    public void setArgumentTypes(List<PrimitiveDefCategory> argumentTypes)
     {
-        this.argumentTypes = argumentTypes;
+        if (argumentTypes == null)
+        {
+            this.argumentTypes = null;
+        }
+        else
+        {
+            this.argumentTypes = new ArrayList<>(argumentTypes);
+        }
     }
 
 

Reply via email to