| package org.eclipse.jst.j2ee.internal.webservice.startup; |
| |
| 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.ui.IStartup; |
| import org.eclipse.wst.common.project.facet.core.internal.FacetedProjectPropertyTester; |
| |
| public class WebserviceListener implements IStartup, IResourceChangeListener, IResourceDeltaVisitor { |
| |
| private boolean listening = false; |
| |
| /* The constants/facets/file extns are duplicated here to avoid loading plugins */ |
| private static final String PROJECT_FACET = "projectFacet"; //$NON-NLS-1$ |
| |
| private static final String EAR_FACET = "jst.ear"; //$NON-NLS-1$ |
| private static final String APPCLIENT_FACET = "jst.appclient"; //$NON-NLS-1$ |
| private static final String WEB_FACET = "jst.web"; //$NON-NLS-1$ |
| private static final String EJB_FACET = "jst.ejb"; //$NON-NLS-1$ |
| |
| private static final String WSDL_EXT = "wsdl"; //$NON-NLS-1$ |
| private static final String WSIL_EXT = "wsil"; //$NON-NLS-1$ |
| private static final String WEB_SERVICES_CLIENT_SHORTNAME = "webservicesclient.xml"; //$NON-NLS-1$ |
| private static final String WEB_SERVICES_DD_URI = "webservices.xml"; //$NON-NLS-1$ |
| |
| private static final FacetedProjectPropertyTester facetPropertyTester = new FacetedProjectPropertyTester(); |
| |
| private static WebserviceListener INSTANCE; |
| |
| public static WebserviceListener getInstance() { |
| return INSTANCE; |
| } |
| /** |
| * @param project |
| * @return |
| * method copied from WebServicesViewerSynchronization for performance reasons (not load plugins) |
| */ |
| private static final boolean isInteresting(IProject project) { |
| return hasFacet(project, WEB_FACET) || |
| hasFacet(project, EJB_FACET) || |
| hasFacet(project, APPCLIENT_FACET); |
| } |
| /** |
| * @param element |
| * @param facet |
| * @return |
| * method copied from WebServicesViewerSynchronization for performance reasons (not load plugins) |
| */ |
| private static final boolean hasFacet(Object element, String facet) { |
| return facetPropertyTester.test(element, PROJECT_FACET, new Object[] {}, facet); |
| } |
| |
| /** |
| * @param aFile |
| * @return |
| * method copied from WebServicesManager for performance reasons (not load plugins) |
| */ |
| private static final 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(WEB_SERVICES_CLIENT_SHORTNAME) |
| || aFile.getName().equals(WEB_SERVICES_DD_URI); |
| } |
| return false; |
| } |
| |
| |
| public boolean isListening() { |
| return listening; |
| } |
| public void earlyStartup() { |
| INSTANCE = this; |
| startListening(); |
| } |
| |
| public void resourceChanged(IResourceChangeEvent event) { |
| try { |
| event.getDelta().accept(this); |
| } catch (CoreException e) { |
| } |
| } |
| |
| public boolean visit(IResourceDelta delta) throws CoreException { |
| |
| IResource resource = delta.getResource(); |
| switch (resource.getType()) { |
| case IResource.ROOT : |
| return true; |
| case IResource.PROJECT: |
| if(isListening() && (delta.getKind() == IResourceDelta.ADDED || delta.getKind() == IResourceDelta.CHANGED)){ |
| if(isInteresting(resource.getProject())) { |
| return true; |
| } |
| } |
| break; |
| case IResource.FOLDER : |
| if(isListening() && (delta.getKind() == IResourceDelta.ADDED || delta.getKind() == IResourceDelta.CHANGED)) { |
| return true; |
| } |
| break; |
| case IResource.FILE : |
| if(isListening() && delta.getKind() == IResourceDelta.ADDED) { |
| if(isFileInteresting((IFile)resource)){ |
| stopListening(); |
| // this will cause the plug-in to start our goal was to delay it until now |
| if(org.eclipse.jst.j2ee.internal.webservice.WebServiceViewerSynchronization.isThereWebServicesPreferenceSet()){ |
| org.eclipse.jst.j2ee.internal.webservice.WebServiceViewerSynchronization.setAreThereWebServices(true); |
| } |
| } |
| } |
| default : |
| break; |
| } |
| |
| return false; |
| } |
| |
| public void startListening() { |
| ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); |
| listening = true; |
| } |
| |
| public void stopListening() { |
| ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); |
| listening = false; |
| } |
| } |