Skip to main content
summaryrefslogtreecommitdiffstats
blob: 45f85b9cf6afe02ee1ab0af66efb9ef990712a63 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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;
import org.eclipse.wst.project.facet.ProductManager;

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 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() {
		if (ProductManager.shouldUseViewerSyncForWebservices()) {
			INSTANCE = this;
			startListening();
		} else {
			//Change to no-op
			//org.eclipse.jst.j2ee.internal.webservice.WebServiceViewerSynchronization.setAreThereWebServices(false);
		}
	}

	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);
						}
					}
				}				
		}
		
		return false;
	}
	
	public void startListening() {
		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
		listening = true;
	}

	public void stopListening() {
		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
		listening = false;
	}
}

Back to the top