You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by su...@apache.org on 2016/11/02 03:49:55 UTC
incubator-atlas git commit: ATLAS-1241 New Instance APIs and POJOs
(sumasai)
Repository: incubator-atlas
Updated Branches:
refs/heads/master 9f643b5b9 -> 0c7468954
ATLAS-1241 New Instance APIs and POJOs (sumasai)
Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/0c746895
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/0c746895
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/0c746895
Branch: refs/heads/master
Commit: 0c7468954f5cf9f85fd066397707e3528ee89da8
Parents: 9f643b5
Author: Suma Shivaprasad <su...@gmail.com>
Authored: Tue Nov 1 20:49:47 2016 -0700
Committer: Suma Shivaprasad <su...@gmail.com>
Committed: Tue Nov 1 20:49:47 2016 -0700
----------------------------------------------------------------------
.../atlas/model/instance/AtlasEntityHeader.java | 179 +++++++++++++++
.../instance/AtlasEntityWithAssociations.java | 149 +++++++++++++
.../model/instance/EntityMutationResponse.java | 136 ++++++++++++
.../atlas/model/instance/EntityMutations.java | 147 +++++++++++++
.../org/apache/atlas/type/AtlasTypeUtil.java | 52 ++---
.../test/java/org/apache/atlas/TestUtilsV2.java | 3 +-
pom.xml | 8 +
release-log.txt | 1 +
.../apache/atlas/RepositoryMetadataModule.java | 4 +
.../store/graph/AtlasEntityStore.java | 178 +++++++++++++++
.../store/graph/v1/AtlasEntityStoreV1.java | 122 +++++++++++
webapp/pom.xml | 8 +
.../org/apache/atlas/web/rest/EntitiesREST.java | 128 +++++++++++
.../org/apache/atlas/web/rest/EntityRest.java | 217 +++++++++++++++++++
14 files changed, 1305 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntityHeader.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntityHeader.java b/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntityHeader.java
new file mode 100644
index 0000000..d9c74ae
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntityHeader.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
+ *
+ * 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.
+ */
+package org.apache.atlas.model.instance;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+
+import org.apache.atlas.model.PList;
+import org.apache.atlas.model.SearchFilter.SortType;
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+
+/**
+ * An instance of an entity - like hive_table, hive_database.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.PROPERTY)
+public class AtlasEntityHeader extends AtlasStruct implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private String guid = null;
+ private AtlasEntity.Status status = AtlasEntity.Status.STATUS_ACTIVE;
+ private String displayText = null;
+
+ public AtlasEntityHeader() {
+ this(null, null);
+ }
+
+ public AtlasEntityHeader(String typeName) {
+ this(typeName, null);
+ }
+
+ public AtlasEntityHeader(AtlasEntityDef entityDef) {
+ this(entityDef != null ? entityDef.getName() : null, null);
+ }
+
+ public AtlasEntityHeader(String typeName, Map<String, Object> attributes) {
+ super(typeName, attributes);
+
+ setGuid(null);
+ setStatus(null);
+ }
+
+ public AtlasEntityHeader(AtlasEntityHeader other) {
+ super(other);
+
+ if (other != null) {
+ setGuid(other.getGuid());
+ setStatus(other.getStatus());
+ }
+ }
+
+ public String getGuid() {
+ return guid;
+ }
+
+ public void setGuid(String guid) {
+ this.guid = guid;
+ }
+
+ public AtlasEntity.Status getStatus() {
+ return status;
+ }
+
+ public void setStatus(AtlasEntity.Status status) {
+ this.status = status;
+ }
+
+ public String getDisplayText() {
+ return displayText;
+ }
+
+ public void setDisplayText(final String displayText) {
+ this.displayText = displayText;
+ }
+
+ @Override
+ public StringBuilder toString(StringBuilder sb) {
+ if (sb == null) {
+ sb = new StringBuilder();
+ }
+
+ sb.append("AtlasEntityHeader{");
+ sb.append("guid='").append(guid).append('\'');
+ sb.append(", status=").append(status);
+ sb.append(", displayText=").append(displayText);
+ sb.append(", ");
+ super.toString(sb);
+ sb.append('}');
+
+ return sb;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) { return true; }
+ if (o == null || getClass() != o.getClass()) { return false; }
+ if (!super.equals(o)) { return false; }
+
+ AtlasEntityHeader that = (AtlasEntityHeader) o;
+
+ if (guid != null ? !guid.equals(that.guid) : that.guid != null) { return false; }
+ if (status != null ? !status.equals(that.status) : that.status != null) { return false; }
+ if (displayText != null ? !displayText.equals(that.displayText) : that.displayText != null) { return false; }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = super.hashCode();
+
+ result = 31 * result + (guid != null ? guid.hashCode() : 0);
+ result = 31 * result + (status != null ? status.hashCode() : 0);
+ result = 31 * result + (displayText != null ? displayText.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return toString(new StringBuilder()).toString();
+ }
+
+ /**
+ * REST serialization friendly list.
+ */
+ @JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+ @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+ @JsonIgnoreProperties(ignoreUnknown=true)
+ @XmlRootElement
+ @XmlAccessorType(XmlAccessType.PROPERTY)
+ @XmlSeeAlso(AtlasEntity.class)
+ public static class AtlasEntityHeaders extends PList<AtlasEntityHeader> {
+ private static final long serialVersionUID = 1L;
+
+ public AtlasEntityHeaders() {
+ super();
+ }
+
+ public AtlasEntityHeaders(List<AtlasEntityHeader> list) {
+ super(list);
+ }
+
+ public AtlasEntityHeaders(List list, long startIndex, int pageSize, long totalCount,
+ SortType sortType, String sortBy) {
+ super(list, startIndex, pageSize, totalCount, sortType, sortBy);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntityWithAssociations.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntityWithAssociations.java b/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntityWithAssociations.java
new file mode 100644
index 0000000..4ddd585
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasEntityWithAssociations.java
@@ -0,0 +1,149 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * 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.
+ */
+package org.apache.atlas.model.instance;
+
+import org.apache.atlas.model.PList;
+import org.apache.atlas.model.SearchFilter.SortType;
+import org.apache.atlas.model.typedef.AtlasEntityDef;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
+
+/**
+ * An instance of an entity - like hive_table, hive_database along with its assictaed classifications, terms etc.
+ */
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.PROPERTY)
+public class AtlasEntityWithAssociations extends AtlasEntity implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ List<AtlasClassification> classifications;
+
+ public AtlasEntityWithAssociations() {
+ this(null, null);
+ }
+
+ public AtlasEntityWithAssociations(String typeName) {
+ this(typeName, null);
+ }
+
+ public AtlasEntityWithAssociations(AtlasEntityDef entityDef) {
+ this(entityDef != null ? entityDef.getName() : null, null);
+ }
+
+ public AtlasEntityWithAssociations(String typeName, Map<String, Object> attributes) {
+ super(typeName, attributes);
+ setClassifications(null);
+ }
+
+ public AtlasEntityWithAssociations(AtlasEntityWithAssociations other) {
+ super(other);
+
+ setClassifications(other != null ? other.getClassifications() : null);
+ }
+
+ @Override
+ public StringBuilder toString(StringBuilder sb) {
+ if (sb == null) {
+ sb = new StringBuilder();
+ }
+
+ sb.append("AtlasEntityWithAssociations{");
+ sb.append("classifications='").append(classifications).append('\'');
+ sb.append(", ");
+ super.toString(sb);
+ sb.append('}');
+
+ return sb;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) { return true; }
+ if (o == null || getClass() != o.getClass()) { return false; }
+ if (!super.equals(o)) { return false; }
+
+ AtlasEntityWithAssociations that = (AtlasEntityWithAssociations) o;
+
+ if (classifications != null ? !classifications.equals(that.classifications) : that.classifications != null) { return false; }
+
+ return true;
+ }
+
+ public List<AtlasClassification> getClassifications() {
+ return classifications;
+ }
+
+ public void setClassifications(final List<AtlasClassification> classifications) {
+ this.classifications = classifications;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = super.hashCode();
+ result = 31 * result + (classifications != null ? classifications.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return toString(new StringBuilder()).toString();
+ }
+
+ /**
+ * REST serialization friendly list.
+ */
+ @JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+ @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+ @JsonIgnoreProperties(ignoreUnknown=true)
+ @XmlRootElement
+ @XmlAccessorType(XmlAccessType.PROPERTY)
+ @XmlSeeAlso(AtlasEntityWithAssociations.class)
+ public static class AtlasEntitiesWithAssociations extends PList<AtlasEntityWithAssociations> {
+ private static final long serialVersionUID = 1L;
+
+ public AtlasEntitiesWithAssociations() {
+ super();
+ }
+
+ public AtlasEntitiesWithAssociations(List<AtlasEntityWithAssociations> list) {
+ super(list);
+ }
+
+ public AtlasEntitiesWithAssociations(List list, long startIndex, int pageSize, long totalCount,
+ SortType sortType, String sortBy) {
+ super(list, startIndex, pageSize, totalCount, sortType, sortBy);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java b/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
new file mode 100644
index 0000000..a6c75ed
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
@@ -0,0 +1,136 @@
+/**
+ * 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.
+ */
+package org.apache.atlas.model.instance;
+
+
+import org.apache.atlas.model.instance.AtlasEntityHeader;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.PROPERTY)
+public class EntityMutationResponse {
+
+ Map<EntityMutations.EntityOperation, List<AtlasEntityHeader>> entitiesMutated = new HashMap<>();
+
+ public EntityMutationResponse() {
+ }
+
+ public EntityMutationResponse(final Map<EntityMutations.EntityOperation, List<AtlasEntityHeader>> opVsEntityMap) {
+ this.entitiesMutated = opVsEntityMap;
+ }
+
+ public Map<EntityMutations.EntityOperation, List<AtlasEntityHeader>> getEntitiesMutated() {
+ return entitiesMutated;
+ }
+
+ public void setEntitiesMutated(final Map<EntityMutations.EntityOperation, List<AtlasEntityHeader>> opVsEntityMap) {
+ this.entitiesMutated = opVsEntityMap;
+ }
+
+ List<AtlasEntityHeader> getEntitiesByOperation(EntityMutations.EntityOperation op) {
+ if ( entitiesMutated != null) {
+ return entitiesMutated.get(op);
+ }
+ return null;
+ }
+
+ public void addEntity(EntityMutations.EntityOperation op, AtlasEntityHeader header) {
+ if (entitiesMutated == null) {
+ entitiesMutated = new HashMap<EntityMutations.EntityOperation, List<AtlasEntityHeader>>();
+ }
+
+ if (entitiesMutated != null && entitiesMutated.get(op) == null) {
+ entitiesMutated.put(op, new ArrayList<AtlasEntityHeader>());
+ }
+ entitiesMutated.get(op).add(header);
+ }
+
+
+ public StringBuilder toString(StringBuilder sb) {
+ if ( sb == null) {
+ sb = new StringBuilder();
+ }
+
+ if (MapUtils.isNotEmpty(entitiesMutated)) {
+ int i = 0;
+ for (Map.Entry<EntityMutations.EntityOperation, List<AtlasEntityHeader>> e : entitiesMutated.entrySet()) {
+ if (i > 0) {
+ sb.append(",");
+ }
+ sb.append(e.getKey()).append(":");
+ if (CollectionUtils.isNotEmpty(e.getValue())) {
+ for (int j = 0; i < e.getValue().size(); j++) {
+ if (j > 0) {
+ sb.append(",");
+ }
+ e.getValue().get(i).toString(sb);
+ }
+ }
+ i++;
+ }
+ }
+
+ return sb;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if ( this == o) return true;
+
+ if ( this == null || getClass() != o.getClass()) return false;
+ if ( !super.equals(o)) return false;
+
+ EntityMutationResponse that = (EntityMutationResponse) o;
+
+ if ( entitiesMutated != null ? !entitiesMutated.equals(that.entitiesMutated) : that.entitiesMutated != null) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (entitiesMutated != null ? entitiesMutated.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return toString(new StringBuilder()).toString();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/intg/src/main/java/org/apache/atlas/model/instance/EntityMutations.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/EntityMutations.java b/intg/src/main/java/org/apache/atlas/model/instance/EntityMutations.java
new file mode 100644
index 0000000..e489f33
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/instance/EntityMutations.java
@@ -0,0 +1,147 @@
+/**
+ * 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.
+ */
+package org.apache.atlas.model.instance;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
+@JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown=true)
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.PROPERTY)
+public class EntityMutations implements Serializable {
+
+ private List<EntityMutation> entityMutations = new ArrayList<>();
+
+ public enum EntityOperation {
+ CREATE_OR_UPDATE,
+ PARTIAL_UPDATE,
+ DELETE,
+ }
+
+ public static final class EntityMutation implements Serializable {
+ private EntityOperation op;
+ private AtlasEntity entity;
+
+ public EntityMutation(EntityOperation op, AtlasEntity entity) {
+ this.op = op;
+ this.entity = entity;
+ }
+
+ public StringBuilder toString(StringBuilder sb) {
+ if ( sb == null) {
+ sb = new StringBuilder();
+ }
+ sb.append("EntityMutation {");
+ sb.append("op=").append(op);
+ if (entity != null) {
+ sb.append(", entity=");
+ entity.toString(sb);
+ }
+ sb.append("}");
+
+ return sb;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) { return true; }
+ if (o == null || getClass() != o.getClass()) { return false; }
+
+ EntityMutation that = (EntityMutation) o;
+
+ if (op != null ? !op.equals(that.op) : that.op != null) { return false; }
+ if (entity != null ? !entity.equals(that.entity) : that.entity != null) { return false; }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (op != null ? op.hashCode() : 0);
+ result = 31 * result + (entity != null ? entity.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return toString(new StringBuilder()).toString();
+ }
+ }
+
+ public EntityMutations(List<EntityMutation> entityMutations) {
+ this.entityMutations = entityMutations;
+ }
+
+ public StringBuilder toString(StringBuilder sb) {
+ if ( sb == null) {
+ sb = new StringBuilder();
+ }
+ sb.append("EntityMutations{");
+ if (CollectionUtils.isNotEmpty(entityMutations)) {
+ for (int i = 0; i < entityMutations.size(); i++) {
+ if (i > 0) {
+ sb.append(",");
+ }
+ entityMutations.get(i).toString(sb);
+ }
+ }
+ sb.append("}");
+
+ return sb;
+ }
+
+ @Override
+ public String toString() {
+ return toString(new StringBuilder()).toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) { return true; }
+ if (o == null || getClass() != o.getClass()) { return false; }
+
+ EntityMutations that = (EntityMutations) o;
+
+ if (entityMutations != null ? !entityMutations.equals(that.entityMutations) : that.entityMutations != null) { return false; }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (entityMutations != null ? entityMutations.hashCode() : 0);
+ return result;
+ }
+}
+
+
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java b/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
index 190364f..a2f7463 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
@@ -73,7 +73,7 @@ public class AtlasTypeUtil {
public static boolean isMapType(String typeName) {
return StringUtils.startsWith(typeName, ATLAS_TYPE_MAP_PREFIX)
- && StringUtils.endsWith(typeName, ATLAS_TYPE_MAP_SUFFIX);
+ && StringUtils.endsWith(typeName, ATLAS_TYPE_MAP_SUFFIX);
}
@@ -109,44 +109,44 @@ public class AtlasTypeUtil {
public static AtlasAttributeDef createOptionalAttrDef(String name, AtlasType dataType) {
return new AtlasAttributeDef(name, dataType.getTypeName(), true,
- Cardinality.SINGLE, 0, 1,
- true, false,
- Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
+ Cardinality.SINGLE, 0, 1,
+ true, false,
+ Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
}
public static AtlasAttributeDef createOptionalAttrDef(String name, String dataType) {
return new AtlasAttributeDef(name, dataType, true,
- Cardinality.SINGLE, 0, 1,
- true, false,
- Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
+ Cardinality.SINGLE, 0, 1,
+ true, false,
+ Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
}
public static AtlasAttributeDef createRequiredAttrDef(String name, String dataType) {
return new AtlasAttributeDef(name, dataType, false,
- Cardinality.SINGLE, 1, 1,
- false, false,
- Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
+ Cardinality.SINGLE, 1, 1,
+ false, false,
+ Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
}
public static AtlasAttributeDef createUniqueRequiredAttrDef(String name, AtlasType dataType) {
return new AtlasAttributeDef(name, dataType.getTypeName(), false,
- Cardinality.SINGLE, 1, 1,
- true, true,
- Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
+ Cardinality.SINGLE, 1, 1,
+ true, true,
+ Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
}
public static AtlasAttributeDef createUniqueRequiredAttrDef(String name, String typeName) {
return new AtlasAttributeDef(name, typeName, false,
- Cardinality.SINGLE, 1, 1,
- true, true,
- Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
+ Cardinality.SINGLE, 1, 1,
+ true, true,
+ Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
}
public static AtlasAttributeDef createRequiredAttrDef(String name, AtlasType dataType) {
return new AtlasAttributeDef(name, dataType.getTypeName(), false,
- Cardinality.SINGLE, 1, 1,
- false, false,
- Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
+ Cardinality.SINGLE, 1, 1,
+ false, false,
+ Collections.<AtlasStructDef.AtlasConstraintDef>emptyList());
}
public static AtlasEnumDef createEnumTypeDef(String name, String description, AtlasEnumElementDef... enumValues) {
@@ -174,24 +174,24 @@ public class AtlasTypeUtil {
}
public static AtlasEntityDef createClassTypeDef(String name,
- ImmutableSet<String> superTypes, AtlasAttributeDef... attrDefs) {
+ ImmutableSet<String> superTypes, AtlasAttributeDef... attrDefs) {
return createClassTypeDef(name, null, "1.0", superTypes, attrDefs);
}
public static AtlasEntityDef createClassTypeDef(String name, String description,
- ImmutableSet<String> superTypes, AtlasAttributeDef... attrDefs) {
+ ImmutableSet<String> superTypes, AtlasAttributeDef... attrDefs) {
return createClassTypeDef(name, description, "1.0", superTypes, attrDefs);
}
public static AtlasEntityDef createClassTypeDef(String name, String description, String version,
- ImmutableSet<String> superTypes, AtlasAttributeDef... attrDefs) {
+ ImmutableSet<String> superTypes, AtlasAttributeDef... attrDefs) {
return new AtlasEntityDef(name, description, "1.0", Arrays.asList(attrDefs), superTypes);
}
public static AtlasTypesDef getTypesDef(List<AtlasEnumDef> enums,
- List<AtlasStructDef> structs,
- List<AtlasClassificationDef> traits,
- List<AtlasEntityDef> classes) {
+ List<AtlasStructDef> structs,
+ List<AtlasClassificationDef> traits,
+ List<AtlasEntityDef> classes) {
return new AtlasTypesDef(enums, structs, traits, classes);
}
-}
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/TestUtilsV2.java b/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
index dcccc38..bae9d3b 100755
--- a/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
+++ b/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
@@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasObjectId;
import org.apache.atlas.model.typedef.AtlasClassificationDef;
import org.apache.atlas.model.typedef.AtlasEntityDef;
import org.apache.atlas.model.typedef.AtlasEnumDef;
@@ -613,7 +614,7 @@ public final class TestUtilsV2 {
entity.setAttribute("description", "random table");
entity.setAttribute("type", "type");
entity.setAttribute("tableType", "MANAGED");
-// entity.setAttribute("database", new Id(dbId, 0, DATABASE_TYPE));
+ entity.setAttribute("database", new AtlasObjectId(DATABASE_TYPE, dbId));
entity.setAttribute("created", new Date());
return entity;
}
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 62fc136..a6fa7fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1069,6 +1069,14 @@
<dependency>
<groupId>org.apache.atlas</groupId>
+ <artifactId>atlas-intg</artifactId>
+ <version>${project.version}</version>
+ <classifier>tests</classifier>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.atlas</groupId>
<artifactId>atlas-typesystem</artifactId>
<version>${project.version}</version>
</dependency>
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 7737109..19f5244 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -9,6 +9,7 @@ ATLAS-1060 Add composite indexes for exact match performance improvements for al
ATLAS-1127 Modify creation and modification timestamps to Date instead of Long(sumasai)
ALL CHANGES:
+ATLAS-1241 New Instance APIs and POJOs (sumasai)
ATLAS-1259 Fix Test and compilation failure caused bt ATLAS-1233 changes (apoorvnaik via sumasai)
ATLAS-1248 /bin/atlas_stop.py not killing the process and process is found alive even after 30 secs (zhangqiang2 via sumasai)
ATLAS-1258 BugFix for Indexer NPE on StructDef lookup (apoorvnaik via sumasai)
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java b/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java
index 129591a..0325c80 100755
--- a/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java
+++ b/repository/src/main/java/org/apache/atlas/RepositoryMetadataModule.java
@@ -37,6 +37,8 @@ import org.apache.atlas.repository.audit.EntityAuditRepository;
import org.apache.atlas.repository.graph.DeleteHandler;
import org.apache.atlas.repository.graph.GraphBackedMetadataRepository;
import org.apache.atlas.repository.graph.GraphBackedSearchIndexer;
+import org.apache.atlas.repository.store.graph.AtlasEntityStore;
+import org.apache.atlas.repository.store.graph.v1.AtlasEntityStoreV1;
import org.apache.atlas.repository.store.graph.v1.AtlasTypeDefGraphStoreV1;
import org.apache.atlas.repository.typestore.GraphBackedTypeStore;
import org.apache.atlas.repository.typestore.ITypeStore;
@@ -83,6 +85,8 @@ public class RepositoryMetadataModule extends com.google.inject.AbstractModule {
typeDefChangeListenerMultibinder.addBinding().to(DefaultMetadataService.class);
typeDefChangeListenerMultibinder.addBinding().to(GraphBackedSearchIndexer.class).asEagerSingleton();
+ bind(AtlasEntityStore.class).to(AtlasEntityStoreV1.class);
+
// bind the MetadataService interface to an implementation
bind(MetadataService.class).to(DefaultMetadataService.class).asEagerSingleton();
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
new file mode 100644
index 0000000..f17b816
--- /dev/null
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
@@ -0,0 +1,178 @@
+/**
+ * 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.
+ */
+package org.apache.atlas.repository.store.graph;
+
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.SearchFilter;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasEntityWithAssociations;
+import org.apache.atlas.model.instance.EntityMutations;
+import org.apache.atlas.model.instance.EntityMutationResponse;
+
+import java.util.List;
+
+/**
+ * Persistence/Retrieval API for AtlasEntity
+ */
+public interface AtlasEntityStore {
+
+ /**
+ * Initialization
+ */
+ void init() throws AtlasBaseException;
+
+ /**
+ * Create or update an entity if it already exists.
+ * @param entity
+ * @return
+ */
+ EntityMutationResponse createOrUpdate(AtlasEntity entity);
+
+
+ /**
+ * Update entity identified by its guid
+ * @param guid
+ * @param entity
+ * @return
+ */
+ EntityMutationResponse updateById(String guid, AtlasEntity entity);
+
+ /**
+ *
+ * Get entity definition by its guid
+ * @param guid
+ * @return
+ */
+ AtlasEntity getById(String guid);
+
+ /**
+ * Delete an entity by its guid
+ * @param guid
+ * @return
+ */
+ EntityMutationResponse deleteById(String guid);
+
+
+ /**
+ * Create or update a list of entities
+ * @param entities List of AtlasEntity objects that need to be created
+ * @return EntityMutationResponse Entity mutations operations with the correspomding set of entities on which these operations were performed
+ * @throws AtlasBaseException
+ */
+
+ EntityMutationResponse createOrUpdate(List<AtlasEntity> entities) throws AtlasBaseException;
+
+ /**
+ *
+ * Provides list of updated entity guids including any child entities
+ * @param guid
+ * @param entity
+ * @return
+ * @throws AtlasBaseException
+ */
+ EntityMutationResponse updateByIds(String guid, AtlasEntity entity) throws AtlasBaseException;
+
+ /**
+ * Batch GET to retrieve entities by their ID
+ * @param guid
+ * @return
+ * @throws AtlasBaseException
+ */
+ AtlasEntity.AtlasEntities getByIds(List<String> guid) throws AtlasBaseException;
+
+ /**
+ * Batch GET to retrieve entities and their associations by their ID
+ * @param guid
+ * @return
+ * @throws AtlasBaseException
+ */
+ AtlasEntityWithAssociations getWithAssociationsByIds(List<String> guid) throws AtlasBaseException;
+
+ /*
+ * Return list of deleted entity guids
+ */
+ EntityMutationResponse deleteByIds(List<String> guid) throws AtlasBaseException;
+
+ /**
+ *
+ * Get an eneity by its unique attribute
+ * @param typeName
+ * @param attrName
+ * @param attrValue
+ * @return
+ */
+ AtlasEntity getByUniqueAttribute(String typeName, String attrName, String attrValue);
+
+ /**
+ * @deprecated
+ * Create or update a single entity
+ * @param typeName The entity's type
+ * @param attributeName Attribute that uniquely identifies the entity
+ * @param attributeValue The unqiue attribute's value
+ * @return EntityMutationResponse Entity mutations operations with the correspomding set of entities on which these operations were performed
+ * @throws AtlasBaseException
+ *
+ */
+
+ EntityMutationResponse updateByUniqueAttribute(String typeName, String attributeName, String attributeValue, AtlasEntity entity) throws AtlasBaseException;
+
+ /**
+ * @deprecated
+ * @param typeName
+ * @param attributeName
+ * @param attributeValue
+ * @return
+ * @throws AtlasBaseException
+ */
+ EntityMutationResponse deleteByUniqueAttribute(String typeName, String attributeName, String attributeValue) throws AtlasBaseException;
+
+ /**
+ * Compose any type of mutation op - EntityMutation.EntityOperation - CREATE_OR_UPDATE, PARTIAL_UPDATE, DELETE etc in a single transaction
+ * @param mutations
+ * @return
+ * @throws AtlasBaseException
+ */
+ EntityMutationResponse batchMutate(EntityMutations mutations) throws AtlasBaseException;
+
+ /**
+ * Add classification(s)
+ */
+ void addClassifications(String guid, List<AtlasClassification> classification) throws AtlasBaseException;
+
+
+ /**
+ * Update classification(s)
+ */
+ void updateClassifications(String guid, List<AtlasClassification> classification) throws AtlasBaseException;
+
+ /**
+ * Delete classification(s)
+ */
+ void deleteClassifications(String guid, List<String> classificationNames) throws AtlasBaseException;
+
+ /**
+ *
+ * Search by AND filters like typename, pre-defined attribute(s) eg: name, qualifiedName
+ * @param searchFilter
+ * @return
+ * @throws AtlasBaseException
+ */
+ AtlasEntity.AtlasEntities searchEntities(SearchFilter searchFilter) throws AtlasBaseException;
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
new file mode 100644
index 0000000..6b2b216
--- /dev/null
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
@@ -0,0 +1,122 @@
+/**
+ * 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.
+ */
+package org.apache.atlas.repository.store.graph.v1;
+
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.SearchFilter;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasEntityWithAssociations;
+import org.apache.atlas.model.instance.EntityMutationResponse;
+import org.apache.atlas.model.instance.EntityMutations;
+import org.apache.atlas.repository.store.graph.AtlasEntityStore;
+
+import java.util.List;
+
+public class AtlasEntityStoreV1 implements AtlasEntityStore {
+ @Override
+ public void init() throws AtlasBaseException {
+ }
+
+ @Override
+ public EntityMutationResponse createOrUpdate(final AtlasEntity entity) {
+ return null;
+ }
+
+ @Override
+ public EntityMutationResponse updateById(final String guid, final AtlasEntity entity) {
+ return null;
+ }
+
+ @Override
+ public AtlasEntity getById(final String guid) {
+ return null;
+ }
+
+ @Override
+ public EntityMutationResponse deleteById(final String guid) {
+ return null;
+ }
+
+ @Override
+ public EntityMutationResponse createOrUpdate(final List<AtlasEntity> entities) throws AtlasBaseException {
+ return null;
+ }
+
+ @Override
+ public EntityMutationResponse updateByIds(final String guid, final AtlasEntity entity) throws AtlasBaseException {
+ return null;
+ }
+
+ @Override
+ public AtlasEntity.AtlasEntities getByIds(final List<String> guid) throws AtlasBaseException {
+ return null;
+ }
+
+ @Override
+ public AtlasEntityWithAssociations getWithAssociationsByIds(final List<String> guid) throws AtlasBaseException {
+ return null;
+ }
+
+ @Override
+ public EntityMutationResponse deleteByIds(final List<String> guid) throws AtlasBaseException {
+ return null;
+ }
+
+ @Override
+ public AtlasEntity getByUniqueAttribute(final String typeName, final String attrName, final String attrValue) {
+ return null;
+ }
+
+ @Override
+ public EntityMutationResponse updateByUniqueAttribute(final String typeName, final String attributeName, final String attributeValue, final AtlasEntity entity) throws AtlasBaseException {
+ return null;
+ }
+
+ @Override
+ public EntityMutationResponse deleteByUniqueAttribute(final String typeName, final String attributeName, final String attributeValue) throws AtlasBaseException {
+ return null;
+ }
+
+ @Override
+ public EntityMutationResponse batchMutate(final EntityMutations mutations) throws AtlasBaseException {
+ return null;
+ }
+
+
+ @Override
+ public void addClassifications(final String guid, final List<AtlasClassification> classification) throws AtlasBaseException {
+
+ }
+
+ @Override
+ public void updateClassifications(final String guid, final List<AtlasClassification> classification) throws AtlasBaseException {
+
+ }
+
+ @Override
+ public void deleteClassifications(final String guid, final List<String> classificationNames) throws AtlasBaseException {
+
+ }
+
+ @Override
+ public AtlasEntity.AtlasEntities searchEntities(final SearchFilter searchFilter) throws AtlasBaseException {
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/webapp/pom.xml b/webapp/pom.xml
index 82f307c..6dbd484 100755
--- a/webapp/pom.xml
+++ b/webapp/pom.xml
@@ -347,6 +347,14 @@
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
+
+ <dependency>
+ <groupId>org.apache.atlas</groupId>
+ <artifactId>atlas-intg</artifactId>
+ <classifier>tests</classifier>
+ <scope>test</scope>
+ </dependency>
+
</dependencies>
<build>
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/webapp/src/main/java/org/apache/atlas/web/rest/EntitiesREST.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/rest/EntitiesREST.java b/webapp/src/main/java/org/apache/atlas/web/rest/EntitiesREST.java
new file mode 100644
index 0000000..543cbe2
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/web/rest/EntitiesREST.java
@@ -0,0 +1,128 @@
+/**
+ * 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.
+ */
+package org.apache.atlas.web.rest;
+
+import com.google.inject.Inject;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.SearchFilter;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.EntityMutationResponse;
+import org.apache.atlas.repository.store.graph.AtlasEntityStore;
+import org.apache.atlas.services.MetadataService;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.apache.atlas.typesystem.types.TypeSystem;
+import org.apache.atlas.web.util.Servlets;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Singleton;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import java.util.List;
+
+
+@Path("v2/entities")
+@Singleton
+public class EntitiesREST {
+ private static final Logger LOG = LoggerFactory.getLogger(EntitiesREST.class);
+
+ private AtlasEntityStore entitiesStore;
+
+ @Context
+ private HttpServletRequest httpServletRequest;
+
+ @Inject
+ private MetadataService metadataService;
+
+ private TypeSystem typeSystem = TypeSystem.getInstance();
+
+
+
+ @Inject
+ public EntitiesREST(AtlasEntityStore entitiesStore, AtlasTypeRegistry atlasTypeRegistry) {
+ LOG.info("EntitiesRest Init");
+ this.entitiesStore = entitiesStore;
+ }
+
+ /*******
+ * Entity Creation/Updation if it already exists in ATLAS
+ * An existing entity is matched by its guid if supplied or by its unique attribute eg: qualifiedName
+ * Any associations like Classifications, Business Terms will have to be handled through the respective APIs
+ *******/
+
+ @POST
+ @Consumes(Servlets.JSON_MEDIA_TYPE)
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public EntityMutationResponse createOrUpdate(List<AtlasEntity> entities) throws AtlasBaseException {
+ return null;
+ }
+
+ /*******
+ * Entity Updation - Allows full update of the specified entities.
+ * Any associations like Classifications, Business Terms will have to be handled through the respective APIs
+ * Null updates are supported i.e Set an attribute value to Null if its an optional attribute
+ *******/
+ @PUT
+ @Consumes(Servlets.JSON_MEDIA_TYPE)
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public EntityMutationResponse update(List<AtlasEntity> entities) throws AtlasBaseException {
+ return null;
+ }
+
+ @GET
+ @Path("/guids")
+ @Consumes(Servlets.JSON_MEDIA_TYPE)
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public EntityMutationResponse getById(@QueryParam("guid") List<String> guids) throws AtlasBaseException {
+ return null;
+ }
+
+ /*******
+ * Entity Delete
+ *******/
+
+ @DELETE
+ @Path("/guids")
+ @Consumes(Servlets.JSON_MEDIA_TYPE)
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public EntityMutationResponse deleteById(@QueryParam("guid") List<String> guids) throws AtlasBaseException {
+ return null;
+ }
+
+ /**
+ * Bulk retrieval API for searching on entities by certain predefined attributes ( typeName, superType, name, qualifiedName etc) + optional user defined attributes
+ *
+ * @throws AtlasBaseException
+ */
+ @GET
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public AtlasEntity.AtlasEntities searchEntities() throws AtlasBaseException {
+ //SearchFilter searchFilter
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/0c746895/webapp/src/main/java/org/apache/atlas/web/rest/EntityRest.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/rest/EntityRest.java b/webapp/src/main/java/org/apache/atlas/web/rest/EntityRest.java
new file mode 100644
index 0000000..df5138e
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/web/rest/EntityRest.java
@@ -0,0 +1,217 @@
+/**
+ * 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.
+ */
+package org.apache.atlas.web.rest;
+
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.EntityMutationResponse;
+import org.apache.atlas.web.util.Servlets;
+
+import javax.inject.Singleton;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import java.util.List;
+
+/**
+ * REST for a single entity
+ */
+@Path("v2/entity")
+@Singleton
+public class EntityRest {
+
+ /**
+ * Create or Update an entity if it already exists
+ *
+ * @param entity The updated entity
+ * @return
+ */
+ @POST
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public EntityMutationResponse createOrUpdate(AtlasEntity entity) {
+ return null;
+ }
+
+ /**
+ * Complete Update of an entity identified by its GUID
+ *
+ * @param guid
+ * @param entity The updated entity
+ * @return
+ */
+ @PUT
+ @Path("guid/{guid}")
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public EntityMutationResponse updateByGuid(@PathParam("guid") String guid, AtlasEntity entity, @DefaultValue("false") @QueryParam("partialUpdate") boolean partialUpdate) {
+ return null;
+ }
+
+
+ /**
+ * Fetch the complete definition of an entity given its GUID.
+ *
+ * @param guid GUID for the entity
+ */
+ @GET
+ @Path("/guid/{guid}")
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public AtlasEntity getByGuid(@PathParam("guid") String guid) {
+ return null;
+ }
+
+
+ /**
+ * Delete an entity identified by its GUID
+ *
+ * @param guid
+ * @return
+ */
+ @DELETE
+ @Path("guid/{guid}")
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public EntityMutationResponse deleteByGuid(@PathParam("guid") String guid) {
+ return null;
+ }
+
+
+ /*******
+ * Entity Partial Update - Allows a subset of attributes to be updated on
+ * an entity which is identified by its type and unique attribute eg: Referenceable.qualifiedName.
+ * Null updates are not possible
+ *******/
+
+ @Deprecated
+ @PUT
+ @Consumes(Servlets.JSON_MEDIA_TYPE)
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ @Path("/uniqueAttribute/type/{typeName}/attribute/{attrName}")
+ public EntityMutationResponse partialUpdateByUniqueAttribute(@PathParam("typeName") String entityType,
+ @PathParam("attrName") String attribute,
+ @QueryParam("value") String value, AtlasEntity entity) throws Exception {
+ return null;
+ }
+
+ @Deprecated
+ @DELETE
+ @Consumes(Servlets.JSON_MEDIA_TYPE)
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ @Path("/uniqueAttribute/type/{typeName}/attribute/{attrName}")
+ public EntityMutationResponse deleteByUniqueAttribute(@PathParam("typeName") String entityType,
+ @PathParam("attrName") String attribute,
+ @QueryParam("value") String value) throws Exception {
+ return null;
+ }
+
+ /**
+ * Fetch the complete definition of an entity
+ * which is identified by its type and unique attribute eg: Referenceable.qualifiedName.
+ */
+ @Deprecated
+ @GET
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ @Path("/uniqueAttribute/type/{typeName}/attribute/{attrName}")
+ public AtlasEntity getByUniqueAttribute(@PathParam("typeName") String entityType,
+ @PathParam("attrName") String attribute,
+ @QueryParam("value") String value) {
+ return null;
+ }
+
+
+ /**
+ * Gets the list of classifications for a given entity represented by a guid.
+ *
+ * @param guid globally unique identifier for the entity
+ * @return a list of classifications for the given entity guid
+ */
+ @GET
+ @Path("/guid/{guid}/classification/{classificationName}")
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public AtlasClassification.AtlasClassifications getClassification(@PathParam("guid") String guid, @PathParam("classificationName") String classificationName) {
+ return null;
+ }
+
+
+ /**
+ * Gets the list of classifications for a given entity represented by a guid.
+ *
+ * @param guid globally unique identifier for the entity
+ * @return a list of classifications for the given entity guid
+ */
+ @GET
+ @Path("/guid/{guid}/classifications")
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public AtlasClassification.AtlasClassifications getClassifications(@PathParam("guid") String guid) {
+ return null;
+ }
+
+ /**
+ * Classification management
+ */
+
+ /**
+ * Adds classifications to an existing entity represented by a guid.
+ *
+ * @param guid globally unique identifier for the entity
+ */
+ @POST
+ @Path("/guid/{guid}/classifications")
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public void addClassifications(@PathParam("guid") final String guid, List<AtlasClassification> classifications) {
+ }
+
+ /**
+ * Update classification(s) for an entity represented by a guid.
+ * Classifications are identified by their guid or name
+ *
+ * @param guid globally unique identifier for the entity
+ */
+ @PUT
+ @Path("/guid/{guid}/classifications")
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public void updateClassifications(@PathParam("guid") final String guid, List<AtlasClassification> classifications) {
+ }
+
+ /**
+ * Deletes a given classification from an existing entity represented by a guid.
+ *
+ * @param guid globally unique identifier for the entity
+ * @param classificationName name of the trait
+ */
+ @DELETE
+ @Path("/guid/{guid}/classification/{classificationName}")
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public void deleteClassification(@PathParam("guid") String guid,
+ @PathParam("classificationName") String classificationName) {
+ }
+}