|
From: <pe...@us...> - 2003-11-21 13:57:30
|
Update of /cvsroot/neuclear/neuclear-id/src/java/org/neuclear/id/builders
In directory sc8-pr-cvs1:/tmp/cvs-serv28663/src/java/org/neuclear/id/builders
Modified Files:
NamedObjectBuilder.java
Log Message:
Changed some mutable fields in immutable classes, making them truely immutable. Thus safer.
Index: NamedObjectBuilder.java
===================================================================
RCS file: /cvsroot/neuclear/neuclear-id/src/java/org/neuclear/id/builders/NamedObjectBuilder.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** NamedObjectBuilder.java 21 Nov 2003 04:45:10 -0000 1.11
--- NamedObjectBuilder.java 21 Nov 2003 13:57:27 -0000 1.12
***************
*** 2,5 ****
--- 2,8 ----
* $Id$
* $Log$
+ * Revision 1.12 2003/11/21 13:57:27 pelle
+ * Changed some mutable fields in immutable classes, making them truely immutable. Thus safer.
+ *
* Revision 1.11 2003/11/21 04:45:10 pelle
* EncryptedFileStore now works. It uses the PBECipher with DES3 afair.
***************
*** 197,201 ****
* This simple wrapper takes most of the contents of a NamedObject and puts it into a Serializable form that can be signed.
*/
! public class NamedObjectBuilder extends SignedElement implements Named {
public NamedObjectBuilder(final String name, final String tagName, final String prefix, final String nsURI) throws NeuClearException {
super(tagName, prefix, nsURI);
--- 200,204 ----
* This simple wrapper takes most of the contents of a NamedObject and puts it into a Serializable form that can be signed.
*/
! public class NamedObjectBuilder extends SignedElement implements Named,Cloneable {
public NamedObjectBuilder(final String name, final String tagName, final String prefix, final String nsURI) throws NeuClearException {
super(tagName, prefix, nsURI);
***************
*** 376,379 ****
--- 379,448 ----
public final Identity getParent() throws NeuClearException {
return NSResolver.resolveIdentity(NSTools.getParentNSURI(getName()));
+ }
+
+ /**
+ * Creates and returns a copy of this object. The precise meaning
+ * of "copy" may depend on the class of the object. The general
+ * intent is that, for any object <tt>x</tt>, the expression:
+ * <blockquote>
+ * <pre>
+ * x.clone() != x</pre></blockquote>
+ * will be true, and that the expression:
+ * <blockquote>
+ * <pre>
+ * x.clone().getClass() == x.getClass()</pre></blockquote>
+ * will be <tt>true</tt>, but these are not absolute requirements.
+ * While it is typically the case that:
+ * <blockquote>
+ * <pre>
+ * x.clone().equals(x)</pre></blockquote>
+ * will be <tt>true</tt>, this is not an absolute requirement.
+ * <p/>
+ * By convention, the returned object should be obtained by calling
+ * <tt>super.clone</tt>. If a class and all of its superclasses (except
+ * <tt>Object</tt>) obey this convention, it will be the case that
+ * <tt>x.clone().getClass() == x.getClass()</tt>.
+ * <p/>
+ * By convention, the object returned by this method should be independent
+ * of this object (which is being cloned). To achieve this independence,
+ * it may be necessary to modify one or more fields of the object returned
+ * by <tt>super.clone</tt> before returning it. Typically, this means
+ * copying any mutable objects that comprise the internal "deep structure"
+ * of the object being cloned and replacing the references to these
+ * objects with references to the copies. If a class contains only
+ * primitive fields or references to immutable objects, then it is usually
+ * the case that no fields in the object returned by <tt>super.clone</tt>
+ * need to be modified.
+ * <p/>
+ * The method <tt>clone</tt> for class <tt>Object</tt> performs a
+ * specific cloning operation. First, if the class of this object does
+ * not implement the interface <tt>Cloneable</tt>, then a
+ * <tt>CloneNotSupportedException</tt> is thrown. Note that all arrays
+ * are considered to implement the interface <tt>Cloneable</tt>.
+ * Otherwise, this method creates a new instance of the class of this
+ * object and initializes all its fields with exactly the contents of
+ * the corresponding fields of this object, as if by assignment; the
+ * contents of the fields are not themselves cloned. Thus, this method
+ * performs a "shallow copy" of this object, not a "deep copy" operation.
+ * <p/>
+ * The class <tt>Object</tt> does not itself implement the interface
+ * <tt>Cloneable</tt>, so calling the <tt>clone</tt> method on an object
+ * whose class is <tt>Object</tt> will result in throwing an
+ * exception at run time.
+ *
+ * @return a clone of this instance.
+ * @throws CloneNotSupportedException if the object's class does not
+ * support the <code>Cloneable</code> interface. Subclasses
+ * that override the <code>clone</code> method can also
+ * throw this exception to indicate that an instance cannot
+ * be cloned.
+ * @see Cloneable
+ */
+ public Object clone() throws CloneNotSupportedException {
+ try {
+ return new NamedObjectBuilder(getElement().createCopy());
+ } catch (XMLSecurityException e) {
+ throw new RuntimeException(e);
+ }
}
|