/** * 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.AtlasBaseTypeDef; import org.apache.atlas.model.typedef.AtlasEntityDef; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.codehaus.jackson.annotate.JsonAutoDetect; import org.codehaus.jackson.annotate.JsonIgnore; 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.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicLong; 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. */ @JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE) @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) @JsonIgnoreProperties(ignoreUnknown=true) @XmlRootElement @XmlAccessorType(XmlAccessType.PROPERTY) public class AtlasEntity extends AtlasStruct implements Serializable { private static final long serialVersionUID = 1L; /** * Status of the entity - can be active or deleted. Deleted entities are not removed from Atlas store. */ public enum Status { ACTIVE, DELETED } private String guid = null; private Status status = Status.ACTIVE; private String createdBy = null; private String updatedBy = null; private Date createTime = null; private Date updateTime = null; private Long version = 0L; private List<AtlasClassification> classifications; @JsonIgnore private static AtomicLong s_nextId = new AtomicLong(System.nanoTime()); public AtlasEntity() { this(null, null); } public AtlasEntity(String typeName) { this(typeName, null); } public AtlasEntity(AtlasEntityDef entityDef) { this(entityDef != null ? entityDef.getName() : null, null); } public AtlasEntity(String typeName, String attrName, Object attrValue) { super(typeName, attrName, attrValue); init(); } public AtlasEntity(String typeName, Map<String, Object> attributes) { super(typeName, attributes); init(); } public AtlasEntity(AtlasEntity other) { super(other); if (other != null) { setGuid(other.getGuid()); setStatus(other.getStatus()); setCreatedBy(other.getCreatedBy()); setUpdatedBy(other.getUpdatedBy()); setCreateTime(other.getCreateTime()); setUpdateTime(other.getUpdateTime()); setVersion(other.getVersion()); setClassifications(other.getClassifications()); } } public String getGuid() { return guid; } public void setGuid(String guid) { this.guid = guid; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public String getCreatedBy() { return createdBy; } public void setCreatedBy(String createdBy) { this.createdBy = createdBy; } public String getUpdatedBy() { return updatedBy; } public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public Long getVersion() { return version; } public void setVersion(Long version) { this.version = version; } public List<AtlasClassification> getClassifications() { return classifications; } public void setClassifications(List<AtlasClassification> classifications) { this.classifications = classifications; } private void init() { setGuid(nextInternalId()); setStatus(null); setCreatedBy(null); setUpdatedBy(null); setCreateTime(null); setUpdateTime(null); setClassifications(null); } private static String nextInternalId() { return "-" + Long.toString(s_nextId.getAndIncrement()); } @Override public StringBuilder toString(StringBuilder sb) { if (sb == null) { sb = new StringBuilder(); } sb.append("AtlasEntity{"); super.toString(sb); sb.append("guid='").append(guid).append('\''); sb.append(", status=").append(status); sb.append(", createdBy='").append(createdBy).append('\''); sb.append(", updatedBy='").append(updatedBy).append('\''); dumpDateField(", createTime=", createTime, sb); dumpDateField(", updateTime=", updateTime, sb); sb.append(", version=").append(version); sb.append(", classifications=["); AtlasBaseTypeDef.dumpObjects(classifications, sb); sb.append(']'); sb.append(", "); 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; } AtlasEntity that = (AtlasEntity) o; return Objects.equals(guid, that.guid) && status == that.status && Objects.equals(createdBy, that.createdBy) && Objects.equals(updatedBy, that.updatedBy) && Objects.equals(createTime, that.createTime) && Objects.equals(updateTime, that.updateTime) && Objects.equals(version, that.version) && Objects.equals(classifications, that.classifications); } @Override public int hashCode() { return Objects.hash(super.hashCode(), guid, status, createdBy, updatedBy, createTime, updateTime, version, classifications); } @Override public String toString() { return toString(new StringBuilder()).toString(); } /** * An instance of an entity along with extended info - 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 static class AtlasEntityExtInfo implements Serializable { private static final long serialVersionUID = 1L; private Map<String, AtlasEntity> referredEntities; public AtlasEntityExtInfo() { setReferredEntities(null); } public AtlasEntityExtInfo(AtlasEntity referredEntity) { addReferredEntity(referredEntity); } public AtlasEntityExtInfo(Map<String, AtlasEntity> referredEntities) { setReferredEntities(referredEntities); } public AtlasEntityExtInfo(AtlasEntityExtInfo other) { if (other != null) { setReferredEntities(other.getReferredEntities()); } } public Map<String, AtlasEntity> getReferredEntities() { return referredEntities; } public void setReferredEntities(Map<String, AtlasEntity> referredEntities) { this.referredEntities = referredEntities; } @JsonIgnore public final void addReferredEntity(AtlasEntity entity) { addReferredEntity(entity.getGuid(), entity); } @JsonIgnore public final void addReferredEntity(String guid, AtlasEntity entity) { Map<String, AtlasEntity> r = this.referredEntities; if (r == null) { r = new HashMap<>(); this.referredEntities = r; } if (guid != null) { r.put(guid, entity); } } @JsonIgnore public final AtlasEntity removeReferredEntity(String guid) { Map<String, AtlasEntity> r = this.referredEntities; return r != null && guid != null ? r.remove(guid) : null; } @JsonIgnore public final AtlasEntity getReferredEntity(String guid) { Map<String, AtlasEntity> r = this.referredEntities; return r != null && guid != null ? r.get(guid) : null; } @JsonIgnore public AtlasEntity getEntity(String guid) { return getReferredEntity(guid); } @JsonIgnore public AtlasEntity removeEntity(String guid) { Map<String, AtlasEntity> r = this.referredEntities; return r != null && guid != null ? r.remove(guid) : null; } public void updateEntityGuid(String oldGuid, String newGuid) { AtlasEntity entity = getEntity(oldGuid); if (entity != null) { entity.setGuid(newGuid); if(removeEntity(oldGuid) != null) { addReferredEntity(newGuid, entity); } } } public boolean hasEntity(String guid) { return getEntity(guid) != null; } public void compact() { // for derived classes to implement their own logic } public StringBuilder toString(StringBuilder sb) { if (sb == null) { sb = new StringBuilder(); } sb.append("AtlasEntityExtInfo{"); sb.append("referredEntities={"); AtlasBaseTypeDef.dumpObjects(referredEntities, sb); sb.append("}"); sb.append("}"); return sb; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } AtlasEntityExtInfo that = (AtlasEntityExtInfo) o; return Objects.equals(referredEntities, that.referredEntities); } @Override public int hashCode() { return Objects.hash(referredEntities); } @Override public String toString() { return toString(new StringBuilder()).toString(); } } @JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE) @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) @JsonIgnoreProperties(ignoreUnknown=true) @XmlRootElement @XmlAccessorType(XmlAccessType.PROPERTY) public static class AtlasEntityWithExtInfo extends AtlasEntityExtInfo { private static final long serialVersionUID = 1L; private AtlasEntity entity; public AtlasEntityWithExtInfo() { this(null, null); } public AtlasEntityWithExtInfo(AtlasEntity entity) { this(entity, null); } public AtlasEntityWithExtInfo(AtlasEntity entity, AtlasEntityExtInfo extInfo) { super(extInfo); this.entity = entity; } public AtlasEntity getEntity() { return entity; } public void setEntity(AtlasEntity entity) { this.entity = entity; } @JsonIgnore @Override public AtlasEntity getEntity(String guid) { AtlasEntity ret = super.getEntity(guid); if (ret == null && entity != null) { if (StringUtils.equals(guid, entity.getGuid())) { ret = entity; } } return ret; } @JsonIgnore @Override public void compact() { super.compact(); // remove 'entity' from referredEntities if (entity != null) { removeEntity(entity.getGuid()); } } @Override public StringBuilder toString(StringBuilder sb) { if (sb == null) { sb = new StringBuilder(); } sb.append("AtlasEntityWithExtInfo{"); sb.append("entity=").append(entity).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; } AtlasEntityWithExtInfo that = (AtlasEntityWithExtInfo) o; return Objects.equals(entity, that.entity); } @Override public int hashCode() { return Objects.hash(super.hashCode(), entity); } } @JsonAutoDetect(getterVisibility=PUBLIC_ONLY, setterVisibility=PUBLIC_ONLY, fieldVisibility=NONE) @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) @JsonIgnoreProperties(ignoreUnknown=true) @XmlRootElement @XmlAccessorType(XmlAccessType.PROPERTY) public static class AtlasEntitiesWithExtInfo extends AtlasEntityExtInfo { private static final long serialVersionUID = 1L; private List<AtlasEntity> entities; public AtlasEntitiesWithExtInfo() { this(null, null); } public AtlasEntitiesWithExtInfo(AtlasEntity entity) { this(Arrays.asList(entity), null); } public AtlasEntitiesWithExtInfo(List<AtlasEntity> entities) { this(entities, null); } public AtlasEntitiesWithExtInfo(AtlasEntityWithExtInfo entity) { this(Arrays.asList(entity.getEntity()), entity); } public AtlasEntitiesWithExtInfo(List<AtlasEntity> entities, AtlasEntityExtInfo extInfo) { super(extInfo); this.entities = entities; } public List<AtlasEntity> getEntities() { return entities; } public void setEntities(List<AtlasEntity> entities) { this.entities = entities; } @JsonIgnore @Override public AtlasEntity getEntity(String guid) { AtlasEntity ret = super.getEntity(guid); if (ret == null && CollectionUtils.isNotEmpty(entities)) { for (AtlasEntity entity : entities) { if (StringUtils.equals(guid, entity.getGuid())) { ret = entity; break; } } } return ret; } public void addEntity(AtlasEntity entity) { List<AtlasEntity> entities = this.entities; if (entities == null) { entities = new ArrayList<>(); this.entities = entities; } entities.add(entity); } public void removeEntity(AtlasEntity entity) { List<AtlasEntity> entities = this.entities; if (entity != null && entities != null) { entities.remove(entity); } } @Override public void compact() { super.compact(); // remove 'entities' from referredEntities if (CollectionUtils.isNotEmpty(entities)) { for (AtlasEntity entity : entities) { removeReferredEntity(entity.getGuid()); } } } @Override public StringBuilder toString(StringBuilder sb) { if (sb == null) { sb = new StringBuilder(); } sb.append("AtlasEntitiesWithExtInfo{"); sb.append("entities=["); AtlasBaseTypeDef.dumpObjects(entities, sb); 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; } AtlasEntitiesWithExtInfo that = (AtlasEntitiesWithExtInfo) o; return Objects.equals(entities, that.entities); } @Override public int hashCode() { return Objects.hash(super.hashCode(), entities); } } /** * 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 AtlasEntities extends PList<AtlasEntity> { private static final long serialVersionUID = 1L; public AtlasEntities() { super(); } public AtlasEntities(List<AtlasEntity> list) { super(list); } public AtlasEntities(List list, long startIndex, int pageSize, long totalCount, SortType sortType, String sortBy) { super(list, startIndex, pageSize, totalCount, sortType, sortBy); } } }