001: /*
002: * The contents of this file are subject to the terms of the Common Development
003: * and Distribution License (the License). You may not use this file except in
004: * compliance with the License.
005: *
006: * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
007: * or http://www.netbeans.org/cddl.txt.
008: *
009: * When distributing Covered Code, include this CDDL Header Notice in each file
010: * and include the License file at http://www.netbeans.org/cddl.txt.
011: * If applicable, add the following below the CDDL Header, with the fields
012: * enclosed by brackets [] replaced by your own identifying information:
013: * "Portions Copyrighted [year] [name of copyright owner]"
014: *
015: * The Original Software is NetBeans. The Initial Developer of the Original
016: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
017: * Microsystems, Inc. All Rights Reserved.
018: */
019: package org.netbeans.modules.soa.ui.axinodes;
020:
021: import java.util.ArrayList;
022: import java.util.List;
023: import org.netbeans.modules.soa.ui.nodes.NodeFactory;
024: import org.netbeans.modules.xml.axi.AXIComponent;
025: import org.netbeans.modules.xml.axi.AXIDocument;
026: import org.netbeans.modules.xml.axi.AXIModel;
027: import org.netbeans.modules.xml.axi.AXIModelFactory;
028: import org.netbeans.modules.xml.axi.ContentModel;
029: import org.netbeans.modules.xml.axi.Element;
030: import org.netbeans.modules.xml.schema.model.GlobalElement;
031: import org.netbeans.modules.xml.schema.model.GlobalType;
032: import org.netbeans.modules.xml.schema.model.SchemaComponent;
033: import org.netbeans.modules.xml.schema.model.SchemaModel;
034: import org.netbeans.modules.xml.schema.model.SimpleType;
035: import org.netbeans.modules.xml.xam.dom.NamedComponentReference;
036: import org.openide.nodes.Children;
037: import org.openide.nodes.Node;
038: import org.openide.util.Lookup;
039:
040: /**
041: * Loads the list of child nodes for Schema component
042: * or a Schema as a whole.
043: *
044: * @author nk160297
045: */
046: public class AxiomChildren extends Children.Keys {
047:
048: private Lookup myLookup;
049:
050: public AxiomChildren(SchemaModel schemaModel, Lookup lookup) {
051: myLookup = lookup;
052: //
053: setKeys(new Object[] { schemaModel });
054: }
055:
056: public AxiomChildren(AXIModel axiModel, Lookup lookup) {
057: myLookup = lookup;
058: //
059: setKeys(new Object[] { axiModel });
060: }
061:
062: public AxiomChildren(SchemaComponent schemaComp, Lookup lookup) {
063: myLookup = lookup;
064: //
065: setKeys(new Object[] { schemaComp });
066: }
067:
068: public AxiomChildren(AXIComponent axiComp, Lookup lookup) {
069: myLookup = lookup;
070: //
071: setKeys(new Object[] { axiComp });
072: }
073:
074: protected Node[] createNodes(Object key) {
075: if (key instanceof SchemaModel) {
076: return createGlobalElementNodes((SchemaModel) key);
077: } else if (key instanceof AXIModel) {
078: return createGlobalAxiElementNodes((AXIModel) key);
079: } else if (key instanceof SchemaComponent) {
080: return createNodes((SchemaComponent) key);
081: } else if (key instanceof AXIComponent) {
082: return createNodes((AXIComponent) key);
083: } else {
084: return new Node[0];
085: }
086: }
087:
088: protected Node[] createNodes(SchemaComponent schemaComp) {
089: NamedComponentReference<? extends GlobalType> typeRef = null;
090: //
091: AXIDocument axiDocument = null;
092: //
093: if (schemaComp instanceof GlobalElement) {
094: GlobalElement element = (GlobalElement) schemaComp;
095: if (element != null) {
096: axiDocument = getAxiDocument(axiDocument, element);
097: //
098: AXIComponent axiComponent = AxiomUtils
099: .findGlobalComponent(axiDocument,
100: Element.class, element);
101: //
102: if (axiComponent == null) {
103: typeRef = element.getType();
104: } else {
105: return AxiomUtils.processAxiComponent(axiComponent,
106: myLookup);
107: }
108: }
109: } else if (schemaComp instanceof GlobalType) {
110: GlobalType type = (GlobalType) schemaComp;
111: if (type != null && !(type instanceof SimpleType)) {
112: axiDocument = getAxiDocument(axiDocument, type);
113: AXIComponent axiComponent = AxiomUtils
114: .findGlobalComponent(axiDocument,
115: ContentModel.class, type);
116: return AxiomUtils.processAxiComponent(axiComponent,
117: myLookup);
118: }
119: }
120: //
121: return new Node[0];
122: }
123:
124: protected Node[] createNodes(AXIComponent axiComponent) {
125: return AxiomUtils.processAxiComponent(axiComponent, myLookup);
126: }
127:
128: protected Node[] createGlobalElementNodes(SchemaModel schemaModel) {
129: AXIModel axiModel = AXIModelFactory.getDefault().getModel(
130: schemaModel);
131: return createGlobalAxiElementNodes(axiModel);
132: }
133:
134: protected Node[] createGlobalAxiElementNodes(AXIModel axiModel) {
135: NodeFactory nodeFactory = (NodeFactory) myLookup
136: .lookup(NodeFactory.class);
137: assert nodeFactory != null : "Node factory has to be specified"; // NOI18N
138: //
139: ArrayList<Node> nodesList = new ArrayList<Node>();
140: //
141: if (axiModel != null) {
142: AXIDocument axiDocument = axiModel.getRoot();
143: if (axiDocument != null) {
144: List<Element> elementsList = axiDocument
145: .getChildren(Element.class);
146: for (Element element : elementsList) {
147: Node newNode = nodeFactory.createNode(
148: NodeType.ELEMENT, element, myLookup);
149: if (newNode != null) {
150: nodesList.add(newNode);
151: }
152: }
153: }
154: }
155: //
156: Node[] nodes = nodesList.toArray(new Node[nodesList.size()]);
157: return nodes;
158: }
159:
160: private AXIDocument getAxiDocument(AXIDocument axiDocument,
161: SchemaComponent comp) {
162: if (axiDocument == null) {
163: SchemaModel model = comp.getModel();
164: AXIModel axiModel = AXIModelFactory.getDefault().getModel(
165: model);
166: if (axiModel != null) {
167: axiDocument = axiModel.getRoot();
168: }
169: }
170: //
171: return axiDocument;
172: }
173:
174: }
|