/******************************************************************************* * 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.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.jboss.tools.common.meta.XAttribute; import org.jboss.tools.common.meta.constraint.XAttributeConstraintT; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.options.PreferenceModelUtilities; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.model.project.IModelNature; import org.jboss.tools.common.model.util.EclipseResourceUtil; public abstract class AllResourcesTree implements XFilteredTree { protected XModel preferenceModel; protected XModelObject root; protected Map<String,XFilteredTree> trees = new TreeMap<String,XFilteredTree>(); protected XModelObject[] roots = null; public void setModel(XModel model) { preferenceModel = PreferenceModelUtilities.getPreferenceModel(); root = preferenceModel.getRoot(); roots = null; } public XModelObject getRoot() { return root; } public boolean hasChildren(XModelObject object) { if(object == root) return true; XFilteredTree tree = getSubTree(object.getModel()); if(tree != null) for (int i = 0; i < roots.length; i++) { if(object == roots[i]) { object = tree.getRoot(); } } return (tree != null) && tree.hasChildren(object); } private void loadRoots() { if(roots != null) return; roots = new XModelObject[trees.size()]; Iterator it = trees.keySet().iterator(); for (int i = 0; i < roots.length; i++) { XFilteredTree tree = trees.get(it.next()); roots[i] = tree.getRoot().getParent(); } } public XModelObject[] getChildren(XModelObject object) { loadRoots(); if(object == root) { return roots; } XFilteredTree tree = getSubTree(object.getModel()); if(tree != null) for (int i = 0; i < roots.length; i++) { if(object == roots[i]) { object = tree.getRoot(); } } return tree == null ? new XModelObject[0] : tree.getChildren(object); } public XModelObject getChildAt(XModelObject object, int i) { loadRoots(); if(object == root) { return roots[i]; } XFilteredTree tree = getSubTree(object.getModel()); if(tree != null) for (int k = 0; k < roots.length; k++) { if(object == roots[k]) { object = tree.getRoot(); } } return tree == null ? null : tree.getChildAt(object, i); } public boolean isSelectable(XModelObject object) { if(object == root) return false; XFilteredTree tree = getSubTree(object.getModel()); return (tree != null) && tree.isSelectable(object); } public String getValue(XModelObject object) { if(object == root) return ""; //$NON-NLS-1$ IResource resource = (IResource)object.getAdapter(IResource.class); if(resource == null) { XFilteredTree tree = getSubTree(object.getModel()); return XModelObjectConstants.SEPARATOR + EclipseResourceUtil.getProject(object).getName() + XModelObjectConstants.SEPARATOR + tree.getValue(object); } return (resource == null) ? "" : resource.getFullPath().toString(); //$NON-NLS-1$ } public void setConstraint(Object object) { Object[] os = (Object[])object; XAttribute a = (XAttribute)os[0]; XAttributeConstraintT tc = (XAttributeConstraintT)a.getConstraint(); String nature = tc.getProperties().getProperty("nature"); //$NON-NLS-1$ IProject[] ps = ModelPlugin.getWorkspace().getRoot().getProjects(); for (int i = 0; i < ps.length; i++) { if(!ps[i].isOpen()) continue; try { if(nature != null && !ps[i].hasNature(nature)) continue; } catch (CoreException e) { if(ModelPlugin.isDebugEnabled()){ ModelPlugin.getPluginLog().logInfo("AllResourcesTree:" + e.getMessage()); //$NON-NLS-1$ } continue; } IModelNature sp = EclipseResourceUtil.getModelNature(ps[i]); if(sp == null) continue; XModel model_i = sp.getModel(); XFilteredTree tree = createProjectTree(); tree.setModel(model_i); tree.setConstraint(object); if(tree.getRoot() == null) { continue; } trees.put(ps[i].getName(), tree); } } protected abstract XFilteredTree createProjectTree(); private XFilteredTree getSubTree(XModel model) { return trees.get(((IProject)model.getProperties().get(XModelObjectConstants.PROJECT)).getName()); } public XModelObject find(String value) { if(value == null || value.length() == 0) return root; if(value.indexOf("//") >= 0) { //$NON-NLS-1$ String pn = value.substring(1, value.indexOf("//")); //$NON-NLS-1$ XFilteredTree tree = trees.get(pn); return (tree == null) ? null : tree.getRoot().getModel().getByPath(value.substring(value.indexOf("//") + 1)); //$NON-NLS-1$ } if(value.indexOf(XModelObjectConstants.SEPARATOR, 1) < 0) return null; IResource r = ModelPlugin.getWorkspace().getRoot().getFolder(new Path(value)); if(r == null || !r.exists()) { //we can have both folders and files in tree //so if resource is not a folder, it still can be a file r = ModelPlugin.getWorkspace().getRoot().getFile(new Path(value)); } if(r == null || !r.exists()) return null; return EclipseResourceUtil.getObjectByResource(r); } public XModelObject getParent(XModelObject object) { if(object == root) return null; XFilteredTree tree = getSubTree(object.getModel()); if(tree == null) return null; if(tree.getRoot() == object) return root; XModelObject p = tree.getParent(object); if(p == tree.getRoot()) return p.getParent(); return p; } public String getPath(XModelObject object) { if(object == root) return ""; //$NON-NLS-1$ IResource resource = (IResource)object.getAdapter(IResource.class); return (resource == null) ? "" : resource.getFullPath().toString(); //$NON-NLS-1$ } public void dispose() { } }