/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package fedora.soapclient;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* This servlet accepts the result of a posted web form containing information
* about which method parameter values were selected for a dissemination
* request.
*
* <p>The information is read from the form and translated into an
* appropriate dissemination request and then executes the dissemination
* request.
*
* @author Ross Wayland
*/
public class MethodParameterResolverServlet
extends HttpServlet {
private static final long serialVersionUID = 1L;
/** A string constant for the html MIME type */
static final private String HTML_CONTENT_TYPE = "text/html";
/** Servlet mapping for this servlet */
private static String SERVLET_PATH = null;
/** Properties file for soap client */
private static final String soapClientPropertiesFile =
"WEB-INF/soapclient.properties";
@Override
public void init() throws ServletException {
try {
System.out
.println("Realpath Properties File: "
+ getServletContext()
.getRealPath(soapClientPropertiesFile));
FileInputStream fis =
new FileInputStream(getServletContext()
.getRealPath(soapClientPropertiesFile));
Properties p = new Properties();
p.load(fis);
SERVLET_PATH = p.getProperty("soapClientServletPath");
System.out.println("soapClientServletPath: " + SERVLET_PATH);
} catch (Throwable th) {
String message =
"[FedoraSOAPServlet] An error has occurred. "
+ "The error was a \"" + th.getClass().getName()
+ "\" . The " + "Reason: \"" + th.getMessage()
+ "\" .";
throw new ServletException(message);
}
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
// Process the HTTP Post request.
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String PID = null;
String sDefPID = null;
String methodName = null;
String versDateTime = null;
StringBuffer methodParms = new StringBuffer();
Hashtable h_methodParms = new Hashtable();
response.setContentType(HTML_CONTENT_TYPE);
PrintWriter out = response.getWriter();
// Get servlet parameters.
Enumeration parms = request.getParameterNames();
while (parms.hasMoreElements()) {
String name = new String((String) parms.nextElement());
String value = new String(request.getParameter(name));
if (name.equals("PID")) {
PID = URLDecoder.decode(request.getParameter(name), "UTF-8");
} else if (name.equals("sDefPID")) {
sDefPID =
URLDecoder.decode(request.getParameter(name), "UTF-8");
} else if (name.equals("methodName")) {
methodName =
URLDecoder.decode(request.getParameter(name), "UTF-8");
} else if (name.equals("asOfDateTime")) {
versDateTime = request.getParameter(name);
} else if (name.equals("Submit")) {
// Submit parameter is ignored.
} else {
// Any remaining parameters are assumed to be method parameters
// so
// decode and place in hashtable.
h_methodParms.put(URLDecoder.decode(name, "UTF-8"), URLDecoder
.decode(request.getParameter(name), "UTF-8"));
}
}
// Check for any missing required parameters.
if (PID == null || PID.equalsIgnoreCase("") || sDefPID == null
|| sDefPID.equalsIgnoreCase("") || methodName == null
|| methodName.equalsIgnoreCase("")) {
String message =
"[MethodParameterResolverServlet] Insufficient "
+ "information to construct dissemination request. Parameters "
+ "received from web form were: PID: " + PID
+ " -- sDefPID: " + sDefPID + " -- methodName: "
+ methodName + " -- methodParms: "
+ methodParms.toString() + "\". ";
System.out.println(message);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
message);
} else {
// Translate parameters into dissemination request.
StringBuffer redirectURL = new StringBuffer();
redirectURL.append(SERVLET_PATH + "?action_=GetDissemination&"
+ "PID_=" + PID + "&" + "sDefPID_=" + sDefPID + "&"
+ "methodName_=" + methodName);
// Add method parameters.
int i = 0;
for (Enumeration e = h_methodParms.keys(); e.hasMoreElements();) {
String name =
URLEncoder.encode((String) e.nextElement(), "UTF-8");
String value =
URLEncoder.encode((String) h_methodParms.get(name),
"UTF-8");
i++;
if (i == h_methodParms.size()) {
methodParms.append(name + "=" + value);
} else {
methodParms.append(name + "=" + value + "&");
}
}
if (h_methodParms.size() > 0) {
if (versDateTime == null || versDateTime.equalsIgnoreCase("")) {
redirectURL.append("&" + methodParms.toString());
} else {
redirectURL.append("&asOfDateTime_=" + versDateTime + "&"
+ methodParms.toString());
}
} else {
if (versDateTime != null && !versDateTime.equalsIgnoreCase("")) {
redirectURL.append("&asOfDateTime_=" + versDateTime);
}
}
// Redirect to API-A interface.
response.sendRedirect(redirectURL.toString());
}
}
// Clean up resources
@Override
public void destroy() {
}
}