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:
042: package org.netbeans.modules.websvc.jaxrpc.nodes;
043:
044: import java.awt.Image;
045: import java.beans.PropertyChangeEvent;
046: import java.beans.PropertyChangeListener;
047: import javax.swing.Action;
048: import org.openide.nodes.FilterNode;
049: import org.openide.nodes.Node;
050: import org.openide.filesystems.FileObject;
051: import org.openide.util.Lookup;
052: import org.netbeans.modules.websvc.api.registry.WebServicesRegistryView;
053: import org.netbeans.modules.websvc.core.ConfigureHandlerAction;
054: import org.netbeans.api.project.FileOwnerQuery;
055: import org.netbeans.api.project.Project;
056: import org.netbeans.modules.websvc.core.ConfigureHandlerCookie;
057: import org.netbeans.modules.websvc.api.client.WebServicesClientSupport;
058: import org.netbeans.modules.websvc.jaxrpc.ServiceInformation;
059: import org.netbeans.modules.websvc.wsdl.config.ServiceInformationImpl;
060: import org.openide.loaders.DataObject;
061:
062: /** Wrap wsdl node from wsdl directory in a filter, but display children from
063: * corresponding registry node, along with registry properties and short
064: * description.
065: *
066: * @author Peter Williams
067: */
068:
069: public class ServiceClientNode extends FilterNode implements
070: PropertyChangeListener {
071:
072: private String serviceName;
073: private Node registerNode;
074: private DataObject dobj;
075:
076: public ServiceClientNode(Node wsdlNode, Node registerNode) {
077: super (wsdlNode,
078: (registerNode != null) ? new FilterNode.Children(
079: registerNode) : Children.LEAF);
080:
081: this .registerNode = registerNode;
082: this .serviceName = null;
083:
084: // !PW FIXME this should be reworked when probably to be passed in as a parameter
085: // from ClientViewChildren when we enhance to handle multiple services per WSDL.
086: dobj = (DataObject) wsdlNode.getCookie(DataObject.class);
087: if (dobj != null) {
088: ServiceInformationImpl wsdlModel = new ServiceInformationImpl(
089: dobj);
090: String[] serviceNames = wsdlModel.getServiceNames(); //dobj.getServiceNames();
091: if (serviceNames != null && serviceNames.length > 0) {
092: this .serviceName = serviceNames[0];
093: }
094: }
095:
096: WebServicesRegistryView registryView = (WebServicesRegistryView) Lookup
097: .getDefault().lookup(WebServicesRegistryView.class);
098: registryView.addPropertyChangeListener(this );
099: }
100:
101: public void destroy() throws java.io.IOException {
102: super .destroy();
103:
104: /**
105: * This code has been moved from the old WSDLDataObject which used to call removeServiceClient
106: * Since we are now using the WsdlDataObject of the xml module, it has become necessary to call this here.
107: */
108: if (dobj != null) {
109: FileObject f = dobj.getPrimaryFile();
110: WebServicesClientSupport wsc = WebServicesClientSupport
111: .getWebServicesClientSupport(f);
112: if (wsc != null) {
113: wsc.removeServiceClient(f.getName());
114: }
115: }
116: WebServicesRegistryView registryView = (WebServicesRegistryView) Lookup
117: .getDefault().lookup(WebServicesRegistryView.class);
118: registryView.removePropertyChangeListener(this );
119: }
120:
121: public String getName() {
122: return (registerNode != null) ? registerNode.getName() : super
123: .getName();
124: }
125:
126: public String getDisplayName() {
127: return (registerNode != null) ? registerNode.getDisplayName()
128: : super .getDisplayName();
129: }
130:
131: public String getShortDescription() {
132: // !PW FIXME what should the short description of this node really be?
133: // If the service is registered, it's a formatted string with the attributes
134: // of the service (name, ports, etc.)
135:
136: // show short description of registry node instead of WSDL node
137: return registerNode != null ? registerNode
138: .getShortDescription() : "Unregistered service";
139: }
140:
141: public Node.PropertySet[] getPropertySets() {
142: // !PW FIXME should do minimal property set for WSDL node (not the WSDL properties though.)
143: // should also massage properties retrieved from registry, as some of them may
144: // not apply (such as path to wsdl file.)
145:
146: // show property sheet for registry node instead of WSDL node
147: return registerNode != null ? registerNode.getPropertySets()
148: : new Node.PropertySet[0];
149: }
150:
151: public Image getIcon(int type) {
152: // !PW FIXME me need static source for Web Service Icon
153: Image wsdlIcon = super .getIcon(type);
154:
155: // show icon for registry node instead of WSDL node
156: return registerNode != null ? registerNode.getIcon(type)
157: : wsdlIcon;
158: }
159:
160: public Image getOpenedIcon(int type) {
161: // !PW FIXME me need static source for Web Service Opened Icon
162: Image wsdlOpenedIcon = super .getOpenedIcon(type);
163:
164: // show opened icon for registry node instead of WSDL node
165: return registerNode != null ? registerNode.getOpenedIcon(type)
166: : wsdlOpenedIcon;
167: }
168:
169: public Action[] getActions(boolean context) {
170: FileObject fo = dobj.getPrimaryFile();
171: WebServicesClientSupport clientSupport = WebServicesClientSupport
172: .getWebServicesClientSupport(fo);
173: // TODO - this is a hack so that we don't need a new api method - will have to resolve it once I know what's the best way, maybe this is enough
174: if (clientSupport.getDeploymentDescriptor() == null) {
175: return new Action[] {
176: org.openide.util.actions.SystemAction
177: .get(org.netbeans.modules.websvc.jaxrpc.actions.RefreshServiceAction.class),
178: org.openide.util.actions.SystemAction
179: .get(org.openide.actions.FindAction.class),
180: null,
181: org.openide.util.actions.SystemAction
182: .get(org.openide.actions.DeleteAction.class),
183: null,
184: org.openide.util.actions.SystemAction
185: .get(org.openide.actions.ToolsAction.class),
186: null,
187: org.openide.util.actions.SystemAction
188: .get(org.openide.actions.PropertiesAction.class) };
189: }
190: return new Action[] {
191: org.openide.util.actions.SystemAction
192: .get(org.netbeans.modules.websvc.jaxrpc.actions.RefreshServiceAction.class),
193: org.openide.util.actions.SystemAction
194: .get(ConfigureHandlerAction.class),
195: org.openide.util.actions.SystemAction
196: .get(org.openide.actions.FindAction.class),
197: null,
198: //SystemAction.get(WSEditAttributesAction.class),
199: //null,
200: org.openide.util.actions.SystemAction
201: .get(org.openide.actions.DeleteAction.class),
202: null,
203: org.openide.util.actions.SystemAction
204: .get(org.openide.actions.ToolsAction.class),
205: null,
206: org.openide.util.actions.SystemAction
207: .get(org.openide.actions.PropertiesAction.class) };
208: }
209:
210: public Node.Cookie getCookie(Class type) {
211: if (type == ConfigureHandlerCookie.class) {
212: FileObject fo = dobj.getPrimaryFile();
213: Project project = FileOwnerQuery.getOwner(fo);
214: WebServicesClientSupport clientSupport = WebServicesClientSupport
215: .getWebServicesClientSupport(fo);
216: if (clientSupport.getDeploymentDescriptor() != null) { // TODO - see above, this is a same hack
217: return new ConfigureHandlerCookieImpl(serviceName,
218: project, clientSupport, fo);
219: }
220: }
221: // else if(type == EditWSAttributesCookie.class){
222: // return new EditWSAttributesCookieImpl(this, null);
223: // }
224: else if (type == ServiceInformation.class) {
225: return new ServiceInformationImpl(dobj);
226: }
227:
228: Node.Cookie result = super .getCookie(type);
229:
230: if (result == null && registerNode != null) {
231: result = registerNode.getCookie(type);
232: }
233:
234: return result;
235: }
236:
237: public void propertyChange(PropertyChangeEvent evt) {
238: if (WebServicesRegistryView.WEB_SERVICE_ADDED.equals(evt
239: .getPropertyName())) {
240: if (registerNode == null && serviceName != null) {
241: Node addedServiceNode = (Node) evt.getNewValue();
242: // !PW FIXME when named services in registry are changed to be case sensitive,
243: // change these comparisons also.
244: if (serviceName.equalsIgnoreCase(addedServiceNode
245: .getName())) {
246: registerNode = addedServiceNode;
247: setChildren(new FilterNode.Children(registerNode));
248: fireIconChange();
249: }
250: }
251: } else if (WebServicesRegistryView.WEB_SERVICE_REMOVED
252: .equals(evt.getPropertyName())) {
253: if (registerNode != null && serviceName != null) {
254: String removedServiceName = (String) evt.getOldValue();
255: // !PW FIXME when named services in registry are changed to be case sensitive,
256: // change these comparisons also.
257: if (serviceName.equalsIgnoreCase(removedServiceName)) {
258: registerNode = null;
259: setChildren(Children.LEAF);
260: fireIconChange();
261: }
262: }
263: }
264: }
265: }
|