blob: 04da525210b5b6f7818adac924e77c42d924f974 [file] [log] [blame]
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;
}
}