/** * 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 * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * 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.catalog.definition; import com.tinkerpop.pipes.PipeFunction; import com.tinkerpop.pipes.transform.TransformFunctionPipe; import org.apache.atlas.catalog.Request; import org.apache.atlas.catalog.exception.InvalidPayloadException; import org.apache.atlas.catalog.projection.*; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Map; /** * Entity resource definition. */ public class EntityResourceDefinition extends BaseResourceDefinition { public EntityResourceDefinition() { collectionProperties.add("name"); collectionProperties.add("id"); collectionProperties.add("type"); RelationProjection tagProjection = getTagProjection(); projections.put("tags", tagProjection); RelationProjection traitProjection = getTraitProjection(); projections.put("traits", traitProjection); projections.put("default", getDefaultRelationProjection()); relations.put(tagProjection.getName(), tagProjection.getRelation()); relations.put(traitProjection.getName(), traitProjection.getRelation()); } @Override public String getIdPropertyName() { return "id"; } // not meaningful for entities @Override public String getTypeName() { return null; } @Override public void validateCreatePayload(Request request) throws InvalidPayloadException { // no op for entities as we don't currently create entities and // each entity type is different } @Override public String resolveHref(Map<String, Object> properties) { Object id = properties.get("id"); return id == null ? null : String.format("v1/entities/%s", id); } private RelationProjection getTagProjection() { Relation traitRelation = new TagRelation(); RelationProjection tagProjection = new RelationProjection("tags", Collections.singleton("name"), traitRelation, Projection.Cardinality.MULTIPLE); tagProjection.addPipe(new TransformFunctionPipe<>( new PipeFunction<Collection<ProjectionResult>, Collection<ProjectionResult>>() { @Override public Collection<ProjectionResult> compute(Collection<ProjectionResult> results) { for (ProjectionResult result : results) { for (Map<String, Object> properties : result.getPropertyMaps()) { properties.put("href", String.format("v1/entities/%s/tags/%s", result.getStartingVertex().getProperty("id"), properties.get("name"))); } } return results; } })); return tagProjection; } private RelationProjection getTraitProjection() { return new RelationProjection("traits", Collections.<String>emptySet(), new TraitRelation(), Projection.Cardinality.MULTIPLE); } private RelationProjection getDefaultRelationProjection() { Relation genericRelation = new GenericRelation(this); RelationProjection relationProjection = new RelationProjection( "relations", Arrays.asList("type", "id", "name"), genericRelation, Projection.Cardinality.MULTIPLE); relationProjection.addPipe(new TransformFunctionPipe<>( new PipeFunction<Collection<ProjectionResult>, Collection<ProjectionResult>>() { @Override public Collection<ProjectionResult> compute(Collection<ProjectionResult> results) { for (ProjectionResult result : results) { for (Map<String, Object> properties : result.getPropertyMaps()) { properties.put("href", String.format("v1/entities/%s", properties.get("id"))); } } return results; } })); return relationProjection; } }