KickJava   Java API By Example, From Geeks To Geeks.

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


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.io.IOException JavaDoc;
23 import java.util.ArrayList JavaDoc;
24 import java.util.List JavaDoc;
25 import javax.swing.text.BadLocationException JavaDoc;
26 import org.netbeans.modules.xml.axi.AXIComponent;
27 import org.netbeans.modules.xml.axi.AXIModel;
28 import org.netbeans.modules.xml.axi.AXIModelFactory;
29 import org.netbeans.modules.xml.axi.AbstractAttribute;
30 import org.netbeans.modules.xml.axi.AbstractElement;
31 import org.netbeans.modules.xml.axi.Element;
32 import org.netbeans.modules.xml.axi.SchemaGenerator;
33 import org.netbeans.modules.xml.axi.SchemaGeneratorFactory;
34 import org.netbeans.modules.xml.axi.SchemaGeneratorFactory.TransformHint;
35 import org.netbeans.modules.xml.schema.model.SchemaModel;
36 import org.netbeans.modules.xml.xam.Model;
37
38 /**
39  *
40  * @author Ayub Khan
41  */

42 public class SchemaGeneratorFactoryImpl extends SchemaGeneratorFactory {
43     
44     /**
45      * Creates a new instance of SchemaGeneratorFactoryImpl
46      */

47     public SchemaGeneratorFactoryImpl() {
48         super();
49     }
50     
51     public SchemaGenerator.Pattern inferDesignPattern(AXIModel am) {
52         return SchemaGeneratorUtil.inferDesignPattern(am);
53     }
54     
55     public void updateSchema(SchemaModel sm, SchemaGenerator.Pattern pattern)
56     throws BadLocationException JavaDoc, IOException JavaDoc {
57         SchemaGenerator sg = null;
58         if(pattern == SchemaGenerator.Pattern.GARDEN_OF_EDEN)
59             sg = new GardenOfEden(SchemaGenerator.Mode.UPDATE);
60         else if(pattern == SchemaGenerator.Pattern.VENITIAN_BLIND)
61             sg = new VenetianBlind(SchemaGenerator.Mode.UPDATE);
62         else if(pattern == SchemaGenerator.Pattern.SALAMI_SLICE)
63             sg = new SalamiSlice(SchemaGenerator.Mode.UPDATE);
64         else if(pattern == SchemaGenerator.Pattern.RUSSIAN_DOLL)
65             sg = new RussianDoll(SchemaGenerator.Mode.UPDATE);
66         else if(pattern == SchemaGenerator.Pattern.MIXED)
67             sg = new MixedPattern(SchemaGenerator.Mode.UPDATE);
68         
69         if(sg != null)
70             sg.updateSchema(sm);
71     }
72     
73     public List JavaDoc<Element> findMasterGlobalElements(AXIModel am) {
74         return SchemaGeneratorUtil.findMasterGlobalElements(am);
75     }
76     
77     public TransformHint canTransformSchema(SchemaModel sm,
78             SchemaGenerator.Pattern currentPattern,
79             SchemaGenerator.Pattern targetPattern) {
80         return canTransformSchema(sm, currentPattern, targetPattern,
81             findMasterGlobalElements(AXIModelFactory.getDefault().getModel(sm)));
82     }
83     
84     public TransformHint canTransformSchema(SchemaModel sm,
85             SchemaGenerator.Pattern currentPattern,
86             SchemaGenerator.Pattern targetPattern, List JavaDoc<Element> ges) {
87         if(sm == null) return TransformHint.INVALID_SCHEMA;
88         AXIModel am = AXIModelFactory.getDefault().getModel(sm);
89         
90         if(am == null || am.getState() != Model.State.VALID ||
91                 am.getState() == Model.State.NOT_WELL_FORMED)
92             return TransformHint.INVALID_SCHEMA;
93         
94         if(currentPattern == targetPattern)
95             return TransformHint.SAME_DESIGN_PATTERN;
96
97         if(currentPattern != null && targetPattern != null) {
98             if(ges.size() == 0)
99                 return TransformHint.NO_GLOBAL_ELEMENTS;
100             else if(ges.size() > 1 &&
101                     (targetPattern == SchemaGenerator.Pattern.RUSSIAN_DOLL ||
102                     targetPattern == SchemaGenerator.Pattern.VENITIAN_BLIND))
103                 return TransformHint.CANNOT_REMOVE_GLOBAL_ELEMENTS;
104             
105             //single global element
106
int childElementEmptyCount = 0;
107             int childAttributesEmptyCount = 0;
108             boolean grandChildrenAvailable = false;
109             int size = am.getRoot().getElements().size();
110             for(Element ge:am.getRoot().getElements()) {
111                 List JavaDoc<AbstractElement> les =
112                         new ArrayList JavaDoc<AbstractElement>(ge.getChildElements());
113                 filterOtherModelComponents(les, am);
114                 List JavaDoc<AbstractAttribute> attrs =
115                         new ArrayList JavaDoc<AbstractAttribute>(ge.getAttributes());
116                 filterOtherModelComponents(attrs, am);
117                 if(les.size() == 0)
118                     childElementEmptyCount++;
119                 if(attrs.size() == 0)
120                     childAttributesEmptyCount++;
121                 if(!grandChildrenAvailable) {
122                     for(AbstractElement le:les) {
123                         List JavaDoc<AbstractElement> gles =
124                                 new ArrayList JavaDoc<AbstractElement>(le.getChildElements());
125                         filterOtherModelComponents(gles, am);
126                         List JavaDoc<AbstractAttribute> gattrs =
127                                 new ArrayList JavaDoc<AbstractAttribute>(le.getAttributes());
128                         filterOtherModelComponents(gattrs, am);
129                         if(gles.size() > 0 || gattrs.size() > 0) {
130                             grandChildrenAvailable = true;
131                             break;
132                         }
133                     }
134                 }
135             }
136             boolean noChildElements = childElementEmptyCount > 0 &&
137                     childElementEmptyCount == size;
138             boolean noChildAttributes = childAttributesEmptyCount > 0 &&
139                     childAttributesEmptyCount == size;
140             if(noChildElements && targetPattern == SchemaGenerator.Pattern.SALAMI_SLICE)
141                 return TransformHint.GLOBAL_ELEMENTS_HAVE_NO_CHILD_ELEMENTS;
142             if(noChildAttributes && noChildElements &&
143                     (targetPattern == SchemaGenerator.Pattern.GARDEN_OF_EDEN ||
144                     targetPattern == SchemaGenerator.Pattern.RUSSIAN_DOLL))
145                 return TransformHint.GLOBAL_ELEMENTS_HAVE_NO_CHILD_ELEMENTS_AND_ATTRIBUTES;
146             
147             if(!grandChildrenAvailable &&
148                     targetPattern == SchemaGenerator.Pattern.VENITIAN_BLIND)
149                 return TransformHint.GLOBAL_ELEMENTS_HAVE_NO_GRAND_CHILDREN;
150             
151             if(currentPattern == SchemaGenerator.Pattern.SALAMI_SLICE ||
152                     currentPattern == SchemaGenerator.Pattern.RUSSIAN_DOLL)
153                 return TransformHint.WILL_REMOVE_GLOBAL_ELEMENTS;
154             else
155                 return TransformHint.WILL_REMOVE_GLOBAL_ELEMENTS_AND_TYPES;
156 // if((currentPattern == SchemaGenerator.Pattern.VENITIAN_BLIND ||
157
// currentPattern == SchemaGenerator.Pattern.GARDEN_OF_EDEN) &&
158
// (targetPattern == SchemaGenerator.Pattern.RUSSIAN_DOLL ||
159
// targetPattern == SchemaGenerator.Pattern.SALAMI_SLICE)) {
160
// if(currentPattern == SchemaGenerator.Pattern.GARDEN_OF_EDEN)
161
// return TransformHint.WILL_REMOVE_GLOBAL_ELEMENTS_AND_TYPES;
162
// else
163
// return TransformHint.WILL_REMOVE_TYPES;
164
// } else if((currentPattern == SchemaGenerator.Pattern.SALAMI_SLICE ||
165
// currentPattern == SchemaGenerator.Pattern.GARDEN_OF_EDEN) &&
166
// (targetPattern == SchemaGenerator.Pattern.RUSSIAN_DOLL ||
167
// targetPattern == SchemaGenerator.Pattern.VENITIAN_BLIND)) {
168
// if(currentPattern == SchemaGenerator.Pattern.GARDEN_OF_EDEN)
169
// return TransformHint.WILL_REMOVE_GLOBAL_ELEMENTS_AND_TYPES;
170
// else
171
// return TransformHint.WILL_REMOVE_GLOBAL_ELEMENTS;
172
// }
173
}
174         return TransformHint.OK;
175     }
176     
177     private void filterOtherModelComponents(List JavaDoc cs, AXIModel am) {
178         List JavaDoc<Integer JavaDoc> removeList = new ArrayList JavaDoc<Integer JavaDoc>();
179         for(int i=0;i<cs.size();i++) {
180             AXIComponent e = (AXIComponent) cs.get(i);
181             if(!SchemaGeneratorUtil.fromSameSchemaModel(
182                     e.getPeer(), am.getSchemaModel()))
183                 removeList.add(new Integer JavaDoc(i));
184         }
185         //finally remove components from other model
186
for(int i=removeList.size()-1;i>=0;i--) {
187             cs.remove(removeList.get(i).intValue());
188         }
189     }
190     
191     public void transformSchema(SchemaModel sm, SchemaGenerator.Pattern targetPattern)
192     throws IOException JavaDoc {
193         SchemaGenerator sg = null;
194         if(targetPattern == SchemaGenerator.Pattern.GARDEN_OF_EDEN)
195             sg = new GardenOfEden(SchemaGenerator.Mode.TRANSFORM);
196         else if(targetPattern == SchemaGenerator.Pattern.VENITIAN_BLIND)
197             sg = new VenetianBlind(SchemaGenerator.Mode.TRANSFORM);
198         else if(targetPattern == SchemaGenerator.Pattern.SALAMI_SLICE)
199             sg = new SalamiSlice(SchemaGenerator.Mode.TRANSFORM);
200         else if(targetPattern == SchemaGenerator.Pattern.RUSSIAN_DOLL)
201             sg = new RussianDoll(SchemaGenerator.Mode.TRANSFORM);
202         else if(targetPattern == SchemaGenerator.Pattern.MIXED)
203             sg = new MixedPattern(SchemaGenerator.Mode.TRANSFORM);
204         
205         if(sg != null)
206             sg.transformSchema(sm);
207     }
208 }
209
Popular Tags