/*******************************************************************************
* Copyright (c) 2004, 2005
* Thomas Hallgren, Kenneth Olwing, Mitch Sonies
* Pontus Rydin, Nils Unden, Peer Torngren
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the individual
* copyright holders listed above, as Initial Contributors under such license.
* The text of such license is available at www.eclipse.org.
*******************************************************************************/
package org.eclipse.buckminster.jdt.internal;
import org.eclipse.buckminster.jdt.JdtPlugin;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.ClasspathContainerInitializer;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
/**
*
*/
public class BMClasspathInitializer extends ClasspathContainerInitializer implements IResourceChangeListener {
/**
* Constructor for RequiredPluginsInitializer.
*/
public BMClasspathInitializer() {
super();
ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.PRE_BUILD);
}
/**
* @see org.eclipse.jdt.core.ClasspathContainerInitializer#initialize(IPath,
* IJavaProject)
*/
@Override
public void initialize(IPath containerPath, IJavaProject javaProject) throws CoreException {
if (javaProject == null || !BMClasspathContainer.PATH.isPrefixOf(containerPath))
return;
String targetDesignator = null;
if (containerPath.segmentCount() == 2)
targetDesignator = containerPath.lastSegment();
IProject project = javaProject.getProject();
BMClasspathContainer newCP = new BMClasspathContainer(project, targetDesignator);
IClasspathContainer oldCP = JavaCore.getClasspathContainer(containerPath, javaProject);
if (newCP.equals(oldCP))
return;
JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { javaProject }, new IClasspathContainer[] { newCP }, null);
JdtPlugin.getLogger().debug("%s container initialized for project %s", containerPath, project.getName()); //$NON-NLS-1$
}
@Override
public void resourceChanged(IResourceChangeEvent event) {
IPath path = BMClasspathContainer.PATH;
try {
IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
for (IJavaProject javaProject : model.getJavaProjects()) {
for (IClasspathEntry rawEntry : javaProject.readRawClasspath()) {
if (rawEntry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
IPath entryPath = rawEntry.getPath();
if (path.isPrefixOf(entryPath)) {
this.initialize(entryPath, javaProject);
return;
}
}
}
}
} catch (JavaModelException e) {
e.printStackTrace();
} catch (CoreException e) {
e.printStackTrace();
}
}
}