/*******************************************************************************
* Copyright (c) 2012, 2016 PDT Extension Group and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* PDT Extension Group - initial API and implementation
*******************************************************************************/
package org.eclipse.php.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.*;
import org.eclipse.php.composer.core.model.ComposerBuildpathContainer;
import org.eclipse.php.composer.core.model.ModelAccess;
import org.eclipse.php.composer.core.model.PackageManager;
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;
/**
*
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
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.get(project));
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);
}
}