blob: 127904117d97970820d01fb183cb4cbe5d1e45d4 [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.oodt.cas.product.jaxrs.configurations;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Vector;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.apache.oodt.cas.metadata.Metadata;
import org.apache.oodt.cas.metadata.util.PathUtils;
import org.apache.oodt.commons.xml.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* Class representing custom configurations for RSS XML outputs.
* @author rlaidlaw
* @version $Revision$
*/
public class RssConfiguration
{
private static final String CHANNEL_LINK = "channelLink";
private static final String NAMESPACE = "namespace";
private static final String NAMESPACE_KEY = "prefix";
private static final String NAMESPACE_VALUE = "uri";
private static final String TAG = "tag";
private static final String TAG_NAME = "name";
private static final String TAG_SOURCE = "source";
private static final String ATTRIBUTE = "attribute";
private static final String ATTRIBUTE_NAME = "name";
private static final String ATTRIBUTE_VALUE = "value";
private List<RssNamespace> namespaceList = new Vector<RssNamespace>();
private List<RssTag> tagList = new Vector<RssTag>();
private String channelLink = null;
/**
* Initializes the parameters in the configuration object using values from
* the supplied file.
* @param file the configuration file
* @throws IOException if the file does not exist and cannot be read
*/
public void initialize(File file) throws IOException
{
FileInputStream fis = new FileInputStream(file);
Document document = XMLUtils.getDocumentRoot(fis);
Element root = document.getDocumentElement();
channelLink = root.getAttribute(CHANNEL_LINK);
namespaceList = readNamespaces(root);
tagList = readTags(root);
fis.close();
}
private List<RssNamespace> readNamespaces(Element root)
{
List<RssNamespace> namespaces = new Vector<RssNamespace>();
NodeList nodeList = root.getElementsByTagName(NAMESPACE);
if (nodeList != null && nodeList.getLength() > 0)
{
for (int i = 0; i < nodeList.getLength(); i++)
{
Element element = (Element) nodeList.item(i);
namespaces.add(new RssNamespace(element.getAttribute(NAMESPACE_KEY),
element.getAttribute(NAMESPACE_VALUE)));
}
}
return namespaces;
}
private List<RssTag> readTags(Element root)
{
List<RssTag> tags = new Vector<RssTag>();
NodeList list = root.getElementsByTagName(TAG);
if (list != null && list.getLength() > 0)
{
for (int i = 0; i < list.getLength(); i++)
{
Element element = (Element) list.item(i);
tags.add(new RssTag(element.getAttribute(TAG_NAME),
element.getAttribute(TAG_SOURCE), readAttributes(element)));
}
}
return tags;
}
private List<RssTagAttribute> readAttributes(Element element)
{
List<RssTagAttribute> attributes = new Vector<RssTagAttribute>();
NodeList nodeList = element.getElementsByTagName(ATTRIBUTE);
if (nodeList != null && nodeList.getLength() > 0)
{
for (int i = 0; i < nodeList.getLength(); i++)
{
Element attribute = (Element) nodeList.item(i);
attributes.add(new RssTagAttribute(
attribute.getAttribute(ATTRIBUTE_NAME),
attribute.getAttribute(ATTRIBUTE_VALUE)));
}
}
return attributes;
}
/**
* Gets the list of namespaces.
* @return the list of namespaces
*/
public List<RssNamespace> getNamespaceList()
{
return namespaceList;
}
/**
* Gets the channel link URL string.
* @return the channel link URL string
*/
public String getChannelLink()
{
return channelLink;
}
/**
* Appends elements (tags) defined in a configuration file to a specific
* parent element.
* @param metadata the metadata for the product
* @param document the document to which these elements belong
* @param parent the parent element to attach these elements to
*/
public void appendTags(Metadata metadata, Document document,
Element parent)
{
for (RssTag tag : tagList)
{
String tagName = tag.getName();
if (tagName.indexOf(" ") != -1) {
tagName = StringUtils.join(WordUtils.capitalizeFully(tagName).split(
" "));
}
// Create a new element for the tag.
Element element = XMLUtils.addNode(document, parent, tagName);
// Add a value for the tag from the tag source.
if (tag.getSource() != null)
{
element.appendChild(document.createTextNode(StringEscapeUtils.escapeXml(PathUtils
.replaceEnvVariables(tag.getSource(), metadata))));
}
// Add attributes to the tag as defined in the configuration.
for (RssTagAttribute attribute : tag.getAttributes())
{
element.setAttribute(attribute.getName(), PathUtils.replaceEnvVariables(
attribute.getValue(), metadata));
}
}
}
}