1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/*
2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Copyright (c) 2003,2004, Stefan Haustein, Oberhausen, Rhld., Germany
3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * associated documentation files (the "Software"), to deal in the Software without restriction, including
6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * following conditions:
9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The above copyright notice and this permission notice shall be included in all copies or substantial
11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * portions of the Software.
12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * USE OR OTHER DEALINGS IN THE SOFTWARE.
18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu *
19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Contributor(s): John D. Beatty, F. Hunter, Renaud Tognelli
20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */
21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2.serialization;
23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.ByteArrayOutputStream;
25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.ByteArrayInputStream;
26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.ObjectOutputStream;
27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.ObjectInputStream;
28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.IOException;
30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.NotSerializableException;
31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/**
33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * This class is used to store information about each property an implementation of KvmSerializable exposes.
34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu */
35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class SppPropertyInfo implements java.io.Serializable
37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu{
38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final Class OBJECT_CLASS = new Object().getClass();
39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final Class STRING_CLASS = "".getClass();
40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final Class INTEGER_CLASS = new Integer(0).getClass();
41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final Class LONG_CLASS = new Long(0).getClass();
42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final Class BOOLEAN_CLASS = new Boolean(true).getClass();
43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final Class VECTOR_CLASS = new java.util.Vector().getClass();
44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final PropertyInfo OBJECT_TYPE = new PropertyInfo();
45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int TRANSIENT = 1;
46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int MULTI_REF = 2;
47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public static final int REF_ONLY = 4;
48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Name of the property
51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String name;
53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Namespace of this property
56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String namespace;
58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Type of property, Transient, multi_ref, Ref_only *JHS* Note, not really used that effectively
61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int flags;
63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * The current value of this property.
66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    protected Object value;
68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Type of the property/elements. Should usually be an instance of Class.
71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Object type = OBJECT_CLASS;
73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * if a property is multi-referenced, set this flag to true.
76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public boolean multiRef;
78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Element type for array properties, null if not array prop.
81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public PropertyInfo elementType;
83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public SppPropertyInfo()
85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void clear()
89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        type = OBJECT_CLASS;
91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        flags = 0;
92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        name = null;
93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        namespace = null;
94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @return Returns the elementType.
98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public PropertyInfo getElementType()
100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return elementType;
102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param elementType
106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            The elementType to set.
107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setElementType(PropertyInfo elementType)
109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.elementType = elementType;
111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @return Returns the flags.
115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public int getFlags()
117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return flags;
119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param flags
123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            The flags to set.
124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setFlags(int flags)
126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.flags = flags;
128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @return Returns the multiRef.
132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public boolean isMultiRef()
134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return multiRef;
136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param multiRef
140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            The multiRef to set.
141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setMultiRef(boolean multiRef)
143997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
144997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.multiRef = multiRef;
145997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
146997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
147997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
148997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @return Returns the name.
149997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
150997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getName()
151997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
152997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return name;
153997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
154997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
155997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
156997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param name
157997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            The name to set.
158997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
159997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setName(String name)
160997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
161997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.name = name;
162997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
163997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
164997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
165997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @return Returns the namespace.
166997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
167997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String getNamespace()
168997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
169997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return namespace;
170997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
171997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
172997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
173997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param namespace
174997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            The namespace to set.
175997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
176997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setNamespace(String namespace)
177997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
178997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.namespace = namespace;
179997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
180997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
181997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
182997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @return Returns the type.
183997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
184997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Object getType()
185997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
186997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return type;
187997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
188997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
189997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
190997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param type
191997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            The type to set.
192997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
193997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setType(Object type)
194997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
195997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.type = type;
196997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
197997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
198997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
199997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @return Returns the value.
200997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
201997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Object getValue()
202997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
203997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return value;
204997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
205997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
206997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
207997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @param value
208997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *            The value to set.
209997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
210997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public void setValue(Object value)
211997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
212997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        this.value = value;
213997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
214997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
215997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
216997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Show the name and value.
217997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
218997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @see java.lang.Object#toString()
219997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
220997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public String toString()
221997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    {
222997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        StringBuffer sb = new StringBuffer();
223997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        sb.append(name);
224997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        sb.append(" : ");
225997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        if (value != null)
226997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        {
227997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            sb.append(value);
228997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
229997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        else
230997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        {
231997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            sb.append("(not set)");
232997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
233997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return sb.toString();
234997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
235997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
236997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    /**
237997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * Make a deep clone of the properties through Object serialization
238997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     *
239997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     * @see java.lang.Object#clone()
240997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu     */
241997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    public Object clone() {
242997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        Object obj = null;
243997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        try
244997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        {
245997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            // Write the object out to a byte array
246997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            ByteArrayOutputStream bos = new ByteArrayOutputStream();
247997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            ObjectOutputStream out = new ObjectOutputStream(bos);
248997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            out.writeObject(this);
249997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            out.flush();
250997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            out.close();
251997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu
252997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            // Make an input stream from the byte array and read
253997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            // a copy of the object back in.
254997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            ObjectInputStream in = new ObjectInputStream(
255997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu                    new ByteArrayInputStream(bos.toByteArray()));
256997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            obj = in.readObject();
257997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (ClassNotFoundException cnfe)
258997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        {
259997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            cnfe.printStackTrace();
260997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (NotSerializableException nse)
261997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        {
262997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            nse.printStackTrace();
263997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        } catch (IOException e)
264997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        {
265997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu            e.printStackTrace();
266997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        }
267997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu        return obj;
268997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu    }
269997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu}
270