/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.impl.trees;
import java.util.*;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.meta.*;
import org.jboss.tools.common.meta.constraint.*;
import org.jboss.tools.common.model.filesystems.FilePathHelper;
import org.jboss.tools.common.model.filesystems.FileSystemsHelper;
import org.jboss.tools.common.model.filesystems.XFileObject;
import org.jboss.tools.common.model.util.XModelObjectLoaderUtil;
public class FileSystemResourceTree implements XFilteredTree {
protected XModel model = null;
protected Set<String> extensions = null;
protected Set<String> entities = null;
protected boolean javaRootsOnly = false;
public FileSystemResourceTree() {}
public void addExtension(String name) {
if(extensions == null) {
extensions = new HashSet<String>();
}
extensions.add(name);
}
public void dispose() {
if (extensions!=null) extensions.clear();
extensions = null;
if (entities!=null) entities.clear();
entities = null;
}
public void setModel(XModel model) {
this.model = model;
}
public void setConstraint(Object object) {
Object[] os = (Object[])object;
XAttribute a = (XAttribute)os[0];
XAttributeConstraintT tc = (XAttributeConstraintT)a.getConstraint();
String ext = tc.getProperties().getProperty("extensions"); //$NON-NLS-1$
if(ext != null) {
extensions = new HashSet<String>();
StringTokenizer st = new StringTokenizer(ext, ","); //$NON-NLS-1$
while(st.hasMoreTokens()) extensions.add(st.nextToken());
}
String ent = tc.getProperties().getProperty("entities"); //$NON-NLS-1$
if(ent != null) {
entities = new HashSet<String>();
StringTokenizer st = new StringTokenizer(ent, ","); //$NON-NLS-1$
while(st.hasMoreTokens()) entities.add(st.nextToken());
}
String jro = tc.getProperties().getProperty("java_roots_only"); //$NON-NLS-1$
if(XModelObjectConstants.TRUE.equals(jro)) {
javaRootsOnly = true;
}
}
public XModelObject getRoot() {
return FileSystemsHelper.getFileSystems(model);
}
public boolean isSelectable(XModelObject object) {
return (object != null && object.getFileType() == XFileObject.FILE);
}
public String getValue(XModelObject object) {
return getPath(object);
}
public XModelObject find(String value) {
return model.getByPath(value);
}
public XModelObject getParent(XModelObject object) {
XModelObject root = getRoot();
if(object == root) return null;
XModelObject p = object.getParent();
return (p == null) ? null : (p.getParent() == root) ? root : p;
}
public String getPath(XModelObject object) {
String p = object.getPath();
if(p == null || !p.startsWith("FileSystems/")) return p; //$NON-NLS-1$
return XModelObjectLoaderUtil.getResourcePath(object);
}
public boolean hasChildren(XModelObject object) {
if(object.getFileType() == XFileObject.FILE) return false;
return true;
}
public XModelObject getChildAt(XModelObject object, int i) {
XModelObject[] c = getChildren(object);
return (i < 0 || i >= c.length) ? null : c[i];
}
public XModelObject[] getChildren(XModelObject object) {
if(object == getRoot()) return getRootChildren();
int t = object.getFileType();
if(t == XFileObject.FILE) return new XModelObject[0];
return getChildrenInFileSystems(object);
}
protected boolean accepts0(XModelObject o) {
int type = o.getFileType();
if(type == XModelObject.FOLDER) return !XModelObjectConstants.TRUE.equals(o.get("overlapped")); //$NON-NLS-1$
if(type != XModelObject.FILE) return false;
String pathpart = o.getPathPart();
String pp = pathpart.substring(pathpart.lastIndexOf('.') + 1);
// pp = FilePathHelper.toPathPath(pp); // What about UNIX?
pp = pp.toLowerCase();
String ent = o.getModelEntity().getName();
return (extensions == null || extensions.contains(pp)) &&
(entities == null || entities.contains(ent));
}
private XModelObject[] getRootChildren() {
XModelObject[] fs = getRoot().getChildren();
SortedMap<String,XModelObject> t = new TreeMap<String,XModelObject>();
for (int i = 0; i < fs.length; i++) {
if(javaRootsOnly) {
if(XModelObjectConstants.ENT_FILE_SYSTEM_FOLDER.equals(fs[i].getModelEntity().getName())
&& !fs[i].getAttributeValue(XModelObjectConstants.ATTR_NAME).startsWith("src")) { //$NON-NLS-1$
continue;
}
}
XModelObject[] cs = fs[i].getChildren();
for (int j = 0; j < cs.length; j++) {
String p = cs[j].getPathPart();
if(t.containsKey(p)) continue;
if(accepts0(cs[j])) t.put(p, cs[j]);
}
}
Object[] keys = t.keySet().toArray();
XModelObject[] vs = new XModelObject[keys.length];
for (int i = 0; i < vs.length; i++) vs[i] = t.get(keys[i]);
return vs;
}
private XModelObject[] getChildrenInFileSystems(XModelObject object) {
String path = getPath(object);
if(path.startsWith(XModelObjectConstants.SEPARATOR)) path = path.substring(1);
XModelObject[] fs = getRoot().getChildren();
SortedMap<String,XModelObject> t = new TreeMap<String,XModelObject>();
for (int i = 0; i < fs.length; i++) {
XModelObject o = fs[i].getChildByPath(path);
if(o == null) continue;
XModelObject[] cs = o.getChildren();
for (int j = 0; j < cs.length; j++) {
String p = cs[j].getPathPart();
if(t.containsKey(p)) continue;
if(accepts0(cs[j])) t.put(p, cs[j]);
}
}
Object[] keys = t.keySet().toArray();
XModelObject[] vs = new XModelObject[keys.length];
for (int i = 0; i < vs.length; i++) vs[i] = t.get(keys[i]);
return vs;
}
}