/******************************************************************************* * Copyright (c) 2003, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ /* * Created on Feb 9, 2004 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package org.eclipse.jst.j2ee.internal.webservice.helper; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jem.util.emf.workbench.ProjectUtilities; import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase; import org.eclipse.jem.util.logger.proxy.Logger; import org.eclipse.jst.j2ee.client.ApplicationClient; import org.eclipse.jst.j2ee.client.ApplicationClientResource; import org.eclipse.jst.j2ee.ejb.EJBJar; import org.eclipse.jst.j2ee.ejb.EJBResource; import org.eclipse.jst.j2ee.ejb.EnterpriseBean; import org.eclipse.jst.j2ee.internal.J2EEConstants; import org.eclipse.jst.j2ee.internal.J2EEVersionConstants; import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil; import org.eclipse.jst.j2ee.internal.common.XMLResource; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.jst.j2ee.internal.webservice.componentcore.util.WSCDDArtifactEdit; import org.eclipse.jst.j2ee.internal.webservice.componentcore.util.WSDDArtifactEdit; import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceExtManager; import org.eclipse.jst.j2ee.internal.webservices.WSDLServiceHelper; import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities; import org.eclipse.jst.j2ee.webapplication.WebApp; import org.eclipse.jst.j2ee.webapplication.WebAppResource; import org.eclipse.jst.j2ee.webservice.wsclient.ComponentScopedRefs; import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef; import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesClient; import org.eclipse.jst.j2ee.webservice.wsclient.WebServicesResource; import org.eclipse.jst.j2ee.webservice.wsdd.PortComponent; import org.eclipse.jst.j2ee.webservice.wsdd.ServiceImplBean; import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription; import org.eclipse.jst.j2ee.webservice.wsdd.WebServices; import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource; import org.eclipse.wst.common.componentcore.ArtifactEdit; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.ModuleCoreNature; import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel; import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualResource; import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper; import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent; import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener; /** * Internal API class * * This utility class is meant to aid in managing webservice(jsr109) metadata related to Java EE 1.4 or earlier, and will not be upgraded beyond this release. * The WTP webservices team has duplicate public api for gathering serviceRef's etc. * * Marking as @frozen to support <= Java EE 1.4 * */ public class WebServicesManager implements EditModelListener, IResourceChangeListener, IResourceDeltaVisitor { private HashMap wsArtifactEdits = new HashMap(); private HashMap wsClientArtifactEdits = new HashMap(); private List wsArtifactEditsList; private List wsClientArtifactEditsList; private static WebServicesManager INSTANCE = null; private List listeners; private List removedListeners = new ArrayList(); private boolean isNotifying = false; private boolean wsClientElementsChanged = true; private boolean wsElementsChanged = true; private ProcessProjectsWithWSDL processNewProjects; public static final String WSDL_EXT = "wsdl"; //$NON-NLS-1$ public static final String WSIL_EXT = "wsil"; //$NON-NLS-1$ public synchronized static WebServicesManager getInstance() { if (INSTANCE == null) INSTANCE = new WebServicesManager(); return INSTANCE; } public static boolean isFileInteresting(IFile aFile) { if (aFile != null && aFile.getFileExtension() != null) { String extension = aFile.getFileExtension(); return extension.equals(WSDL_EXT) || extension.equals(WSIL_EXT) || aFile.getName().equals(J2EEConstants.WEB_SERVICES_CLIENT_SHORTNAME) || aFile.getName().equals(J2EEConstants.WEB_SERVICES_DD_URI); } return false; } /** * Default Constructor */ public WebServicesManager() { super(); init(); } private void init() { collectArtifactEdits(); ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); } private void addArtifactEdit(IProject handle) { synchronized(wsArtifactEdits) { if (!wsArtifactEdits.containsKey(handle)) { WSDDArtifactEdit edit = WSDDArtifactEdit.getWSDDArtifactEditForRead(handle); if (edit != null) { WebServices webServices = edit.getWebServices(); // If the project has a webservice.xml with internal services or // it has .wsil files with external services, we cache the artifact edit if ((webServices != null && !webServices.getWebServiceDescriptions().isEmpty()) || !edit.getWSILResources().isEmpty()) { edit.addListener(this); wsArtifactEdits.put(handle, edit); wsElementsChanged = true; // Otherwise, dispose the artifact edit } else { edit.dispose(); } } } } synchronized (wsClientArtifactEdits) { if (!wsClientArtifactEdits.containsKey(handle)) { WSCDDArtifactEdit edit = WSCDDArtifactEdit.getWSCDDArtifactEditForRead(handle); if (edit != null) { WebServicesResource res = edit.getWscddXmiResource(); boolean isInterested = false; // Does the project have 1.3 web service clients? if (res != null && res.isLoaded() && res.getWebServicesClient() != null) isInterested = true; // Does the project have 1.4 web service clients? List wsClientEdits = new ArrayList(); wsClientEdits.add(edit); //if (!getWorkspace14ServiceRefs(wsClientEdits).isEmpty()) isInterested = true; // If project has 1.3 or 1.4 web service clients, cache the artifact edit if (isInterested) { edit.addListener(this); wsClientArtifactEdits.put(handle, edit); wsClientElementsChanged = true; // Otherwise, dispose the artifact edit } else { edit.dispose(); } } } } } private void removeArtifactEdit(IProject handle) { synchronized(wsArtifactEdits) { if (wsArtifactEdits.containsKey(handle)) { ArtifactEdit edit = (ArtifactEdit) wsArtifactEdits.get(handle); if (edit != null) { wsArtifactEdits.remove(handle); edit.removeListener(this); edit.dispose(); wsElementsChanged = true; } } } synchronized (wsClientArtifactEdits) { if (wsClientArtifactEdits.containsKey(handle)) { ArtifactEdit edit = (ArtifactEdit) wsClientArtifactEdits.get(handle); if (edit != null) { wsClientArtifactEdits.remove(handle); edit.removeListener(this); edit.dispose(); wsClientElementsChanged = true; } } } } private void collectArtifactEdits() { IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); for (int i = 0; i < projects.length; i++) { IProject project = projects[i]; IVirtualComponent component = ComponentCore.createComponent(project); try { if (!ModuleCoreNature.isFlexibleProject(project) || JavaEEProjectUtilities.isEARProject(project) || JavaEEProjectUtilities.isStaticWebProject(project)) continue; } catch (Exception e) { continue; } addArtifactEdit(component.getProject()); } } /** * @return Returns the artifact edit iterator for web service artifact edits */ private List getWSArtifactEdits() { synchronized (wsArtifactEdits) { if (wsElementsChanged) { wsArtifactEditsList = new ArrayList(); wsArtifactEditsList.addAll(wsArtifactEdits.values()); wsElementsChanged = false; } } return wsArtifactEditsList; } /** * @return Returns the editModels. */ private List getWSClientArtifactEdits() { synchronized (wsClientArtifactEdits) { if (wsClientElementsChanged) { wsClientArtifactEditsList = new ArrayList(); wsClientArtifactEditsList.addAll(wsClientArtifactEdits.values()); wsClientElementsChanged = false; } } return wsClientArtifactEditsList; } private List getListeners() { if (listeners == null) listeners = new ArrayList(); return listeners; } /** * Add aListener to the list of listeners. */ public void addListener(WebServiceManagerListener aListener) { if (aListener != null && !getListeners().contains(aListener)) getListeners().add(aListener); } /* * (non-Javadoc) * * @see org.eclipse.wst.common.internal.emfworkbench.integration.EditModelListener#editModelChanged(org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent) */ public void editModelChanged(EditModelEvent anEvent) { if (anEvent == null) return; if (anEvent.getEventCode()==EditModelEvent.UNLOADED_RESOURCE) { List resources = anEvent.getChangedResources(); for (int i=0; i<resources.size(); i++) { Resource res = (Resource) resources.get(i); if (isInterestedInResource(res)) notifyListeners(anEvent.getEventCode()); } } else if (anEvent.getEventCode() == EditModelEvent.PRE_DISPOSE) { ArtifactEditModel editModel = (ArtifactEditModel) anEvent.getEditModel(); if (editModel == null || editModel.getProject() == null) return; removeArtifactEdit(editModel.getProject()); notifyListeners(anEvent.getEventCode()); } } /** * Notify listeners of * * @anEvent. */ protected void notifyListeners(int anEventType) { if (listeners == null) return; synchronized (this) { isNotifying = true; } try { WebServiceEvent webServiceEvent = null; switch (anEventType) { case EditModelEvent.UNLOADED_RESOURCE: case EditModelEvent.PRE_DISPOSE: case EditModelEvent.REMOVED_RESOURCE: webServiceEvent = new WebServiceEvent(WebServiceEvent.REMOVE); break; default: if (!getAllWorkspaceServiceRefs().isEmpty() || !getAllWSDLServices().isEmpty()) webServiceEvent = new WebServiceEvent(WebServiceEvent.REFRESH); } List list = getListeners(); if (webServiceEvent!=null) { for (int i = 0; i < list.size(); i++) { ((WebServiceManagerListener) list.get(i)).webServiceManagerChanged(webServiceEvent); } } } finally { synchronized (this) { isNotifying = false; if (removedListeners != null && !removedListeners.isEmpty()) { for (int i = 0; i < removedListeners.size(); i++) listeners.remove(removedListeners.get(i)); removedListeners.clear(); } } } } /** * Remove aListener from the list of listeners. */ public synchronized boolean removeListener(WebServiceManagerListener aListener) { if (aListener != null) { if (isNotifying) return removedListeners.add(aListener); return getListeners().remove(aListener); } return false; } private void releaseArtifactEdits() { synchronized (wsArtifactEdits) { Iterator iter = wsArtifactEdits.values().iterator(); while (iter.hasNext()) { WSDDArtifactEdit artifactEdit = (WSDDArtifactEdit) iter.next(); artifactEdit.removeListener(this); artifactEdit.dispose(); } wsArtifactEdits.clear(); } synchronized (wsClientArtifactEdits) { Iterator iter = wsClientArtifactEdits.values().iterator(); while (iter.hasNext()) { WSCDDArtifactEdit artifactEdit = (WSCDDArtifactEdit) iter.next(); artifactEdit.removeListener(this); artifactEdit.dispose(); } wsClientArtifactEdits.clear(); } } /* * (non-Javadoc) * * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) */ public void resourceChanged(IResourceChangeEvent event) { acceptDelta(event); } protected void acceptDelta(IResourceChangeEvent event) { IResourceDelta delta = event.getDelta(); // search for changes to any projects using a visitor if (delta != null) { try { delta.accept(this); } catch (Exception e) { Logger.getLogger().logError(e); } } } /** * returns a list of internal web services descriptions in the workspace */ public List getInternalWebServicesDescriptions() { List result = new ArrayList(); List webServices = getInternalWebServices(); for (int i = 0; i < webServices.size(); i++) { WebServices webService = (WebServices) webServices.get(i); if (webService != null) result.addAll(webService.getWebServiceDescriptions()); } return result; } /** * @return all internal web services instances in workspace */ public List getInternalWebServices() { List result = new ArrayList(); Iterator iter = getWSArtifactEdits().iterator(); while (iter.hasNext()) { WSDDArtifactEdit artifactEdit = (WSDDArtifactEdit) iter.next(); WebServices webServices = artifactEdit.getWebServices(); if (webServices != null) result.add(webServices); } return result; } /** * returns a list of all the internal wsdl services in wsdl's pointed to by wsdd's */ public List getInternalWSDLServices() { return getWSDLServicesFromWSDLResources(getInternalWSDLResources()); } public List getInternalWSDLResources() { List result = new ArrayList(); List wsddWebServices = getInternalWebServicesDescriptions(); for (int i = 0; i < wsddWebServices.size(); i++) { WebServiceDescription webServices = (WebServiceDescription) wsddWebServices.get(i); Resource wsdl = getWSDLResource(webServices); if (wsdl != null && !result.contains(wsdl)) result.add(wsdl); } return result; } public List getExternalWSDLResources() { //TODO fix up for basis off .wsil List result = getWorkspaceWSDLResources(); result.removeAll(getInternalWSDLResources()); List serviceRefs = getAllWorkspaceServiceRefs(); for (int i=0; i<serviceRefs.size(); i++) { ServiceRef ref = (ServiceRef) serviceRefs.get(i); try { Resource res = WorkbenchResourceHelperBase.getResource(URI.createURI(ref.getWsdlFile()), true); if (res !=null && result.contains(res)) result.remove(res); } catch (Exception e) { //Ignore } } return result; } public boolean isServiceInternal(EObject service) { return getInternalWSDLResources().contains(getWSDLResource(service)); } private List getWSDLServicesFromWSDLResources(List wsdlResources) { List result = new ArrayList(); for (int i = 0; i < wsdlResources.size(); i++) { Resource wsdl = (Resource) wsdlResources.get(i); List services = getWSDLServices(wsdl); if (wsdl != null && services != null && !services.isEmpty()) result.addAll(services); } return result; } public List getExternalWSDLServices() { List result = getWsdlServicesFromWorkspaceWSILs(); result.removeAll(getInternalWSDLServices()); return result; } public List getWsdlServicesFromWorkspaceWSILs() { List result = new ArrayList(); List wsilFiles = getWorkspaceWSILFiles(); for (int i = 0; i < wsilFiles.size(); i++) { IFile wsil = (IFile) wsilFiles.get(i); List services = getWsdlServicesFromWsilFile(wsil); if (!services.isEmpty()) result.addAll(services); } return result; } public List getWsdlServicesFromWsilFile(IFile wsil) { WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper(); return serviceHelper.getWsdlServicesFromWsilFile(wsil); } /** * Returns all WSDL Services, both internal and external */ public List getAllWSDLServices() { List result = new ArrayList(); result.addAll(getInternalWSDLServices()); result.addAll(getExternalWSDLServices()); return result; } protected void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); releaseArtifactEdits(); INSTANCE = null; } public Resource getWSDLResource(WebServiceDescription webService) { if (webService == null) return null; String wsdlFileName = webService.getWsdlFile(); Resource res = null; IVirtualResource[] resources = ComponentCore.createResources(WorkbenchResourceHelper.getFile(webService)); if (resources == null || resources.length==0) return res; WSDDArtifactEdit artifactEdit = getExistingWSDDArtifactEdit(resources[0].getComponent().getProject()); if (artifactEdit!=null) res = artifactEdit.getWsdlResource(wsdlFileName); return res; } private WSDDArtifactEdit getExistingWSDDArtifactEdit(IProject project) { List wsEdits = getWSArtifactEdits(); for (int i=0; i<wsEdits.size(); i++) { WSDDArtifactEdit edit = (WSDDArtifactEdit) wsEdits.get(i); if (edit !=null && edit.getProject()!= null && edit.getProject().equals(project)) return edit; } return null; } private WSCDDArtifactEdit getExistingWSCDDArtifactEdit(IProject project) { List wsClientEdits = getWSClientArtifactEdits(); for (int i=0; i<wsClientEdits.size(); i++) { WSCDDArtifactEdit edit = (WSCDDArtifactEdit) wsClientEdits.get(i); if (edit !=null && edit.getProject()!= null && edit.getProject().equals(project)) return edit; } return null; } public List getWSDLServices(Resource wsdl) { WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper(); List result = new ArrayList(); Object def = serviceHelper.getWSDLDefinition(wsdl); if (def == null) return result; result = new ArrayList(serviceHelper.getDefinitionServices(def).values()); return result; } public EObject getWSDLServiceForWebService(WebServiceDescription webService) { EObject service = null; WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper(); Resource wsdl = getWSDLResource(webService); if (wsdl == null) return service; Object definition = serviceHelper.getWSDLDefinition(wsdl); if (definition == null) return service; Map services = serviceHelper.getDefinitionServices(definition); if (services.isEmpty()) return service; PortComponent portComp = null; if (webService.getPortComponents()!=null && webService.getPortComponents().size()>0) { portComp = (PortComponent) webService.getPortComponents().get(0); return getService(portComp); } return service; } public Resource getWSDLResource(EObject wsdlService) { return wsdlService.eResource(); } public EObject getService(PortComponent port) { List services = getInternalWSDLServices(); WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper(); for (int i = 0; i < services.size(); i++) { EObject service = (EObject)services.get(i); if (serviceHelper.getServicePorts(service).size() == 1) { Object wsdlPort = serviceHelper.getServicePorts(service).values().toArray()[0]; String qName = serviceHelper.getPortBindingNamespaceURI(wsdlPort); if (port.getWsdlPort().getNamespaceURI().equals(qName)) return service; } } return null; } public PortComponent getPortComponent(String qName) { List wsDescs = getInternalWebServicesDescriptions(); for (int i = 0; i < wsDescs.size(); i++) { WebServiceDescription wsDesc = (WebServiceDescription) wsDescs.get(i); List ports = wsDesc.getPortComponents(); for (int j = 0; j < ports.size(); j++) { PortComponent portComp = (PortComponent) ports.get(j); if (portComp.getWsdlPort().getNamespaceURI().equals(qName)) return portComp; } } return null; } public PortComponent getPortComponent(String qName, IProject project) { List wsDescs = getInternalWebServicesDescriptions(); for (int i = 0; i < wsDescs.size(); i++) { WebServiceDescription wsDesc = (WebServiceDescription) wsDescs.get(i); List ports = wsDesc.getPortComponents(); for (int j = 0; j < ports.size(); j++) { PortComponent portComp = (PortComponent) ports.get(j); if (project == ProjectUtilities.getProject(portComp)) return portComp; } } return null; } public PortComponent getPortComponent(EObject wsdlService) { // If there is only one port in the wsdl service, find the matching port component // otherwise if multiple ports return null because we need more information WSDLServiceHelper serviceHelper = WSDLServiceExtManager.getServiceHelper(); if (wsdlService == null || serviceHelper.getServicePorts(wsdlService).isEmpty()) return null; if (serviceHelper.getServicePorts(wsdlService).size() > 0) { Object port = serviceHelper.getServicePorts(wsdlService).values().toArray()[0]; String qName = serviceHelper.getPortBindingNamespaceURI(port); return getPortComponent(qName, ProjectUtilities.getProject(wsdlService)); } return null; } public ServiceImplBean getServiceImplBean(EObject wsdlService) { PortComponent port = getPortComponent(wsdlService); if (port == null) return null; return port.getServiceImplBean(); } public WsddResource getWsddResource(EObject wsdlService) { PortComponent port = getPortComponent(wsdlService); if (port == null) return null; return (WsddResource) port.eResource(); } public String getServiceEndpointInterface(EObject wsdlService) { PortComponent port = getPortComponent(wsdlService); if (port == null) return null; return port.getServiceEndpointInterface(); } public List getAllWorkspaceServiceRefs() { List result = new ArrayList(); result.addAll(getWorkspace13ServiceRefs()); result.addAll(getWorkspace14ServiceRefs()); return result; } public List getWorkspace13ServiceRefs() { List result = new ArrayList(); Iterator iter = getWSClientArtifactEdits().iterator(); while (iter.hasNext()) { WSCDDArtifactEdit artifactEdit = (WSCDDArtifactEdit) iter.next(); WebServicesResource res = artifactEdit.getWscddXmiResource(); if (res != null && res.isLoaded() && res.getWebServicesClient() != null) { if (JavaEEProjectUtilities.isEJBProject(artifactEdit.getProject())) { List scopedBeans = res.getWebServicesClient().getComponentScopedRefs(); for (Iterator iterator = scopedBeans.iterator(); iterator.hasNext();) { ComponentScopedRefs refBean = (ComponentScopedRefs) iterator.next(); result.addAll(refBean.getServiceRefs()); } } else result.addAll(res.getWebServicesClient().getServiceRefs()); } } return result; } public List get13ServiceRefs(IProject handle) { List result = new ArrayList(); WSCDDArtifactEdit wsClientArtifactEdit = getExistingWSCDDArtifactEdit(handle); if (wsClientArtifactEdit !=null) { WebServicesResource res = wsClientArtifactEdit.getWscddXmiResource(); if (res != null && res.isLoaded() && res.getWebServicesClient() != null) result.addAll(res.getWebServicesClient().getServiceRefs()); } return result; } public List getWorkspace14ServiceRefs() { return getWorkspace14ServiceRefs(getWSClientArtifactEdits()); } private List getWorkspace14ServiceRefs(List wsClientArtifactEdits) { Iterator iter = wsClientArtifactEdits.iterator(); List result = new ArrayList(); while (iter.hasNext()) { WSCDDArtifactEdit wscArtifactEdit = (WSCDDArtifactEdit) iter.next(); IProject project = wscArtifactEdit.getProject(); String projectType = J2EEProjectUtilities.getJ2EEProjectType(project); String projectVersion = J2EEProjectUtilities.getJ2EEProjectVersion(project); int j2eeLevel = 0; if(IModuleConstants.JST_EJB_MODULE.equals(projectType)){ j2eeLevel = J2EEVersionUtil.convertEJBVersionStringToJ2EEVersionID(projectVersion); } else if(IModuleConstants.JST_WEB_MODULE.equals(projectType)){ j2eeLevel = J2EEVersionUtil.convertWebVersionStringToJ2EEVersionID(projectVersion); } else if(IModuleConstants.JST_APPCLIENT_MODULE.equals(projectType)){ j2eeLevel = J2EEVersionUtil.convertAppClientVersionStringToJ2EEVersionID(projectVersion); } // this method needs to check that project's j2ee level is 14 if(j2eeLevel != J2EEVersionConstants.J2EE_1_4_ID) continue; ArtifactEdit artifactEdit = ArtifactEdit.getArtifactEditForRead(project); try { EObject rootObject = null; if (artifactEdit!=null) rootObject = artifactEdit.getContentModelRoot(); // handle EJB project case if (rootObject instanceof EJBJar) { List cmps = ((EJBJar) rootObject).getEnterpriseBeans(); for (int j = 0; j < cmps.size(); j++) { EnterpriseBean bean = (EnterpriseBean) cmps.get(j); if (bean.getServiceRefs() != null && !bean.getServiceRefs().isEmpty()) result.addAll(bean.getServiceRefs()); } } // handle Web Project else if (rootObject instanceof WebApp) { if (((WebApp) rootObject).getServiceRefs() != null && !((WebApp) rootObject).getServiceRefs().isEmpty()) result.addAll(((WebApp) rootObject).getServiceRefs()); } // handle App clients else if (rootObject instanceof ApplicationClient) { if (((ApplicationClient) rootObject).getServiceRefs() != null && !((ApplicationClient) rootObject).getServiceRefs().isEmpty()) result.addAll(((ApplicationClient) rootObject).getServiceRefs()); } } finally { if (artifactEdit != null) artifactEdit.dispose(); } } return result; } public boolean isJ2EE14(ServiceRef ref) { return !(ref.eContainer() instanceof WebServicesClient); } public List getWorkspaceWSILFiles() { List result = new ArrayList(); Iterator iter = getWSArtifactEdits().iterator(); while (iter.hasNext()) { WSDDArtifactEdit artifactEdit = (WSDDArtifactEdit) iter.next(); List files = artifactEdit.getWSILResources(); for (int j = 0; j < files.size(); j++) { IFile file = (IFile) files.get(j); if (file != null && WSIL_EXT.equals(file.getFileExtension())) result.add(file); } } return result; } public List getWorkspaceWSDLResources() { List result = new ArrayList(); Iterator iter = getWSArtifactEdits().iterator(); while (iter.hasNext()) { WSDDArtifactEdit artifactEdit = (WSDDArtifactEdit) iter.next(); IProject project = artifactEdit.getProject(); if (project != null) { List wsdlResources = artifactEdit.getWSDLResources(); if (wsdlResources != null && !wsdlResources.isEmpty()) { for (int j = 0; j < wsdlResources.size(); j++) { Resource wsdl = (Resource) wsdlResources.get(j); if (!result.contains(wsdl)) result.add(wsdl); } } } } return result; } public List getWSDLServices() { List result = new ArrayList(); List internalWsdls = getInternalWSDLServices(); if (internalWsdls != null && !internalWsdls.isEmpty()) result.addAll(internalWsdls); //TODO add externals return result; } /** * @param bean * @return */ public List get13ServiceRefs(EnterpriseBean bean) { WSCDDArtifactEdit artifactEdit = null; IFile file = WorkbenchResourceHelper.getFile(bean); if (file!=null) artifactEdit = getExistingWSCDDArtifactEdit(file.getProject()); if (artifactEdit !=null) { WebServicesResource res = artifactEdit.getWscddXmiResource(); if (res != null && res.getWebServicesClient() != null) { String ejbName = bean.getName(); List scopes = res.getWebServicesClient().getComponentScopedRefs(); for (Iterator iter = scopes.iterator(); iter.hasNext();) { ComponentScopedRefs scope = (ComponentScopedRefs) iter.next(); if (scope.getComponentName().equals(ejbName)) return scope.getServiceRefs(); } } } return Collections.EMPTY_LIST; } /** * @param client * @return */ public List get13ServiceRefs(ApplicationClient client) { IProject handle = getComponentProject(WorkbenchResourceHelper.getFile(client)); if (handle == null) return Collections.EMPTY_LIST; WSCDDArtifactEdit artifactEdit = getExistingWSCDDArtifactEdit(handle); if (artifactEdit !=null) { WebServicesResource res = artifactEdit.getWscddXmiResource(); if (res != null) { WebServicesClient webClient = res.getWebServicesClient(); if (webClient != null) return webClient.getServiceRefs(); } } return Collections.EMPTY_LIST; } /** * @param webapp * @return */ public List get13ServiceRefs(WebApp webapp) { IProject handle = getComponentProject(WorkbenchResourceHelper.getFile(webapp)); if (handle == null) return Collections.EMPTY_LIST; WSCDDArtifactEdit artifactEdit = getExistingWSCDDArtifactEdit(handle); if (artifactEdit !=null) { WebServicesResource res = artifactEdit.getWscddXmiResource(); if (res != null) { WebServicesClient webClient = res.getWebServicesClient(); if (webClient != null) return webClient.getServiceRefs(); } } return Collections.EMPTY_LIST; } /* * (non-Javadoc) * * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta) */ public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); if (resource.getType() == IResource.PROJECT) { IProject p = (IProject) resource; // Handle project adds and project opens if ((delta.getKind()==IResourceDelta.ADDED || (((delta.getFlags() & IResourceDelta.OPEN) != 0) && p.isAccessible()))) { IVirtualComponent component = ComponentCore.createComponent(p); if (component!=null && !JavaEEProjectUtilities.isEARProject(p) && !JavaEEProjectUtilities.isStaticWebProject(p)) { getQueuedJob().addProject(p); return false; } } // Handle project close events and removals else if ((delta.getKind() == IResourceDelta.CHANGED && ((delta.getFlags() & IResourceDelta.OPEN) != 0)) || (delta.getKind() == IResourceDelta.REMOVED)){ removeArtifactEdit(p); return false; } } else if (resource.getType() == IResource.FILE && isInterrestedInFile((IFile) resource)) { // Handle WSIL and WSDL File additions as well as webservice.xml and webserviceclient.xml if ((delta.getKind() == IResourceDelta.ADDED) || ((delta.getFlags() & IResourceDelta.MOVED_TO) != 0)) { if (resource.getFileExtension().equals(WSDL_EXT)) addedWsdl((IFile) resource); else if (resource.getFileExtension().equals(WSIL_EXT)) addedWsil((IFile)resource); else if (resource.getName().equals(J2EEConstants.WEB_SERVICES_CLIENT_SHORTNAME) || resource.getName().equals(J2EEConstants.WEB_SERVICES_DD_URI)) { getQueuedJob().addProject(resource.getProject()); } } // Handle WSIL or WSDL file removals else if ((delta.getKind() == IResourceDelta.REMOVED) || ((delta.getFlags() & IResourceDelta.MOVED_FROM) != 0)) { if (resource.getFileExtension().equals(WSDL_EXT) || resource.getFileExtension().equals(WSIL_EXT)) notifyListeners(EditModelEvent.UNLOADED_RESOURCE); } return false; } return true; } private ProcessProjectsWithWSDL createProjectsJob() { Set newSet = new HashSet(); ProcessProjectsWithWSDL job = new ProcessProjectsWithWSDL(newSet, EditModelEvent.ADDED_RESOURCE); job.setRule(ResourcesPlugin.getWorkspace().getRoot()); job.setSystem(true); return job; } private ProcessProjectsWithWSDL getQueuedJob() { if (processNewProjects != null && (processNewProjects.getState() == Job.WAITING)){ return processNewProjects; } processNewProjects = createProjectsJob(); processNewProjects.schedule(); return processNewProjects; } private class ProcessProjectsWithWSDL extends Job { private Set currentProjects; private int eventType; public ProcessProjectsWithWSDL(Set p, int newEventType) { super(WebServiceManagerNLS.WebServicesManager_Loading_Webservice_); currentProjects = p; eventType = newEventType; } public void addProject(IProject p) { synchronized(currentProjects) { currentProjects.add(p); } } @Override protected IStatus run(IProgressMonitor monitor) { // Null out job for processing new projects synchronized (processNewProjects) { if(processNewProjects == this){ processNewProjects = null; } } for (Iterator iterator = currentProjects.iterator(); iterator.hasNext();) { IProject currentProject = (IProject) iterator.next(); addArtifactEdit(currentProject); } notifyListeners(eventType); return Status.OK_STATUS; } } protected void addedWsdl(IFile wsdl) { if (!wsdl.exists()) return; IProject handle = getComponentProject(wsdl); if (handle != null) { addArtifactEdit(handle); notifyListeners(EditModelEvent.LOADED_RESOURCE); } } protected void addedWsil(IFile wsil) { if (!wsil.exists()) return; IProject handle = getComponentProject(wsil); if (handle != null) { addArtifactEdit(handle); notifyListeners(EditModelEvent.LOADED_RESOURCE); } } private IProject getComponentProject(IFile res) { if (res==null) return null; return res.getProject(); } protected boolean isInterrestedInFile(IFile aFile) { return isFileInteresting(aFile); } /** * The only resources webservice manager is concerned about are: * webservice.xml, webserviceclient.xml, and J2EE 1.4 web.xml, ejb-jar-xml, and application-client.xml * @param res * @return boolean isInterested */ private boolean isInterestedInResource(Resource res) { if (res instanceof WsddResource || res instanceof WebServicesResource) { return true; } else if (res instanceof EJBResource || res instanceof WebAppResource || res instanceof ApplicationClientResource) { return ((XMLResource)res).getJ2EEVersionID()>J2EEVersionConstants.J2EE_1_3_ID; } else { return false; } } /** * @param object * @return */ public Collection getServiceRefs(EJBJar jar) { List list = new ArrayList(); List beans = jar.getEnterpriseBeans(); try { for (int i = 0; i < beans.size(); i++) { EnterpriseBean bean = (EnterpriseBean) beans.get(i); list.addAll(getServiceRefs(bean)); } } catch (Exception e) { //Ignore } return list; } public Collection getServiceRefs(EnterpriseBean bean) { List list = new ArrayList(); if (bean.getEjbJar().getJ2EEVersionID() >= J2EEVersionConstants.J2EE_1_4_ID) list.addAll(bean.getServiceRefs()); else list.addAll(get13ServiceRefs(bean)); return list; } public Collection getServiceRefs(WebApp webapp) { List list = new ArrayList(); try { if (webapp.getVersionID() >= J2EEVersionConstants.WEB_2_4_ID) list.addAll(webapp.getServiceRefs()); else list.addAll(get13ServiceRefs(webapp)); } catch (Exception e) { //Ignore } return list; } public Collection getServiceRefs(ApplicationClient client) { List list = new ArrayList(); try { if (client.getJ2EEVersionID() >= J2EEVersionConstants.J2EE_1_4_ID) list.addAll(client.getServiceRefs()); else list.addAll(get13ServiceRefs(client)); } catch (Exception e) { //Ignore } return list; } }