KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > infoglue > deliver > util > webservices > DynamicWebserviceSerializer


1 /**
2  *
3  */

4 package org.infoglue.deliver.util.webservices;
5
6 import java.util.ArrayList JavaDoc;
7 import java.util.Collection JavaDoc;
8 import java.util.HashMap JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11 import java.util.Map JavaDoc;
12
13 /**
14  *
15  */

16 public class DynamicWebserviceSerializer
17 {
18     /**
19      *
20      */

21     private static final Object JavaDoc MARKER = null;
22     
23     /**
24      *
25      */

26     private Map JavaDoc legalTypes;
27     
28     /**
29      *
30      */

31     public DynamicWebserviceSerializer()
32     {
33         super();
34     }
35
36     /**
37      *
38      */

39     public DynamicWebserviceSerializer(final Map JavaDoc legalTypes)
40     {
41         super();
42         this.legalTypes = legalTypes;
43     }
44     
45     /**
46      *
47      */

48     public List JavaDoc serializeCollection(final Collection JavaDoc collection)
49     {
50         final Collection JavaDoc c = (collection == null) ? new ArrayList JavaDoc() : collection;
51         
52         final List JavaDoc result = createResultList(c.getClass(), c.size());
53         for(final Iterator JavaDoc i = collection.iterator(); i.hasNext(); )
54         {
55             result.addAll(serializeObject(i.next()));
56         }
57         return result;
58     }
59     
60     /**
61      *
62      */

63     public List JavaDoc serializeMap(final Map JavaDoc map) {
64         final Map JavaDoc m = (map == null) ? new HashMap JavaDoc() : map;
65         
66         final List JavaDoc result = createResultList(m.getClass(), m.size());
67         for(final Iterator JavaDoc i = map.keySet().iterator(); i.hasNext(); )
68         {
69             final Object JavaDoc key = i.next();
70             final Object JavaDoc value = map.get(key);
71             result.addAll(serializeObject(key));
72             result.addAll(serializeObject(value));
73         }
74         return result;
75     }
76     
77     /**
78      *
79      */

80     public List JavaDoc serializeDynamicWebserviceElement(final DynamicWebserviceElement element) {
81         final List JavaDoc arguments = element.serialize();
82         for(final Iterator JavaDoc i = arguments.iterator(); i.hasNext(); )
83         {
84             checkType(i.next());
85         }
86         final List JavaDoc result = createResultList(element.getClass(), arguments.size());
87         result.addAll(arguments);
88         return result;
89     }
90     
91     /**
92      *
93      */

94     private List JavaDoc serializeObject(final Object JavaDoc o) {
95         if(o instanceof Map JavaDoc)
96         {
97             return serializeMap((Map JavaDoc) o);
98         }
99         if(o instanceof Collection JavaDoc)
100         {
101             return serializeCollection((Collection JavaDoc) o);
102         }
103         if(o instanceof DynamicWebserviceElement)
104         {
105             return serializeDynamicWebserviceElement((DynamicWebserviceElement) o);
106         }
107         checkType(o);
108         final List JavaDoc dummy = new ArrayList JavaDoc();
109         dummy.add(o);
110         return dummy;
111     }
112
113     /**
114      *
115      */

116     private List JavaDoc createResultList(final Class JavaDoc c, final int size)
117     {
118         final List JavaDoc list = new ArrayList JavaDoc();
119         list.add(MARKER);
120         list.add(c.getName());
121         list.add(new Integer JavaDoc(size).toString());
122         return list;
123     }
124     
125     /**
126      *
127      */

128     private void checkType(final Object JavaDoc o)
129     {
130         if(o == null)
131         {
132             throw new IllegalArgumentException JavaDoc("Null objects are not allowed in collections...");
133         }
134         if(!legalTypes.containsKey(o.getClass()))
135         {
136             throw new IllegalArgumentException JavaDoc("Non-standard elements not allowed in collections...");
137         }
138     }
139
140     /**
141      *
142      */

143     public Object JavaDoc deserialize(final Object JavaDoc[] array) throws Throwable JavaDoc
144     {
145         final List JavaDoc list = new ArrayList JavaDoc();
146         for(int i=0; i<array.length; ++i)
147         {
148             list.add(array[i]);
149         }
150         return deserializeElement(list);
151     }
152     
153     /**
154      *
155      */

156     private Object JavaDoc deserializeMap(final List JavaDoc c, final Map JavaDoc map, final int count) throws Throwable JavaDoc
157     {
158         for(int i=0; i<count; ++i)
159         {
160             final Object JavaDoc key = deserializeElement(c);
161             final Object JavaDoc value = deserializeElement(c);
162             map.put(key, value);
163         }
164         return map;
165     }
166     
167     /**
168      *
169      */

170     private Object JavaDoc deserializeCollection(final List JavaDoc c, final Collection JavaDoc collection, final int count) throws Throwable JavaDoc
171     {
172         for(int i=0; i<count; ++i)
173         {
174             Object JavaDoc o = deserializeElement(c);
175             collection.add(o);
176         }
177         return collection;
178     }
179     
180     /**
181      *
182      */

183     private Object JavaDoc deserializeDynamicWebserviceElement(final List JavaDoc c, final DynamicWebserviceElement element, final int count) throws Throwable JavaDoc
184     {
185         final List JavaDoc arguments = new ArrayList JavaDoc();
186         for(int i=0; i<count; ++i)
187         {
188             arguments.add(c.remove(0));
189         }
190         element.deserialize(arguments);
191         return element;
192     }
193     
194     /**
195      *
196      */

197     private Object JavaDoc deserializeElement(final List JavaDoc c) throws Throwable JavaDoc
198     {
199         Object JavaDoc o = c.remove(0);
200         if(o == MARKER)
201         {
202             final Object JavaDoc oo = Class.forName(c.remove(0).toString()).newInstance();
203             int count = new Integer JavaDoc(c.remove(0).toString()).intValue();
204             if(oo instanceof Map JavaDoc)
205             {
206                 return deserializeMap(c, (Map JavaDoc) oo, count);
207             }
208             if(oo instanceof Collection JavaDoc)
209             {
210                 return deserializeCollection(c, (Collection JavaDoc) oo, count);
211             }
212             return deserializeDynamicWebserviceElement(c, (DynamicWebserviceElement) oo, count);
213         }
214         return o;
215     }
216 }
217
Popular Tags