KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > schema > refactoring > query > readers > QuerySubstitutionGroupsReader


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 /*
21  * QuerySubstitutionGroupsReader.java
22  *
23  * Created on October 26, 2005, 11:27 AM
24  *
25  * To change this template, choose Tools | Template Manager
26  * and open the template in the editor.
27  */

28
29 package org.netbeans.modules.xml.schema.refactoring.query.readers;
30
31
32 import java.awt.Color JavaDoc;
33 import java.text.MessageFormat JavaDoc;
34 import java.util.ArrayList JavaDoc;
35 import java.util.Collection JavaDoc;
36 import java.util.HashMap JavaDoc;
37 import java.util.List JavaDoc;
38 import java.util.Map JavaDoc;
39 import java.util.Set JavaDoc;
40 import org.netbeans.modules.xml.nbprefuse.AnalysisConstants;
41 import org.netbeans.modules.xml.refactoring.RefactoringManager;
42 import org.netbeans.modules.xml.refactoring.spi.UIHelper;
43 import org.netbeans.modules.xml.refactoring.ui.util.AnalysisUtilities;
44 import org.netbeans.modules.xml.schema.model.GlobalElement;
45 import org.netbeans.modules.xml.schema.model.SchemaModel;
46 import org.netbeans.modules.xml.xam.Component;
47 import org.openide.ErrorManager;
48 import org.openide.awt.StatusDisplayer;
49 import org.openide.util.NbBundle;
50 import org.netbeans.modules.xml.xam.dom.NamedComponentReference;
51 import prefuse.data.Edge;
52 import prefuse.data.Graph;
53 import prefuse.data.Node;
54
55 /**
56  *
57  * @author Jeri Lockhart
58  */

59 public class QuerySubstitutionGroupsReader {
60     
61     private SchemaModel model;
62 // private SchemaComponent query;
63

64 // private QuerySchemaComponentNode headElementNode;
65
// Map - Key is HeadElement, Value is List of Global elements in Subst Grp
66
private Map JavaDoc<GlobalElement,List JavaDoc<GlobalElement>> sGroups;
67     
68     
69     public static final prefuse.data.Schema FIND_USAGES_NODES_SCHEMA = new prefuse.data.Schema(); // prefuse graph schema
70
static {
71         FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.LABEL, String JavaDoc.class, AnalysisConstants.EMPTY_STRING);
72         FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.ID, String JavaDoc.class, AnalysisConstants.EMPTY_STRING);
73         FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.COMPONENT_TYPE_NAME, String JavaDoc.class, AnalysisConstants.EMPTY_STRING);
74         FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.ELEMENT_TYPE, String JavaDoc.class, AnalysisConstants.EMPTY_STRING); // type of a GE, LE, GA, or LA
75
FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.XML_FILENAME, String JavaDoc.class, AnalysisConstants.EMPTY_STRING);
76         FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.TOOLTIP, String JavaDoc.class, AnalysisConstants.EMPTY_STRING); // name
77
// FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.SCHEMA_COMPONENT, SchemaComponent.class); // Global Complex Type, etc
78
FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.XAM_COMPONENT, Component.class); // Global Complex Type, etc
79
FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.IS_PRIMITIVE, boolean.class, false); // is builtin type
80
FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.IS_QUERY_NODE, boolean.class, false);
81         FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.IS_USAGE_NODE, boolean.class, false);
82         FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.IS_HEAD_ELEMENT, boolean.class, false);
83         FIND_USAGES_NODES_SCHEMA.addColumn(AnalysisConstants.OPENIDE_NODE,
84                 org.openide.nodes.Node.class);
85     }
86     
87     public static final prefuse.data.Schema FIND_USAGES_EDGES_SCHEMA = new prefuse.data.Schema(); // prefuse graph schema
88
static {
89         FIND_USAGES_EDGES_SCHEMA.addColumn(AnalysisConstants.LABEL, String JavaDoc.class, AnalysisConstants.EMPTY_STRING);
90         FIND_USAGES_EDGES_SCHEMA.addColumn(AnalysisConstants.EDGE_TYPE, String JavaDoc.class, AnalysisConstants.EMPTY_STRING); // "file-edge-type" "generalization", "reference" "composition"
91
FIND_USAGES_EDGES_SCHEMA.addColumn(AnalysisConstants.TOOLTIP, String JavaDoc.class, AnalysisConstants.EMPTY_STRING);
92     }
93     
94     
95     /**
96      * Creates a new instance of QuerySubstitutionGroupsReader
97      */

