package org.eclipse.dltk.tcl.internal.core.packages;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IBuildpathEntry;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IModelProvider;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.core.ScriptProject;
import org.eclipse.dltk.internal.launching.InterpreterContainerInitializer;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.InterpreterContainerHelper;
import org.eclipse.dltk.launching.ScriptRuntime;
import org.eclipse.dltk.tcl.core.TclCorePreferences;
import org.eclipse.dltk.tcl.core.TclPackagesManager;
import org.eclipse.dltk.tcl.core.packages.TclPackageInfo;
import org.eclipse.dltk.tcl.internal.core.sources.TclSourcesFragment;
public class TclPackagesModelProvider implements IModelProvider {
public TclPackagesModelProvider() {
}
public void provideModelChanges(IModelElement parentElement, List children) {
if (parentElement.getElementType() == IModelElement.SCRIPT_PROJECT) {
ScriptProject project = (ScriptProject) parentElement;
// add sources fragment
TclSourcesFragment fragment = new TclSourcesFragment(
(ScriptProject) parentElement);
if (!children.contains(fragment)) {
children.add(fragment);
}
if (!TclCorePreferences.USE_PACKAGE_CONCEPT) {
return;
}
// Add packages fragment
Set<String> realRequirements = new HashSet<String>();
collectRealRequirements(project, realRequirements);
IInterpreterInstall install = resolveInterpreterInstall(project);
if (install == null) {
return;
}
List<TclPackageInfo> infos = TclPackagesManager.getPackageInfos(
install, realRequirements, true);
// if (infos.size() == 0 && realRequirements.size() != 0) {
// TclPlugin.error("Retrived empty packages list for request:"
// + realRequirements + " for interpreter:"
// + install.getInstallLocation().toOSString(), null);
// }
for (TclPackageInfo packageName : infos) {
TclPackageFragment pfragment = new TclPackageFragment(
(ScriptProject) parentElement, packageName.getName());
if (!children.contains(pfragment)) {
children.add(pfragment);
}
}
}
}
public static void collectRealRequirements(IScriptProject project,
Set<String> realRequirements) {
Set<String> set = new HashSet<String>();
InterpreterContainerHelper.getInterpreterContainerDependencies(project,
set, set);
// set.addAll(realRequirements);
realRequirements.addAll(set);
// TclProjectInfo projectInfo = TclPackagesManager.getTclProject(project
// .getElementName());
// EList<TclModuleInfo> modules = projectInfo.getModules();
// for (TclModuleInfo tclModuleInfo : modules) {
// EList<TclSourceEntry> required = tclModuleInfo.getRequired();
// EList<UserCorrection> corrections = tclModuleInfo
// .getPackageCorrections();
// IModelElement element = null;
// if (required.isEmpty()) {
// element = DLTKCore.create(tclModuleInfo.getHandle());
// // Check for file existance
// if (element != null && element.exists()) {
// if (element instanceof TclPackageSourceModule) {
// continue;
// }
// }
// }
// for (TclSourceEntry req : required) {
// String value = req.getValue();
// for (UserCorrection userCorrection : corrections) {
// if (userCorrection.getOriginalValue().equals(value)) {
// value = userCorrection.getUserValue();
// break;
// }
// }
// if (TclPackagesManager.isValidName(value)) {
// realRequirements.add(value);
// }
// }
// }
}
public static IInterpreterInstall resolveInterpreterInstall(
IScriptProject project) {
try {
IInterpreterInstall install = null;
install = ScriptRuntime.getInterpreterInstall(project);
if (install != null) {
return install;
}
} catch (CoreException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
}
// Try to resolve interpreter install by hands.
// Maybe initialization problem.
IBuildpathEntry[] buildpath = null;
try {
buildpath = project.getRawBuildpath();
} catch (ModelException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
return null;
}
for (IBuildpathEntry entry : buildpath) {
IPath path = entry.getPath();
if (path.segmentCount() > 0
&& path.segment(0).equals(
ScriptRuntime.INTERPRETER_CONTAINER)) {
try {
IInterpreterInstall interp = InterpreterContainerInitializer
.resolveInterpreter(
InterpreterContainerInitializer
.getNatureFromProject(project),
InterpreterContainerInitializer
.getEnvironmentFromProject(project),
path);
if (interp != null) {
return interp;
}
} catch (CoreException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
}
break;
}
}
return null;
}
public boolean isModelChangesProvidedFor(IModelElement modelElement,
String name) {
// if (!TclCorePreferences.USE_PACKAGE_CONCEPT) {
// return false;
// }
if (modelElement.getElementType() == IModelElement.SCRIPT_PROJECT) {
return true;
}
return false;
}
}