/* * � Copyright IBM Corp. 2011 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.ibm.xsp.extlib.designer.tooling.panels.model; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.ibm.commons.iloader.node.DataNode; import com.ibm.commons.iloader.node.IAttribute; import com.ibm.commons.iloader.node.ICollection; import com.ibm.commons.iloader.node.IMember; import com.ibm.commons.iloader.node.IObjectCollection; import com.ibm.commons.iloader.node.NodeException; import com.ibm.commons.iloader.node.collections.SingleCollection; import com.ibm.commons.util.StringUtil; import com.ibm.designer.domino.xsp.api.util.XPagesDOMUtil; import com.ibm.xsp.extlib.designer.tooling.utils.ExtLibToolingLogger; import com.ibm.xsp.extlib.tree.ITreeNode; import com.ibm.xsp.registry.FacesContainerProperty; import com.ibm.xsp.registry.FacesDefinition; import com.ibm.xsp.registry.FacesProperty; import com.ibm.xsp.registry.FacesRegistry; /** * @author doconnor * */ public class LinkContentProvider implements ITreeContentProvider { private String attrToFilter = null; private DataNode dn = null; private FacesRegistry registry = null; public LinkContentProvider(String attr, FacesRegistry registry){ this.attrToFilter = attr; this.registry = registry; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ public Object[] getChildren(Object parent) { if(parent instanceof Element && registry != null){ Element element = (Element)parent; FacesDefinition definition = registry.findDef(element.getNamespaceURI(), element.getLocalName()); Collection<String> names = definition.getPropertyNames(); List<Object> children = new ArrayList<Object>(); for(String name : names){ FacesProperty prop = definition.getProperty(name); if(prop instanceof FacesContainerProperty){ FacesContainerProperty cp = (FacesContainerProperty)prop; if(cp.getItemProperty() != null){ FacesProperty fp = cp.getItemProperty(); if(fp.getJavaClass().isAssignableFrom(ITreeNode.class)){ DataNode tmp = new DataNode(); try { tmp.setClassDef(dn.getClassDef().getLoader().getClassOf(element)); } catch (NodeException e) { if(ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.isErrorEnabled()){ ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.error(e, "Failed to get class definition for tag {0}", element.getTagName()); // $NLE-LinkContentProvider.Failedtogetclassdefinitionfortag0-1$ } } tmp.setDataProvider(new SingleCollection(element)); IMember member = tmp.getMember(name); if(member instanceof ICollection){ ICollection col = (ICollection)member; if(col.getType()==IAttribute.TYPE_OBJECT) { IObjectCollection values = null; try { values = dn.getLoader().getObjectCollection(tmp.getCurrentObject(), col); } catch (NodeException e) { ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.error(e, "Error retrieving collection from data node. "); // $NLE-LinkContentProvider.Errorretrievingcollectionfromdata-1$ } if(values != null){ for(int i = 0; i < values.size(); i++){ children.add(values.get(i)); } } } } } } } } return children.toArray(new Object[0]); } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object root) { if(root instanceof DataNode){ DataNode dn = (DataNode)root; IMember member = dn.getMember(attrToFilter); if(member instanceof ICollection){ ICollection col = (ICollection)member; if(col.getType()==IAttribute.TYPE_OBJECT) { IObjectCollection values = null; try { values = dn.getLoader().getObjectCollection(dn.getCurrentObject(), col); } catch (NodeException e) { if(ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.isErrorEnabled()){ ExtLibToolingLogger.EXT_LIB_TOOLING_LOGGER.error(e, StringUtil.format("Failed to get children for {0}", dn.getClassDef().getDisplayName())); // $NLE-LinkContentProvider.Failedtogetchildrenfor-1$ } } if(values != null){ Object[] vals = new Object[values.size()]; for(int i = 0; i < values.size(); i++){ vals[i] = values.get(i); } return vals; } } } } return new Object[0]; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ public Object getParent(Object arg0) { return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ public boolean hasChildren(Object parent) { if(parent instanceof Element && registry != null){ Element element = (Element)parent; FacesDefinition definition = registry.findDef(element.getNamespaceURI(), element.getLocalName()); if (definition != null) { Collection<String> names = definition.getPropertyNames(); for(String name : names){ FacesProperty prop = definition.getProperty(name); if(prop instanceof FacesContainerProperty){ FacesContainerProperty cp = (FacesContainerProperty)prop; if(cp.getItemProperty() != null){ FacesProperty fp = cp.getItemProperty(); if(fp.getJavaClass().isAssignableFrom(ITreeNode.class)){ Element e = XPagesDOMUtil.getAttributeElement(element, name); if(e != null){ // at this point, we have a <this.children> element... // return true; // GGRD8UAP4U - check if <this.children> has children NodeList childrenNodes = e.getChildNodes(); if (null != childrenNodes && childrenNodes.getLength() > 0) { // does it have any non-text children? boolean hasChildElement = false; for (int i = 0; i < childrenNodes.getLength() && !hasChildElement; i++) { Node node = childrenNodes.item(i); hasChildElement = (node.getNodeType() == Node.ELEMENT_NODE); } if (hasChildElement) { return true; } } } } } } } } } return false; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { if(newInput instanceof DataNode){ this.dn = (DataNode)newInput; } } }