001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.xml.wsdl.ui.api.property;
042:
043: import java.io.File;
044: import java.io.FileFilter;
045: import java.util.ArrayList;
046: import java.util.Collections;
047: import java.util.List;
048: import java.util.Set;
049:
050: import org.netbeans.api.project.FileOwnerQuery;
051: import org.netbeans.api.project.Project;
052: import org.netbeans.modules.xml.catalogsupport.DefaultProjectCatalogSupport;
053: import org.netbeans.modules.xml.wsdl.model.Message;
054: import org.netbeans.modules.xml.wsdl.model.WSDLComponent;
055: import org.netbeans.modules.xml.wsdl.model.WSDLModel;
056: import org.netbeans.modules.xml.wsdl.model.WSDLModelFactory;
057: import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.NodesFactory;
058: import org.netbeans.modules.xml.xam.ModelSource;
059: import org.netbeans.modules.xml.xam.ui.customizer.FolderNode;
060: import org.netbeans.spi.project.ui.LogicalViewProvider;
061: import org.openide.filesystems.FileObject;
062: import org.openide.filesystems.FileUtil;
063: import org.openide.loaders.DataObject;
064: import org.openide.nodes.FilterNode;
065: import org.openide.nodes.Node;
066: import org.openide.nodes.FilterNode.Children;
067: import org.openide.util.NbBundle;
068:
069: public class MessagePartChooserHelper extends
070: ChooserHelper<WSDLComponent> {
071:
072: private Node projectsFolderNode;
073: private WSDLModel model;
074:
075: public MessagePartChooserHelper(WSDLModel model) {
076: this .model = model;
077: }
078:
079: @Override
080: public void populateNodes(Node parentNode) {
081: List<Class<? extends WSDLComponent>> filters = new ArrayList<Class<? extends WSDLComponent>>();
082: filters.add(Message.class);
083:
084: FileObject wsdlFile = model.getModelSource().getLookup()
085: .lookup(FileObject.class);
086: projectsFolderNode = new FolderNode(new Children.Array());
087: projectsFolderNode.setDisplayName(NbBundle.getMessage(
088: MessagePartChooserHelper.class,
089: "LBL_MessageParts_DisplayName"));
090: if (wsdlFile != null) {
091: Project project = FileOwnerQuery.getOwner(wsdlFile);
092: if (project != null) {
093: LogicalViewProvider viewProvider = project.getLookup()
094: .lookup(LogicalViewProvider.class);
095: ArrayList<Node> nodes = new ArrayList<Node>();
096: nodes.add(new WSDLProjectFolderNode(viewProvider
097: .createLogicalView(), project, filters));
098:
099: DefaultProjectCatalogSupport catalogSupport = DefaultProjectCatalogSupport
100: .getInstance(wsdlFile);
101: Set refProjects = catalogSupport.getProjectReferences();
102: if (refProjects != null && refProjects.size() > 0) {
103: for (Object o : refProjects) {
104: Project refPrj = (Project) o;
105: viewProvider = refPrj.getLookup().lookup(
106: LogicalViewProvider.class);
107: nodes.add(new WSDLProjectFolderNode(
108: viewProvider.createLogicalView(),
109: refPrj, filters));
110: }
111: }
112: projectsFolderNode.getChildren().add(
113: nodes.toArray(new Node[nodes.size()]));
114: }
115: }
116:
117: if (projectsFolderNode != null) {
118: parentNode.getChildren().add(
119: new Node[] { projectsFolderNode });
120: }
121: }
122:
123: @Override
124: public Node selectNode(WSDLComponent comp) {
125: if (comp == null)
126: return null;
127: return selectNode(projectsFolderNode, comp);
128: }
129:
130: private Node selectNode(Node parentNode, WSDLComponent element) {
131: org.openide.nodes.Children children = parentNode.getChildren();
132: for (Node node : children.getNodes()) {
133: WSDLComponent sc = null;
134: if (sc == null) {
135: sc = node.getLookup().lookup(WSDLComponent.class);
136: }
137:
138: if (sc == element) {
139: return node;
140: }
141:
142: Node node1 = selectNode(node, element);
143: if (node1 != null) {
144: return node1;
145: }
146: }
147: return null;
148: }
149:
150: class WSDLProjectFolderNode extends FilterNode {
151: public WSDLProjectFolderNode(Node original, Project project,
152: List<Class<? extends WSDLComponent>> filters) {
153: super (original, new WSDLProjectFolderChildren(project,
154: filters));
155: }
156: }
157:
158: class WSDLProjectFolderChildren extends Children.Keys<FileObject> {
159:
160: private final FileObject projectDir;
161: private final Project project;
162: private final List<Class<? extends WSDLComponent>> filters;
163: private Set<FileObject> emptySet = Collections.emptySet();
164:
165: public WSDLProjectFolderChildren(Project project,
166: List<Class<? extends WSDLComponent>> filters) {
167: this .project = project;
168: this .filters = filters;
169: this .projectDir = project.getProjectDirectory();
170: }
171:
172: @Override
173: public Node[] createNodes(FileObject fo) {
174: ModelSource modelSource = org.netbeans.modules.xml.retriever.catalog.Utilities
175: .getModelSource(fo, false);
176: WSDLModel wsdlModel = WSDLModelFactory.getDefault()
177: .getModel(modelSource);
178: NodesFactory factory = NodesFactory.getInstance();
179: return new Node[] { new FileNode(factory
180: .createFilteredDefinitionNode(wsdlModel
181: .getDefinitions(), filters), FileUtil
182: .getRelativePath(projectDir, fo), 2) };
183:
184: }
185:
186: @Override
187: protected void addNotify() {
188: resetKeys();
189: }
190:
191: @Override
192: protected void removeNotify() {
193: this .setKeys(emptySet);
194:
195: }
196:
197: private void resetKeys() {
198: ArrayList<FileObject> keys = new ArrayList<FileObject>();
199: LogicalViewProvider viewProvider = project.getLookup()
200: .lookup(LogicalViewProvider.class);
201: Node node = viewProvider.createLogicalView();
202: org.openide.nodes.Children children = node.getChildren();
203: for (Node child : children.getNodes()) {
204: DataObject dobj = child.getCookie(DataObject.class);
205: if (dobj != null) {
206: File[] files = recursiveListFiles(FileUtil
207: .toFile(dobj.getPrimaryFile()),
208: new WSDLFileFilter());
209: for (File file : files) {
210: FileObject fo = FileUtil.toFileObject(file);
211: keys.add(fo);
212: }
213: }
214: }
215: this .setKeys(keys);
216: }
217:
218: }
219:
220: public static final String WSDL_FILE_EXTENSION = "wsdl";
221:
222: static class WSDLFileFilter implements FileFilter {
223:
224: public boolean accept(File pathname) {
225: boolean result = false;
226: String fileName = pathname.getName();
227: String fileExtension = null;
228: int dotIndex = fileName.lastIndexOf('.');
229: if (dotIndex != -1) {
230: fileExtension = fileName.substring(dotIndex + 1);
231: }
232:
233: if (fileExtension != null
234: && (fileExtension
235: .equalsIgnoreCase(WSDL_FILE_EXTENSION))) {
236: result = true;
237: }
238:
239: return result;
240: }
241: }
242:
243: }
|