98     public QuerySubstitutionGroupsReader(SchemaModel model) {
99         this.model = model;
100     }
101     
102     
103     public Graph loadGraph() {
104         Graph graph = new Graph(true); // isDirected
105
graph.getNodeTable().addColumns(FIND_USAGES_NODES_SCHEMA);
106         graph.getEdgeTable().addColumns(FIND_USAGES_EDGES_SCHEMA);
107         // get global elements
108
// if GE has SubstitutionGroup (SG)
109
// create new group entry in map
110
// add GE to list
111
sGroups = new HashMap JavaDoc<GlobalElement,List JavaDoc<GlobalElement>>();
112         Collection JavaDoc<GlobalElement> ges = model.getSchema().getElements();
113         for (GlobalElement ge:ges){
114             NamedComponentReference<GlobalElement> headElemRef = ge.getSubstitutionGroup();
115             // TODO add stats to status area about broken refs
116
// ref can be broken
117
// headElemRef.isBroken()
118
// headElemRef.get() == null
119
if (headElemRef != null){
120                 GlobalElement headElem = headElemRef.get();
121                 if (headElem != null){
122                     List JavaDoc<GlobalElement> members = sGroups.get(headElem);
123                     if (members == null){
124                         members = new ArrayList JavaDoc<GlobalElement>();
125                         sGroups.put(headElem, members);
126                     }
127                     members.add(ge);
128                 } else {
129                     ErrorManager.getDefault().log(ErrorManager.ERROR,"QuerySubstitutionGroupsReader.loadGraph ignoring GE w/ invalid substGrp ref " + ge.getName());
130                 }
131             }
132         }
133         int numGroups = sGroups.size();
134         
135         if (numGroups == 1) {
136             StatusDisplayer.getDefault().setStatusText(
137                     NbBundle.getMessage(QuerySubstitutionGroupsReader.class,
138                     "LBL_SubstitutionGroup_Found"));
139         } else {
140             StatusDisplayer.getDefault().setStatusText(
141                     MessageFormat.format(NbBundle.getMessage(QuerySubstitutionGroupsReader.class,
142                     "LBL_SubstitutionGroups_Found"),
143                     new Object JavaDoc[] {numGroups,
144             }
145             ));
146         }
147         // build graph
148
Set JavaDoc<GlobalElement> headElems = sGroups.keySet();
149         for (GlobalElement head: headElems){
150             List JavaDoc<GlobalElement> geList = sGroups.get(head);
151             // this shouldn't happen
152
assert geList != null:"Error is finding substitution group for "+ head;
153             Node headNode = createHeadElementNode(graph, head);
154             for (GlobalElement ge: geList){
155                 Node elemNode = createNode(graph, ge);
156                 
157 // elemNode.setString(AnalysisConstants.TOOLTIP,
158
// MessageFormat.format(
159
// NbBundle.getMessage(QuerySubstitutionGroupsReader.class,
160
// "LBL_Substitutable_Element"), // e.g., "Substituable for xxx"
161
// new Object[] {headNode.getString(AnalysisConstants.LABEL)}));
162

163                 AnalysisUtilities.ToolTipLine topLine = null;
164                 topLine = new AnalysisUtilities.ToolTipLine((
165                         MessageFormat.format(
166                         NbBundle.getMessage(QuerySubstitutionGroupsReader.class,
167                         "LBL_Substitutable_Element"), // e.g., "Substituable for xxx"
168
new Object JavaDoc[] {headNode.getString(AnalysisConstants.LABEL)})),
169                         100,
170                         Color.BLACK.getRGB(),
171                         AnalysisUtilities.ToolTipLine.HorizontalAlignment.CENTER);
172                 String JavaDoc compType = elemNode.getString(AnalysisConstants.COMPONENT_TYPE_NAME);
173                 AnalysisUtilities.ToolTipLine typeLine = new AnalysisUtilities.ToolTipLine(compType,
174                         100,
175                         Color.BLACK.getRGB(),
176                         AnalysisUtilities.ToolTipLine.HorizontalAlignment.CENTER);
177                 String JavaDoc toolTip = AnalysisUtilities.createHTMLToolTip(new AnalysisUtilities.ToolTipLine[] {topLine, typeLine});
178                 elemNode.setString(AnalysisConstants.TOOLTIP, toolTip);
179                 
180                 Edge edge = createEdge(graph, elemNode, headNode);
181             }
182         }
183 // GraphUtilities.dumpGraph(graph);
184
return graph;
185     }
186     
187     
188     
189     
190     
191     private Node createHeadElementNode(Graph graph, GlobalElement head) {
192         Node headElementNode = createNode(graph, head);
193         headElementNode.setBoolean(AnalysisConstants.IS_HEAD_ELEMENT, true);
194         
195 // headElementNode.setAttribute(AnalysisConstants.TOOLTIP,
196
// NbBundle.getMessage(QuerySubstitutionGroupsReader.class,
197
// "LBL_Head_Element"));
198

199         AnalysisUtilities.ToolTipLine topLine = new AnalysisUtilities.ToolTipLine((
200                 NbBundle.getMessage(QuerySubstitutionGroupsReader.class,
201                 "LBL_Head_Element")),
202                 100,
203                 Color.BLACK.getRGB(),
204                 AnalysisUtilities.ToolTipLine.HorizontalAlignment.CENTER);
205         
206         AnalysisUtilities.ToolTipLine typeLine = new AnalysisUtilities.ToolTipLine(
207                 NbBundle.getMessage(QuerySubstitutionGroupsReader.class,"LBL_Global_Element"),
208                 100,
209                 Color.BLACK.getRGB(),
210                 AnalysisUtilities.ToolTipLine.HorizontalAlignment.CENTER);
211         
212         String JavaDoc toolTip = AnalysisUtilities.createHTMLToolTip(new AnalysisUtilities.ToolTipLine[] {topLine, typeLine});
213         headElementNode.setString(AnalysisConstants.TOOLTIP, toolTip);
214         
215         return headElementNode;
216         
217         
218     }
219     
220     private Edge createEdge(Graph graph, Node elemNode, Node headNode){
221 //
222
// Edge edge = graph.addEdge(queryNode, fileNode);
223
Edge edge = graph.addEdge(elemNode, headNode);
224         edge.setString(AnalysisConstants.EDGE_TYPE, AnalysisConstants.GENERALIZATION);
225         return edge;
226     }
227     
228     private Node createNode(Graph graph, GlobalElement ge){
229         Node n = graph.addNode();
230         UIHelper uiHleper = RefactoringManager.getInstance().getTargetComponentUIHelper(ge);
231         org.openide.nodes.Node displayNode = uiHleper.getDisplayNode(ge);
232         n.set(AnalysisConstants.OPENIDE_NODE, displayNode );
233         n.set(AnalysisConstants.XAM_COMPONENT, ge);
234         n.setString(AnalysisConstants.COMPONENT_TYPE_NAME, displayNode.getShortDescription());
235         n.setString(AnalysisConstants.LABEL, displayNode.getName());
236         n.setString(AnalysisConstants.ELEMENT_TYPE, displayNode.getDisplayName());
237         
238         return n;
239     }
240     
241     
242     
243 }
244
Popular Tags