/******************************************************************************* * 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.jsf.model.pv; import java.util.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.CoreException; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.XModelObjectConstants; import org.jboss.tools.common.model.event.XModelTreeEvent; import org.jboss.tools.common.model.filesystems.FileSystemsHelper; import org.jboss.tools.common.model.impl.ExtraRootImpl; import org.jboss.tools.common.model.util.*; import org.jboss.tools.jsf.JSFModelPlugin; import org.jboss.tools.jst.web.model.helpers.WebAppHelper; import org.jboss.tools.jst.web.model.pv.WebProjectNode; public class JSFProjectsRoot extends ExtraRootImpl implements WebProjectNode { private static final long serialVersionUID = 2682624545624629547L; XModelObject fs; XModelObject webroot = null; XModelObject webxml = null; XModelObject[] treeChildren = new XModelObject[0]; protected void onSetEntity(String entity) { super.onSetEntity(entity); getFileSystems(); getModel().addModelTreeListener(new JsfTreeListener()); } public boolean isLoaded() { return children != null && !children.isEmpty(); } public XModelObject getFileSystems() { if(fs == null) { fs = FileSystemsHelper.getFileSystems(getModel()); webxml = WebAppHelper.getWebApp(getModel()); if(fs != null) webroot = fs.getChildByPath("WEB-ROOT"); } return fs; } public String get(String name) { if("_hasErrors_".equals(name)) { return (fs == null) ? "yes" : fs.get(name); } return super.get(name); } public XModelObject getWebXML() { return webxml; } public boolean hasChildren() { return true; } protected void loadChildren() { if(!isLoaded()) { XModelObjectLoaderUtil.addRequiredChildren(this); } } public String getPresentationString() { if(getFileSystems() == null) return ""; return getFileSystems().getPresentationString(); } public boolean isActive() { return getFileSystems() != null && getFileSystems().isActive(); } public XModelObject[] getTreeChildren() { fs = FileSystemsHelper.getFileSystems(getModel()); if(fs == null) return new XModelObject[0]; webroot = fs.getChildByPath("WEB-ROOT"); webxml = WebAppHelper.getWebApp(getModel()); List<XModelObject> list = new ArrayList<XModelObject>(); if(webroot != null) list.add(webroot); XModelObject[] ss = fs.getChildren("FileSystemFolder"); for (XModelObject s: ss) { if(s.getAttributeValue(XModelObjectConstants.ATTR_NAME).startsWith("WEB-ROOT-")) { list.add(s); } } XModelObject[] cs = getChildren(); for (int i = 0; i < cs.length; i++) list.add(cs[i]); if(webxml != null) list.add(webxml); treeChildren = list.toArray(new XModelObject[0]); return treeChildren; } public boolean isChild(XModelObject object) { for (int i = 0; i < treeChildren.length; i++) if(treeChildren[i] == object) return true; return false; } public XModelObject getTreeParent(XModelObject object) { if(treeChildren.length == 0) getTreeChildren(); if(isChild(object)) return this; XModelObject[] cs = getChildren(); for (int i = 0; i < cs.length; i++) { if(cs[i] instanceof WebProjectNode) { WebProjectNode n = (WebProjectNode)cs[i]; if(n.isChild(object)) return n.getTreeParent(object); } } return object.getParent(); } public void invalidate() { if(!isLoaded()) return; XModelObject[] cs = getChildren(); for (int i = 0; i < cs.length; i++) { WebProjectNode n = (WebProjectNode)cs[i]; n.invalidate(); } fireStructureChanged(XModelTreeEvent.STRUCTURE_CHANGED, this); } public Object getAdapter(Class adapter) { return (fs != null) ? fs.getAdapter(adapter) : super.getAdapter(adapter); } public int getErrorState() { if(org.jboss.tools.common.model.project.WatcherLoader.isLocked(getModel())) return 0; if(!isLoaded()) { IProject p = EclipseResourceUtil.getProject(fs); if(p != null && p.exists() && p.isAccessible()) try { IMarker[] ms = p.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); if(ms != null && ms.length > 0) { for (int i = 0; i < ms.length; i++) { if(ms[i].getAttribute(IMarker.SEVERITY, 0) == IMarker.SEVERITY_ERROR) return 2; } } return 0; } catch (CoreException e) { JSFModelPlugin.getPluginLog().logError(e); return 0; } } getTreeChildren(); if(webxml == null || webxml.getErrorState() != 0 || webxml.getErrorChildCount() > 0) { setErrorState(webxml == null ? 2 : webxml.getErrorState()); } else { setErrorState(0); } return super.getErrorState(); } }