blob: 5b8e1570dd3ad64ed59d5ff6e9d2aec3aa702f54 [file] [log] [blame]
/**
* 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.typesystem;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import org.apache.atlas.AtlasException;
import org.apache.atlas.classification.InterfaceAudience;
import org.apache.atlas.typesystem.persistence.Id;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Represents a Class Instance that has not been associated with a FieldMapping.
*/
public class Referenceable extends Struct implements IReferenceableInstance {
private Id id;
private final ImmutableMap<String, IStruct> traits;
private final ImmutableList<String> traitNames;
public Referenceable(String typeName, String... traitNames) {
super(typeName);
id = new Id(typeName);
this.traitNames = ImmutableList.copyOf(traitNames);
ImmutableMap.Builder<String, IStruct> b = new ImmutableMap.Builder<>();
for (String t : traitNames) {
b.put(t, new Struct(t));
}
traits = b.build();
}
public Referenceable(String typeName, Map<String, Object> values) {
super(typeName, values);
id = new Id(typeName);
traitNames = ImmutableList.of();
traits = ImmutableMap.of();
}
public Referenceable(String guid, String typeName, Map<String, Object> values) {
super(typeName, values);
id = new Id(guid, 0, typeName);
traitNames = ImmutableList.of();
traits = ImmutableMap.of();
}
/**
* Not public - only use during deserialization
* @param guid the unique id
* @param typeName the type name
* @param values the entity attribute values
*/
@InterfaceAudience.Private
public Referenceable(String guid, String typeName, Map<String, Object> values, List<String> _traitNames,
Map<String, IStruct> _traits) {
super(typeName, values);
id = new Id(guid, 0, typeName);
traitNames = ImmutableList.copyOf(_traitNames);
traits = ImmutableMap.copyOf(_traits);
}
/**
* Not public - only use during deserialization
* @param id entity id
* @param typeName the type name
* @param values the entity attribute values
*/
@InterfaceAudience.Private
public Referenceable(Id id, String typeName, Map<String, Object> values, List<String> _traitNames,
Map<String, IStruct> _traits) {
super(typeName, values);
this.id = id;
traitNames = ImmutableList.copyOf(_traitNames);
traits = ImmutableMap.copyOf(_traits);
}
/**
* Construct a Referenceable from the given IReferenceableInstance.
*
* @param instance the referenceable instance to copy
*
* @throws AtlasException if the referenceable can not be created
*/
public Referenceable(IReferenceableInstance instance) throws AtlasException {
this(instance.getId(), instance.getTypeName(), instance.getValuesMap(), instance.getTraits(),
getTraits(instance));
}
/**
* No-arg constructor for serialization.
*/
@SuppressWarnings("unused")
private Referenceable() {
super(null, null);
id = null;
traitNames = ImmutableList.of();
traits = ImmutableMap.of();
}
@Override
public ImmutableList<String> getTraits() {
return traitNames;
}
@Override
public Id getId() {
return id;
}
@Override
public IStruct getTrait(String typeName) {
return traits.get(typeName);
}
/**
* Matches traits, values associated with this Referenceable and skips the id match
* @param o The Referenceable which needs to be matched with
* @return
*/
public boolean equalsContents(Object o) {
if(this == o) {
return true;
}
if(o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}
if(!super.equalsContents(o)) {
return false;
}
Referenceable obj = (Referenceable)o;
if (!traitNames.equals(obj.getTraits())) {
return false;
}
return true;
}
public String toString() {
return "{" +
"Id='" + id + '\'' +
", traits=" + traitNames +
", values=" + getValuesMap() +
'}';
}
@Override
public String toShortString() {
return String.format("entity[type=%s guid=%s]", typeName, id._getId());
}
public void replaceWithNewId(Id id) {
this.id = id;
}
private static Map<String, IStruct> getTraits(IReferenceableInstance instance) throws AtlasException {
Map<String, IStruct> traits = new HashMap<>();
for (String traitName : instance.getTraits() ) {
traits.put(traitName, new Struct(traitName, instance.getTrait(traitName).getValuesMap()));
}
return traits;
}
}