package com.dubture.composer.core;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.BuildpathContainerInitializer;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IBuildpathContainer;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.php.internal.core.Logger;
import org.eclipse.php.internal.core.preferences.IPreferencesPropagatorListener;
import org.eclipse.php.internal.core.preferences.PreferencesPropagatorEvent;
import org.eclipse.php.internal.core.project.PHPNature;
import org.eclipse.php.internal.core.project.PhpVersionChangedHandler;
import org.eclipse.php.internal.core.util.project.observer.IProjectClosedObserver;
import org.eclipse.php.internal.core.util.project.observer.ProjectRemovedObserversAttacher;
import com.dubture.composer.core.model.ComposerBuildpathContainer;
import com.dubture.composer.core.model.ModelAccess;
import com.dubture.composer.core.model.PackageManager;
/**
*
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class ComposerBuildpathContainerInitializer extends
BuildpathContainerInitializer
{
public static final String CONTAINER = ComposerPlugin.ID + ".CONTAINER"; //$NON-NLS-1$
private Map<IProject, IPreferencesPropagatorListener> project2PhpVerListener = new HashMap<IProject, IPreferencesPropagatorListener>();
@Override
public void initialize(IPath containerPath, IScriptProject scriptProject)
throws CoreException
{
if (containerPath.segmentCount() > 0 && containerPath.segment(0).equals(CONTAINER) && ComposerPlugin.getDefault().isBuildpathContainerEnabled()) {
try {
if (isPHPProject(scriptProject)) {
DLTKCore
.setBuildpathContainer(
containerPath,
new IScriptProject[] { scriptProject },
new IBuildpathContainer[] { new ComposerBuildpathContainer(containerPath, scriptProject) },
null);
initializeListener(containerPath, scriptProject);
}
} catch (Exception e) {
Logger.logException(e);
}
}
}
private void initializeListener(final IPath containerPath,
final IScriptProject scriptProject) {
final IProject project = scriptProject.getProject();
if (project2PhpVerListener.containsKey(project)) {
return;
}
IPreferencesPropagatorListener versionChangeListener = new IPreferencesPropagatorListener() {
public void preferencesEventOccured(PreferencesPropagatorEvent event) {
try {
// Re-initialize when PHP version changes
initialize(containerPath, scriptProject);
} catch (CoreException e) {
Logger.logException(e);
}
}
public IProject getProject() {
return project;
}
};
project2PhpVerListener.put(project, versionChangeListener);
PhpVersionChangedHandler.getInstance().addPhpVersionChangedListener(
versionChangeListener);
ProjectRemovedObserversAttacher.getInstance().addProjectClosedObserver(
project, new IProjectClosedObserver() {
public void closed() {
PhpVersionChangedHandler.getInstance()
.removePhpVersionChangedListener(
project2PhpVerListener.remove(project));
}
});
}
private static boolean isPHPProject(IScriptProject project) {
String nature = getNatureFromProject(project);
return PHPNature.ID.equals(nature);
}
private static String getNatureFromProject(IScriptProject project) {
IDLTKLanguageToolkit languageToolkit = DLTKLanguageManager
.getLanguageToolkit(project);
if (languageToolkit != null) {
return languageToolkit.getNatureId();
}
return null;
}
public void requestBuildpathContainerUpdate(IPath containerPath,
IScriptProject project, IBuildpathContainer containerSuggestion)
{
if (isComposerContainer(containerPath)) {
String name = containerPath.segment(1);
if (containerSuggestion != null) {
PackageManager manager = ModelAccess.getInstance().getPackageManager();
if (manager.getPackage(name) == null) {
return;
}
manager.setPackage(
name,
containerSuggestion.getBuildpathEntries(),
containerSuggestion.getKind() == IBuildpathContainer.K_SYSTEM);
} else {
ModelAccess.getInstance().getPackageManager().removePackage(name);
}
}
}
private boolean isComposerContainer(IPath path)
{
return path != null && CONTAINER.equals(path.segment(0));
}
@Override
public boolean canUpdateBuildpathContainer(IPath containerPath,
IScriptProject project)
{
return isComposerContainer(containerPath);
}
}