/**
* Aptana Studio
* Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
* Please see the license.html included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.editor.php.internal.builder.preferences;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
import com.aptana.core.logging.IdeLog;
import com.aptana.editor.php.PHPEditorPlugin;
/**
* Project dependencies manager.
*
* @author Pavel Petrochenko
* @author Denis Denisenko
*/
public final class DependenciesManager
{
/**
* Listeners.
*/
private static List<IProjectDependencyListener> listeners = new ArrayList<IProjectDependencyListener>();
/**
* Adds listener.
*
* @param listener
* - listener to add.
*/
public static void addListener(IProjectDependencyListener listener)
{
listeners.add(listener);
}
/**
* Removes listener.
*
* @param listener
* - listener to remove.
*/
public static void removeListener(IProjectDependencyListener listener)
{
listeners.remove(listener);
}
/**
* Gets project dependencies.
*
* @param project
* - project.
* @return project dependencies
*/
public static ProjectDependencies getDependencies(IProject project)
{
ProjectDependencies dependencies = new ProjectDependencies();
if (!project.isAccessible())
{
return dependencies;
}
try
{
String persistentProperty = project.getPersistentProperty(buildPathPropertyName());
dependencies.load(persistentProperty);
dependencies.loadLibs(project.getPersistentProperty(libsPropertyName()));
}
catch (CoreException e)
{
IdeLog.logError(PHPEditorPlugin.getDefault(), "Error loading project dependencies", e); //$NON-NLS-1$
}
return dependencies;
}
/**
* Sets project dependencies.
*
* @param project
* - project.
* @param dependencies
* - dependencies.
*/
public static void setDependencies(IProject project, ProjectDependencies dependencies)
{
try
{
project.setPersistentProperty(buildPathPropertyName(), dependencies.toString());
project.setPersistentProperty(libsPropertyName(), dependencies.getLibString());
notifyChanged(project, dependencies);
}
catch (CoreException e)
{
IdeLog.logError(PHPEditorPlugin.getDefault(), "Error setting project dependencies", e); //$NON-NLS-1$
}
}
/**
* Sets project extensions.
*
* @param extensions
* - esnetnsions to set.
*/
public static void setExtensions(List<PHPExtension> extensions)
{
StringBuilder bld = new StringBuilder();
for (PHPExtension e : extensions)
{
String eName = escape(e.getName());
String ePath = escape(e.getPath());
bld.append(eName);
bld.append((char) 3);
bld.append(ePath);
bld.append(File.pathSeparatorChar);
}
if (bld.length() > 0)
{
bld.deleteCharAt(bld.length() - 1);
}
PHPEditorPlugin.getDefault().getPreferenceStore().setValue("php-extensions", bld.toString()); //$NON-NLS-1$
}
private static QualifiedName buildPathPropertyName()
{
return new QualifiedName(PHPEditorPlugin.PLUGIN_ID, "phpbuildpath"); //$NON-NLS-1$
}
private static QualifiedName libsPropertyName()
{
return new QualifiedName(PHPEditorPlugin.PLUGIN_ID, "libs"); //$NON-NLS-1$
}
/**
* Gets project extensions.
*
* @return project extensions.
*/
public static List<PHPExtension> getExtensions()
{
String string = PHPEditorPlugin.getDefault().getPreferenceStore().getString("php-extensions"); //$NON-NLS-1$
String[] split = string.split(File.pathSeparator);
List<PHPExtension> result = new ArrayList<PHPExtension>();
for (String s : split)
{
if (s.length() > 0)
{
PHPExtension e = new PHPExtension();
int indexOf = s.indexOf((char) 3);
String name = s.substring(0, indexOf);
String path = s.substring(indexOf + 1);
e.setName(descape(name));
e.setPath(descape(path));
result.add(e);
}
}
return result;
}
static String descape(String substring)
{
String replace = substring.replace((char) 2, File.pathSeparatorChar);
return replace;
}
static String escape(String absolutePath)
{
String replace = absolutePath.replace(File.pathSeparatorChar, (char) 2);
return replace;
}
/**
* Notifies project dependencies are changed.
*
* @param project
* - project.
* @param dependencies
* - dependencies.
*/
private static void notifyChanged(IProject project, ProjectDependencies dependencies)
{
for (IProjectDependencyListener listener : listeners)
{
listener.dependenciesChanged(project, dependencies);
}
}
/**
* DependenciesManager private constructor.
*/
private DependenciesManager()
{
}
}