package com.anjlab.eclipse.tapestry5; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.xml.stream.XMLInputFactory; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.Status; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import com.anjlab.eclipse.tapestry5.watchdog.EclipseClasspathWatchdog; import com.anjlab.eclipse.tapestry5.watchdog.ITapestryContextListener; import com.anjlab.eclipse.tapestry5.watchdog.IWebXmlListener; import com.anjlab.eclipse.tapestry5.watchdog.TapestryContextWatchdog; import com.anjlab.eclipse.tapestry5.watchdog.TapestryProjectWatchdog; import com.anjlab.eclipse.tapestry5.watchdog.WebXmlReader; import com.anjlab.eclipse.tapestry5.watchdog.WebXmlReader.WebXml; import com.anjlab.eclipse.tapestry5.watchdog.WebXmlWatchdog; /** * The activator class controls the plug-in life cycle */ public class Activator extends AbstractUIPlugin implements IWebXmlListener { // The plug-in ID public static final String PLUGIN_ID = "com.anjlab.eclipse.tapestry5"; //$NON-NLS-1$ // The shared instance private static Activator plugin; private TapestryContextWatchdog tapestryContextWatchdog; private WebXmlWatchdog webXmlWatchdog; private TapestryProjectWatchdog tapestryProjectWatchdog; private TapestryModuleFactory tapestryModuleFactory; private EclipseClasspathWatchdog eclipseClasspathWatchdog; private TapestryContextFactory tapestryContextFactory; /** * The constructor */ public Activator() { } /* * (non-Javadoc) * * @see * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext * ) */ public void start(BundleContext context) throws Exception { super.start(context); plugin = this; projectCache = new ConcurrentHashMap<String, Map<String,Object>>(); webXmlWatchdog = new WebXmlWatchdog(); webXmlWatchdog.addListener(null, this); webXmlWatchdog.start(); // Tapestry project watchdog should start before tapestry context one, // this is in order to receive resource change notifications first, // because tapestry context references to tapestry modules that could be // outdated tapestryProjectWatchdog = new TapestryProjectWatchdog(); tapestryProjectWatchdog.start(); tapestryContextFactory = new TapestryContextFactory(); tapestryModuleFactory = new TapestryModuleFactory(); eclipseClasspathWatchdog = new EclipseClasspathWatchdog(); eclipseClasspathWatchdog.addListener(null, tapestryModuleFactory); eclipseClasspathWatchdog.start(); tapestryContextWatchdog = new TapestryContextWatchdog(); tapestryContextWatchdog.start(); } private Map<String, Map<String, Object>> projectCache; public synchronized Map<String, Object> getCache(IProject project) { Map<String, Object> cache = projectCache.get(project.getName()); if (cache == null) { cache = new ConcurrentHashMap<String, Object>(); projectCache.put(project.getName(), cache); } return cache; } /* * (non-Javadoc) * * @see * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext * ) */ public void stop(BundleContext context) throws Exception { tapestryProjectWatchdog.stop(); tapestryProjectWatchdog = null; webXmlWatchdog.stop(); webXmlWatchdog.removeListener(null, this); webXmlWatchdog = null; tapestryContextWatchdog.stop(); tapestryContextWatchdog = null; eclipseClasspathWatchdog.stop(); eclipseClasspathWatchdog.removeListener(null, tapestryModuleFactory); eclipseClasspathWatchdog = null; tapestryModuleFactory = null; tapestryContextFactory = null; projectCache = null; plugin = null; super.stop(context); } /** * Returns the shared instance * * @return the shared instance */ public static Activator getDefault() { return plugin; } /** * Returns an image descriptor for the image file at the given plug-in * relative path * * @param path * the path * @return the image descriptor */ public static ImageDescriptor getImageDescriptor(String path) { return imageDescriptorFromPlugin(PLUGIN_ID, path); } public void logError(String message) { getLog().log(new Status(Status.ERROR, PLUGIN_ID, message)); } public void logError(String message, Throwable t) { getLog().log(new Status(Status.ERROR, PLUGIN_ID, message, t)); } public void logWarning(String message) { getLog().log(new Status(Status.WARNING, PLUGIN_ID, message)); } public void logWarning(String message, Throwable t) { getLog().log(new Status(Status.WARNING, PLUGIN_ID, message, t)); } private XMLInputFactory factory = null; public XMLInputFactory getXMLInputFactory() { if (factory == null) { factory = XMLInputFactory.newInstance(); } return factory; } public TapestryContext getTapestryContext(IWorkbenchWindow window) { return tapestryContextWatchdog.getTapestryContext(window); } public void addTapestryContextListener(IWorkbenchWindow window, ITapestryContextListener listener) { tapestryContextWatchdog.addListener(window, listener); } public void removeTapestryContextListener(IWorkbenchWindow window, ITapestryContextListener listener) { tapestryContextWatchdog.removeListener(window, listener); } private static final String WEB_XML = "web.xml"; @Override public void webXmlChanged(IFile file, WebXml webXml) { // Replace webXml in cache with new instance Activator.getDefault().getCache(file.getProject()).put(WEB_XML, webXml); } public WebXml getWebXml(IProject project) { Map<String, Object> projectCache = Activator.getDefault().getCache(project); WebXml webXml = (WebXml) projectCache.get(WEB_XML); if (webXml == null || webXml.isEmpty()) { webXml = WebXmlReader.readWebXml(TapestryUtils.findWebXml(project)); projectCache.put(WEB_XML, webXml); } return webXml; } public TapestryProject getTapestryProject(IWorkbenchWindow window) { return tapestryProjectWatchdog.getTapestryProject(window); } public void addTapestryProjectListener(IWorkbenchWindow window, ITapestryContextListener listener) { tapestryProjectWatchdog.addListener(window, listener); } public void removeTapestryProjectListener(IWorkbenchWindow window, ITapestryContextListener listener) { tapestryProjectWatchdog.removeListener(window, listener); } public void forceProjectRefresh(IWorkbenchWindow window) { tapestryProjectWatchdog.forceProjectRefresh(window); } public TapestryModuleFactory getTapestryModuleFactory() { return tapestryModuleFactory; } public TapestryContextFactory getTapestryContextFactory() { return tapestryContextFactory; } private static Image tapestryLogoIcon; public static Image getTapestryLogoIcon() { return tapestryLogoIcon != null ? tapestryLogoIcon : (tapestryLogoIcon = getImageDescriptor("icons/tapestry-logo.png").createImage()); } }