package com.vmware.vfabric.ide.eclipse.tcserver.internal.core; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.runtime.CoreException; import org.eclipse.jst.server.tomcat.core.internal.ConfigurationResourceListener; import org.eclipse.wst.server.core.IServer; import org.eclipse.wst.server.core.IServerType; import org.eclipse.wst.server.core.ServerCore; import org.eclipse.wst.server.core.internal.ServerType; // Alas, ConfigurationResourceListener has a value hard-coded in that makes it Tomcat-specific public class TcServerConfigurationResourceListener extends ConfigurationResourceListener { private IProject serversProject; private final String VMWARE_SERVER_ID_PREFIX = "com.vmware.server.tc."; private final String SPRINGSOURCE_SERVER_ID_PREFIX = "com.springsource.tcserver."; public void resourceChanged(IResourceChangeEvent event) { if (event.getType() == IResourceChangeEvent.POST_CHANGE) { IProject project = getServersProject(); if (project != null) { IResourceDelta delta = event.getDelta(); if (delta != null) { IResourceDelta serversProjectDelta = delta.findMember(project.getFullPath()); if (serversProjectDelta != null) { // The change occurred within the Servers project. IResourceDelta[] childDelta = serversProjectDelta.getAffectedChildren(); if (childDelta.length > 0) { IServer[] servers = ServerCore.getServers(); for (IResourceDelta element : childDelta) { // Check if this subfolder of the Servers folder // matches a Tomcat configuration folder for (IServer server : servers) { IServerType serverType = server.getServerType(); if (serverType.getId().startsWith(VMWARE_SERVER_ID_PREFIX) || serverType.getId().startsWith(SPRINGSOURCE_SERVER_ID_PREFIX)) { IFolder configFolder = server.getServerConfiguration(); if (configFolder != null) { if (element.getFullPath().equals(configFolder.getFullPath())) { // Found a Tomcat server // affected by this delta. // Update this server's publish // state. TcServerBehaviour tcServerBehaviour = (TcServerBehaviour) server .loadAdapter(TcServerBehaviour.class, null); if (tcServerBehaviour != null) { // Indicate that this server // needs to publish and // restart if running tcServerBehaviour .setTomcatServerPublishState(IServer.PUBLISH_STATE_INCREMENTAL); tcServerBehaviour.setTomcatServerRestartState(true); } break; } } } } } } } } } } } private IProject getServersProject() { if (serversProject == null) { IProject project; try { project = ServerType.getServerProject(); synchronized (this) { serversProject = project; } } catch (CoreException e) { // Ignore } } return serversProject; } }