/*
* Created on 07.02.2004
*/
package mmonster.webfrontend;
import java.io.IOException;
import java.io.PrintWriter;
import java.rmi.RemoteException;
import java.util.StringTokenizer;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import multimonster.common.AuthData;
import multimonster.common.ConnectionAddress;
import multimonster.common.Format;
import multimonster.common.FormatId;
import multimonster.common.InputOption;
import multimonster.common.OutputOption;
import multimonster.common.Protocol;
import multimonster.common.ProtocolId;
import multimonster.common.SearchCriteria;
import multimonster.common.SearchResult;
import multimonster.common.UserIdentifier;
import multimonster.common.media.MOIdentifier;
import multimonster.common.media.MetaData;
import multimonster.controller.exceptions.ControllerException;
import multimonster.controller.exceptions.InvalidAuthDataException;
import multimonster.controller.interfaces.ControllerImpl;
import multimonster.controller.interfaces.ControllerImplHome;
import multimonster.mediaproxy.interfaces.MediaProxyImplHome;
import org.apache.log4j.Logger;
/**
*
* A web-UserInterface for the MultiMonster-Server.
* Some standard-operations are implemented (login, insert, search, play, logout).
*
* @author jrgmei
*
* @web.servlet name = "ControllerDispachterServlet" display-name =
* "ControllerDispachter Servlet" description = "Servlet that calls
* MMonster-Controller-Methods"
*
* @web.servlet-mapping url-pattern = "/ControllerDispachter"
*
* @web.env-entry name = "Title" type = "java.lang.String" value =
* "ControllerDispachterServlet" description = ""
*
* @web.ejb-ref name = "multimonster/controller/Controller" type = "Session"
* home = "multimonster.controller.interfaces.ControllerImplHome" remote =
* "multimonster.controller.interfaces.ControllerImpl" description = ""
*
* @jboss.ejb-ref-jndi ref-name = "multimonster/controller/Controller"
* jndi-name = "ejb/ControllerFacade"
*
*/
public class ControllerDispachterServlet extends HttpServlet {
private Logger log;
private String title;
private ControllerImplHome controllerHome;
private MediaProxyImplHome proxyHome;
private String httpSessionID;
private ControllerImpl controller = null;
public ControllerDispachterServlet() {
}
/*
* (non-Javadoc)
*
* @see javax.servlet.GenericServlet#init()
*/
public void init() throws ServletException {
Context context;
log = Logger.getLogger(this.getClass());
log.debug("ControllerDispatcher-Servlet init...");
try {
context = new InitialContext();
title = (String) context.lookup("java:/comp/env/Title");
Object ref = context.lookup(ControllerImplHome.JNDI_NAME);
controllerHome =
(ControllerImplHome) PortableRemoteObject.narrow(
ref,
ControllerImplHome.class);
ref = context.lookup(MediaProxyImplHome.JNDI_NAME);
proxyHome =
(MediaProxyImplHome) PortableRemoteObject.narrow(
ref,
MediaProxyImplHome.class);
} catch (NamingException e) {
log.error("Couldn't get Controller: " + e.getMessage());
} catch (Exception e) {
log.error("Couldn't get Controller: " + e.getMessage());
}
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
protected void doGet(HttpServletRequest arg0, HttpServletResponse response)
throws ServletException, IOException {
log.warn(
"ControllerDispatcher-Servlet directly called (HTTP-Method GET).");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println(title);
out.println("</title></head>");
out.println("<body>");
out.println("Please use HTML-websites to start application.");
out.println("</body></html>");
}
/*
* (non-Javadoc)
*
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
protected void doPost(HttpServletRequest req, HttpServletResponse response)
throws ServletException, IOException {
String function = null;
Object controller_from_httpSession;
// besorge HTTP-Session aus Request-Obejekt,
// falls keine Session vorhanden, wird diese angelegt
HttpSession httpSession = req.getSession(true);
httpSessionID = httpSession.getId();
// controller aus der Session holen, falls vorhanden:
controller_from_httpSession = httpSession.getAttribute("controller");
if (controller_from_httpSession == null || (!(controller_from_httpSession instanceof ControllerImpl))){
// wenn kein controller da, dann erzeugen und in Session ablegen:
try {
controller = controllerHome.create();
httpSession.setAttribute("controller", controller);
} catch (RemoteException e) {
log.error("Error calling Controller: " + e.getMessage());
} catch (CreateException e) {
log.error("Error calling Controller: " + e.getMessage());
}
} else {
controller = (ControllerImpl) controller_from_httpSession;
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println( printHTMLHeader() );
out.println("<body>");
// out.println("<center>HTTP-Session-ID <b>" +httpSessionID +"<b></center><p/>");
out.println("<center>");
try {
if (controller != null) {
function = req.getParameter("function");
if (function.equals("login")) {
login(out, req);
} else if (function.equals("logout")) {
logout(out, req);
} else if (function.equals("search_result")) {
searchResult(out, req);
} else if (function.equals("handleSearchResult")) {
String deleteCheckbox = null;
deleteCheckbox = req.getParameter("del");
log.debug("del-checkbox: " +deleteCheckbox);
if (deleteCheckbox != null && deleteCheckbox.equals("1")){
// moid should be deleted
delete(out, req);
} else {
// normal play
play1(out, req);
}
} else if (function.equals("play2")) {
play2(out, req);
} else if (function.equals("insert1")) {
insert1(out, req);
} else if (function.equals("insert2")) {
insert2(out, req);
} else {
log.warn(
"unknown function called: '"
+ req.getParameter("function")
+ "'");
}
} else {
/* no controllerHome */
log.error("No connection to Controller, can't call anything.");
out.println("No connection to Controller, can't call anything.");
}
} catch (RemoteException e) {
log.error("Error calling Controller: " + e.getMessage());
} catch (CreateException e) {
log.error("Error calling Controller: " + e.getMessage());
} finally {
out.println("</center>");
out.println("</body>");
out.println("</html>");
}
}
/**
* schreibt HTML-Header f�r Servlet-Antwort
*/
private String printHTMLHeader() {
String ret = "";
ret += "<head>";
ret += "<title>" + title + "</title>";
ret += "<link rel=\"stylesheet\" media=\"all\" href=\"style.css\">";
ret += "<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-1\">";
ret += "<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">";
ret += "</head>";
return ret;
}
/**
*
*/
private void login(
PrintWriter out,
HttpServletRequest req)
throws RemoteException {
boolean loginSuccessful = false;
AuthData auth = null;
UserIdentifier uid = new UserIdentifier(req.getParameter("username"));
auth = new AuthData(uid, req.getParameter("password"));
try {
loginSuccessful = controller.login(auth);
} catch (InvalidAuthDataException e) {
out.println("Login failed.<br>Please retry.");
} catch (ControllerException e1) {
out.println("<b>The following exception occured:</b></br>");
out.println(e1.getMessage());
}
out.println("<p>");
if (loginSuccessful) {
out.println(
"User <b>"
+ auth.getUid().getUid()
+ "</b> successfully logged in.<br>");
}
out.println("</p>");
}
/**
* @param controller2
* @param out
* @param req
* @throws RemoteException
*/
private void logout(PrintWriter out, HttpServletRequest req) throws RemoteException {
try {
controller.logout();
out.println("You are now logged out.");
} catch (ControllerException e) {
out.println("<p><b>The following exception occured:</b><br>");
out.println(e.getMessage());
out.println("</p>");
}
}
/**
*
*/
private void searchResult(
PrintWriter out,
HttpServletRequest req)
throws RemoteException {
log.debug("Viewing searchresult.");
out.println(
"<form action=\"ControllerDispachter\" method=\"POST\" >"
+ "<input type=\"hidden\" name=\"function\" value=\"handleSearchResult\">"
+ "<table cellspacing=\"2\" cellpadding=\"2\" border=\"0\">");
SearchCriteria crit = new SearchCriteria();
SearchResult[] result = null;
crit.setTitle(req.getParameter("title_search_string"));
try {
result = controller.search(crit);
if ((result != null) && (result.length > 0)) {
for (int i = 0; i < result.length; i++) {
int moid =
result[i].getMediaObject().getMOId().getMoNumber();
out.println(
"<tr><td><input type=\"radio\" name=\"mo\" value=\""
+ moid
+ "\"");
if (i == 0)
out.println(" checked=\"checked\"");
out.println(">");
out.println(
result[i].getMediaObject().getMetaData().getTitle());
out.println("</td></tr>");
}
out.println("<tr><td></td></tr>");
out.println("<tr><td><input type=\"checkbox\" name=\"del\" value=\"1\">delete selected media-object</td></tr>");
out.println(
"<tr><td><input type=\"submit\" name=\"button\" value=\"Process selection...\"></td></tr>");
} else {
out.println("<tr><td>Nothing found</td></tr>");
}
out.println("</table></form>");
} catch (ControllerException e) {
out.println("<p><b>The following exception occured:</b><br>");
out.println(e.getMessage());
out.println("</p>");
}
}
private void delete(PrintWriter out,
HttpServletRequest req)
throws RemoteException {
boolean delSuccessful = false;
log.debug("Delete.");
// get mOId from user selection:
MOIdentifier moid =
new MOIdentifier(new Integer(req.getParameter("mo")).intValue());
try {
delSuccessful = controller.deleteMediaObject(moid);
if (delSuccessful) {
out.println("Deleted MediaObject<br>" +moid.getMoNumber() +".");
} else {
out.println("<b>Could not delete MediaObject:<br> " +moid +".</b>");
}
} catch (ControllerException e) {
out.println("<p><b>The following exception occured:</b><br>");
out.println(e.getMessage());
out.println("</br></p>");
}
}
/**
* view outputpossibilities
*/
private void play1(
PrintWriter out,
HttpServletRequest req)
throws RemoteException {
Format format = null;
Protocol protocol = null;
log.debug("View Output possibilities");
out.println("<form action=\"ControllerDispachter\" method=\"POST\">");
out.println(
"<input type=\"hidden\" name=\"function\" value=\"play2\">");
out.println("<table cellspacing=\"2\" cellpadding=\"2\" border=\"0\">");
out.println(
"<tr><td></td><td><b>Format</b></td><td><b>Protocol</b></td></tr>");
OutputOption[] oo = null;
// get mOId from user selection:
MOIdentifier moid =
new MOIdentifier(new Integer(req.getParameter("mo")).intValue());
try {
oo = controller.getOutputOptions(moid);
if (oo != null) {
for (int i = 0; i < oo.length; i++) {
format = oo[i].getFormat();
protocol = oo[i].getProtocol();
if (format == null || protocol == null){
continue;
}
out.println(
"<tr><td><input type=\"radio\" name=\"mo\" value=\""
+ req.getParameter("mo")
+ "."
+ format.getFormatId().getId()
+ "."
+ protocol.getProtocolID().getId()
+ "\"");
if (i == 0)
out.println(" checked=\"checked\"");
out.println("></td>");
out.println(
"<td>" + format.getDescription() + "</td>");
out.println(
"<td>"
+ protocol.getProtocolName()
+ "</td>");
out.println("</tr>");
}
}
out.println(
"<tr><td><input type=\"submit\" name=\"button\" value=\"Get it...\"></td></tr>"
+ "</table></form>");
} catch (ControllerException e1) {
out.println("<p><b>The following exception occured:</b><br>");
out.println(e1.getMessage());
out.println("</br></p>");
}
}
/**
* get MediaObject in selected Format, return link to Proxy
*/
private void play2(
PrintWriter out,
HttpServletRequest req)
throws RemoteException {
ConnectionAddress addr = null;
StringTokenizer to_parse = null;
String mOIdString = null;
String formatString = null;
String protocolId = null;
OutputOption oo = null;
MOIdentifier mOId = null;
log.debug(
"User has choosen: "
+ req.getParameter("mo")
+ ", presenting the link.");
// input-form parameter parsing to get mOId, format and
// protocol
to_parse = new StringTokenizer(req.getParameter("mo"), ".");
mOIdString = to_parse.nextToken();
formatString = to_parse.nextToken();
protocolId = to_parse.nextToken();
mOId = new MOIdentifier(new Integer(mOIdString).intValue());
oo =
new OutputOption(
new Format(new FormatId(formatString)),
new Protocol(new ProtocolId(protocolId)));
try {
String link = null;
out.println("<p>");
addr = controller.prepareOutput(mOId, oo);
link = addr.getUrl().toString();
out.println("<a href=\"" + link + "\">GET IT</a>");
} catch (ControllerException e1) {
out.println("<b>The following exception occured:</b></br>");
out.println(e1.getMessage());
} finally {
out.println("</p>");
out.println("</table></form>");
}
}
/**
* getInputOptions
*/
private void insert1(
PrintWriter out,
HttpServletRequest req)
throws RemoteException, CreateException {
log.debug("View Input possibilities");
InputOption[] io = null;
try {
io = controller.getInputOptions();
if (io != null) {
out.println(
"<form action=\"ControllerDispachter\" method=\"POST\" >"
+ "<input type=\"hidden\" name=\"function\" value=\"insert2\">"
+ "<table cellspacing=\"2\" cellpadding=\"2\" border=\"0\">");
out.println(
"<tr><td></td><td><b>Protocol</b></td></tr>");
for (int i = 0; i < io.length; i++) {
if (io[i].getProtocol() != null) {
out.println(
"<tr><td><input type=\"radio\" name=\"io\" value=\""
+ io[i].getProtocol().getProtocolID().getId()
+ "\"");
if (i == 0)
out.println(" checked=\"checked\"");
out.println("></td>");
out.println(
"<td>"
+ io[i].getProtocol().getProtocolID().getId()
+ "</td>");
out.println("</tr>");
}
}
out.println("<tr></tr>" +
"<tr><td>Title</td><td><input type=\"text\" name=\"title_string\" value=\"\"></td></tr>");
out.println(
"<tr><td>Outline</td><td><input type=\"text\" name=\"outline_string\" value=\"\"></td></tr>");
out.println(
"<tr><td></td><td><input type=\"submit\" name=\"button\" value=\"Insert it...\"></td></tr>"
+ "</table></form>");
} else {
out.println("<p><b>No InputOptions have been returned.</b><br>");
}
} catch (ControllerException e1) {
out.println("<p><b>The following exception occured:</b><br>");
out.println(e1.getMessage());
out.println("</br></p>");
}
}
/**
* prepare insert, view connectionAddress to insert
*/
private void insert2(
PrintWriter out,
HttpServletRequest req)
throws RemoteException, CreateException {
log.debug("User has choosen: " + req.getParameter("io"));
// get protocol, format
String protocol_string = req.getParameter("io");
ProtocolId protocolId = new ProtocolId(protocol_string);
MetaData metaData =
new MetaData(
req.getParameter("title_string"),
req.getParameter("outline_string"));
ConnectionAddress conn = null;
try {
conn =
controller.prepareInsert(
protocolId,
metaData);
if (conn != null){
String serverSocketHost = conn.getUrl().getHost();
int serverSocketPort = conn.getUrl().getPort();
//use a helper servlet, that gets the data out of the http-stream
String directInputServletPath = "DirectInput";
out.println(
"<b>Title </b>" + req.getParameter("title_string") + " <br>");
out.println(
"<b>Outline </b>" + req.getParameter("outline_string") + " <br>");
//send the post-http-request with the file to the helper servlet
out.println(
"<form action=\"" +directInputServletPath +"\" enctype=\"multipart/form-data\" method=\"POST\">"
+ "<input type=\"hidden\" name=\"serverSocketHost\" value=\"" + serverSocketHost + "\">"
+ "<input type=\"hidden\" name=\"serverSocketPort\" value=\"" + serverSocketPort + "\">"
+ "<table>"
+ "<tr><td>File: </td>"
+ "<td><input type=\"file\" name=\"mediafile\" size=40 maxlength=255></tr>"
+ "<tr><td></td><td><input type=\"submit\" value=\"Upload\"></td></tr>"
+ "</table>"
+ "</form>");
out.println("<p/>");
} else {
//controller returned no conn
out.println("<p><b>No ConnectionAdress has been returned.</b><br>");
}
} catch (ControllerException e) {
out.println("<p><b>The following exception occured:</b><br>");
out.println(e.getMessage());
out.println("</p>");
}
}
}