/*
* 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.tinkerpop.gremlin.structure.util.star;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
import org.apache.tinkerpop.gremlin.structure.util.Attachable;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
* Provides helper functions for reading vertex and edges from their serialized GraphSON forms.
*/
public class StarGraphGraphSONDeserializer {
/**
* A helper function for reading vertex edges from a serialized {@link org.apache.tinkerpop.gremlin.structure.util.star.StarGraph} (i.e. a {@link java.util.Map}) generated by
* {@link org.apache.tinkerpop.gremlin.structure.util.star.StarGraphGraphSONSerializerV1d0}.
*/
public static void readStarGraphEdges(final Function<Attachable<Edge>, Edge> edgeMaker,
final StarGraph starGraph,
final Map<String, Object> vertexData,
final String direction) throws IOException {
final Map<String, List<Map<String,Object>>> edgeDatas = (Map<String, List<Map<String,Object>>>) vertexData.get(direction);
for (Map.Entry<String, List<Map<String,Object>>> edgeData : edgeDatas.entrySet()) {
for (Map<String,Object> inner : edgeData.getValue()) {
final StarGraph.StarEdge starEdge;
if (direction.equals(GraphSONTokens.OUT_E))
starEdge = (StarGraph.StarEdge) starGraph.getStarVertex().addOutEdge(edgeData.getKey(), starGraph.addVertex(T.id, inner.get(GraphSONTokens.IN)), T.id, inner.get(GraphSONTokens.ID));
else
starEdge = (StarGraph.StarEdge) starGraph.getStarVertex().addInEdge(edgeData.getKey(), starGraph.addVertex(T.id, inner.get(GraphSONTokens.OUT)), T.id, inner.get(GraphSONTokens.ID));
if (inner.containsKey(GraphSONTokens.PROPERTIES)) {
final Map<String, Object> edgePropertyData = (Map<String, Object>) inner.get(GraphSONTokens.PROPERTIES);
for (Map.Entry<String, Object> epd : edgePropertyData.entrySet()) {
starEdge.property(epd.getKey(), epd.getValue());
}
}
if (edgeMaker != null) edgeMaker.apply(starEdge);
}
}
}
/**
* A helper function for reading a serialized {@link org.apache.tinkerpop.gremlin.structure.util.star.StarGraph} from a {@link java.util.Map} generated by
* {@link org.apache.tinkerpop.gremlin.structure.util.star.StarGraphGraphSONSerializerV1d0}.
*/
public static StarGraph readStarGraphVertex(final Map<String, Object> vertexData) throws IOException {
final StarGraph starGraph = StarGraph.open();
starGraph.addVertex(T.id, vertexData.get(GraphSONTokens.ID), T.label, vertexData.get(GraphSONTokens.LABEL));
if (vertexData.containsKey(GraphSONTokens.PROPERTIES)) {
final Map<String, List<Map<String, Object>>> properties = (Map<String, List<Map<String, Object>>>) vertexData.get(GraphSONTokens.PROPERTIES);
for (Map.Entry<String, List<Map<String, Object>>> property : properties.entrySet()) {
for (Map<String, Object> p : property.getValue()) {
final StarGraph.StarVertexProperty vp = (StarGraph.StarVertexProperty) starGraph.getStarVertex().property(VertexProperty.Cardinality.list, property.getKey(), p.get(GraphSONTokens.VALUE), T.id, p.get(GraphSONTokens.ID));
if (p.containsKey(GraphSONTokens.PROPERTIES)) {
final Map<String, Object> edgePropertyData = (Map<String, Object>) p.get(GraphSONTokens.PROPERTIES);
for (Map.Entry<String, Object> epd : edgePropertyData.entrySet()) {
vp.property(epd.getKey(), epd.getValue());
}
}
}
}
}
return starGraph;
}
}