| /** |
| * 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; |
| } |
| } |