/**
* Copyright (c) 2008, Aberystwyth University
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* - Neither the name of the Centre for Advanced Software and
* Intelligent Systems (CASIS) nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package org.purl.sword.client;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.purl.sword.base.DepositResponse;
import org.purl.sword.base.SWORDEntry;
import org.purl.sword.base.ServiceDocument;
/**
* Example client that runs as a Servlet.
*
* @author Stuart Lewis
*/
public class ServletClient extends HttpServlet {
/**
* The user agent name of this library
*/
public static final String userAgent = "SWORDAPP Java Client: SWORD version 1.3 compatible (http://sourceforge.net/projects/sword-app/)";
/**
* Temporary directory.
*/
private String tempDirectory;
/**
* List of urls for the destination services to access.
*/
private String[] urls;
/**
* Used to determine if a proxy value should be set.
*/
private boolean useProxy = false;
/**
* The proxy host name.
*/
private String pHost;
/**
* The proxy port name.
*/
private int pPort;
/** Counter used during Deposit information. */
private static int counter = 0;
/**
* Initialise the servlet.
*/
public void init() {
tempDirectory = getServletContext().getInitParameter(
"upload-temp-directory");
if ((tempDirectory == null) || (tempDirectory.equals(""))) {
tempDirectory = System.getProperty("java.io.tmpdir");
}
String lots = getServletContext().getInitParameter("client-urls");
urls = lots.split(",");
pHost = getServletContext().getInitParameter("proxy-host");
String pPortstr = getServletContext().getInitParameter("proxy-port");
if (((pHost != null) && (!pHost.equals("")))
&& ((pPortstr != null) && (!pPortstr.equals("")))) {
try {
pPort = Integer.parseInt(pPortstr);
useProxy = true;
} catch (Exception e) {
// Port number not numeric
}
}
}
/**
* Handle a get request. Simply show the default form (form.jsp)
*
* @param request The request details
* @param response The response to write to.
*
* @throws ServletException
* @throws IOException
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// Get request, so show the default page
request.setAttribute("urls", urls);
request.getRequestDispatcher("form.jsp").forward(request, response);
}
/**
* Process the post. Determine if the request is for a post or service
* document. Then, dispatch the request to the appropriate handler.
*
* @param request The request details.
* @param response The response to write to.
*
* @throws ServletException
* @throws IOException
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
if (request.getParameter("servicedocument") != null) {
this.doServiceDocument(request, response);
} else if (request.getParameter("deposit") != null) {
request.setAttribute("url", request.getParameter("url"));
request.setAttribute("u", request.getParameter("u"));
request.setAttribute("p", request.getParameter("p"));
request.setAttribute("obo", request.getParameter("obo"));
request.setAttribute("abstract", request.getParameter("abstract"));
request.setAttribute("policy", request.getParameter("policy"));
request.setAttribute("treatment", request.getParameter("treatment"));
request.setAttribute("mediation", request.getParameter("mediation"));
request.setAttribute("accepts", request.getParameter("accepts"));
request.setAttribute("acceptsp", request.getParameter("acceptsp"));
request.setAttribute("maxuploadsize", request.getParameter("maxuploadsize"));
request.getRequestDispatcher("depositform.jsp").forward(request, response);
} else if (ServletFileUpload.isMultipartContent(request)) {
this.doDeposit(request, response);
} else {
request.setAttribute("urls", urls);
request.getRequestDispatcher("form.jsp").forward(request, response);
}
}
/**
* Process the request for a service document.
*
* @param request The request details.
* @param response The response to write to.
*
* @throws ServletException
* @throws IOException
*/
private void doServiceDocument(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// Get the service document
Client client = new Client();
// Which URL do we want?
URL url = new URL(request.getParameter("url"));
String theUrl = request.getParameter("url");
if ((request.getParameter("ownurl") != null)
&& (!request.getParameter("ownurl").equals(""))) {
url = new URL(request.getParameter("ownurl"));
theUrl = request.getParameter("ownurl");
}
int port = url.getPort();
if (port == -1) {
port = 80;
}
// Set up the server
client.setServer(url.getHost(), port);
client.setCredentials(request.getParameter("u"), request.getParameter("p"));
if (useProxy) {
client.setProxy(pHost, pPort);
}
try {
ServiceDocument sd = client.getServiceDocument(theUrl,
request.getParameter("obo"));
// Set the status
Status status = client.getStatus();
request.setAttribute("status", status.toString());
if (status.getCode() == 200) {
// Set the debug response
String xml = sd.marshall();
String validateXml = xml;
validateXml = validateXml.replaceAll("&", "&");
validateXml = validateXml.replaceAll("<", "<");
validateXml = validateXml.replaceAll(">", ">");
validateXml = validateXml.replaceAll("\"", """);
validateXml = validateXml.replaceAll("'", "'");
request.setAttribute("xmlValidate", validateXml); // for passing to validation
xml = xml.replaceAll("<", "<");
xml = xml.replaceAll(">", ">");
request.setAttribute("xml", xml);
// Set the ServiceDocument and associated values
request.setAttribute("sd", sd);
request.setAttribute("sdURL", theUrl);
request.setAttribute("u", request.getParameter("u"));
request.setAttribute("p", request.getParameter("p"));
request.setAttribute("sdOBO", request.getParameter("obo"));
request.getRequestDispatcher("servicedocument.jsp").forward(
request, response);
return;
} else {
request.setAttribute("error", status.getCode() + " "
+ status.getMessage());
request.setAttribute("urls", urls);
request.getRequestDispatcher("form.jsp").forward(request,
response);
return;
}
} catch (SWORDClientException e) {
e.printStackTrace();
request.setAttribute("error", e.toString());
request.setAttribute("urls", urls);
request.getRequestDispatcher("form.jsp").forward(request, response);
}
}
/**
* Process a deposit.
*
* @param request The request details.
* @param response The response to output to.
*
* @throws ServletException
* @throws IOException
*/
private void doDeposit(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// Do the deposit
Client client = new Client();
try {
PostMessage message = new PostMessage();
message.setUserAgent(ClientConstants.SERVICE_NAME);
// Get the file
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
String u = null;
String p = null;
String contentDisposition = null;
String filetype = null;
boolean useMD5 = false;
boolean errorMD5 = false;
boolean verbose = false;
boolean noOp = false;
boolean login = false;
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
if (name.equals("url")) {
message.setDestination(value);
URL url = new URL(value);
int port = url.getPort();
if (port == -1) {
port = 80;
}
client.setServer(url.getHost(), port);
} else if (name.equals("usemd5")) {
useMD5 = true;
} else if (name.equals("errormd5")) {
errorMD5 = true;
} else if (name.equals("verbose")) {
verbose = true;
} else if (name.equals("noop")) {
noOp = true;
} else if (name.equals("obo")) {
message.setOnBehalfOf(value);
} else if (name.equals("slug")) {
if ((value != null) && (!value.trim().equals(""))) {
message.setSlug(value);
}
} else if (name.equals("cd")) {
contentDisposition = value;
} else if (name.equals("filetype")) {
filetype = value;
} else if (name.equals("formatnamespace")) {
if ((value != null) && (!value.trim().equals(""))) {
message.setFormatNamespace(value);
}
} else if (name.equals("u")) {
u = value;
login = true;
request.setAttribute("u", value);
} else if (name.equals("p")) {
p = value;
login = true;
}
request.setAttribute(name, value);
} else {
String fname = tempDirectory + File.separator +
"ServletClient-" + counter++;
if ((contentDisposition != null) && (!contentDisposition.equals(""))) {
fname = tempDirectory + File.separator + contentDisposition;
}
File uploadedFile = new File(fname);
item.write(uploadedFile);
message.setFilepath(fname);
if ((filetype == null) || (filetype.trim().equals(""))) {
message.setFiletype(item.getContentType());
} else {
message.setFiletype(filetype);
}
}
}
if (login) {
client.setCredentials(u, p);
}
if (useProxy) {
client.setProxy(pHost, pPort);
}
message.setUseMD5(useMD5);
message.setChecksumError(errorMD5);
message.setVerbose(verbose);
message.setNoOp(noOp);
// Post the file
DepositResponse resp = client.postFile(message);
// Set the status
Status status = client.getStatus();
request.setAttribute("status", status.toString());
if ((status.getCode() == 201) || (status.getCode() == 202)) {
// Set the debug response
String xml = resp.marshall();
String validateXml = xml;
validateXml = validateXml.replaceAll("&", "&");
validateXml = validateXml.replaceAll("<", "<");
validateXml = validateXml.replaceAll(">", ">");
validateXml = validateXml.replaceAll("\"", """);
validateXml = validateXml.replaceAll("'", "'");
request.setAttribute("xmlValidate", validateXml); // for passing to validation
xml = xml.replaceAll("<", "<");
xml = xml.replaceAll(">", ">");
request.setAttribute("xml", xml);
SWORDEntry se = resp.getEntry();
request.setAttribute("id", se.getId());
request.setAttribute("authors", se.getAuthors());
request.setAttribute("contributors", se.getContributors());
request.setAttribute("title", se.getTitle().getContent());
request.setAttribute("updated", se.getUpdated());
request.setAttribute("categories", se.getCategories());
request.setAttribute("treatment", se.getTreatment());
request.setAttribute("summary", se.getSummary().getContent());
request.setAttribute("generator", se.getGenerator().getContent());
request.setAttribute("userAgent", se.getUserAgent());
request.setAttribute("packaging", se.getPackaging());
request.setAttribute("links", se.getLinks());
request.setAttribute("location", resp.getLocation());
// Set the ServiceDocument and associated values
request.getRequestDispatcher("deposit.jsp").forward(request, response);
return;
} else {
String error = status.getCode() + " " + status.getMessage() + " - ";
try {
error += resp.getEntry().getSummary().getContent();
} catch (Exception e) {
// Do nothing - we have default error message
e.printStackTrace();
}
request.setAttribute("error", error);
// Try and get an error document in xml
String xml = resp.marshall();
xml = xml.replaceAll("<", "<");
xml = xml.replaceAll(">", ">");
request.setAttribute("xml", xml);
request.getRequestDispatcher("depositform.jsp").forward(request, response);
return;
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("error", "value: " + e.toString());
request.setAttribute("urls", urls);
request.getRequestDispatcher("depositform.jsp").forward(request, response);
}
}
}