package org.rubypeople.rdt.internal.core; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.rubypeople.rdt.core.IRubyElement; import org.rubypeople.rdt.core.IRubyScript; import org.rubypeople.rdt.core.LocalFileStorage; import org.rubypeople.rdt.core.RubyModelException; import org.rubypeople.rdt.core.WorkingCopyOwner; import org.rubypeople.rdt.internal.core.util.MementoTokenizer; import org.rubypeople.rdt.internal.core.util.Messages; import org.rubypeople.rdt.internal.core.util.Util; public class ExternalSourceFolder extends SourceFolder { public ExternalSourceFolder(SourceFolderRoot parent, String[] names) { super(parent, names); } /* * @see RubyElement#generateInfos */ protected void generateInfos(Object info, HashMap newElements, IProgressMonitor pm) throws RubyModelException { // Open my folder: this creates all the pkg infos Openable openableParent = (Openable)this.parent; if (!openableParent.isOpen()) { openableParent.generateInfos(openableParent.createElementInfo(), newElements, pm); } } public boolean isReadOnly() { return true; } protected Object[] storedNonRubyResources() throws RubyModelException { return ((ExternalSourceFolderInfo) getElementInfo()).getNonRubyResources(); } protected boolean computeChildren(OpenableElementInfo info) { ArrayList<IRubyElement> vChildren = new ArrayList<IRubyElement>(); File file = getPath().toFile(); File[] members = file.listFiles(); List<LocalFileStorage> files = new ArrayList<LocalFileStorage>(); for (int i = 0, max = members.length; i < max; i++) { File child = members[i]; if (!child.isDirectory()) { IRubyElement childElement; if (Util.isValidRubyScriptName(child.getName())) { childElement = new ExternalRubyScript(this, child.getName(), DefaultWorkingCopyOwner.PRIMARY); vChildren.add(childElement); } else { files.add(new LocalFileStorage(child)); } } } if (info instanceof SourceFolderInfo) { SourceFolderInfo duh = (SourceFolderInfo) info; duh.setNonRubyResources(files.toArray(new Object[files.size()])); } IRubyElement[] children= new IRubyElement[vChildren.size()]; vChildren.toArray(children); info.setChildren(children); return true; } public IRubyScript getRubyScript(String name) { if (!org.rubypeople.rdt.internal.core.util.Util.isRubyLikeFileName(name)) { throw new IllegalArgumentException(Messages.convention_unit_notRubyName); } return new ExternalRubyScript(this, name, DefaultWorkingCopyOwner.PRIMARY); } /* * @see RubyElement */ public IRubyElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner owner) { switch (token.charAt(0)) { case JEM_RUBYSCRIPT: if (!memento.hasMoreTokens()) return this; String classFileName = memento.nextToken(); RubyElement classFile = new ExternalRubyScript(this, classFileName, owner); return classFile.getHandleFromMemento(memento, owner); } return null; } /** * Returns an array of non-ruby resources contained in the receiver. */ public Object[] getNonRubyResources() throws RubyModelException { if (this.isDefaultPackage()) { // We don't want to show non ruby resources of the default package (see PR #1G58NB8) return RubyElementInfo.NO_NON_RUBY_RESOURCES; } else { return this.storedNonRubyResources(); } } }