1 /*
2 * jDTAUS Core API
3 * Copyright (C) 2005 Christian Schulte
4 * <cs@schulte.it>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 */
21 package org.jdtaus.core.container;
22
23 import java.io.ObjectStreamException;
24 import java.io.Serializable;
25
26 /**
27 * Module meta-data.
28 * <p>A module consists of the properties {@code name}, {@code description}
29 * and {@code version}. Property {@code name} holds the name of the module
30 * uniquely identifying the module in a collection of modules. Property
31 * {@code description} holds a textual description, property {@code version}
32 * a textual version of the module. A module defines specifications,
33 * implementations and properties.</p>
34 *
35 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
36 * @version $JDTAUS: Module.java 8743 2012-10-07 03:06:20Z schulte $
37 */
38 public class Module extends ModelObject implements Cloneable, Serializable
39 {
40 //--Constants---------------------------------------------------------------
41
42 /** Serial version UID for backwards compatibility with 1.0.x classes. */
43 private static final long serialVersionUID = 2518888867819463746L;
44
45 //---------------------------------------------------------------Constants--
46 //--Module------------------------------------------------------------------
47
48 /**
49 * The specifications of the module.
50 * @serial
51 */
52 private Specifications specifications;
53
54 /**
55 * The implementations of the module.
56 * @serial
57 */
58 private Implementations implementations;
59
60 /**
61 * The properties of the module.
62 * @serial
63 */
64 private Properties properties;
65
66 /**
67 * The messages of the module.
68 * @serial
69 */
70 private Messages messages;
71
72 /**
73 * The description of the module.
74 * @serial
75 * @deprecated Replaced by property {@code documentation}.
76 */
77 private String description;
78
79 /**
80 * The name of the module.
81 * @serial
82 */
83 private String name;
84
85 /**
86 * The version of the module.
87 * @serial
88 */
89 private String version;
90
91 /** Creates a new {@code Module} instance. */
92 public Module()
93 {
94 super();
95 }
96
97 /**
98 * Gets the specifications of the module.
99 *
100 * @return the specifications of the module.
101 */
102 public Specifications getSpecifications()
103 {
104 if ( this.specifications == null )
105 {
106 this.specifications = new Specifications();
107 }
108
109 return this.specifications;
110 }
111
112 /**
113 * Setter for property {@code specifications}.
114 *
115 * @param value the new specifications of the module.
116 */
117 public void setSpecifications( final Specifications value )
118 {
119 this.specifications = value;
120 }
121
122 /**
123 * Gets the implementations of the module.
124 *
125 * @return implementations of the module.
126 */
127 public Implementations getImplementations()
128 {
129 if ( this.implementations == null )
130 {
131 this.implementations = new Implementations();
132 }
133
134 return this.implementations;
135 }
136
137 /**
138 * Setter for property {@code implementations}.
139 *
140 * @param value the new implementations of the module.
141 */
142 public void setImplementations( final Implementations value )
143 {
144 this.implementations = value;
145 }
146
147 /**
148 * Gets the properties of the module.
149 *
150 * @return the properties of the module.
151 */
152 public Properties getProperties()
153 {
154 if ( this.properties == null )
155 {
156 this.properties = new Properties();
157 }
158
159 return this.properties;
160 }
161
162 /**
163 * Setter for property {@code properties}.
164 *
165 * @param value the new properties of the module.
166 */
167 public void setProperties( final Properties value )
168 {
169 this.properties = value;
170 }
171
172 /**
173 * Gets the messages of the module.
174 *
175 * @return the messages of the module.
176 */
177 public Messages getMessages()
178 {
179 if ( this.messages == null )
180 {
181 this.messages = new Messages();
182 }
183
184 return this.messages;
185 }
186
187 /**
188 * Setter for property {@code messages}.
189 *
190 * @param value new messages of the module.
191 */
192 public void setMessages( final Messages value )
193 {
194 this.messages = value;
195 }
196
197 /**
198 * Gets the description of the module.
199 *
200 * @return the description of the module or {@code null}.
201 * @deprecated Replaced by {@link #getDocumentation() getDocumentation().getValue()}.
202 */
203 public String getDescription()
204 {
205 return this.getDocumentation().getValue();
206 }
207
208 /**
209 * Setter for property {@code description}.
210 *
211 * @param value the new description of the module.
212 * @deprecated Replaced by {@link #setDocumentation(org.jdtaus.core.container.Text) getDocumentation().setValue( value )}.
213 */
214 public void setDescription( final String value )
215 {
216 this.getDocumentation().setValue( value );
217 }
218
219 /**
220 * Gets the name of the module.
221 *
222 * @return the unique name of the module.
223 */
224 public String getName()
225 {
226 if ( this.name == null )
227 {
228 this.name = "";
229 }
230
231 return this.name;
232 }
233
234 /**
235 * Setter for property {@code name}.
236 *
237 * @param value the new name of the module.
238 */
239 public void setName( final String value )
240 {
241 this.name = value;
242 }
243
244 /**
245 * Gets the version of the module.
246 *
247 * @return the version of the module or {@code null}.
248 */
249 public String getVersion()
250 {
251 return this.version;
252 }
253
254 /**
255 * Setter for property {@code version}.
256 *
257 * @param value the new version of the module.
258 */
259 public void setVersion( final String value )
260 {
261 this.version = value;
262 }
263
264 /**
265 * Creates a string representing the properties of the instance.
266 *
267 * @return a string representing the properties of the instance.
268 */
269 private String internalString()
270 {
271 final StringBuffer buf = new StringBuffer( 500 ).append( '{' ).
272 append( this.internalString( this ) ).
273 append( ", name=" ).append( this.name ).
274 append( ", version=" ).append( this.version ).
275 append( ", properties=" ).append( this.properties ).
276 append( ", messages=" ).append( this.messages ).
277 append( ", specifications=" ).append( this.getSpecifications() ).
278 append( ", implementations=" ).append( this.getImplementations() );
279
280 buf.append( '}' ).toString();
281 return buf.toString();
282 }
283
284 //------------------------------------------------------------------Module--
285 //--Serializable------------------------------------------------------------
286
287 /**
288 * Takes care of initializing fields when constructed from an 1.0.x object
289 * stream.
290 *
291 * @throws ObjectStreamException if no scope can be resolved.
292 */
293 private Object readResolve() throws ObjectStreamException
294 {
295 if ( this.getDocumentation().getValue() == null &&
296 this.description != null )
297 {
298 this.getDocumentation().setValue( this.description );
299 }
300 if ( "".equals( this.version ) )
301 {
302 this.version = null;
303 }
304
305 return this;
306 }
307
308 //------------------------------------------------------------Serializable--
309 //--Object------------------------------------------------------------------
310
311 /**
312 * Returns a string representation of the object.
313 *
314 * @return a string representation of the object.
315 */
316 public String toString()
317 {
318 return super.toString() + this.internalString();
319 }
320
321 /**
322 * Creates and returns a copy of this object. This method performs a
323 * "shallow copy" of this object, not a "deep copy" operation.
324 *
325 * @return a clone of this instance.
326 */
327 public Object clone()
328 {
329 try
330 {
331 return super.clone();
332 }
333 catch ( final CloneNotSupportedException e )
334 {
335 throw new AssertionError( e );
336 }
337 }
338
339 /**
340 * Indicates whether some other object is equal to this one by comparing
341 * properties {@code name} and {@code version}.
342 *
343 * @param o the reference object with which to compare.
344 *
345 * @return {@code true} if this object is the same as {@code o};
346 * {@code false} otherwise.
347 */
348 public final boolean equals( final Object o )
349 {
350 boolean equal = this == o;
351
352 if ( !equal && o instanceof Module )
353 {
354 final Module that = (Module) o;
355 equal = this.getName().equals( that.getName() ) &&
356 ( this.getVersion() == null ? that.getVersion() == null
357 : this.getVersion().equals( that.getVersion() ) );
358
359 }
360
361 return equal;
362 }
363
364 /**
365 * Returns a hash code value for this object.
366 *
367 * @return a hash code value for this object.
368 */
369 public final int hashCode()
370 {
371 return this.getName().hashCode() +
372 ( this.getVersion() == null ? 0 : this.getVersion().hashCode() );
373
374 }
375
376 //------------------------------------------------------------------Object--
377 }