View Javadoc

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.Serializable;
24  
25  /**
26   * Property meta-data.
27   * <p>A property consists of the properties {@code name}, {@code type} and
28   * {@code value}. Property {@code name} holds the name uniquely identifying the
29   * property in a collection of properties. Property {@code type} holds the type
30   * of the property. Property {@code value} holds the properties value which is
31   * of type {@code type}. The {@code api} flag indicates if the property is part
32   * of a public API.</p>
33   *
34   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
35   * @version $JDTAUS: Property.java 8743 2012-10-07 03:06:20Z schulte $
36   */
37  public class Property extends ModelObject implements Cloneable, Serializable
38  {
39      //--Constants---------------------------------------------------------------
40  
41      /** Serial version UID for backwards compatibility with 1.0.x classes. */
42      private static final long serialVersionUID = -5450366074586725711L;
43  
44      //---------------------------------------------------------------Constants--
45      //--Property----------------------------------------------------------------
46  
47      /**
48       * The name of the property.
49       * @serial
50       */
51      private String name;
52  
53      /**
54       * The type of the property.
55       * @serial
56       */
57      private Class type;
58  
59      /**
60       * The value of the property.
61       * @serial
62       */
63      private Object value;
64  
65      /**
66       * Flag indicating that the property is part of a public API.
67       * @serial
68       */
69      private boolean api;
70  
71      /** Creates a new {@code Property} instance. */
72      public Property()
73      {
74          super();
75      }
76  
77      /**
78       * Gets the name of the property.
79       *
80       * @return the name of the property.
81       */
82      public String getName()
83      {
84          if ( this.name == null )
85          {
86              this.name = "";
87          }
88  
89          return this.name;
90      }
91  
92      /**
93       * Setter for property {@code name}.
94       *
95       * @param value the new name of the property.
96       */
97      public void setName( final String value )
98      {
99          this.name = value;
100     }
101 
102     /**
103      * Gets the type of the property.
104      *
105      * @return the type of the property.
106      */
107     public Class getType()
108     {
109         if ( this.type == null )
110         {
111             this.type = String.class;
112         }
113 
114         return this.type;
115     }
116 
117     /**
118      * Setter for property {@code type}.
119      *
120      * @param value the new type of the property.
121      */
122     public void setType( final Class value )
123     {
124         this.type = value;
125     }
126 
127     /**
128      * Gets the value of the property.
129      *
130      * @return the value of the property or {@code null}.
131      */
132     public Object getValue()
133     {
134         return this.value;
135     }
136 
137     /**
138      * Setter for property {@code value}.
139      *
140      * @param value the new value of the property.
141      */
142     public void setValue( final Object value )
143     {
144         this.value = value;
145     }
146 
147     /**
148      * Gets the flag indicating if the property is part of a public API.
149      *
150      * @return {@code true} if the property is part of a public API.
151      */
152     public boolean isApi()
153     {
154         return this.api;
155     }
156 
157     /**
158      * Setter for property {@code api}.
159      *
160      * @param value {@code true} if the property is part of a public API.
161      */
162     public void setApi( final boolean value )
163     {
164         this.api = value;
165     }
166 
167     /**
168      * Creates a string representing the properties of the instance.
169      *
170      * @return a string representing the properties of the instance.
171      */
172     private String internalString()
173     {
174         return new StringBuffer( 500 ).append( '{' ).
175             append( super.internalString( this ) ).
176             append( ", api=" ).append( this.api ).
177             append( ", name=" ).append( this.name ).
178             append( ", type=" ).append( this.type ).
179             append( ", value=" ).append( this.value ).
180             append( '}' ).toString();
181 
182     }
183 
184     //----------------------------------------------------------------Property--
185     //--Object------------------------------------------------------------------
186 
187     /**
188      * Returns a string representation of the object.
189      *
190      * @return a string representation of the object.
191      */
192     public String toString()
193     {
194         return super.toString() + this.internalString();
195     }
196 
197     /**
198      * Indicates whether some other object is equal to this one by comparing
199      * the values of all properties.
200      *
201      * @param o the reference object with which to compare.
202      *
203      * @return {@code true} if this object is the same as {@code o};
204      * {@code false} otherwise.
205      */
206     public boolean equals( final Object o )
207     {
208         boolean equal = this == o;
209 
210         if ( !equal && o instanceof Property )
211         {
212             final Property that = (Property) o;
213             equal = this.getName().equals( that.getName() ) &&
214                 this.getType().equals( that.getType() ) &&
215                 ( this.getValue() == null
216                 ? that.getValue() == null
217                 : this.getValue().equals( that.getValue() ) );
218 
219         }
220 
221         return equal;
222     }
223 
224     /**
225      * Returns a hash code value for this object.
226      *
227      * @return a hash code value for this object.
228      */
229     public int hashCode()
230     {
231         return this.getName().hashCode() +
232             this.getType().hashCode() +
233             ( this.getValue() == null ? 0 : this.getValue().hashCode() );
234 
235     }
236 
237     /**
238      * Creates and returns a copy of this object. This method  performs a
239      * "shallow copy" of this object, not a "deep copy" operation.
240      *
241      * @return a clone of this instance.
242      */
243     public Object clone()
244     {
245         try
246         {
247             return super.clone();
248         }
249         catch ( final CloneNotSupportedException e )
250         {
251             throw new AssertionError( e );
252         }
253     }
254 
255     //------------------------------------------------------------------Object--
256 }