package org.eclipse.dltk.tcl.internal.core.packages; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.IScriptFolder; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.core.WorkingCopyOwner; import org.eclipse.dltk.core.environment.EnvironmentManager; import org.eclipse.dltk.core.environment.EnvironmentPathUtils; import org.eclipse.dltk.core.environment.IEnvironment; import org.eclipse.dltk.internal.core.DefaultWorkingCopyOwner; import org.eclipse.dltk.internal.core.ExternalEntryFile; import org.eclipse.dltk.internal.core.ExternalSourceModule; import org.eclipse.dltk.internal.core.MementoModelElementUtil; import org.eclipse.dltk.internal.core.ModelElement; import org.eclipse.dltk.internal.core.ModelElementInfo; import org.eclipse.dltk.internal.core.Openable; import org.eclipse.dltk.internal.core.OpenableElementInfo; import org.eclipse.dltk.internal.core.ScriptFolderInfo; import org.eclipse.dltk.internal.core.util.MementoTokenizer; import org.eclipse.dltk.launching.IInterpreterInstall; import org.eclipse.dltk.launching.ScriptRuntime; import org.eclipse.dltk.tcl.core.TclPackagesManager; import org.eclipse.dltk.tcl.core.packages.TclPackageInfo; import org.eclipse.dltk.utils.CorePrinter; public class TclPackageElement extends Openable implements IScriptFolder { private String packageName; private String packageVersion; protected TclPackageElement(ModelElement parent, String name, String version) { super(parent); this.packageName = name; this.packageVersion = version; } public String getElementName() { return PackageUtils.packageToPath(packageName, this.packageVersion); } protected Object createElementInfo() { return new OpenableElementInfo(); } public int getElementType() { return SCRIPT_FOLDER; } public int getKind() throws ModelException { return IProjectFragment.K_SOURCE; } public IResource getResource() { return null; } public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof TclPackageElement)) return false; TclPackageElement other = (TclPackageElement) o; return this.packageName.equals(other.packageName) && getParent().equals(other.getParent()); } protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws ModelException { // check whether this folder can be opened IInterpreterInstall install = null; try { install = ScriptRuntime.getInterpreterInstall(getScriptProject()); } catch (CoreException e) { if (DLTKCore.DEBUG) { e.printStackTrace(); } } if (install != null) { // add modules from resources Set<IModelElement> vChildren = new HashSet<IModelElement>(); // Add external source module here. TclPackageInfo packageInfo = TclPackagesManager.getPackageInfo( install, this.packageName, true); if (packageInfo == null) { return true; } List<String> sources = packageInfo.getSources(); if (!sources.isEmpty()) { String[] paths = sources.toArray(new String[sources.size()]); IEnvironment environment = EnvironmentManager .getEnvironment(getScriptProject()); for (int i = 0; i < paths.length; i++) { IPath path = new Path(paths[i]); ExternalEntryFile storage = new ExternalEntryFile( EnvironmentPathUtils.getFile(environment, path)); ExternalSourceModule module = new TclPackageSourceModule( this, path.lastSegment(), DefaultWorkingCopyOwner.PRIMARY, storage); vChildren.add(module); } } info.setChildren(vChildren.toArray(new IModelElement[vChildren .size()])); } return true; } protected char getHandleMementoDelimiter() { return JEM_USER_ELEMENT; } public IModelElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) { switch (token.charAt(0)) { case JEM_SOURCEMODULE: if (!memento.hasMoreTokens()) return this; String classFileName = memento.nextToken(); ModelElement classFile = (ModelElement) getSourceModule(classFileName); return classFile.getHandleFromMemento(memento, owner); case JEM_USER_ELEMENT: return MementoModelElementUtil.getHandleFromMemento(memento, this, owner); } return null; } public boolean containsScriptResources() throws ModelException { Object elementInfo = getElementInfo(); if (!(elementInfo instanceof ScriptFolderInfo)) return false; ScriptFolderInfo scriptElementInfo = (ScriptFolderInfo) elementInfo; return scriptElementInfo.containsScriptResources(); } public boolean hasChildren() throws ModelException { return getChildren().length > 0; } public void printNode(CorePrinter output) { output.formatPrint("DLTK TCL Package:" + getElementName()); //$NON-NLS-1$ output.indent(); try { IModelElement modelElements[] = this.getChildren(); for (int i = 0; i < modelElements.length; ++i) { IModelElement element = modelElements[i]; if (element instanceof ModelElement) { ((ModelElement) element).printNode(output); } else { output.print("Unknown element:" + element); //$NON-NLS-1$ } } } catch (ModelException ex) { output.formatPrint(ex.getLocalizedMessage()); } output.dedent(); } public ISourceModule createSourceModule(String name, String contents, boolean force, IProgressMonitor monitor) throws ModelException { return null; } public Object[] getForeignResources() throws ModelException { return ModelElementInfo.NO_NON_SCRIPT_RESOURCES; } public boolean exists() { return true; } public ISourceModule[] getSourceModules() throws ModelException { List<IModelElement> list = getChildrenOfType(SOURCE_MODULE); ISourceModule[] array = new ISourceModule[list.size()]; list.toArray(array); return array; } public boolean hasSubfolders() throws ModelException { return false; } public boolean isRootFolder() { return false; } public IPath getPath() { return getParent().getPath().append( PackageUtils.packageToPath(packageName, this.packageVersion)); } public void copy(IModelElement container, IModelElement sibling, String rename, boolean replace, IProgressMonitor monitor) throws ModelException { } public void delete(boolean force, IProgressMonitor monitor) throws ModelException { } public void move(IModelElement container, IModelElement sibling, String rename, boolean replace, IProgressMonitor monitor) throws ModelException { } public void rename(String name, boolean replace, IProgressMonitor monitor) throws ModelException { } public ISourceModule getSourceModule(String name) { IModelElement[] children = null; try { children = getChildren(); for (int i = 0; i < children.length; i++) { IModelElement child = children[i]; if (child instanceof ISourceModule) { if (name.equals(child.getElementName())) { return (ISourceModule) child; } } } } catch (ModelException e) { if (DLTKCore.DEBUG) { e.printStackTrace(); } } return null; } public String getVersion() { return this.packageVersion; } public String getPackageName() { return this.packageName; } /** * @since 2.0 */ @Override public boolean isReadOnly() { return true; } }