/*
* Copyright DataStax, Inc.
*
* Licensed 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 com.datastax.dse.driver.internal.core.graph;
import com.datastax.dse.driver.api.core.graph.GraphNode;
import com.datastax.oss.driver.api.core.type.reflect.GenericType;
import com.datastax.oss.driver.shaded.guava.common.base.Objects;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.jcip.annotations.Immutable;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Property;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
Modern implementation for GraphSON 2+ results.
The server returns results with type information. The driver works with the decoded objects
directly.
/**
* Modern implementation for GraphSON 2+ results.
*
* <p>The server returns results with type information. The driver works with the decoded objects
* directly.
*/
@Immutable
public class ObjectGraphNode implements GraphNode {
private final Object delegate;
public ObjectGraphNode(Object delegate) {
this.delegate = delegate;
}
@Override
public boolean isNull() {
return delegate == null;
}
@Override
public boolean isMap() {
return delegate instanceof Map;
}
@Override
public Iterable<?> keys() {
return ((Map<?, ?>) delegate).keySet();
}
@Override
public GraphNode getByKey(Object key) {
if (!isMap()) {
return null;
}
Map<?, Object> map = asMap();
if (map.containsKey(key)) {
return new ObjectGraphNode(map.get(key));
}
return null;
}
@Override
@SuppressWarnings("unchecked")
public <K, V> Map<K, V> asMap() {
return (Map<K, V>) delegate;
}
@Override
public boolean isList() {
return delegate instanceof List;
}
@Override
public int size() {
if (isList()) {
return asList().size();
} else if (isMap()) {
return asMap().size();
} else if (isSet()) {
return asSet().size();
} else {
return 0;
}
}
@Override
public GraphNode getByIndex(int index) {
if (!isList() || index < 0 || index >= size()) {
return null;
}
return new ObjectGraphNode(asList().get(index));
}
@Override
@SuppressWarnings("unchecked")
public <T> List<T> asList() {
return (List<T>) delegate;
}
@Override
public boolean isValue() {
return !(isList()
|| isMap()
|| isSet()
|| isVertex()
|| isEdge()
|| isPath()
|| isProperty()
|| isVertexProperty());
}
@Override
public boolean isVertexProperty() {
return delegate instanceof VertexProperty;
}
@Override
public boolean isProperty() {
return delegate instanceof Property;
}
@Override
public boolean isPath() {
return delegate instanceof Path;
}
@Override
public int asInt() {
return (Integer) delegate;
}
@Override
public boolean asBoolean() {
return (Boolean) delegate;
}
@Override
public long asLong() {
return (Long) delegate;
}
@Override
public double asDouble() {
return (Double) delegate;
}
@Override
public String asString() {
return (String) delegate;
}
@Override
@SuppressWarnings("unchecked")
public <T> T as(Class<T> clazz) {
return (T) delegate;
}
@Override
@SuppressWarnings("unchecked")
public <T> T as(GenericType<T> type) {
return (T) delegate;
}
@Override
public boolean isVertex() {
return delegate instanceof Vertex;
}
@Override
public Vertex asVertex() {
return (Vertex) delegate;
}
@Override
public boolean isEdge() {
return delegate instanceof Edge;
}
@Override
public Edge asEdge() {
return (Edge) delegate;
}
@Override
public Path asPath() {
return (Path) delegate;
}
@Override
@SuppressWarnings("unchecked")
public <T> Property<T> asProperty() {
return (Property<T>) delegate;
}
@Override
@SuppressWarnings("unchecked")
public <T> VertexProperty<T> asVertexProperty() {
return (VertexProperty<T>) delegate;
}
@Override
public boolean isSet() {
return delegate instanceof Set;
}
@Override
@SuppressWarnings("unchecked")
public <T> Set<T> asSet() {
return (Set<T>) delegate;
}
@Override
public String toString() {
return this.delegate.toString();
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
// Compare each others' delegates.
return other instanceof ObjectGraphNode
&& Objects.equal(this.delegate, ((ObjectGraphNode) other).delegate);
}
@Override
public int hashCode() {
return Objects.hashCode(delegate);
}
}