KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > axi > impl > DatatypeBuilder


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.netbeans.modules.xml.axi.impl;
21
22 import java.util.ArrayList JavaDoc;
23 import java.util.Collection JavaDoc;
24 import org.netbeans.modules.xml.axi.datatype.*;
25 import org.netbeans.modules.xml.axi.datatype.UnionType;
26 import org.netbeans.modules.xml.xam.dom.NamedComponentReference;
27 import org.netbeans.modules.xml.axi.*;
28 import org.netbeans.modules.xml.schema.model.*;
29 import org.netbeans.modules.xml.schema.model.visitor.DeepSchemaVisitor;
30
31 /**
32  *
33  * @author Ayub Khan (Ayub.Khan@Sun.Com)
34  */

35 public class DatatypeBuilder extends DeepSchemaVisitor {
36     
37     /**
38      * Creates a new instance of DatatypeBuilder
39      */

40     DatatypeBuilder() {
41     }
42     
43     /**
44      * Creates a new instance of DatatypeBuilder
45      */

46     public DatatypeBuilder(AXIModel model) {
47         this.model = (AXIModelImpl)model;
48     }
49     
50     public void visit(Enumeration enumeration) {
51         assert (facetParent instanceof SimpleRestriction);
52         if(datatype instanceof NumberBase)
53             ((NumberBase)datatype).addEnumeration(
54                     NumberBase.toNumber(enumeration.getValue()));
55         else if(datatype instanceof BinaryBase)
56             ((BinaryBase)datatype).addEnumeration(enumeration.getValue());
57         else if(datatype instanceof NotationType)
58             ((NotationType)datatype).addEnumeration(enumeration.getValue());
59         else if(datatype instanceof QNameType)
60             ((QNameType)datatype).addEnumeration(enumeration.getValue());
61         else if(datatype instanceof StringBase)
62             ((StringBase)datatype).addEnumeration(enumeration.getValue());
63         else if(datatype instanceof TimeBase)
64             ((TimeBase)datatype).addEnumeration(enumeration.getValue());
65     }
66     
67     public void visit(FractionDigits fractionDigits) {
68         assert (facetParent instanceof SimpleRestriction);
69         java.util.List JavaDoc<Number JavaDoc> removeList =
70                 new ArrayList JavaDoc<Number JavaDoc>();
71         java.util.List JavaDoc<? extends Number JavaDoc> currentList = datatype.getFractionDigits();
72         if(currentList != null && currentList.size() > 0) {
73             for(int i=0;i<currentList.size();i++)
74                 removeList.add(currentList.get(i));
75             for(int i=0;i<removeList.size();i++)
76                 datatype.removeFractionDigits(removeList.get(i));
77         }
78         datatype.addFractionDigits(fractionDigits.getValue());
79     }
80     
81     public void visit(Length length) {
82         assert (facetParent instanceof SimpleRestriction);
83         java.util.List JavaDoc<Number JavaDoc> removeList =
84                 new ArrayList JavaDoc<Number JavaDoc>();
85         java.util.List JavaDoc<? extends Number JavaDoc> currentList = datatype.getLengths();
86         if(currentList != null && currentList.size() > 0) {
87             for(int i=0;i<currentList.size();i++)
88                 removeList.add(currentList.get(i));
89             for(int i=0;i<removeList.size();i++)
90                 datatype.removeLength(removeList.get(i));
91         }
92         datatype.addLength(length.getValue());
93     }
94     
95     public void visit(MaxExclusive maxExclusive) {
96         assert (facetParent instanceof SimpleRestriction);
97         if(datatype instanceof NumberBase) {
98             java.util.List JavaDoc<Number JavaDoc> removeList =
99                     new ArrayList JavaDoc<Number JavaDoc>();
100             java.util.List JavaDoc<? extends Number JavaDoc> currentList =
101                     ((NumberBase)datatype).getMaxExclusives();
102             if(currentList != null && currentList.size() > 0) {
103                 for(int i=0;i<currentList.size();i++)
104                     removeList.add(currentList.get(i));
105                 for(int i=0;i<removeList.size();i++)
106                     ((NumberBase)datatype).removeMaxExclusive(removeList.get(i));
107             }
108             ((NumberBase)datatype).addMaxExclusive(
109                     NumberBase.toNumber(maxExclusive.getValue()));
110         } else if(datatype instanceof TimeBase) {
111             java.util.List JavaDoc<String JavaDoc> removeList =
112                     new ArrayList JavaDoc<String JavaDoc>();
113             java.util.List JavaDoc<String JavaDoc> currentList =
114                     ((TimeBase)datatype).getMaxExclusives();
115             if(currentList != null && currentList.size() > 0) {
116                 for(int i=0;i<currentList.size();i++)
117                     removeList.add(currentList.get(i));
118                 for(int i=0;i<removeList.size();i++)
119                     ((TimeBase)datatype).removeMaxExclusive(removeList.get(i));
120             }
121             ((TimeBase)datatype).addMaxExclusive(maxExclusive.getValue());
122         }
123     }
124     
125     public void visit(MaxInclusive maxInclusive) {
126         assert (facetParent instanceof SimpleRestriction);
127         if(datatype instanceof NumberBase) {
128             java.util.List JavaDoc<Number JavaDoc> removeList =
129                     new ArrayList JavaDoc<Number JavaDoc>();
130             java.util.List JavaDoc<? extends Number JavaDoc> currentList =
131                     ((NumberBase)datatype).getMaxInclusives();
132             if(currentList != null && currentList.size() > 0) {
133                 for(int i=0;i<currentList.size();i++)
134                     removeList.add(currentList.get(i));
135                 for(int i=0;i<removeList.size();i++)
136                     ((NumberBase)datatype).removeMaxInclusive(removeList.get(i));
137             }
138             ((NumberBase)datatype).addMaxInclusive(
139                     NumberBase.toNumber(maxInclusive.getValue()));
140         } else if(datatype instanceof TimeBase) {
141             java.util.List JavaDoc<String JavaDoc> removeList =
142                     new ArrayList JavaDoc<String JavaDoc>();
143             java.util.List JavaDoc<String JavaDoc> currentList =
144                     ((TimeBase)datatype).getMaxInclusives();
145             if(currentList != null && currentList.size() > 0) {
146                 for(int i=0;i<currentList.size();i++)
147                     removeList.add(currentList.get(i));
148                 for(int i=0;i<removeList.size();i++)
149                     ((TimeBase)datatype).removeMaxInclusive(removeList.get(i));
150             }
151             ((TimeBase)datatype).addMaxInclusive(maxInclusive.getValue());
152         }
153     }
154     
155     public void visit(MinExclusive minExclusive) {
156         assert (facetParent instanceof SimpleRestriction);
157         if(datatype instanceof NumberBase) {
158             java.util.List JavaDoc<Number JavaDoc> removeList =
159                     new ArrayList JavaDoc<Number JavaDoc>();
160             java.util.List JavaDoc<? extends Number JavaDoc> currentList =
161                     ((NumberBase)datatype).getMinExclusives();
162             if(currentList != null && currentList.size() > 0) {
163                 for(int i=0;i<currentList.size();i++)
164                     removeList.add(currentList.get(i));
165                 for(int i=0;i<removeList.size();i++)
166                     ((NumberBase)datatype).removeMinExclusive(removeList.get(i));
167             }
168             ((NumberBase)datatype).addMinExclusive(
169                     NumberBase.toNumber(minExclusive.getValue()));
170         } else if(datatype instanceof TimeBase) {
171             java.util.List JavaDoc<String JavaDoc> removeList =
172                     new ArrayList JavaDoc<String JavaDoc>();
173             java.util.List JavaDoc<String JavaDoc> currentList =
174                     ((TimeBase)datatype).getMinExclusives();
175             if(currentList != null && currentList.size() > 0) {
176                 for(int i=0;i<currentList.size();i++)
177                     removeList.add(currentList.get(i));
178                 for(int i=0;i<removeList.size();i++)
179                     ((TimeBase)datatype).removeMinExclusive(removeList.get(i));
180             }
181             ((TimeBase)datatype).addMinExclusive(minExclusive.getValue());
182         }
183     }
184     
185     public void visit(MinInclusive minInclusive) {
186         assert (facetParent instanceof SimpleRestriction);
187         if(datatype instanceof NumberBase) {
188             java.util.List JavaDoc<Number JavaDoc> removeList =
189                     new ArrayList JavaDoc<Number JavaDoc>();
190             java.util.List JavaDoc<? extends Number JavaDoc> currentList =
191                     ((NumberBase)datatype).getMinInclusives();
192             if(currentList != null && currentList.size() > 0) {
193                 for(int i=0;i<currentList.size();i++)
194                     removeList.add(currentList.get(i));
195                 for(int i=0;i<removeList.size();i++)
196                     ((NumberBase)datatype).removeMinInclusive(removeList.get(i));
197             }
198             ((NumberBase)datatype).addMinInclusive(
199                     NumberBase.toNumber(minInclusive.getValue()));
200         } else if(datatype instanceof TimeBase) {
201             java.util.List JavaDoc<String JavaDoc> removeList =
202                     new ArrayList JavaDoc<String JavaDoc>();
203             java.util.List JavaDoc<String JavaDoc> currentList =
204                     ((TimeBase)datatype).getMinInclusives();
205             if(currentList != null && currentList.size() > 0) {
206                 for(int i=0;i<currentList.size();i++)
207                     removeList.add(currentList.get(i));
208                 for(int i=0;i<removeList.size();i++)
209                     ((TimeBase)datatype).removeMinInclusive(removeList.get(i));
210             }
211             ((TimeBase)datatype).addMinInclusive(minInclusive.getValue());
212         }
213     }
214     
215     public void visit(MaxLength maxLength) {
216         assert (facetParent instanceof SimpleRestriction);
217         java.util.List JavaDoc<Number JavaDoc> removeList =
218                 new ArrayList JavaDoc<Number JavaDoc>();
219         java.util.List JavaDoc<? extends Number JavaDoc> currentList = datatype.getMaxLengths();
220         if(currentList != null && currentList.size() > 0) {
221             for(int i=0;i<currentList.size();i++)
222                 removeList.add(currentList.get(i));
223             for(int i=0;i<removeList.size();i++)
224                 datatype.removeMaxLength(removeList.get(i));
225         }
226         datatype.addMaxLength(maxLength.getValue());
227     }
228     
229     public void visit(MinLength minLength) {
230         assert (facetParent instanceof SimpleRestriction);
231         java.util.List JavaDoc<Number JavaDoc> removeList = new ArrayList JavaDoc<Number JavaDoc>();
232         java.util.List JavaDoc<? extends Number JavaDoc> currentList = datatype.getMinLengths();
233         if(currentList != null && currentList.size() > 0) {
234             for(int i=0;i<currentList.size();i++)
235                 removeList.add(currentList.get(i));
236             for(int i=0;i<removeList.size();i++)
237                 datatype.removeMinLength(removeList.get(i));
238         }
239         datatype.addMinLength(minLength.getValue());
240     }
241     
242     public void visit(Pattern pattern) {
243         assert (facetParent instanceof SimpleRestriction);
244         datatype.addPattern(pattern.getValue());
245     }
246     
247     public void visit(TotalDigits totalDigits) {
248         assert (facetParent instanceof SimpleRestriction);
249         java.util.List JavaDoc<Number JavaDoc> removeList =
250                 new ArrayList JavaDoc<Number JavaDoc>();
251         java.util.List JavaDoc<? extends Number JavaDoc> currentList = datatype.getTotalDigits();
252         if(currentList != null && currentList.size() > 0) {
253             for(int i=0;i<currentList.size();i++)
254                 removeList.add(currentList.get(i));
255             for(int i=0;i<removeList.size();i++)
256                 datatype.removeTotalDigits(removeList.get(i));
257         }
258         datatype.addTotalDigits(totalDigits.getValue());
259     }
260     
261     public void visit(Whitespace facet) {
262         assert (facetParent instanceof SimpleRestriction);
263         java.util.List JavaDoc<Whitespace.Treatment> removeList =
264                 new ArrayList JavaDoc<Whitespace.Treatment>();
265         java.util.List JavaDoc<Whitespace.Treatment> currentList = datatype.getWhiteSpaces();
266         if(currentList != null && currentList.size() > 0) {
267             for(int i=0;i<currentList.size();i++)
268                 removeList.add(currentList.get(i));
269             for(int i=0;i<removeList.size();i++)
270                 datatype.removeWhitespace(removeList.get(i));
271         }
272         datatype.addWhitespace(facet.getValue());
273     }
274     
275     /**
276      * Creates an AXI Datatype, given a schema component.
277      */

278     Datatype getDatatype(SchemaComponent component) {
279         if(component instanceof LocalAttribute)
280             return createDatatype((LocalAttribute)component);
281         if(component instanceof GlobalAttribute)
282             return createDatatype((GlobalAttribute)component);
283         if(component instanceof AttributeReference)
284             return createDatatype(((AttributeReference)component).getRef().get());
285         if(component instanceof LocalElement)
286             return createDatatype((LocalElement)component);
287         if(component instanceof GlobalElement)
288             return createDatatype((GlobalElement)component);
289         if(component instanceof ElementReference)
290             return createDatatype(((ElementReference)component).getRef().get());
291         if(component instanceof GlobalSimpleType)
292             return new CustomDatatype(
293                     ((GlobalSimpleType)component).getName(),
294                     createDatatype((SimpleType) component));
295         
296         return null;
297     }
298     
299     /**
300      * Creates an AXI Datatype, given a schema component.
301      */

302     Datatype getDatatype(SimpleType st) {
303         return createDatatype(st);
304     }
305     
306     /**
307      * Creates an AXI Datatype, given a schema LocalAttribute.
308      */

309     Datatype createDatatype(LocalAttribute attribute) {
310         if(attribute.getType() != null) {
311             datatype = createDatatype(attribute.getType().get());
312         } else {
313             datatype = createDatatype(attribute.getInlineType());
314         }
315         return datatype;
316     }
317     
318     /**
319      * Creates an AXI Datatype, given a schema GlobalAttribute.
320      */

321     Datatype createDatatype(GlobalAttribute attribute) {
322         if(attribute.getType() != null) {
323             datatype = createDatatype(attribute.getType().get());
324         } else {
325             datatype = createDatatype(attribute.getInlineType());
326         }
327         return datatype;
328     }
329     
330     /**
331      * Creates an AXI Datatype, given a schema LocalAttribute.
332      */

333     Datatype createDatatype(LocalElement le) {
334         if(le.getType() != null) {
335             if(le.getType().get() instanceof SimpleType)
336                 datatype = createDatatype((SimpleType) le.getType().get());
337         } else {
338             if(le.getInlineType() instanceof SimpleType)
339                 datatype = createDatatype((SimpleType) le.getInlineType());
340         }
341         return datatype;
342     }
343     
344     /**
345      * Creates an AXI Datatype, given a schema GlobalAttribute.
346      */

347     Datatype createDatatype(GlobalElement ge) {
348         if(ge.getType() != null) {
349             if(ge.getType().get() instanceof SimpleType)
350                 datatype = createDatatype((SimpleType) ge.getType().get());
351         } else {
352             if(ge.getInlineType() instanceof SimpleType)
353                 datatype = createDatatype((SimpleType) ge.getInlineType());
354         }
355         return datatype;
356     }
357     
358     Datatype createDatatype(final SimpleType simpleType) {
359         datatype = null;
360         try {
361             datatype = doCreateDatatype(simpleType);
362             if(simpleType instanceof GlobalSimpleType &&
363                     this.model != null) {
364                 String JavaDoc name = ((GlobalSimpleType)simpleType).getName();
365                 for(GlobalSimpleType gst:this.model.getSchemaModel().getSchema().getSimpleTypes())
366                     if(gst.getName().equals(name))
367                         return new CustomDatatype(name, datatype);
368             }
369         }catch(Throwable JavaDoc th) {
370             th.printStackTrace();
371         }
372         return datatype;
373     }
374     
375     Datatype doCreateDatatype(final SimpleType simpleType) {
376         if(simpleType == null) return null;
377         if(simpleType instanceof GlobalSimpleType) {
378             datatype = DatatypeFactory.getDefault().
379                     createPrimitive(((GlobalSimpleType)simpleType).getName());
380         }
381         if(datatype == null) {//not a built-in type
382
SimpleTypeDefinition def = simpleType.getDefinition();
383             if(def instanceof SimpleTypeRestriction) {
384                 GlobalSimpleType baseType = null;
385                 if(((SimpleTypeRestriction)def).getBase() != null) {
386                     baseType = (GlobalSimpleType)((SimpleTypeRestriction)def).getBase().get();
387                     datatype = doCreateDatatype(baseType);
388                     SimpleRestriction r = (SimpleRestriction)def;
389                     facetParent = r;
390                     findFacets(r);
391                 } else
392                     datatype = doCreateDatatype(((SimpleTypeRestriction)def).getInlineType());
393             } else if(def instanceof org.netbeans.modules.xml.schema.model.List) {
394                 org.netbeans.modules.xml.schema.model.List l =
395                         (org.netbeans.modules.xml.schema.model.List)def;
396                 if(l.getType() != null)
397                     datatype = doCreateDatatype(l.getType().get());
398                 else
399                     datatype = doCreateDatatype(l.getInlineType());
400             } else if(def instanceof Union) {
401                 Union u = (Union)def;
402                 Datatype unionType = new UnionType();
403                 
404                 if(u.getMemberTypes() != null) {
405                     for(NamedComponentReference<GlobalSimpleType> gst:u.getMemberTypes()) {
406                         Datatype memberType = doCreateDatatype(gst.get());
407                         if(memberType != null)
408                             ((UnionType)unionType).addMemberType(memberType);
409                     }
410                 }
411                 if(u.getInlineTypes() != null) {
412                     for(LocalSimpleType lst:u.getInlineTypes()) {
413                         datatype = null;
414                         Datatype memberType = doCreateDatatype(lst);
415                         if(memberType != null)
416                             ((UnionType)unionType).addMemberType(memberType);
417                     }
418                     if(u.getInlineTypes().size() > 0)
419                         ((UnionType)unionType).setHasFacets(true);
420                 }
421                 return unionType;
422             }
423         }
424         return datatype;
425     }
426     
427     void findFacets(final SimpleRestriction r) {
428         findFacets(r.getEnumerations());
429         findFacets(r.getFractionDigits());
430         findFacets(r.getLengths());
431         findFacets(r.getMaxExclusives());
432         findFacets(r.getMaxInclusives());
433         findFacets(r.getMaxLengths());
434         findFacets(r.getMinExclusives());
435         findFacets(r.getMinInclusives());
436         findFacets(r.getMinLengths());
437         findFacets(r.getPatterns());
438         findFacets(r.getTotalDigits());
439         findFacets(r.getWhitespaces());
440     }
441     
442     Datatype findPrimitive(Schema schema, String JavaDoc typeName) {
443         Collection JavaDoc<GlobalSimpleType> gsts = schema.getSimpleTypes();
444         for(GlobalSimpleType gst:gsts) {
445             if(gst.getName().equals(typeName)) {
446                 return createDatatype(gst);
447             }
448         }
449         return null;
450     }
451     
452     void findFacets(Collection JavaDoc<? extends SchemaComponent> facets) {
453         for(SchemaComponent facet:facets) {
454             facet.accept(this);
455         }
456     }
457     
458     Datatype getDatatype() {
459         return datatype;
460     }
461     
462     private Datatype datatype;
463     private SimpleRestriction facetParent;
464     AXIModelImpl model;
465 }
466
Popular Tags