1 19 27 28 package org.netbeans.modules.xml.schema.refactoring.query.readers; 29 30 import java.text.MessageFormat ; 31 import java.util.ArrayList ; 32 import java.util.Collection ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 import java.util.Map ; 36 import org.netbeans.api.java.project.JavaProjectConstants; 37 import org.netbeans.api.project.SourceGroup; 38 import org.netbeans.modules.xml.nbprefuse.AnalysisConstants; 39 import org.netbeans.modules.xml.refactoring.RefactoringManager; 40 import org.netbeans.modules.xml.refactoring.spi.UIHelper; 41 import org.netbeans.modules.xml.refactoring.ui.CancelSignal; 42 import org.netbeans.modules.xml.schema.model.GlobalAttribute; 43 import org.netbeans.modules.xml.schema.model.GlobalAttributeGroup; 44 import org.netbeans.modules.xml.schema.model.GlobalComplexType; 45 import org.netbeans.modules.xml.schema.model.GlobalElement; 46 import org.netbeans.modules.xml.schema.model.GlobalGroup; 47 import org.netbeans.modules.xml.schema.model.GlobalSimpleType; 48 import org.netbeans.modules.xml.schema.model.Schema; 49 import org.netbeans.modules.xml.schema.model.SchemaComponent; 50 import org.netbeans.modules.xml.schema.model.SchemaModel; 51 import org.netbeans.modules.xml.schema.model.SchemaModelFactory; 52 import org.netbeans.modules.xml.schema.model.visitor.Preview; 53 import org.netbeans.modules.xml.schema.refactoring.ui.QueryUtilities; 54 import org.netbeans.modules.xml.xam.Model; 55 import org.netbeans.modules.xml.xam.ModelSource; 56 import org.netbeans.modules.xml.xam.NamedReferenceable; 57 import org.netbeans.modules.xml.xam.Referenceable; 58 import org.openide.awt.StatusDisplayer; 59 import org.openide.filesystems.FileObject; 60 import org.openide.nodes.AbstractNode; 61 import org.openide.nodes.Children; 62 import org.openide.nodes.FilterNode; 63 import org.openide.nodes.Node; 64 import org.openide.util.NbBundle; 65 66 70 public class QueryUnusedGlobalsReader { 71 72 private enum FindUsagesResult {USAGES_FOUND, 73 NO_USAGES_FOUND, 74 CANCEL_REQUESTED}; 75 76 private static final int GCT = 2; 77 private static final int GST = 5; 78 private static final int GRP = 4; 79 private static final int AT = 0; 80 private static final int ATG = 1; 81 private static final int ELE = 3; 82 83 84 85 90 public Node findUnusedGlobals(CancelSignal cancelSignal, 91 SchemaModel model, 92 Boolean excludeGEs) { 93 if (cancelSignal == null || model == null || excludeGEs == null){ 94 return null; 95 } 96 97 AbstractNode root = new AbstractNode(new Children.Array()); 98 root.setDisplayName(NbBundle.getMessage(QueryUnusedGlobalsReader.class, 99 "LBL_Unused_Global_Components")); 100 root.setIconBaseWithExtension("org/netbeans/modules/xml/schema/refactoring/resources/unused-query.PNG"); Schema schema = model.getSchema(); 102 103 Node[] catChildren = new Node[excludeGEs.booleanValue()?5:6]; 104 105 List <SchemaComponent> theGlobals = new ArrayList <SchemaComponent>(); 106 107 Collection <GlobalComplexType> cts = schema.getComplexTypes(); 108 Node ctCat = QueryUtilities.createCategoryNode(AnalysisConstants.GlobalTypes.COMPLEX_TYPE); 109 catChildren[GCT] = ctCat; 110 theGlobals.addAll(cts); 111 Collection <GlobalElement> elems = null; 112 int groupExcludedOffset = 1; 113 if (!excludeGEs){ 114 groupExcludedOffset--; 115 elems = schema.getElements(); 116 Node eCat = QueryUtilities.createCategoryNode(AnalysisConstants.GlobalTypes.ELEMENT); 117 catChildren[ELE] = eCat; 118 theGlobals.addAll(elems); 119 } 120 121 Collection <GlobalSimpleType> sts = schema.getSimpleTypes(); 122 Node stCat = QueryUtilities.createCategoryNode(AnalysisConstants.GlobalTypes.SIMPLE_TYPE); 123 catChildren[GST-groupExcludedOffset] = stCat; 124 theGlobals.addAll(sts); 125 126 Collection <GlobalGroup> ggs = schema.getGroups(); 127 Node gCat = QueryUtilities.createCategoryNode(AnalysisConstants.GlobalTypes.GROUP); 128 catChildren[GRP-groupExcludedOffset] = gCat; 129 theGlobals.addAll(ggs); 130 131 Collection <GlobalAttribute> ats = schema.getAttributes(); 132 Node atCat = QueryUtilities.createCategoryNode(AnalysisConstants.GlobalTypes.ATTRIBUTE); 133 catChildren[AT] = atCat; 134 theGlobals.addAll(ats); 135 136 Collection <GlobalAttributeGroup> ags = schema.getAttributeGroups(); 137 Node agCat = QueryUtilities.createCategoryNode(AnalysisConstants.GlobalTypes.ATTRIBUTE_GROUP); 138 catChildren[ATG] = agCat; 139 theGlobals.addAll(ags); 140 141 142 List <FileObject> allFiles = new ArrayList <FileObject>(); 143 FileObject qFile = (FileObject) model.getModelSource().getLookup().lookup(FileObject.class); 144 allFiles.add(qFile); 146 147 FileObject queryFolder = qFile.getParent(); 149 getFiles(allFiles, queryFolder, null, qFile); 150 151 152 List <SourceGroup> srcGrps = 153 QueryUtilities.getProjectSourceGroups( 154 model,JavaProjectConstants.SOURCES_TYPE_JAVA); 155 156 for(SourceGroup srcGrp : srcGrps) { 158 FileObject f = srcGrp.getRootFolder(); 159 if (f != queryFolder){ 160 getFiles(allFiles, f, queryFolder, qFile); 161 } 162 } 163 findUnused(cancelSignal, theGlobals, allFiles); 164 if (cancelSignal.isCancelRequested()){ 165 StatusDisplayer.getDefault().setStatusText(NbBundle.getMessage( 166 QueryUnusedGlobalsReader.class, "LBL_Query_Cancelled")); 167 return null; 168 } 169 for (SchemaComponent sc:theGlobals){ 170 createNode(sc, catChildren, groupExcludedOffset); 171 } 172 173 174 root.getChildren().add(catChildren); 175 StatusDisplayer.getDefault().setStatusText((theGlobals.size()==1? 176 NbBundle.getMessage(QueryUnusedGlobalsReader.class, 177 "LBL_Found_1_Unused_Component"): 178 MessageFormat.format( 179 NbBundle.getMessage(QueryUnusedGlobalsReader.class, 180 "LBL_Found_Unused_Global_Components"), 181 new Object []{Integer.valueOf(theGlobals.size())}))); 182 183 189 return root; 190 } 191 192 196 private void findUnused(CancelSignal cancelSignal, List <SchemaComponent> theGlobals, List <FileObject> theFiles){ 197 Iterator <FileObject> filesIt = theFiles.iterator(); 198 while(filesIt.hasNext()){ 199 FileObject f = filesIt.next(); 200 ModelSource modelSource = 202 org.netbeans.modules.xml.retriever.catalog.Utilities.getModelSource( 203 f, 204 true); 206 SchemaModel currModel = SchemaModelFactory.getDefault().getModel(modelSource); 207 if (currModel.getState() == Model.State.NOT_WELL_FORMED) { 208 continue; 209 } 210 assert currModel != null:"Cannot get SchemaModel for " + f.getNameExt(); 211 Iterator <SchemaComponent> scIt = theGlobals.iterator(); 212 while(scIt.hasNext()){ 214 if (cancelSignal.isCancelRequested()){ 215 return; 216 } 217 SchemaComponent sc = scIt.next(); 218 Referenceable ref = Referenceable.class.cast(sc); 219 Preview preview = 221 QueryUtilities.getUsagesPreview( 222 currModel.getSchema(), 223 NamedReferenceable.class.cast(ref)); 224 225 assert preview != null: 226 "QueryUtilities.getUsagesPreview() returned null preview"; Map <SchemaComponent, List <SchemaComponent>> um = 228 preview.getUsages(); 229 assert um != null: 230 "QueryUtilities.getUsagesPreview() returned preview with null map"; 232 if (um.size() > 0){ 233 scIt.remove(); 235 } 236 } 240 } 241 } 242 243 244 248 private void getFiles(List <FileObject> allFiles, 249 FileObject fobj, 250 FileObject queryFolder, 251 FileObject queryFile){ 252 253 if (fobj != null && fobj.isFolder() && fobj != queryFolder){ 254 FileObject[] children = fobj.getChildren(); 255 for (FileObject f:children){ 256 if (f.isData() && 257 f.getExt().equals(AnalysisConstants.SCHEMA_FILE_EXTENSION) && 258 f != queryFile) { allFiles.add(f); 261 } else { getFiles(allFiles, f, queryFolder,queryFile); 263 } 264 } 265 } 266 267 } 268 269 270 277 private void createNode(SchemaComponent sc, Node[] categories, int groupExcludedOffset){ 278 if (!(sc instanceof Referenceable) || categories == null){ 279 return; 280 } 281 int index = 0; 282 if (sc instanceof GlobalComplexType){ 283 index = GCT; 284 } else if (sc instanceof GlobalSimpleType){ 285 index = GST - groupExcludedOffset; 286 } else if (sc instanceof GlobalGroup){ 287 index = GRP - groupExcludedOffset; 288 } else if (sc instanceof GlobalAttribute){ 289 index = AT; 290 } else if (sc instanceof GlobalAttributeGroup){ 291 index = ATG; 292 } else if (sc instanceof GlobalElement){ 293 index = ELE; 294 } 295 Node displayNode = RefactoringManager.getInstance(). 296 getTargetComponentUIHelper((Referenceable)sc).getDisplayNode(sc); 297 displayNode = new FilterNode(displayNode) { 298 public String getHtmlDisplayName() { 299 return null; 300 } 301 }; 302 categories[index].getChildren().add(new Node[]{displayNode}); 303 } 304 } 305 | Popular Tags |