2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
11 http://www.apache.org/licenses/LICENSE-2.0
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.aai.serialization.tinkerpop;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.Iterator;
26 import java.util.List;
28 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
29 import org.apache.tinkerpop.gremlin.structure.Direction;
30 import org.apache.tinkerpop.gremlin.structure.Edge;
31 import org.apache.tinkerpop.gremlin.structure.Element;
32 import org.apache.tinkerpop.gremlin.structure.Graph;
33 import org.apache.tinkerpop.gremlin.structure.Vertex;
34 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
37 * Represents a {@link Vertex} that is disconnected from a {@link Graph} however,
38 * traversals are supported as they are backed by a Tree with saturated {@link Vertex} and {@link Edge} objects.
39 * These objects are not mutable and can only be used to read information out.
43 public class TreeBackedVertex extends DetachedVertex implements Vertex {
45 private static final long serialVersionUID = -976854460992756953L;
46 private final Tree<Element> tree;
47 private final Vertex self;
48 public TreeBackedVertex (Vertex v, Tree<Element> tree) {
55 public Iterator<Edge> edges(final Direction direction, final String... edgeLabels) {
56 final List<Element> edges = tree.getObjectsAtDepth(2);
57 final List<Tree<Element>> trees = tree.getTreesAtDepth(2);
58 final List<Tree<Element>> vTrees = tree.getTreesAtDepth(3);
59 return edges.stream().map( ele -> (Edge)ele).filter(e -> {
60 if (Direction.IN.equals(direction)) {
61 return e.inVertex().equals(self);
62 } else if (Direction.OUT.equals(direction)) {
63 return e.outVertex().equals(self);
68 boolean result = false;
69 if (edgeLabels.length == 0) {
72 for (String label : edgeLabels) {
73 if (label.equals(e.label())) {
80 Tree<Element> eTree = new Tree<>();
81 for (Tree<Element> tree : trees) {
82 if (tree.keySet().contains(e)) {
87 TreeBackedVertex in = null;
88 TreeBackedVertex out = null;
89 if (e.inVertex().equals(self)) {
91 out = this.createForVertex(e.outVertex(), vTrees);
92 } else if (e.outVertex().equals(self)) {
94 in = this.createForVertex(e.inVertex(), vTrees);
96 return (Edge)new TreeBackedEdge(e, in, out);
101 private TreeBackedVertex createForVertex(Vertex v, List<Tree<Element>> trees) {
102 Tree<Element> vTree = new Tree<>();
103 for (Tree<Element> tree : trees) {
104 if (tree.keySet().contains(v)) {
110 return new TreeBackedVertex((Vertex)vTree.keySet().iterator().next(), vTree);
113 public Iterator<Vertex> vertices(final Direction direction, final String... labels) {
114 final List<Tree<Element>> vertexElements = tree.getTreesAtDepth(3);
115 final List<Element> edgeElements = tree.getObjectsAtDepth(2);
116 return edgeElements.stream().map( ele -> (Edge)ele).filter(e -> {
117 boolean result = false;
118 if (labels.length == 0) {
121 for (String label : labels) {
122 if (label.equals(e.label())) {
129 if (Direction.IN.equals(direction) && e.inVertex().equals(self)) {
131 } else if (Direction.OUT.equals(direction) && e.outVertex().equals(self)) {
133 } else if (Direction.BOTH.equals(direction)){
139 final List<Vertex> list;
140 if (Direction.IN.equals(direction)) {
141 list = Collections.singletonList(e.outVertex());
142 } else if (Direction.OUT.equals(direction)){
143 list = Collections.singletonList(e.inVertex());
145 list = new ArrayList<>();
146 Iterator<Vertex> itr = e.bothVertices();
147 while (itr.hasNext()) {
148 list.add(itr.next());
153 }).flatMap(list -> list.stream()).map(v -> {
154 Tree<Element> vTree = new Tree<Element>();
155 for (Tree<Element> tree : vertexElements) {
156 if (tree.keySet().contains(v)) {
162 return (Vertex)new TreeBackedVertex(v, vTree);