1 package org.thegalactic.dgraph; 2 3 /* 4 * Node.java 5 * 6 * Copyright: 2010-2015 Karell Bertet, France 7 * Copyright: 2015-2016 The Galactic Organization, France 8 * 9 * License: http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html CeCILL-B license 10 * 11 * This file is part of java-lattices. 12 * You can redistribute it and/or modify it under the terms of the CeCILL-B license. 13 */ 14 /** 15 * This class gives a standard representation for a node of a graph. 16 * 17 * A node is composed of a `content` and an automatically computed and unique 18 * index. 19 * 20 * This class implements the `Comparable` interface aiming at sorting nodes by 21 * providing the {@link #compareTo} method that compares the node with those in 22 * parameter by comparing their indexes. 23 * 24 * Since nodes are comparable, they can be stored in a sorted collection, and in 25 * particular in a sorted set where set operations are provided. 26 * 27 * ![Node](Node.png) 28 * 29 * @param <N> the content type 30 * 31 * @uml Node.png !include resources/org/thegalactic/dgraph/Node.iuml 32 * 33 * hide members show Node members class Node #LightCyan title Node UML graph 34 */ 35 public class Node<N> implements Comparable<Node<N>>, Cloneable { 36 37 /* 38 * ------------- FIELDS --------------------- 39 */ 40 /** 41 * An uniquely defined identifier for this node. 42 */ 43 private int identifier; 44 45 /** 46 * An object to store information about the element. 47 */ 48 private N content; 49 50 /** 51 * The total number of nodes. 52 * 53 * Initialised to 0, it is incremented by the constructor, and used to 54 * inialize the identifier. 55 */ 56 private static int count; 57 58 /* 59 * ------------- CONSTRUCTORS ------------------ 60 */ 61 /** 62 * Constructs a new node containing the specified content. 63 * 64 * Identifier of this node is initalized with the `count` variable which is 65 * the incremented. 66 * 67 * @param content Content for this node 68 */ 69 public Node(final N content) { 70 this.identifier = ++count; 71 this.content = content; 72 } 73 74 /** 75 * Constructs a new node with a null content. 76 * 77 * Identifier of this node is initalized with the `count` variable which is 78 * the incremented. 79 */ 80 public Node() { 81 this(null); 82 } 83 84 /* 85 * -------------- ACCESSORS ------------------- 86 */ 87 /** 88 * Get the identifier. 89 * 90 * @return the node identifier 91 */ 92 public final int getIdentifier() { 93 return this.identifier; 94 } 95 96 /** 97 * Get the content. 98 * 99 * @return the node content 100 */ 101 public final N getContent() { 102 return this.content; 103 } 104 105 /** 106 * Set the content. 107 * 108 * @param content Content for this node 109 * 110 * @return this for chaining 111 */ 112 public final Node setContent(final N content) { 113 this.content = content; 114 return this; 115 } 116 117 /** 118 * Test if this node has a content. 119 * 120 * @return true if this node has a content 121 */ 122 public final boolean hasContent() { 123 return this.content != null; 124 } 125 126 /* 127 * --------------- SAVING METHOD ------------ 128 */ 129 /** 130 * Returns a string representation of this node without spaces. 131 * 132 * @return the string representation 133 */ 134 @Override 135 public String toString() { 136 String string; 137 if (this.content == null) { 138 string = String.valueOf(this.identifier); 139 } else { 140 string = this.content.toString(); 141 } 142 return string; 143 } 144 145 /* 146 * --------------- OVERRIDDEN METHODS ------------ 147 */ 148 /** 149 * Returns a clone of this node. 150 * 151 * @return a clone of this node 152 * 153 * @throws java.lang.CloneNotSupportedException 154 */ 155 @Override 156 public Node clone() throws CloneNotSupportedException { 157 final Node node = (Node) super.clone(); 158 node.identifier = ++count; 159 return node; 160 } 161 162 /** 163 * Compares this node with the specified one. 164 * 165 * @param object The object to be tested with 166 * 167 * @return true or false as this node is equal to the specified object. 168 */ 169 @Override 170 public boolean equals(final Object object) { 171 return this == object || object != null && this.getClass() == object.getClass() 172 && this.identifier == ((Node) object).identifier; 173 } 174 175 /** 176 * Compute the hash code. 177 * 178 * @return an integer representing the object 179 */ 180 @Override 181 public int hashCode() { 182 return this.identifier; 183 } 184 185 /** 186 * Compares this node with those in parameter, based on their identifiers. 187 * 188 * The result is zero if the identifiers are equal; positive if this node's 189 * identifier is greater, and negative otherwise. This comparison method is 190 * needed to define a natural ordering. It allows to use objects of this 191 * class in a sorted collection. 192 * 193 * @param node the specified element to be compared with this node 194 * 195 * @return a negative integer, zero, or a positive integer as this node is 196 * less than, equal to, or greater than the specified object. 197 */ 198 public final int compareTo(final Node node) { 199 return this.identifier - node.identifier; 200 } 201 }