X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fuwobo%2Fsrc%2Fit%2Funibo%2Fcs%2Fhelm%2Fuwobo%2FServlet.java;fp=helm%2Fuwobo%2Fsrc%2Fit%2Funibo%2Fcs%2Fhelm%2Fuwobo%2FServlet.java;h=0e28877fd42827e43518c48d8435a7d01a85e059;hb=30060cffed61b88fe53e4d6386b606050d6dfda0;hp=0000000000000000000000000000000000000000;hpb=e6927665462cbbace76cff1b17d4f8badcb44eda;p=helm.git diff --git a/helm/uwobo/src/it/unibo/cs/helm/uwobo/Servlet.java b/helm/uwobo/src/it/unibo/cs/helm/uwobo/Servlet.java new file mode 100644 index 000000000..0e28877fd --- /dev/null +++ b/helm/uwobo/src/it/unibo/cs/helm/uwobo/Servlet.java @@ -0,0 +1,247 @@ +package it.unibo.cs.helm.uwobo; + +import java.io.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.http.*; +import javax.xml.transform.*; +import org.xml.sax.*; + +/* +* +* usage: +* http://aristotele/helm/servlet/uwobo/help +* http://aristotele/helm/servlet/uwobo/add?xsluri=&key= +* http://aristotele/helm/servlet/uwobo/remove[?key=] +* http://aristotele/helm/servlet/uwobo/list +* http://aristotele/helm/servlet/uwobo/reload[?key=] +* http://aristotele/helm/servlet/uwobo/update[?key=] +* http://aristotele/helm/servlet/uwobo/apply?xmluri=&keys=[¶m.=]* +* +* example: +* http://aristotele/helm/servlet/uwobo/add?xsluri=file:///D:/Archivio/Progetti/helm/resources/xsl/foo1.xsl&key=foo1 +* http://aristotele/helm/servlet/uwobo/add?xsluri=file:///D:/Archivio/Progetti/helm/resources/xsl/foo2.xsl&key=foo2 +* http://aristotele/helm/servlet/uwobo/apply?xmluri=file:///D:/Archivio/Progetti/helm/resources/xsl/foo.xml&key=foo1&key=foo2 +* +* installation notes (Tomcat): +* replace parser.jar and jaxp.jar from /lib with xerces.jar +* +* add in conf/server.xml +* +* +* +* add in uriworkermap.properties +* /helm/*=ajp12 +* +* bugs: +* directory base stylesheet inclusi +* +* @author Riccardo Solmi +*/ +public class Servlet extends HttpServlet { + public static final String[] usage = { + "http://hostname/helm/servlet/uwobo/help", + "http://hostname/helm/servlet/uwobo/add?xsluri=stylesheet&key=name", + "http://hostname/helm/servlet/uwobo/remove[?key=name]", + "http://hostname/helm/servlet/uwobo/list", + "http://hostname/helm/servlet/uwobo/reload[?key=name]", + "http://hostname/helm/servlet/uwobo/update[?key=name]", + "http://hostname/helm/servlet/uwobo/apply?xmluri=xmldata&keys=key_1,...,key_n[¶m.name=value]*" + }; + public static final String help; + + static { + StringBuffer sb = new StringBuffer(); + sb.append(""); + help = sb.toString(); + } + + private Server server; + + public void init(ServletConfig config) throws ServletException + { + super.init(config); + + System.out.println("UWOBO init"); + server = new Server(); + } + + public static String[] split(final String s, final String delim) + { + StringTokenizer st = new StringTokenizer(s, delim); + String[] res = new String[st.countTokens()]; + for (int i = 0; i < res.length; i++) res[i] = st.nextToken(); + return res; + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException + { + System.out.println("UWOBO "+request.getPathInfo()); + ServletOutputStream out; + + try { + final String cmd = request.getPathInfo(); + if (cmd == null) { + sendError(response, HttpServletResponse.SC_NOT_FOUND, "unknown command", help); + return; + } + if (cmd.equals("/add")) { + final String filename = request.getParameter("xsluri"); + if (filename == null) { + sendError(response, HttpServletResponse.SC_BAD_REQUEST, "bad parameters", usage[1]); + return; + } + final String key = request.getParameter("key"); + server.add(filename, key); + } else if (cmd.equals("/apply")) { + final String infile = request.getParameter("xmluri"); + final String keys = request.getParameter("keys"); + + if (infile == null || keys == null) { + sendError(response, HttpServletResponse.SC_BAD_REQUEST, "bad parameters", usage[6]); + return; + } + + final String[] keyName = split(keys, ","); + final Key[] keySeq = new Key[keyName.length]; + for (int i = 0; i < keySeq.length; i++) { + keySeq[i] = new Key(); + keySeq[i].name = keyName[i]; + keySeq[i].params = new HashMap(); + } + + final Properties props = new Properties(); + final Enumeration e = request.getParameterNames(); + while (e.hasMoreElements()) { + String param = (String) e.nextElement(); + if (param.startsWith("param.")) { + final String name = param.substring(6); + final String value = request.getParameter(param); + final String[] keyParam = split(name, "."); + if (keyParam.length == 1) { + // this is a global parameter + Server.log("global parameter: " + keyParam[0] + " = " + value); + for (int i = 0; i < keySeq.length; i++) + // we add the global parameter only if there is no + // local parameter with the same name + if (!keySeq[i].params.containsKey(keyParam[0])) + keySeq[i].params.put(keyParam[0], value); + } else if (keyParam.length == 2) { + // this is a local parameter + Server.log("local parameter: " + keyParam[0] + "." + keyParam[1] + " = " + value); + for (int i = 0; i < keySeq.length; i++) { + if (keySeq[i].name.equals(keyParam[0])) + keySeq[i].params.put(keyParam[1], value); + } + } else { + sendError(response, HttpServletResponse.SC_BAD_REQUEST, "bad parameters", usage[6]); + return; + } + } else if (param.startsWith("prop.")) { + final String name = param.substring(5); + final String value = request.getParameter(param); + Server.log("property: " + name + " = " + value); + props.setProperty(name, value); + } + } + + String contentType = props.getProperty(OutputKeys.MEDIA_TYPE); + if (contentType == null && keySeq.length > 0) + contentType = server.getContentType(keySeq[keySeq.length - 1].name); + else if (contentType == null) + contentType = "text/xml"; + response.setContentType(contentType); + Server.log("content type: " + contentType); + + out = response.getOutputStream(); + server.apply(infile, out, keySeq, props); + out.close(); + return; + } else if (cmd.equals("/remove")) { + final String key = request.getParameter("key"); + if (key == null) + server.removeAll(); + else + server.remove(key); + } else if (cmd.equals("/list")) { + Iterator i = server.list().iterator(); + + response.setContentType("text/html"); + out = response.getOutputStream(); + out.println("

Uwobo servlet

stylesheet list:

"); + out.close(); + return; + } else if (cmd.equals("/reload")) { + final String key = request.getParameter("key"); + if (key == null) + server.reloadAll(); + else + server.reload(key); + } else if (cmd.equals("/update")) { + final String key = request.getParameter("key"); + if (key == null) + server.updateAll(); + else + server.update(key); + } else if (cmd.equals("/help")) { + response.setContentType("text/html"); + out = response.getOutputStream(); + out.println("

"+server.PACKAGE+" servlet - version "+server.VERSION+"

"); + out.println("compiled "+server.DATE+" at "+server.TIME.substring(0,2)+":"+server.TIME.substring(2)+""); + out.println("

usage:

"+help+""); + out.close(); + return; + } else { + sendError(response, HttpServletResponse.SC_NOT_FOUND, "unknown command", help); + return; + } + } catch (TransformerConfigurationException tce) { + sendError(response, HttpServletResponse.SC_BAD_REQUEST, "stylesheet error", tce); + return; + } catch (SAXException se) { + sendError(response, HttpServletResponse.SC_BAD_REQUEST, "SAX Exception", se); + return; + } catch (Exception e) { + sendError(response, HttpServletResponse.SC_BAD_REQUEST, "exception", e); + return; + } + + response.setContentType("text/html"); + response.setHeader("Cache-Control", "no-cache"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Expires", "0"); + out = response.getOutputStream(); + out.println("

Uwobo servlet

done

"); + out.close(); + } + + private void sendError(HttpServletResponse response, int code, String msg, Exception e) throws IOException { + String err; + if (e != null) + err = "

"+e.getMessage()+"

"; + else + err = ""; + response.setContentType("text/html"); + response.sendError(code, "

Uwobo servlet

"+msg+"

"+err+""); + } + + private void sendError(HttpServletResponse response, int code, String msg, String usage) throws IOException { + response.setContentType("text/html"); + response.sendError(code, "

Uwobo servlet

"+msg+"

usage: "+usage+""); + } + + public String getServletInfo() { + return "The UWOBO servlet"; + } +}