/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.xmlui.configuration; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.xpath.XPath; /** * This class reads the XMLUI configuration file. * * @author Scott Phillips */ public class XMLUIConfiguration { /** log4j category */ private static Logger log = Logger.getLogger(XMLUIConfiguration.class); /** The configured Aspects */ private static List<Aspect> aspects = new ArrayList<Aspect>(); /** The configured Theme rules */ private static List<Theme> themes = new ArrayList<Theme>(); /** * Initialize the XMLUI Configuration. * * Load and parse the xmlui.xconf configuration file for a list of * installed aspects and themes. Multiple configuration paths may be * supplied but only the first valid file (exists and readable) will * be used. * * @param configPaths Multiple paths configuration paths may be specified */ public static void loadConfig(String ... configPaths) throws IOException, JDOMException { if (configPaths == null || configPaths.length == 0) { throw new IllegalStateException("The xmlui configuration path must be defined."); } File configFile = null; for (String configPath : configPaths ) { if (configPath != null) { configFile = new File(configPath); } if (configFile != null && configFile.exists() && configFile.canRead()) { log.info("Loading XMLUI configuration from: "+configPath); break; } else { log.debug("Faild to load XMLUI configuration from: "+configPath); } } if (configFile == null) { StringBuilder allPaths = new StringBuilder(); for (String configPath : configPaths) { if (allPaths.length() > 0) { allPaths.append(", "); } allPaths.append(configPath); } throw new IllegalStateException("None of the xmlui configuration paths were valid: "+ allPaths); } // FIXME: Sometime in the future require that the xmlui.xconf be valid. // SAXBuilder builder = new SAXBuilder(true); SAXBuilder builder = new SAXBuilder(); Document config = builder.build(configFile); @SuppressWarnings("unchecked") // This cast is correct List<Element> aspectElements = XPath.selectNodes(config, "//xmlui/aspects/aspect"); @SuppressWarnings("unchecked") // This cast is correct List<Element> themeElements = XPath.selectNodes(config, "//xmlui/themes/theme"); for (Element aspectElement : aspectElements) { String path = aspectElement.getAttributeValue("path"); String name = aspectElement.getAttributeValue("name"); if (path == null || path.length() == 0) { throw new IllegalStateException("All aspects muth define a path"); } aspects.add(new Aspect(name, path)); log.info("Aspect Installed: name='"+name+"', path='"+path+"'."); } // Put them in the order that people expect. Collections.reverse(aspects); for (Element themeElement : themeElements) { String name = themeElement.getAttributeValue("name"); String path = themeElement.getAttributeValue("path"); String id = themeElement.getAttributeValue("id"); String regex = themeElement.getAttributeValue("regex"); String handle = themeElement.getAttributeValue("handle"); if (path == null || path.length() == 0) { throw new IllegalStateException("All themes muth define a path"); } themes.add(new Theme(name, path, id, regex, handle)); log.info("Theme Installed: name='"+name+"', path='"+path+"', id='"+id+"', regex='"+regex+"', handle='"+handle+"'."); } } /** * * @return The configured Aspect chain. */ public static List<Aspect> getAspectChain() { return aspects; } /** * * @return The configured Theme rules. */ public static List<Theme> getThemeRules() { return themes; } }