/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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 org.apereo.portal.layout.simple; import java.util.Enumeration; import java.util.Set; import java.util.Vector; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apereo.portal.PortalException; import org.apereo.portal.layout.INodeIdResolver; import org.apereo.portal.layout.IUserLayout; import org.apereo.portal.layout.dlm.DistributedUserLayout; import org.apereo.portal.layout.node.IUserLayoutFolderDescription; import org.apereo.portal.layout.node.IUserLayoutNodeDescription; import org.apereo.portal.layout.node.UserLayoutNodeDescription; import org.apereo.portal.layout.om.IStylesheetUserPreferences; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * The simple user layout implementation. This layout is based on a Document. * * <p>Prior to uPortal 2.5, this class existed in the org.apereo.portal.layout package. It was moved * to its present package to reflect that it is part of the Simple Layout Management implementation. * */ public class SimpleLayout implements IUserLayout { private final DistributedUserLayout userLayout; private final Document layout; private final String layoutId; private final Log log = LogFactory.getLog(getClass()); public SimpleLayout(DistributedUserLayout userLayout, String layoutId) { this.userLayout = userLayout; this.layout = this.userLayout.getLayout(); this.layoutId = layoutId; } @Override public IUserLayoutNodeDescription getNodeDescription(String nodeId) throws PortalException { Element element = layout.getElementById(nodeId); return UserLayoutNodeDescription.createUserLayoutNodeDescription(element); } @Override public String getParentId(String nodeId) throws PortalException { String parentId = null; Element element = layout.getElementById(nodeId); if (element != null) { Node parent = element.getParentNode(); if (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) { Element parentE = (Element) parent; parentId = parentE.getAttribute("ID"); } } return parentId; } @Override public Enumeration getChildIds(String nodeId) throws PortalException { Vector v = new Vector(); IUserLayoutNodeDescription node = getNodeDescription(nodeId); if (node instanceof IUserLayoutFolderDescription) { Element element = layout.getElementById(nodeId); for (Node n = element.getFirstChild(); n != null; n = n.getNextSibling()) { if (n.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) n; if (e.getAttribute("ID") != null) { v.add(e.getAttribute("ID")); } } } } return v.elements(); } @Override public String getId() { return layoutId; } /* (non-Javadoc) * @see org.apereo.portal.layout.IUserLayout#findNodeId(javax.xml.xpath.XPathExpression) */ @Override public String findNodeId(XPathExpression xpathExpression) throws PortalException { try { return xpathExpression.evaluate(this.layout); } catch (XPathExpressionException e) { throw new PortalException( "Exception while executing XPathExpression: " + xpathExpression, e); } } @Override public String findNodeId(INodeIdResolver finder) { return finder.traverseDocument(this.layout); } @Override public String getRootId() { String rootNode = null; try { String expression = "/layout/folder"; XPathFactory fac = XPathFactory.newInstance(); XPath xpath = fac.newXPath(); Element rootNodeE = (Element) xpath.evaluate(expression, layout, XPathConstants.NODE); rootNode = rootNodeE.getAttribute("ID"); } catch (Exception e) { log.error("Error getting root id.", e); } return rootNode; } @Override public IStylesheetUserPreferences getDistributedStructureStylesheetUserPreferences() { return this.userLayout.getDistributedStructureStylesheetUserPreferences(); } @Override public IStylesheetUserPreferences getDistributedThemeStylesheetUserPreferences() { return this.userLayout.getDistributedThemeStylesheetUserPreferences(); } }