blob: f4a5ff1c100d62b814ade0f5a96b244761f42fa7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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
*
* 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 org.apache.cocoon.bean.helpers;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.cocoon.bean.CocoonBean;
import org.apache.cocoon.bean.helpers.OutputStreamListener;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.BooleanUtils;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Static class for configuring a CocoonBean from a DOM Document object
*
* @author <a href="mailto:uv@upaya.co.uk">Upayavira</a>
* @version CVS $Id$
*/
public class BeanConfigurator {
private static final String NODE_ROOT = "cocoon";
private static final String ATTR_VERBOSE = "verbose";
private static final String NODE_LOGGING = "logging";
private static final String ATTR_LOG_KIT = "log-kit";
private static final String ATTR_LOG_LEVEL = "level";
private static final String ATTR_LOGGER = "logger";
private static final String NODE_CONTEXT_DIR = "context-dir";
private static final String NODE_DEST_DIR = "dest-dir";
private static final String NODE_WORK_DIR = "work-dir";
private static final String NODE_CONFIG_FILE = "config-file";
private static final String NODE_URI_FILE = "uri-file";
private static final String NODE_CHECKSUMS_URI = "checksums-uri";
private static final String ATTR_CONTEXT_DIR = "context-dir";
private static final String ATTR_DEST_DIR = "dest-dir";
private static final String ATTR_WORK_DIR = "work-dir";
private static final String ATTR_CONFIG_FILE = "config-file";
private static final String ATTR_URI_FILE = "uri-file";
private static final String ATTR_CHECKSUMS_URI = "checksums-uri";
private static final String ATTR_AGENT = "user-agent";
private static final String ATTR_ACCEPT = "accept";
private static final String ATTR_DEFAULT_FILENAME = "default-filename";
private static final String NODE_BROKEN_LINKS = "broken-links";
private static final String ATTR_BROKEN_LINK_REPORT_TYPE = "type";
private static final String ATTR_BROKEN_LINK_REPORT_FILE = "file";
private static final String ATTR_BROKEN_LINK_GENERATE = "generate";
private static final String ATTR_BROKEN_LINK_EXTENSION = "extension";
private static final String NODE_AGENT = "user-agent";
private static final String NODE_ACCEPT = "accept";
private static final String ATTR_FOLLOW_LINKS = "follow-links";
private static final String ATTR_PRECOMPILE_ONLY = "precompile-only";
private static final String ATTR_CONFIRM_EXTENSIONS = "confirm-extensions";
private static final String NODE_LOAD_CLASS = "load-class";
private static final String NODE_DEFAULT_FILENAME = "default-filename";
private static final String NODE_INCLUDE = "include";
private static final String NODE_EXCLUDE = "exclude";
private static final String ATTR_INCLUDE_EXCLUDE_PATTERN = "pattern";
private static final String NODE_INCLUDE_LINKS = "include-links";
private static final String ATTR_LINK_EXTENSION = "extension";
private static final String NODE_URI = "uri";
private static final String ATTR_URI_TYPE = "type";
private static final String ATTR_URI_SOURCEPREFIX = "src-prefix";
private static final String ATTR_URI_SOURCEURI = "src";
private static final String ATTR_URI_DESTURI = "dest";
private static final String NODE_URIS = "uris";
private static final String ATTR_NAME = "name";
public static String configure(Document xconf, CocoonBean cocoon, String destDir, String uriGroup, OutputStreamListener listener)
throws IllegalArgumentException {
Node root = xconf.getDocumentElement();
if (!NODE_ROOT.equals(root.getNodeName())) {
throw new IllegalArgumentException("Expected root node of "+ NODE_ROOT);
}
if (hasAttribute(root, ATTR_VERBOSE)) {
cocoon.setVerbose(getBooleanAttributeValue(root, ATTR_VERBOSE));
}
if (hasAttribute(root, ATTR_FOLLOW_LINKS)) {
cocoon.setFollowLinks(getBooleanAttributeValue(root, ATTR_FOLLOW_LINKS));
}
if (hasAttribute(root, ATTR_PRECOMPILE_ONLY)) {
cocoon.setPrecompileOnly(getBooleanAttributeValue(root, ATTR_PRECOMPILE_ONLY));
}
if (hasAttribute(root, ATTR_CONFIRM_EXTENSIONS)) {
cocoon.setConfirmExtensions(getBooleanAttributeValue(root, ATTR_CONFIRM_EXTENSIONS));
}
if (hasAttribute(root, ATTR_CONTEXT_DIR)) {
cocoon.setContextDir(getAttributeValue(root, ATTR_CONTEXT_DIR));
}
if (hasAttribute(root, ATTR_DEST_DIR)) {
destDir = getAttributeValue(root, ATTR_DEST_DIR);
}
if (hasAttribute(root, ATTR_WORK_DIR)) {
cocoon.setWorkDir(getAttributeValue(root, ATTR_WORK_DIR));
}
if (hasAttribute(root, ATTR_CONFIG_FILE)) {
cocoon.setConfigFile(getAttributeValue(root, ATTR_CONFIG_FILE));
}
if (hasAttribute(root, ATTR_URI_FILE)) {
cocoon.addTargets(processURIFile(getAttributeValue(root, ATTR_URI_FILE)), destDir);
}
if (hasAttribute(root, ATTR_CHECKSUMS_URI)) {
cocoon.setChecksumURI(getAttributeValue(root, ATTR_CHECKSUMS_URI));
}
if (hasAttribute(root, ATTR_AGENT)) {
cocoon.setAgentOptions(getAttributeValue(root, ATTR_AGENT));
}
if (hasAttribute(root, ATTR_ACCEPT)) {
cocoon.setAcceptOptions(getAttributeValue(root, ATTR_ACCEPT));
}
if (hasAttribute(root, ATTR_DEFAULT_FILENAME)) {
cocoon.setDefaultFilename(getAttributeValue(root, ATTR_DEFAULT_FILENAME));
}
if (destDir == null || destDir.length() == 0) {
destDir = getNodeValue(root, NODE_DEST_DIR);
}
NodeList nodes = root.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if (node.getNodeType()== Node.ELEMENT_NODE) {
String nodeName = node.getNodeName();
if (nodeName.equals(NODE_BROKEN_LINKS)) {
parseBrokenLinkNode(cocoon, node, listener);
} else if (nodeName.equals(NODE_LOAD_CLASS)) {
cocoon.addLoadedClass(getNodeValue(node));
} else if (nodeName.equals(NODE_LOGGING)) {
parseLoggingNode(cocoon, node);
} else if (nodeName.equals(NODE_CONTEXT_DIR)) {
if (hasAttribute(root, ATTR_CONTEXT_DIR)) {
throw new IllegalArgumentException("Cannot have "+NODE_CONTEXT_DIR+" as both element and attribute");
} else {
cocoon.setContextDir(getNodeValue(node));
}
} else if (nodeName.equals(NODE_CONFIG_FILE)) {
if (hasAttribute(root, ATTR_CONFIG_FILE)) {
throw new IllegalArgumentException("Cannot have "+NODE_CONFIG_FILE+" as both element and attribute");
} else {
cocoon.setConfigFile(getNodeValue(node));
}
} else if (nodeName.equals(NODE_DEST_DIR)) {
// Ignore
} else if (nodeName.equals(NODE_WORK_DIR)) {
if (hasAttribute(root, ATTR_WORK_DIR)) {
throw new IllegalArgumentException("Cannot have "+NODE_WORK_DIR+" as both element and attribute");
} else {
cocoon.setWorkDir(getNodeValue(node));
}
} else if (nodeName.equals(NODE_CHECKSUMS_URI)) {
if (hasAttribute(root, ATTR_CHECKSUMS_URI)) {
throw new IllegalArgumentException("Cannot have "+NODE_CHECKSUMS_URI+" as both element and attribute");
} else {
cocoon.setChecksumURI(getNodeValue(node));
}
} else if (nodeName.equals(NODE_AGENT)) {
cocoon.setAgentOptions(getNodeValue(node));
} else if (nodeName.equals(NODE_ACCEPT)) {
cocoon.setAcceptOptions(getNodeValue(node));
} else if (nodeName.equals(NODE_DEFAULT_FILENAME)) {
cocoon.setDefaultFilename(getNodeValue(node));
} else if (nodeName.equals(NODE_INCLUDE)) {
String pattern = parseIncludeExcludeNode(cocoon, node, NODE_INCLUDE);
cocoon.addIncludePattern(pattern);
} else if (nodeName.equals(NODE_EXCLUDE)) {
String pattern = parseIncludeExcludeNode(cocoon, node, NODE_EXCLUDE);
cocoon.addExcludePattern(pattern);
} else if (nodeName.equals(NODE_INCLUDE_LINKS)) {
parseIncludeLinksNode(cocoon, node);
} else if (nodeName.equals(NODE_URI)) {
parseURINode(cocoon, node, destDir);
} else if (nodeName.equals(NODE_URIS)) {
parseURIsNode(cocoon, node, destDir, uriGroup);
} else if (nodeName.equals(NODE_URI_FILE)) {
if (hasAttribute(root, ATTR_URI_FILE)) {
throw new IllegalArgumentException("Cannot have "+NODE_URI_FILE+" as both element and attribute");
} else {
cocoon.addTargets(processURIFile(getNodeValue(node)), destDir);
}
} else {
throw new IllegalArgumentException("Unknown element: <" + nodeName + ">");
}
}
}
return destDir;
}
private static void parseLoggingNode(CocoonBean cocoon, Node node) throws IllegalArgumentException {
if (hasAttribute(node, ATTR_LOG_KIT)) {
cocoon.setLogKit(getAttributeValue(node, ATTR_LOG_KIT));
}
if (hasAttribute(node, ATTR_LOGGER)) {
cocoon.setLogger(getAttributeValue(node, ATTR_LOGGER));
}
if (hasAttribute(node, ATTR_LOG_LEVEL)) {
cocoon.setLogLevel(getAttributeValue(node, ATTR_LOG_LEVEL));
}
NodeList nodes = node.getChildNodes();
if (nodes.getLength()!=0) {
throw new IllegalArgumentException("Unexpected children of <" + NODE_LOGGING + "> node");
}
}
private static void parseIncludeLinksNode(CocoonBean cocoon, Node node) throws IllegalArgumentException {
if (hasAttribute(node, ATTR_LINK_EXTENSION)) {
cocoon.addIncludeLinkExtension(getAttributeValue(node, ATTR_LINK_EXTENSION));
}
}
private static void parseBrokenLinkNode(CocoonBean cocoon, Node node, OutputStreamListener listener) throws IllegalArgumentException {
if (hasAttribute(node, ATTR_BROKEN_LINK_REPORT_FILE)) {
listener.setReportFile(getAttributeValue(node, ATTR_BROKEN_LINK_REPORT_FILE));
}
if (hasAttribute(node, ATTR_BROKEN_LINK_REPORT_TYPE)) {
listener.setReportType(getAttributeValue(node, ATTR_BROKEN_LINK_REPORT_TYPE));
}
if (hasAttribute(node, ATTR_BROKEN_LINK_GENERATE)) {
cocoon.setBrokenLinkGenerate(getBooleanAttributeValue(node, ATTR_BROKEN_LINK_GENERATE));
}
if (hasAttribute(node, ATTR_BROKEN_LINK_EXTENSION)) {
cocoon.setBrokenLinkExtension(getAttributeValue(node, ATTR_BROKEN_LINK_EXTENSION));
}
NodeList nodes = node.getChildNodes();
if (nodes.getLength()!=0) {
throw new IllegalArgumentException("Unexpected children of <" + NODE_BROKEN_LINKS + "> node");
}
}
private static String parseIncludeExcludeNode(CocoonBean cocoon, Node node, final String NODE_TYPE) throws IllegalArgumentException {
NodeList nodes = node.getChildNodes();
if (nodes.getLength() != 0) {
throw new IllegalArgumentException("Unexpected children of <" + NODE_INCLUDE + "> node");
}
if (hasAttribute(node, ATTR_INCLUDE_EXCLUDE_PATTERN)) {
return getAttributeValue(node, ATTR_INCLUDE_EXCLUDE_PATTERN);
} else {
throw new IllegalArgumentException("Expected a "+ATTR_INCLUDE_EXCLUDE_PATTERN+" attribute for <"+NODE_TYPE+"> node");
}
}
private static void parseURIsNode(CocoonBean cocoon, Node node, String destDir, String uriGroup) throws IllegalArgumentException {
boolean followLinks = cocoon.followLinks();
boolean confirmExtensions = cocoon.confirmExtensions();
String logger = cocoon.getLoggerName();
String destURI = destDir;
String root = null;
String type = null;
String name = null;
if (hasAttribute(node, ATTR_FOLLOW_LINKS)) {
followLinks = getBooleanAttributeValue(node, ATTR_FOLLOW_LINKS);
}
if (hasAttribute(node, ATTR_CONFIRM_EXTENSIONS)) {
confirmExtensions = getBooleanAttributeValue(node, ATTR_CONFIRM_EXTENSIONS);
}
if (hasAttribute(node, ATTR_URI_TYPE)) {
type = getAttributeValue(node, ATTR_URI_TYPE);
}
if (hasAttribute(node, ATTR_URI_SOURCEPREFIX)) {
root = getAttributeValue(node, ATTR_URI_SOURCEPREFIX);
}
if (hasAttribute(node, ATTR_URI_DESTURI)) {
destURI = getAttributeValue(node, ATTR_URI_DESTURI);
}
if (hasAttribute(node, ATTR_LOGGER)) {
logger = getAttributeValue(node, ATTR_LOGGER);
}
if (hasAttribute(node, ATTR_NAME)) {
name = getAttributeValue(node, ATTR_NAME);
if (name != null && uriGroup != null && !name.equals(uriGroup)) {
// The user has not selected this URI group, so ignore it.
return;
}
}
NodeList nodes = node.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
Node child = nodes.item(i);
if (child.getNodeType()== Node.ELEMENT_NODE) {
String childName = child.getNodeName();
if (childName.equals(NODE_URI)) {
String _sourceURI = null;
String _destURI = destURI;
String _root = root;
String _type = type;
if (child.getAttributes().getLength() == 0) {
_sourceURI = getNodeValue(child);
//destURI is inherited
} else {
_sourceURI = getAttributeValue(child, ATTR_URI_SOURCEURI);
if (hasAttribute(child, ATTR_URI_TYPE)) {
_type = getAttributeValue(child, ATTR_URI_TYPE);
}
if (hasAttribute(child, ATTR_URI_SOURCEPREFIX)) {
_root = getAttributeValue(child, ATTR_URI_SOURCEPREFIX);
}
if (hasAttribute(child, ATTR_URI_DESTURI)) {
_destURI = getAttributeValue(child, ATTR_URI_DESTURI);
}
}
cocoon.addTarget(_type, _root, _sourceURI, _destURI, followLinks, confirmExtensions, logger);
} else {
throw new IllegalArgumentException("Unknown element: <" + childName + ">");
}
}
}
}
private static void parseURINode(CocoonBean cocoon, Node node, String destDir) throws IllegalArgumentException {
NodeList nodes = node.getChildNodes();
if (node.getAttributes().getLength() == 0 && nodes.getLength() != 0) {
cocoon.addTarget(getNodeValue(node), destDir);
} else if (node.getAttributes().getLength() !=0 && nodes.getLength() ==0){
String src = getAttributeValue(node, ATTR_URI_SOURCEURI);
String type = null;
if (hasAttribute(node, ATTR_URI_TYPE)) {
type = getAttributeValue(node, ATTR_URI_TYPE);
}
String root = null;
if (hasAttribute(node, ATTR_URI_SOURCEPREFIX)) {
root = getAttributeValue(node, ATTR_URI_SOURCEPREFIX);
}
String dest = null;
if (hasAttribute(node, ATTR_URI_DESTURI)) {
dest = getAttributeValue(node, ATTR_URI_DESTURI);
}
if (root != null && type != null && dest != null) {
cocoon.addTarget(type, root, src, dest);
} else if (root != null && dest != null) {
cocoon.addTarget(root, src, dest);
} else if (dest != null) {
cocoon.addTarget(src, dest);
} else {
cocoon.addTarget(src, destDir);
}
} else if (node.getAttributes().getLength() !=0 && nodes.getLength() != 0) {
throw new IllegalArgumentException("Unexpected children of <" + NODE_URI + "> node");
} else {
throw new IllegalArgumentException("Not enough information for <"+ NODE_URI + "> node");
}
}
private static String getNodeValue(Node root, String name) throws IllegalArgumentException {
NodeList nodes = root.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if (node.getNodeType()== Node.ELEMENT_NODE) {
String nodeName = node.getNodeName();
if (nodeName.equals(name)) {
return getNodeValue(node);
}
}
}
return null;
}
private static String getNodeValue(Node node) throws IllegalArgumentException {
StringBuffer s = new StringBuffer();
NodeList children = node.getChildNodes();
boolean found = false;
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.TEXT_NODE) {
s.append(child.getNodeValue());
found = true;
} else {
throw new IllegalArgumentException("Unexpected node:" + child.getLocalName());
}
}
if (!found) {
throw new IllegalArgumentException("Expected value for " + node.getLocalName() + " node");
}
return s.toString();
}
private static String getAttributeValue(Node node, String attr) throws IllegalArgumentException {
NamedNodeMap nodes = node.getAttributes();
if (nodes != null) {
Node attribute = nodes.getNamedItem(attr);
if (attribute != null && attribute.getNodeValue() != null) {
return attribute.getNodeValue();
}
}
throw new IllegalArgumentException("Missing " + attr + " attribute on <" + node.getNodeName() + "> node");
}
private static boolean hasAttribute(Node node, String attr) {
NamedNodeMap nodes = node.getAttributes();
if (nodes != null) {
Node attribute = nodes.getNamedItem(attr);
return (attribute != null);
}
return false;
}
private static boolean getBooleanAttributeValue(Node node, String attr) {
NamedNodeMap nodes = node.getAttributes();
if (nodes != null) {
Node attribute = nodes.getNamedItem(attr);
if (attribute != null) {
String value = attribute.getNodeValue();
return BooleanUtils.toBoolean(value);
}
}
return false;
}
/**
* <code>processURIFile</code> method.
*
* @param filename a <code>String</code> value
* @return uris a <code>List</code> of URIs
*/
public static List processURIFile(String filename) {
List uris = new ArrayList();
FileReader fr = null;
BufferedReader uriFile = null;
try {
fr = new FileReader(filename);
uriFile = new BufferedReader(fr);
String uri;
while ((uri = uriFile.readLine()) != null) {
uri = uri.trim();
if (!uri.equals("") && !uri.startsWith("#")) {
uris.add(uri.trim());
}
}
} catch (FileNotFoundException e) {
// nothing to do
} catch (IOException e) {
// nothing to do
} finally {
IOUtils.closeQuietly(uriFile);
IOUtils.closeQuietly(fr);
}
return uris;
}
}