1 19 20 package org.netbeans.modules.xml.axi.impl; 21 22 import java.io.IOException ; 23 import java.util.ArrayList ; 24 import java.util.List ; 25 import javax.swing.text.BadLocationException ; 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 42 public class SchemaGeneratorFactoryImpl extends SchemaGeneratorFactory { 43 44 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 , IOException { 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 <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 <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 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 <AbstractElement> les = 112 new ArrayList <AbstractElement>(ge.getChildElements()); 113 filterOtherModelComponents(les, am); 114 List <AbstractAttribute> attrs = 115 new ArrayList <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 <AbstractElement> gles = 124 new ArrayList <AbstractElement>(le.getChildElements()); 125 filterOtherModelComponents(gles, am); 126 List <AbstractAttribute> gattrs = 127 new ArrayList <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 } 174 return TransformHint.OK; 175 } 176 177 private void filterOtherModelComponents(List cs, AXIModel am) { 178 List <Integer > removeList = new ArrayList <Integer >(); 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 (i)); 184 } 185 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 { 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 |