1 19 package org.netbeans.modules.websvc.jaxrpc.nodes; 20 21 import org.netbeans.modules.j2ee.dd.api.web.ServletMapping; 27 import org.netbeans.modules.j2ee.dd.api.web.WebApp; 28 import org.netbeans.modules.websvc.jaxrpc.actions.JaxRpcWsdlCookie; 29 import org.netbeans.modules.websvc.core.webservices.ui.DeleteWsDialog; 30 import org.netbeans.modules.websvc.spi.webservices.WebServicesConstants; 31 import org.openide.ErrorManager; 32 import org.openide.cookies.SaveCookie; 33 import org.openide.cookies.OpenCookie; 34 import org.openide.loaders.DataFolder; 35 import org.openide.loaders.DataObject; 36 import org.openide.loaders.DataObjectNotFoundException; 37 import org.openide.nodes.AbstractNode; 38 import org.netbeans.modules.j2ee.dd.api.webservices.Webservices; 39 import org.netbeans.modules.j2ee.dd.api.webservices.WebserviceDescription; 40 import org.netbeans.modules.j2ee.dd.api.webservices.ServiceImplBean; 41 import org.openide.util.actions.SystemAction; 42 import org.openide.actions.*; 43 import org.openide.util.HelpCtx; 44 import javax.swing.Action ; 45 import org.openide.util.Utilities; 46 import java.awt.Image ; 47 import org.openide.filesystems.FileObject; 48 import org.netbeans.modules.websvc.jaxrpc.actions.AddOperationAction; 49 import org.netbeans.modules.websvc.api.webservices.WebServicesSupport; 50 import org.openide.filesystems.FileLock; 51 import org.netbeans.api.java.classpath.ClassPath; 52 import org.netbeans.spi.java.classpath.ClassPathProvider; 53 import org.netbeans.api.project.Project; 54 import org.netbeans.api.project.FileOwnerQuery; 55 import org.openide.DialogDisplayer; 56 import org.openide.NotifyDescriptor; 57 import org.openide.util.NbBundle; 58 import org.netbeans.modules.websvc.jaxrpc.actions.WSRegisterCookie; 59 import java.awt.event.ActionEvent ; 60 import java.awt.event.ActionListener ; 61 import java.net.URL ; 62 import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule; 63 import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider; 64 import org.netbeans.modules.websvc.core.webservices.ui.panels.EnterWSDLUrlPanel; 65 import org.openide.DialogDescriptor; 66 import org.openide.util.Lookup; 67 import org.netbeans.modules.websvc.api.registry.WebServicesRegistryView; 68 import java.awt.Dialog ; 69 import java.awt.datatransfer.Transferable ; 70 import org.openide.util.lookup.AbstractLookup; 71 import org.openide.util.lookup.InstanceContent; 72 import org.openide.windows.TopComponent; 73 import org.openide.util.RequestProcessor; 74 import org.netbeans.modules.j2ee.deployment.plugins.api.InstanceProperties; 75 import org.netbeans.modules.websvc.core.webservices.action.ConfigureHandlerAction; 76 import org.netbeans.modules.websvc.core.webservices.action.ConfigureHandlerCookie; 77 import org.netbeans.modules.websvc.core.webservices.ui.panels.MessageHandlerPanel; 78 import org.netbeans.modules.j2ee.dd.api.webservices.PortComponent; 79 import org.netbeans.modules.j2ee.dd.api.webservices.PortComponentHandler; 80 import java.io.IOException ; 81 import java.net.HttpURLConnection ; 82 import java.net.URLConnection ; 83 import java.util.ArrayList ; 84 import javax.swing.DefaultListModel ; 85 import javax.swing.ListModel ; 86 import org.apache.tools.ant.module.api.support.ActionUtils; 87 import org.netbeans.api.progress.ProgressHandle; 88 import org.netbeans.api.progress.ProgressHandleFactory; 89 import org.netbeans.modules.websvc.core.WebServiceReference; 90 import org.netbeans.modules.websvc.core.WebServiceTransferable; 91 import org.netbeans.modules.websvc.jaxrpc.actions.RegenerateFromWsdlAction; 92 import org.netbeans.modules.websvc.jaxrpc.actions.RegenerateFromWsdlCookie; 93 import org.netbeans.spi.project.support.ant.GeneratedFilesHelper; 97 import org.openide.execution.ExecutorTask; 98 import org.openide.nodes.Node; 99 100 public class WebServiceNode extends AbstractNode implements WSRegisterCookie, JaxRpcWsdlCookie, 101 ConfigureHandlerCookie, OpenCookie, RegenerateFromWsdlCookie{ 102 Webservices webServices; 103 WebserviceDescription webServiceDescription; 104 FileObject srcRoot; 105 WebServicesSupport wsSupport; 106 String wsName; 107 Project project; 108 109 public WebServiceNode(Webservices webServices, WebserviceDescription webServiceDescription, FileObject srcRoot) { 110 this(new InstanceContent(), webServices, webServiceDescription, srcRoot); 111 } 112 113 private WebServiceNode(InstanceContent content, Webservices webServices, WebserviceDescription webServiceDescription, FileObject srcRoot) { 114 super(new WebServiceChildren(webServiceDescription, srcRoot), new AbstractLookup(content)); 115 this.webServices = webServices; 116 this.webServiceDescription = webServiceDescription; 117 this.srcRoot = srcRoot; 118 this.wsSupport = WebServicesSupport.getWebServicesSupport(srcRoot); 119 project = FileOwnerQuery.getOwner(srcRoot); 120 wsName = webServiceDescription.getWebserviceDescriptionName(); 121 setDisplayName(wsName); 122 setName(wsName); 123 content.add(this); 124 } 126 127 public Image getIcon(int type){ 128 return Utilities.loadImage("org/netbeans/modules/websvc/core/webservices/ui/resources/XMLServiceDataIcon.gif"); 129 } 130 131 public Image getOpenedIcon(int type){ 132 return getIcon( type); 133 } 134 135 public void open() { 136 OpenCookie oc = getOpenCookie(); 137 if (oc != null) { 138 oc.open(); 139 } 140 } 141 142 public WebServicesSupport getWebServicesSupport(){ 143 return wsSupport; 144 } 145 146 private OpenCookie getOpenCookie() { 147 OpenCookie oc = null; 148 return oc; 162 } 163 164 public Action getPreferredAction() { 165 return SystemAction.get(OpenAction.class); 166 } 167 168 public Node.Cookie getCookie(Class type){ 169 return super.getCookie(type); 173 } 174 175 public Action[] getActions(boolean context) { 177 return new SystemAction[] { 178 SystemAction.get(OpenAction.class), 179 null, 180 SystemAction.get(AddOperationAction.class), 181 null, 182 SystemAction.get(RegenerateFromWsdlAction.class), 183 null, 184 SystemAction.get(ConfigureHandlerAction.class), 185 null, 188 SystemAction.get(DeleteAction.class), 189 null, 190 SystemAction.get(PropertiesAction.class), 191 }; 192 } 193 194 public HelpCtx getHelpCtx() { 195 return HelpCtx.DEFAULT_HELP; 196 } 197 198 public boolean canDestroy() { 200 return true; 201 } 202 203 private void deleteFile(FileObject f) { 204 FileLock lock = null; 205 try { 206 lock = f.lock(); 207 if (f.isFolder()) { 208 DataFolder folder = DataFolder.findFolder(f); 209 if (folder!=null) { 211 DataObject[] children = folder.getChildren(); 212 for (int i=0;i<children.length;i++) { 213 SaveCookie save = (SaveCookie)children[i].getCookie(SaveCookie.class); 214 if (save!=null) save.save(); 215 } 216 } 217 } 218 f.delete(lock); 219 } catch(java.io.IOException e) { 220 NotifyDescriptor ndd = 221 new NotifyDescriptor.Message(NbBundle.getMessage(this.getClass(), "MSG_Unable_Delete_File", f.getNameExt()), 222 NotifyDescriptor.ERROR_MESSAGE); 223 DialogDisplayer.getDefault().notify(ndd); 224 } finally { 225 if(lock != null) { 226 lock.releaseLock(); 227 } 228 } 229 } 230 231 private void deleteConfigFile() { 232 ClassPathProvider cpp = (ClassPathProvider)project.getLookup().lookup(ClassPathProvider.class); 233 assert cpp != null; 234 ClassPath classPath = cpp.findClassPath(srcRoot, ClassPath.SOURCE); 235 String configFileName = getPackageName()+ "/" + wsName + "-config" + ".xml"; 236 FileObject configFO = classPath.findResource(configFileName); 237 if(configFO != null) { 238 deleteFile(configFO); 239 } 240 } 241 242 private void deleteDDFile() { 243 FileObject wsdd = wsSupport.getWebservicesDD(); 244 if(wsdd != null) { 245 deleteFile(wsdd); 246 } 247 } 248 249 public void destroy() throws java.io.IOException { 250 super.destroy(); 251 String wsdlName = getWsdlName(); 252 FileObject wsdlFile = getWsdlFile(wsdlName); 253 FileObject mappingFile = getMappingFile(wsdlName); 254 String packageName=getPackageName(); 255 String deleteOptions = DeleteWsDialog.open(getDisplayName(),packageName.replace('/','.'),(wsdlFile==null?null:wsdlName)); 256 if (!deleteOptions.equals(DeleteWsDialog.DELETE_NOTHING)) { 257 boolean deletePackage=false; 258 boolean deleteWsdl=false; 259 if (deleteOptions.equals(DeleteWsDialog.DELETE_ALL)) { 260 deletePackage=true; 261 deleteWsdl=true; 262 } else if (deleteOptions.equals(DeleteWsDialog.DELETE_PACKAGE)) deletePackage=true; 263 else if (deleteOptions.equals(DeleteWsDialog.DELETE_WSDL)) deleteWsdl=true; 264 deleteConfigFile(); 266 webServices.removeWebserviceDescription(webServiceDescription); 268 webServices.write(wsSupport.getWebservicesDD()); 270 if(webServices.sizeWebserviceDescription() == 0) { 272 deleteDDFile(); 273 } 274 wsSupport.removeServiceEntry(getLinkName()); 276 wsSupport.removeProjectEntries(wsName); 277 if (deletePackage) { FileObject wsPackage = srcRoot.getFileObject(packageName); 279 if (wsPackage!=null) { 280 FileObject parent = wsPackage.getParent(); 281 deleteFile(wsPackage); 282 while (parent!=srcRoot && parent.getChildren().length==0) { 284 FileObject fileToDelete=parent; 285 parent = parent.getParent(); 286 deleteFile(fileToDelete); 287 } 288 } 289 } 290 if (deleteWsdl) { 291 if (wsdlFile!=null) { 292 deleteFile(wsdlFile); 293 } 294 if (mappingFile!=null) { 295 deleteFile(mappingFile); 296 } 297 } 298 } 299 300 } 301 302 private String getLinkName() { 303 PortComponent portComponent = webServiceDescription.getPortComponent(0); ServiceImplBean serviceImplBean = portComponent.getServiceImplBean(); 305 String link =serviceImplBean.getServletLink(); 306 if(link == null) { 307 link = serviceImplBean.getEjbLink(); 308 } 309 return link; 310 } 311 312 private String getPackageName() { 314 return ""; 319 } 320 321 351 private String getDefaultWSDLUrl(){ 352 J2eeModuleProvider provider = (J2eeModuleProvider)project.getLookup().lookup(J2eeModuleProvider.class); 353 InstanceProperties instanceProperties = provider.getInstanceProperties(); 354 String portNumber = instanceProperties.getProperty(InstanceProperties.HTTP_PORT_NUMBER); 355 if(portNumber == null || portNumber.equals("")) { 356 portNumber = "8080"; 357 } 358 String contextRoot = "webservice"; Object moduleType = provider.getJ2eeModule().getModuleType(); 360 String wsURI = wsName; 361 if(J2eeModule.WAR.equals(moduleType)) { 362 J2eeModuleProvider.ConfigSupport configSupport = provider.getConfigSupport(); 363 WebServicesSupport wsSupport = WebServicesSupport.getWebServicesSupport(srcRoot); 364 FileObject ddFolder = wsSupport.getWsDDFolder(); 365 if (ddFolder!=null) { 366 FileObject webXmlFo = ddFolder.getFileObject("web.xml"); if (webXmlFo!=null) { 368 wsURI = findUriForWS(webXmlFo,wsName); 369 if (wsURI.startsWith("/")) wsURI=wsURI.substring(1); } 371 372 } 373 374 contextRoot = configSupport.getWebContextRoot(); 375 if(contextRoot != null && contextRoot.startsWith("/")){ 376 contextRoot = contextRoot.substring(1); 377 } 378 } else if(J2eeModule.EJB.equals(moduleType)) { 379 contextRoot = "webservice"; } 381 382 return "http://localhost:" + portNumber +"/" + (contextRoot != null && !contextRoot.equals("") ? contextRoot + "/" : "") + wsURI + "?WSDL"; 383 } 384 385 private String findUriForWS(FileObject webXmlFo, String wsName) { 386 try { 387 WebApp webApp = org.netbeans.modules.j2ee.dd.api.web.DDProvider.getDefault().getDDRoot(webXmlFo); 388 if (webApp!=null) { 389 ServletMapping[] maps = webApp.getServletMapping(); 390 String servletName = WebServicesConstants.WebServiceServlet_PREFIX+wsName; 392 for (int i=0;i<maps.length;i++) { 393 if (servletName.equals(maps[i].getServletName())) { 394 return maps[i].getUrlPattern(); 395 } 396 } 397 } 398 } catch (IOException ex) {} 399 return wsName; 400 } 401 402 private String getWsdlName() { 403 String wsdlFile = webServiceDescription.getWsdlFile(); 404 if (wsdlFile!=null) { 405 int ind = wsdlFile.lastIndexOf("/"); if (ind>=0) return wsdlFile.substring(ind+1); 407 } 408 return wsdlFile; 409 } 410 411 private FileObject getWsdlFile(String wsdlName) { 412 WebServicesSupport wsSupport = WebServicesSupport.getWebServicesSupport(srcRoot); 413 FileObject wsdlFolder = wsSupport.getWsDDFolder().getFileObject("wsdl"); FileObject wsdlFO=null; 415 if (wsdlFolder!=null) { 416 if (wsdlName!=null) { 417 wsdlFO=wsdlFolder.getFileObject(wsdlName); 418 } 419 } 420 return wsdlFO; 421 } 422 423 private FileObject getMappingFile(String wsdlName) { 424 WebServicesSupport wsSupport = WebServicesSupport.getWebServicesSupport(srcRoot); 425 FileObject ddFolder = wsSupport.getWsDDFolder(); 426 FileObject mappingFO=null; 427 if (ddFolder!=null) { 428 if (wsdlName!=null) { 429 String wsdlShortName = wsdlName; 430 if (wsdlName.endsWith(".wsdl")) wsdlShortName = wsdlName.substring(0,wsdlName.length()-5); 431 mappingFO=ddFolder.getFileObject(wsdlShortName+"-mapping.xml"); } 433 } 434 return mappingFO; 435 } 436 437 440 public void registerWebService() { 441 final EnterWSDLUrlPanel panel = new EnterWSDLUrlPanel(getDefaultWSDLUrl()); 442 DialogDescriptor dialogDesc = new DialogDescriptor(panel, NbBundle.getMessage(WebServiceNode.class, "Enter_WSDL_Url"), true, 443 new ActionListener (){ 444 public void actionPerformed(ActionEvent evt) { 445 if(evt.getSource() == NotifyDescriptor.OK_OPTION) { 446 447 RequestProcessor.getDefault().post(new Runnable (){ 448 public void run(){ 449 URL url = null; 450 try{ 451 url = new URL (panel.getSelectedWSDLUrl()); 452 }catch(Exception e){ 453 throw new RuntimeException (e.getMessage()); 454 } 455 WebServicesRegistryView registryView = (WebServicesRegistryView)Lookup.getDefault(). 456 lookup(WebServicesRegistryView.class); 457 TopComponent currentComponent = TopComponent.getRegistry().getActivated(); 458 currentComponent.setCursor(org.openide.util.Utilities.createProgressCursor(currentComponent)); 459 try{ 460 boolean success = registryView.registerService(url, true); 461 if(!success) { 462 NotifyDescriptor d = new NotifyDescriptor.Message(NbBundle.getMessage(WebServiceNode.class, 463 "MSG_UNABLE_TO_REGISTER_WS"), NotifyDescriptor.ERROR_MESSAGE); 464 DialogDisplayer.getDefault().notify(d); 465 } 466 }finally{ 467 currentComponent.setCursor(null); 468 } 469 } 470 }); 471 } 472 } 473 }); 474 Dialog dialog = DialogDisplayer.getDefault().createDialog(dialogDesc); 475 dialog.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(WebServiceNode.class, "Enter_WSDL_Url_Desc")); 476 dialog.setVisible(true); 477 } 478 479 private boolean isNewHandler(String className, PortComponent portComponent){ 480 PortComponentHandler[] handlers = portComponent.getHandler(); 481 for(int i = 0; i < handlers.length; i++){ 482 if(handlers[i].getHandlerClass().equals(className)){ 483 return false; 484 } 485 } 486 return true; 487 } 488 489 private boolean isInModel(String className, ListModel model){ 490 for(int i = 0; i < model.getSize(); i++){ 491 String cls = (String )model.getElementAt(i); 492 if(className.equals(cls)){ 493 return true; 494 } 495 } 496 return false; 497 } 498 public void configureHandler() { 499 final PortComponent portComponent = webServiceDescription.getPortComponent(0); 500 PortComponentHandler[] handlers = portComponent.getHandler(); 501 ArrayList handlerList = new ArrayList (); 502 for(int j = 0; j < handlers.length; j++) { 503 handlerList.add(handlers[j].getHandlerClass()); 504 } 505 final MessageHandlerPanel panel = new MessageHandlerPanel(project, (String [])handlerList.toArray(new String [handlerList.size()]), false, wsName); 506 String title = NbBundle.getMessage(WebServiceNode.class,"TTL_MessageHandlerPanel"); 507 DialogDescriptor dialogDesc = new DialogDescriptor(panel, title, true, 508 new ActionListener (){ 509 public void actionPerformed(ActionEvent evt) { 510 if(evt.getSource() == NotifyDescriptor.OK_OPTION) { 511 DefaultListModel listModel = panel.getListModel(); 512 try{ 513 for(int i = 0; i < listModel.getSize(); i++){ 515 String className = (String )listModel.getElementAt(i); 516 if(isNewHandler(className, portComponent)){ 517 PortComponentHandler handler = (PortComponentHandler)webServices.createBean("PortComponentHandler"); 518 handler.setHandlerName(className); 519 handler.setHandlerClass(className); 520 portComponent.addHandler(handler); 521 } 522 } 523 PortComponentHandler[] handlers = portComponent.getHandler(); 525 for(int j = 0; j < handlers.length; j++){ 526 PortComponentHandler handler = handlers[j]; 527 String clsName = handler.getHandlerClass(); 528 if(!isInModel(clsName, listModel)){ 529 portComponent.removeHandler(handler); 530 } 531 } 532 webServices.write(wsSupport.getWebservicesDD()); 533 }catch(ClassNotFoundException e){ 535 throw new RuntimeException (e.getMessage()); 536 } catch(IOException e){ 537 throw new RuntimeException (e.getMessage()); 538 } 539 } 540 } 541 }); 542 Dialog dialog = DialogDisplayer.getDefault().createDialog(dialogDesc); 543 dialog.setVisible(true); 544 } 545 546 549 public Object getValue(String attributeName) { 550 Object retValue; 551 if (attributeName.equals("customDelete")) { retValue = Boolean.TRUE; 553 } else { 554 retValue = super.getValue(attributeName); 555 } 556 return retValue; 557 } 558 559 public String getWsdlURL() { 560 return getDefaultWSDLUrl(); 561 } 562 563 public void regenerate() { 564 567 NotifyDescriptor.Confirmation notifyDesc = 568 new NotifyDescriptor.Confirmation(NbBundle.getMessage(WebServiceNode.class, "MSG_CONFIRM_REFRESH_IMPL" ), 569 NotifyDescriptor.YES_NO_OPTION); 570 DialogDisplayer.getDefault().notify(notifyDesc); 571 if(notifyDesc.getValue() == NotifyDescriptor.NO_OPTION) { 572 return; 573 } 574 final ProgressHandle handle = ProgressHandleFactory.createHandle 575 ( NbBundle.getMessage(WebServiceNode.class, "TXT_Regenerating")); 576 handle.start(100); 577 handle.switchToIndeterminate(); 578 Runnable r = new Runnable (){ 579 public void run(){ 580 try{ 581 runWscompileTarget(); 582 }finally{ 583 handle.finish(); 584 } 585 } 586 }; 587 RequestProcessor.getDefault().post(r); 588 } 589 590 public Transferable clipboardCopy() throws IOException { 591 URL url = new URL (getWsdlURL()); 592 boolean connectionOK=false; 593 try { 594 URLConnection connection = url.openConnection(); 595 if (connection instanceof HttpURLConnection ) { 596 HttpURLConnection httpConnection = (HttpURLConnection )connection; 597 try { 598 httpConnection.setRequestMethod("GET"); httpConnection.connect(); 600 if (HttpURLConnection.HTTP_OK == httpConnection.getResponseCode()) 601 connectionOK=true; 602 } catch (java.net.ConnectException ex) { 603 url = null; 605 } finally { 606 if (httpConnection!=null) 607 httpConnection.disconnect(); 608 } 609 if(!connectionOK){ 610 url = null; 612 } 613 } 614 } catch (IOException ex) { 615 url = null; 617 } 618 return new WebServiceTransferable(new WebServiceReference(url , wsName, project.getProjectDirectory().getName())); 619 } 620 621 private void runWscompileTarget(){ 622 FileObject buildImplFo = project.getProjectDirectory().getFileObject(GeneratedFilesHelper.BUILD_IMPL_XML_PATH); 623 try { 624 ExecutorTask wscompileTask = 625 ActionUtils.runTarget(buildImplFo,new String []{wsName + "_wscompile"},null); wscompileTask.waitFinished(); 627 } catch (IOException ex) { 628 ErrorManager.getDefault().log(ex.getLocalizedMessage()); 629 } catch (IllegalArgumentException ex) { 630 ErrorManager.getDefault().log(ex.getLocalizedMessage()); 631 632 } 633 } 634 } 635 | Popular Tags |