/******************************************************************************* * Copyright (c) 2009-2011 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.core; import java.util.ArrayList; import java.util.List; 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.ISaveContext; import org.eclipse.core.resources.ISaveParticipant; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.resource.ImageDescriptor; import org.jboss.tools.cdi.internal.core.event.CDIProjectChangeEvent; import org.jboss.tools.cdi.internal.core.event.ICDIProjectChangeListener; import org.jboss.tools.cdi.internal.core.scanner.lib.BeanArchiveDetector; import org.jboss.tools.common.log.BaseUIPlugin; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; /** * The activator class controls the plug-in life cycle */ public class CDICorePlugin extends BaseUIPlugin { // The plug-in ID public static final String PLUGIN_ID = "org.jboss.tools.cdi.core"; public static final String CA_CDI_EL_IMAGE_PATH = "images/ca/icons_CDI_EL.gif"; // The shared instance private static CDICorePlugin plugin; /** * The constructor */ public CDICorePlugin() { plugin = this; } /* * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) */ public void start(BundleContext context) throws Exception { super.start(context); ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener); ResourcesPlugin.getWorkspace().addSaveParticipant(PLUGIN_ID, new ISaveParticipant() { @Override public void saving(ISaveContext context) throws CoreException { BeanArchiveDetector.getInstance().save(); } @Override public void rollback(ISaveContext context) {} @Override public void prepareToSave(ISaveContext context) throws CoreException {} @Override public void doneSaving(ISaveContext context) {} }); } /* * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener); super.stop(context); } IResourceChangeListener resourceChangeListener = new RCL(); class RCL implements IResourceChangeListener { public void resourceChanged(IResourceChangeEvent event) { if(event.getType() == IResourceChangeEvent.PRE_DELETE || event.getType() == IResourceChangeEvent.PRE_CLOSE) { IResource r = event.getResource(); if(r instanceof IProject) { IProject p = (IProject)r; CDICoreNature n = (CDICoreNature)getCDINature(p); if(n != null) { n.dispose(); } } } else if(event.getType() == IResourceChangeEvent.POST_CHANGE) { IResourceDelta[] cs = event.getDelta().getAffectedChildren(IResourceDelta.CHANGED); for (IResourceDelta c: cs) { if((c.getFlags() & IResourceDelta.OPEN) != 0 && c.getResource() instanceof IProject) { IProject p = (IProject)c.getResource(); getCDI(p, true); } } } } } /** * Returns the shared instance * * @return the shared instance */ public static CDICorePlugin 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); } /** * Returns CDI project. * @param project * @param resolve * @return */ public static ICDIProject getCDIProject(IProject project, boolean resolve) { CDICoreNature nature = getCDI(project, resolve); if(nature!=null) { return nature.getDelegate(); } return null; } private static CDICoreNature getCDINature(IProject project) { if(project == null || !project.exists() || !project.isOpen()) return null; try { if(!project.hasNature(CDICoreNature.NATURE_ID)) return null; } catch (CoreException e) { //ignore - all checks are done above return null; } CDICoreNature n = null; try { n = (CDICoreNature)project.getNature(CDICoreNature.NATURE_ID); } catch (CoreException e) { getDefault().logError(e); } return n; } public static CDICoreNature getCDI(IProject project, boolean resolve) { CDICoreNature n = getCDINature(project); if(n != null) { if(resolve) { n.resolve(); } else { n.loadProjectDependencies(); } } return n; } private static List<ICDIProjectChangeListener> listeners = new ArrayList<ICDIProjectChangeListener>(); /** * Adds CDI Project listener */ public static void addCDIProjectListener(ICDIProjectChangeListener listener) { synchronized(listeners) { if(listeners.contains(listener)) return; listeners.add(listener); } } /** * Removes CDI Project listener */ public static void removeCDIProjectListener(ICDIProjectChangeListener listener) { synchronized(listeners) { listeners.remove(listener); } } /** * Fires CDI Project change event * * @param event */ public static void fire(CDIProjectChangeEvent event) { ICDIProjectChangeListener[] ls = null; synchronized(listeners) { ls = listeners.toArray(new ICDIProjectChangeListener[listeners.size()]); } for (ICDIProjectChangeListener l : ls) { l.projectChanged(event); } } boolean cacheIsLoaded = false; ICDICache cache; public ICDICache getDBCache() { if(!cacheIsLoaded) { synchronized (this) { if(!cacheIsLoaded) { try { Bundle b = Platform.getBundle("org.jboss.tools.cdi.db"); if(b != null) { try { Class c = b.loadClass("org.jboss.tools.cdi.db.CDIDataBase"); if(c != null) { cache = (ICDICache)c.newInstance(); } } catch (ClassNotFoundException e) { logError(e); } catch (InstantiationException e) { logError(e); } catch (IllegalAccessException e) { logError(e); } } } catch (Throwable t) { logError(t); } finally { cacheIsLoaded = true; } } } } return cache; } }