/* Copyright (c) 2014 Boundless and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/org/documents/edl-v10.html * * Contributors: * Justin Deoliveira (Boundless) - initial implementation */ package org.locationtech.geogig.storage.memory; import java.util.List; import java.util.Map; import org.locationtech.geogig.api.ObjectId; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * Node class used by {@link Graph}. * <p> * Every node contains an {@link ObjectId} representing the node in addition to a map of key/value * properties representing "extended" attributes. * </p> * * @author Justin Deoliveira, Boundless */ class Node { final ObjectId id; final List<Edge> in = Lists.newArrayList(); final List<Edge> out = Lists.newArrayList(); boolean root = false; Map<String,String> props; /** * Creates a new node with the specified id. */ Node(ObjectId id) { this.id = id; } /** * Determines if this node is marked as a root node. */ public boolean isRoot() { return root; } /** * Marks/unmarks a node as a root node. */ public void setRoot(boolean root) { this.root = root; } /** * Returns all nodes reachable from this node through an outgoing relationship. */ public Iterable<Node> to() { return Iterables.transform(out, new Function<Edge,Node>() { @Override public Node apply(Edge e) { return e.dst; } }); } /** * Returns all nodes related to this node through an incoming relationship. */ public Iterable<Node> from() { return Iterables.transform(in, new Function<Edge,Node>() { @Override public Node apply(Edge e) { return e.src; } }); } /** * Associates a property with the node. */ public void put(String key, String value) { if (props == null) { props = Maps.newHashMap(); } props.put(key, value); } /** * Retrieves a property of the node. */ public Optional<String> get(String key) { return Optional.fromNullable(props != null ? props.get(key) : null); } @Override public String toString() { return id != null ? id.toString() : "null"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Node other = (Node) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }