/* 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.server.access;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import fedora.common.Constants;
import fedora.server.Server;
import fedora.server.errors.InitializationException;
/**
* 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 the corresponding
* API-A-LITE interface dissemination request in the form of a URI. The initial
* request is then redirected to the API-A-LITE interface to execute the
* dissemination request.
*
* @author Ross Wayland
* @version $Id$
*/
public class MethodParameterResolverServlet
extends HttpServlet {
/** Logger for this class. */
private static final Logger LOG =
Logger.getLogger(MethodParameterResolverServlet.class.getName());
private static final long serialVersionUID = 1L;
/** A string constant for the html MIME type */
private static final String HTML_CONTENT_TYPE = "text/html; charset=UTF-8";
/** An instance of the Fedora server. */
private static Server s_server = null;
@Override
public void init() throws ServletException {
try {
s_server =
Server.getInstance(new File(Constants.FEDORA_HOME), false);
} catch (InitializationException ie) {
throw new ServletException("Unable to get Fedora Server instance. -- "
+ ie.getMessage());
}
}
/**
* Treat Get request identical to Post request.
*
* @param request
* The servlet request.
* @param response
* The servlet response.
* @throws ServletException
* If an error occurs that affects the servlet's basic operation.
* @throws IOException
* If an error occurs within an input or output operation.
*/
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
* Process Post request from web form.
*
* @param request
* The servlet request.
* @param response
* The servlet response.
* @throws ServletException
* If an error occurs that affects the servlet's basic operation.
* @throws IOException
* If an error occurs within an input or output operation.
*/
@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();
response.setContentType(HTML_CONTENT_TYPE);
Hashtable h_methodParms = new Hashtable();
// Get parameters passed from web form.
Enumeration parms = request.getParameterNames();
while (parms.hasMoreElements()) {
String name = new String((String) parms.nextElement());
if (name.equals("PID")) {
PID = request.getParameter(name);
} else if (name.equals("sDefPID")) {
sDefPID = request.getParameter(name);
} else if (name.equals("methodName")) {
methodName = request.getParameter(name);
} else if (name.equals("asOfDateTime")) {
versDateTime = request.getParameter(name).trim();
if (versDateTime.equalsIgnoreCase("null")
|| versDateTime.equalsIgnoreCase("")) {
versDateTime = null;
}
} 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(name, request.getParameter(name));
}
}
// Check that all required parameters are present.
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() + "\". ";
LOG.error(message);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
message);
} else {
// Translate web form parameters into dissemination request.
StringBuffer redirectURL = new StringBuffer();
redirectURL.append(request.getContextPath() + "/get/" + PID + "/"
+ sDefPID + "/" + 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("/" + versDateTime + "?"
+ methodParms.toString());
}
} else {
if (versDateTime == null || versDateTime.equalsIgnoreCase("")) {
redirectURL.append("/");
} else {
redirectURL.append("/" + versDateTime + "/");
}
}
// Redirect request back to FedoraAccessServlet.
response.sendRedirect(redirectURL.toString());
}
}
// Clean up resources
@Override
public void destroy() {
}
}