/******************************************************************************* * 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.IResource; import org.jboss.tools.common.meta.XChild; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.event.XModelTreeEvent; import org.jboss.tools.common.model.filesystems.FileSystemsHelper; import org.jboss.tools.common.model.filesystems.impl.FileSystemsImpl; import org.jboss.tools.common.model.filesystems.impl.FileSystemsLoader; import org.jboss.tools.common.model.impl.*; public class JSFProjectResourceBundles extends JSFProjectFolder { private static final long serialVersionUID = 6050376048898424153L; Iterator<XModelObject> roots = null; public void invalidate() { if(!valid || isLoading) return; valid = false; fireStructureChanged(XModelTreeEvent.STRUCTURE_CHANGED, this); } public void set(String name, String value) { if("invalidate".equals(name)) { if("true".equals(value)) invalidate(); } else { super.set(name, value); } } public XModelObject[] getTreeChildren() { if(isLoading || valid) return treeChildren; isLoading = true; valid = true; try { roots = getRoots(); List<XModelObject> list = collect(roots); treeChildren = list.toArray(new XModelObject[0]); } finally { isLoading = false; } EntityComparator c = new EntityComparator(new XChild[0]); Arrays.sort(treeChildren, c); return treeChildren; } protected Iterator<XModelObject> getRoots() { List<XModelObject> list = new ArrayList<XModelObject>(); FileSystemsImpl fs = (FileSystemsImpl)FileSystemsHelper.getFileSystems(getModel()); new FileSystemsLoader().updateSrcs(fs); XModelObject[] cs = FileSystemsHelper.getFileSystems(getModel()).getChildren("FileSystemFolder"); for (int i = 0; i < cs.length; i++) { String n = cs[i].getAttributeValue("name"); if(n.startsWith("src") || n.startsWith("lib-")) list.add(cs[i]); } XModelObject web = getModel().getByPath("Web"); XModelObject[] ms = (web == null) ? new XModelObject[0] : web.getChildren("WebJSFModule"); if(ms.length > 0) { String s = ms[0].getAttributeValue("src file system"); if(s == null || s.length() == 0 || "src".equals(s)) return list.iterator(); StringTokenizer st = new StringTokenizer(s, ","); while(st.hasMoreTokens()) { String t = st.nextToken().trim(); if(t.length() == 0 || "src".equals(t)) continue; XModelObject r = FileSystemsHelper.getFileSystem(getModel(), t); if(r != null) list.add(r); } } return list.iterator(); } protected List<XModelObject> collect(Iterator<XModelObject> rs) { List<XModelObject> list = new ArrayList<XModelObject>(); while(rs.hasNext()) { collect(list, rs.next()); } return list; } protected void collect(List<XModelObject> l, XModelObject o) { if(o.getFileType() == XModelObject.FILE) { if(acceptFile(o)) l.add(o); } else if(o.getFileType() > XModelObject.FILE) { XModelObject[] cs = o.getChildren(); for (int i = 0; i < cs.length; i++) collect(l, cs[i]); } } protected boolean acceptFile(XModelObject o) { return "FilePROPERTIES".equals(o.getModelEntity().getName()); } public Object getAdapter(Class adapter) { if(adapter == IResource.class) { if(roots == null) roots = getRoots(); Iterator rs = roots; while(rs.hasNext()) { XModelObject r = (XModelObject)rs.next(); Object a = r.getAdapter(adapter); if(a != null) return a; } return null; } return super.getAdapter(adapter); } public XModelObject getTreeParent(XModelObject object) { if(!acceptFile(object)) return null; return (isChild(object)) ? this : null; } }