| /** |
| * 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.converters; |
| |
| |
| import org.apache.atlas.AtlasErrorCode; |
| import org.apache.atlas.AtlasException; |
| import org.apache.atlas.exception.AtlasBaseException; |
| import org.apache.atlas.model.TypeCategory; |
| import org.apache.atlas.model.instance.AtlasEntity; |
| import org.apache.atlas.model.instance.AtlasObjectId; |
| import org.apache.atlas.type.AtlasEntityType; |
| import org.apache.atlas.type.AtlasType; |
| import org.apache.atlas.type.AtlasTypeRegistry; |
| import org.apache.atlas.typesystem.IReferenceableInstance; |
| import org.apache.atlas.typesystem.Referenceable; |
| import org.apache.atlas.typesystem.persistence.Id; |
| import org.apache.atlas.typesystem.persistence.StructInstance; |
| import org.apache.commons.collections.MapUtils; |
| import org.apache.commons.lang3.StringUtils; |
| |
| import java.util.Map; |
| |
| public class |
| AtlasObjectIdConverter extends AtlasAbstractFormatConverter { |
| |
| public AtlasObjectIdConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry) { |
| this(registry, typeRegistry, TypeCategory.OBJECT_ID_TYPE); |
| } |
| |
| protected AtlasObjectIdConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry, TypeCategory typeCategory) { |
| super(registry, typeRegistry, typeCategory); |
| } |
| |
| @Override |
| public Object fromV1ToV2(Object v1Obj, AtlasType type, AtlasFormatConverter.ConverterContext converterContext) throws AtlasBaseException { |
| Object ret = null; |
| |
| if (v1Obj != null) { |
| if (v1Obj instanceof Id) { |
| Id id = (Id) v1Obj; |
| |
| ret = new AtlasObjectId(id._getId(), id.getTypeName()); |
| } else if (v1Obj instanceof IReferenceableInstance) { |
| IReferenceableInstance refInst = (IReferenceableInstance) v1Obj; |
| String guid = refInst.getId()._getId(); |
| |
| ret = new AtlasObjectId(guid, refInst.getTypeName()); |
| |
| if (!converterContext.entityExists(guid) && hasAnyAssignedAttribute(refInst)) { |
| AtlasEntityType entityType = typeRegistry.getEntityTypeByName(refInst.getTypeName()); |
| AtlasEntityFormatConverter converter = (AtlasEntityFormatConverter) converterRegistry.getConverter(TypeCategory.ENTITY); |
| AtlasEntity entity = converter.fromV1ToV2(v1Obj, entityType, converterContext); |
| |
| converterContext.addReferredEntity(entity); |
| } |
| } |
| } |
| |
| return ret; |
| } |
| |
| @Override |
| public Object fromV2ToV1(Object v2Obj, AtlasType type, ConverterContext converterContext) throws AtlasBaseException { |
| Id ret = null; |
| |
| if (v2Obj != null) { |
| |
| if (v2Obj instanceof Map) { |
| Map v2Map = (Map) v2Obj; |
| String idStr = (String)v2Map.get(AtlasObjectId.KEY_GUID); |
| String typeName = type.getTypeName(); |
| |
| if (StringUtils.isEmpty(idStr)) { |
| throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND); |
| } |
| |
| ret = new Id(idStr, 0, typeName); |
| } else if (v2Obj instanceof AtlasObjectId) { // transient-id |
| ret = new Id(((AtlasObjectId) v2Obj).getGuid(), 0, type.getTypeName()); |
| } else if (v2Obj instanceof AtlasEntity) { |
| AtlasEntity entity = (AtlasEntity) v2Obj; |
| ret = new Id(((AtlasObjectId) v2Obj).getGuid(), 0, type.getTypeName()); |
| } else { |
| throw new AtlasBaseException(AtlasErrorCode.TYPE_CATEGORY_INVALID, type.getTypeCategory().name()); |
| } |
| } |
| return ret; |
| } |
| |
| private boolean hasAnyAssignedAttribute(IReferenceableInstance rInstance) { |
| boolean ret = false; |
| |
| if (rInstance instanceof StructInstance) { |
| StructInstance sInstance = (StructInstance) rInstance; |
| |
| Map<String, Object> attributes = null; |
| |
| try { |
| attributes = sInstance.getValuesMap(); |
| } catch (AtlasException e) { |
| // ignore |
| } |
| |
| if (MapUtils.isNotEmpty(attributes)) { |
| for (String attrName : attributes.keySet()) { |
| try { |
| if (sInstance.isValueSet(attrName)) { |
| ret = true; |
| break; |
| } |
| } catch (AtlasException e) { |
| // ignore |
| } |
| } |
| } |
| } else if (rInstance instanceof Referenceable) { |
| Referenceable referenceable = (Referenceable) rInstance; |
| |
| ret = MapUtils.isNotEmpty(referenceable.getValuesMap()); |
| } |
| |
| return ret; |
| } |
| } |