Add name to the Sone.
[Sone.git] / src / main / java / net / pterodactylus / sone / data / Sone.java
1 /*
2  * FreenetSone - Sone.java - Copyright © 2010 David Roden
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 package net.pterodactylus.sone.data;
19
20 import java.util.Collections;
21 import java.util.HashSet;
22 import java.util.Set;
23 import java.util.UUID;
24
25 import freenet.keys.FreenetURI;
26
27 /**
28  * A Sone defines everything about a user: the {@link User} itself, her profile,
29  * her status updates.
30  *
31  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
32  */
33 public class Sone {
34
35         /** A GUID for this Sone. */
36         private final UUID id = UUID.randomUUID();
37
38         /** The name of this Sone. */
39         private final String name;
40
41         /** The URI under which the Sone is stored in Freenet. */
42         private final FreenetURI requestUri;
43
44         /** The URI used to insert a new version of this Sone. */
45         /* This will be null for remote Sones! */
46         private final FreenetURI insertUri;
47
48         /** All friend Sones. */
49         private final Set<Sone> friendSones = new HashSet<Sone>();
50
51         /**
52          * Creates a new Sone.
53          *
54          * @param name
55          *            The name of the Sone
56          * @param requestUri
57          *            The request URI of the Sone
58          */
59         public Sone(String name, FreenetURI requestUri) {
60                 this(name, requestUri, null);
61         }
62
63         /**
64          * Creates a new Sone.
65          *
66          * @param name
67          *            The name of the Sone
68          * @param requestUri
69          *            The request URI of the Sone
70          * @param insertUri
71          *            The insert URI of the Sone
72          */
73         public Sone(String name, FreenetURI requestUri, FreenetURI insertUri) {
74                 this.name = name;
75                 this.requestUri = requestUri;
76                 this.insertUri = insertUri;
77         }
78
79         //
80         // ACCESSORS
81         //
82
83         /**
84          * Returns the ID of this Sone.
85          *
86          * @return The ID of this Sone
87          */
88         public String getId() {
89                 return id.toString();
90         }
91
92         /**
93          * Returns the name of this Sone.
94          *
95          * @return The name of this Sone
96          */
97         public String getName() {
98                 return name;
99         }
100
101         /**
102          * Returns the request URI of this Sone.
103          *
104          * @return The request URI of this Sone
105          */
106         public FreenetURI getRequestUri() {
107                 return requestUri;
108         }
109
110         /**
111          * Returns the insert URI of this Sone.
112          *
113          * @return The insert URI of this Sone
114          */
115         public FreenetURI getInsertUri() {
116                 return insertUri;
117         }
118
119         /**
120          * Returns all friend Sones of this Sone.
121          *
122          * @return The friend Sones of this Sone
123          */
124         public Set<Sone> getFriendSones() {
125                 return Collections.unmodifiableSet(friendSones);
126         }
127
128         /**
129          * Returns whether this Sone has the given Sone as a friend Sone.
130          *
131          * @param friendSone
132          *            The friend Sone to check for
133          * @return {@code true} if this Sone has the given Sone as a friend,
134          *         {@code false} otherwise
135          */
136         public boolean hasFriendSone(Sone friendSone) {
137                 return friendSones.contains(friendSone);
138         }
139
140         /**
141          * Adds the given Sone as a friend Sone.
142          *
143          * @param friendSone
144          *            The friend Sone to add
145          * @return This Sone (for method chaining)
146          */
147         public Sone addFriendSone(Sone friendSone) {
148                 friendSones.add(friendSone);
149                 return this;
150         }
151
152         /**
153          * Removes the given Sone as a friend Sone.
154          *
155          * @param friendSone
156          *            The friend Sone to remove
157          * @return This Sone (for method chaining)
158          */
159         public Sone removeFriendSone(Sone friendSone) {
160                 friendSones.remove(friendSone);
161                 return this;
162         }
163
164         //
165         // OBJECT METHODS
166         //
167
168         /**
169          * {@inheritDoc}
170          */
171         @Override
172         public int hashCode() {
173                 return id.hashCode();
174         }
175
176 }