blob: 65150dd18eb57b06823894ef1ec824c1dc5b25ab [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.rss;
//JDK imports
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.util.List;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Logger;
import java.util.logging.Level;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.text.ParseException;
//OODT imports
import static org.apache.oodt.cas.product.rss.RSSConfigMetKeys.RSS_TRANSFER_CONF_KEY;
import org.apache.oodt.cas.filemgr.structs.exceptions.CatalogException;
import org.apache.oodt.cas.filemgr.structs.exceptions.DataTransferException;
import org.apache.oodt.cas.filemgr.structs.exceptions.ConnectionException;
import org.apache.oodt.cas.filemgr.structs.FileTransferStatus;
import org.apache.oodt.cas.filemgr.system.XmlRpcFileManagerClient;
import org.apache.oodt.commons.xml.XMLUtils;
import org.apache.oodt.cas.metadata.Metadata;
import org.apache.oodt.cas.metadata.util.PathUtils;
import org.apache.oodt.commons.util.DateConvert;
/**
* @author mattmann
* @version $Revision$
*
* <p>
* A Servlet that supports the <a
* href="http://feedvalidator.org/docs/rss2.html">RSS 2.0</a> specification for
* delivering Product Transfer Feeds.
* </p>
*
*/
public class RSSProductTransferServlet extends HttpServlet {
/* serial Version UID */
private static final long serialVersionUID = -7983832512818339079L;
/* our client to the file manager */
private static XmlRpcFileManagerClient fClient = null;
/* RSS config */
private RSSConfig rssconf;
/* our log stream */
private Logger LOG = Logger.getLogger(RSSProductTransferServlet.class
.getName());
public static final String COPYRIGHT_BOILER_PLATE = "Copyright 2010: Apache Software Foundation";
public static final String RSS_FORMAT_STR = "E, dd MMM yyyy HH:mm:ss z";
public static final SimpleDateFormat dateFormatter = new SimpleDateFormat(
RSS_FORMAT_STR);
/**
* <p>
* Default Constructor
* </p>.
*/
public RSSProductTransferServlet() {
}
/**
* Initializes the servlet.
*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
String fileManagerUrl = null;
try {
fileManagerUrl = PathUtils.replaceEnvVariables(config.getServletContext().getInitParameter(
"filemgr.url") );
} catch (Exception e) {
throw new ServletException("Failed to get filemgr url : " + e.getMessage(), e);
}
if (fileManagerUrl == null) {
// try the default port
fileManagerUrl = "http://localhost:9000";
}
fClient = null;
try {
fClient = new XmlRpcFileManagerClient(new URL(fileManagerUrl));
} catch (MalformedURLException e) {
LOG.log(Level.SEVERE,
"Unable to initialize file manager url in RSS Servlet: [url="
+ fileManagerUrl + "], Message: " + e.getMessage());
} catch (ConnectionException e) {
LOG.log(Level.SEVERE,
"Unable to initialize file manager url in RSS Servlet: [url="
+ fileManagerUrl + "], Message: " + e.getMessage());
}
try
{
rssconf = RSSConfigReader.readConfig(new File(PathUtils
.replaceEnvVariables(config.getServletContext().getInitParameter(
(RSS_TRANSFER_CONF_KEY)))));
}
catch (FileNotFoundException e)
{
throw new ServletException(e);
}
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException {
doIt(req, resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException {
doIt(req, resp);
}
public void doIt(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException {
List currentTransfers = null;
try {
currentTransfers = fClient.getCurrentFileTransfers();
} catch (DataTransferException e) {
e.printStackTrace();
LOG.log(Level.WARNING,
"Exception getting current transfers from file manager: Message: "
+ e.getMessage());
return;
}
String requestUrl = req.getRequestURL().toString();
String base = requestUrl.substring(0, requestUrl.lastIndexOf('/'));
if (currentTransfers != null && currentTransfers.size() > 0) {
String channelDesc = "Current Files Being Transferred to the File Manager";
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
factory.setNamespaceAware(true);
Document doc = factory.newDocumentBuilder().newDocument();
Element rss = XMLUtils.addNode(doc, doc, "rss");
XMLUtils.addAttribute(doc, rss, "version", "2.0");
// add namespace attributes from config file to rss tag
for (RSSNamespace namespace : rssconf.getNamespaces())
{
XMLUtils.addAttribute(doc, rss,
"xmlns:" + namespace.getPrefix(), namespace.getUri());
}
Element channel = XMLUtils.addNode(doc, rss, "channel");
XMLUtils.addNode(doc, channel, "title",
"File Manager Transfers");
XMLUtils.addNode(doc, channel, "link", base
+ "/viewTransfers");
XMLUtils.addNode(doc, channel, "description", channelDesc);
String buildPubDate = dateFormatter.format(new Date());
XMLUtils.addNode(doc, channel, "language", "en-us");
XMLUtils.addNode(doc, channel, "copyright",
COPYRIGHT_BOILER_PLATE);
XMLUtils.addNode(doc, channel, "pubDate", buildPubDate);
XMLUtils.addNode(doc, channel, "category", "data transfer");
XMLUtils.addNode(doc, channel, "generator", "CAS File Manager");
XMLUtils.addNode(doc, channel, "lastBuildDate", buildPubDate);
for (Iterator i = currentTransfers.iterator(); i.hasNext();) {
FileTransferStatus status = (FileTransferStatus) i.next();
Element item = XMLUtils.addNode(doc, channel, "item");
XMLUtils.addNode(doc, item, "title", status
.getParentProduct().getProductName());
XMLUtils.addNode(doc, item, "description", status
.getParentProduct().getProductType().getName());
XMLUtils.addNode(doc, item, "link", base
+ "/viewTransfer?ref="
+ status.getFileRef().getOrigReference() + "&size="
+ status.getFileRef().getFileSize());
Metadata m = null;
try {
m = fClient.getMetadata(status.getParentProduct());
String productReceivedTime = m
.getMetadata("CAS.ProductReceivedTime");
Date receivedTime = null;
try {
receivedTime = DateConvert
.isoParse(productReceivedTime);
} catch (ParseException ignore) {
}
if (receivedTime != null) {
XMLUtils.addNode(doc, item, "pubDate",
dateFormatter.format(receivedTime));
}
// set product transfer metadata
m.addMetadata("BytesTransferred",
"" + status.getBytesTransferred());
m.addMetadata("TotalBytes",
"" + status.getFileRef().getFileSize());
m.addMetadata("PercentComplete",
"" + status.computePctTransferred());
} catch (CatalogException ignore) {
}
// add additional elements from the RSSConfig
for (RSSTag tag : rssconf.getTags()) {
item.appendChild(RSSUtils.emitRSSTag(tag, m, doc, item));
}
}
DOMSource source = new DOMSource(doc);
TransformerFactory transFactory = TransformerFactory
.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty("indent", "yes");
StreamResult result = new StreamResult(resp.getOutputStream());
resp.setContentType("text/xml");
transformer.transform(source, result);
} catch (ParserConfigurationException e) {
throw new ServletException(e);
} catch (TransformerException e) {
throw new ServletException(e);
}
}
}
}