+/* Copyright (C) 2001, HELM Team
+ *
+ * This file is part of UWOBO, developed at the Computer Science
+ * Department, University of Bologna, Italy.
+ *
+ * UWOBO is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * UWOBO is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with UWOBO; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * For details, see the UWOBO World-Wide-Web page,
+ * http://cs.unibo.it/helm/uwobo
+ */
+
package it.unibo.cs.helm.uwobo;
import java.io.*;
import javax.xml.transform.*;
import org.xml.sax.*;
+// WARNING: next comment is obsolete!!!!!
/*
*
* 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.=]*
+* http://hostname/helm/servlet/uwobo/help
+* http://hostname/helm/servlet/uwobo/add?bind=key,stylesheet[&bind=key,stylesheet]*
+* http://hostname/helm/servlet/uwobo/remove[?keys=key_1,...,key_n]
+* http://hostname/helm/servlet/uwobo/list
+* http://hostname/helm/servlet/uwobo/reload[?keys=key_1,...,key_n]
+* http://hostname/helm/servlet/uwobo/apply?xmluri=xmldata&keys=key_1,...,key_n[¶m.name=value]*[¶m.key.name=value]*[&prop.name=[value]]*
*
* 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
+* http://aristotele/helm/servlet/uwobo/add?bind=foo1,file:///D:/Archivio/Progetti/helm/resources/xsl/foo1.xsl
+* http://aristotele/helm/servlet/uwobo/add?bind=foo2,file:///D:/Archivio/Progetti/helm/resources/xsl/foo2.xsl
+* http://aristotele/helm/servlet/uwobo/apply?xmluri=file:///D:/Archivio/Progetti/helm/resources/xsl/foo.xml&keys=foo1,foo2
*
* installation notes (Tomcat):
-* replace parser.jar and jaxp.jar from /lib with xerces.jar
+* replace parser.jar and jaxp.jar from /lib with xerces.jar and add xalan.jar
*
* add in conf/server.xml
* <Context path="/helm"
* add in uriworkermap.properties
* /helm/*=ajp12
*
-* bugs:
-* directory base stylesheet inclusi
*
-* @author Riccardo Solmi
+* @author The HELM team
*/
public class Servlet extends HttpServlet {
- public static final String[] usage = {
- "http://<i>hostname</i>/helm/servlet/uwobo/help",
- "http://<i>hostname</i>/helm/servlet/uwobo/add?xsluri=<i>stylesheet</i>&key=<i>name</i>",
- "http://<i>hostname</i>/helm/servlet/uwobo/remove[?key=<i>name</i>]",
- "http://<i>hostname</i>/helm/servlet/uwobo/list",
- "http://<i>hostname</i>/helm/servlet/uwobo/reload[?key=<i>name</i>]",
- "http://<i>hostname</i>/helm/servlet/uwobo/update[?key=<i>name</i>]",
- "http://<i>hostname</i>/helm/servlet/uwobo/apply?xmluri=<i>xmldata</i>&keys=<i>key_1,...,key_n</i>[¶m.<i>name</i>=<i>value</i>]*"
- };
- public static final String help;
-
- static {
- StringBuffer sb = new StringBuffer();
- sb.append("<ul>");
- for (int i=0; i<usage.length; i++)
- sb.append("<li>").append(usage[i]).append("</li>");
- sb.append("</ul>");
- help = sb.toString();
- }
+
+ public static final String[] usage = {
+ "http://<i>hostname</i>/helm/servlet/uwobo/help",
+ "http://<i>hostname</i>/helm/servlet/uwobo/add?bind=<i>key</i>,<i>stylesheet</i>[&bind=<i>key</i>,<i>stylesheet</i>]*",
+ "http://<i>hostname</i>/helm/servlet/uwobo/remove[?keys=<i>key_1,...,key_n</i>]",
+ "http://<i>hostname</i>/helm/servlet/uwobo/list",
+ "http://<i>hostname</i>/helm/servlet/uwobo/reload[?keys=<i>key_1,...,key_n</i>]",
+ "http://<i>hostname</i>/helm/servlet/uwobo/apply?xmluri=<i>xmldata</i>&keys=<i>key_1,...,key_n</i>[¶m.<i>name</i>=<i>value</i>]*[¶m.<i>key</i>.<i>name</i>=<i>value</i>]*[&prop.<i>name</i>=[<i>value</i>]]*"
+ };
+ public static final String help;
+
+ static {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<ul>");
+ for (int i=0; i<usage.length; i++)
+ sb.append("<li>").append(usage[i]).append("</li>");
+ sb.append("</ul>");
+ help = sb.toString();
+ }
- private Server server;
+ private Server server;
- public void init(ServletConfig config) throws ServletException
- {
- super.init(config);
+ public void init(ServletConfig config)
+ throws ServletException
+ {
+ super.init(config);
- System.out.println("UWOBO init");
- server = new Server();
- }
+ 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;
- }
+ private static String[] split(final String s, final String delim)
+ {
+ String[] res = {null};
+ if (s == null) return res;
+ StringTokenizer st = new StringTokenizer(s, delim);
+ 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");
+ private static String[] split2(final String s, final String delim)
+ {
+ String[] res = new String[2];
+ StringTokenizer st = new StringTokenizer(s);
+ res[0] = st.nextToken(delim); res[1] = st.nextToken("").substring(1);
+ return res;
+ }
- if (infile == null || keys == null) {
- sendError(response, HttpServletResponse.SC_BAD_REQUEST, "bad parameters", usage[6]);
- return;
- }
+ private void html_open(HttpServletResponse resp, ServletOutputStream out)
+ throws IOException
+ {
+ resp.setContentType("text/html");
+ out.println("<html><body bgcolor=\"#ffffff\"><h1>" + server.PACKAGE + " servlet</h1>");
+ }
+
+ private void html_close(ServletOutputStream out)
+ throws IOException
+ {
+ out.println("<p>done</p></body></html>");
+ out.close();
+ }
- 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();
- }
+ private String msg_out(String message)
+ {
+ return message+"<br />";
+ }
+
+ private String exc_out(String message, Exception e)
+ {
+ if (message == null)
+ {
+ message = e.getClass().getName();
+ message = message.substring(message.lastIndexOf('.')+1);
+ }
+ String local = e.getLocalizedMessage();
+ local = local.substring(local.lastIndexOf(':')+1);
+ return "<b style=\"color: red\">"+message+": "+local+"</b><br />";
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException
+ {
+ ServletOutputStream out = response.getOutputStream();
+ String log = "";
+
+ response.setHeader("Cache-Control", "no-cache");
+ response.setHeader("Pragma", "no-cache");
+ response.setHeader("Expires", "0");
+ System.out.println("UWOBO "+request.getPathInfo());
+
+ try {
+ final String cmd = request.getPathInfo();
+ if (cmd == null) {
+ sendError(response, out, "unknown command", help); return;
+ }
+ if (cmd.equals("/add")) {
+ final String[] xslkey = request.getParameterValues("bind");
+ if (xslkey == null) {
+ sendError(response, out, "bad parameters", usage[1]); return;
+ }
+ html_open(response, out);
+ for (int i = 0; i < xslkey.length; i++) {
+ final String data[] = split2(xslkey[i], ",");
+ out.println(msg_out("adding stylesheet "+data[0]+" ("+data[1]+")"));
+ try {
+ log = server.add(data[1], data[0]);
+ if(!log.equals(""))
+ out.println(msg_out(log));
+ } catch (TransformerConfigurationException tce) {
+ out.println(exc_out("Stylesheet Error", tce));
+ } catch (Exception e) {
+ out.println(exc_out(null, e));
+ }
+ }
+ html_close(out); return;
+ }
+ if (cmd.equals("/apply")) {
+ final String infile = request.getParameter("xmluri");
+ final String keys = request.getParameter("keys");
- 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);
+ if (infile == null || keys == null) {
+ sendError(response, out, "bad parameters", usage[6]); return;
+ }
- 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();
+ 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();
+ }
- response.setContentType("text/html");
- out = response.getOutputStream();
- out.println("<html><body><h1>Uwobo servlet</h1><p>stylesheet list:</p><ul>");
- while (i.hasNext())
- out.println("<li>"+i.next()+"</li>");
- out.println("</ul></body></html>");
- 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("<html><body><h1>"+server.PACKAGE+" servlet - version "+server.VERSION+"</h1>");
- out.println("<b>compiled "+server.DATE+" at "+server.TIME.substring(0,2)+":"+server.TIME.substring(2)+"</b>");
- out.println("<p>usage:</p>"+help+"</body></html>");
- 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;
- }
+ 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, out, "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);
- response.setContentType("text/html");
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Pragma", "no-cache");
- response.setHeader("Expires", "0");
- out = response.getOutputStream();
- out.println("<html><body><h1>Uwobo servlet</h1><p>done</p></body></html>");
- out.close();
- }
+ try {
+ out = response.getOutputStream();
+ server.apply(infile, out, keySeq, props);
+ out.close();
+ } catch (TransformerConfigurationException tce) {
+ sendError(response, out, exc_out("stylesheet error", tce), "");
+ } catch (Exception ee) {
+ sendError(response, out, exc_out(null, ee), "");
+ }
+ return;
+ }
+ if (cmd.equals("/remove")) {
+ final String key = request.getParameter("keys");
+ final String [] data = split(key, ",");
+ html_open(response, out);
+ for (int i = 0; i < data.length; i++) {
+ if (data[i] == null) {
+ out.println(msg_out("removing all keys"));
+ ArrayList res;
+ res = server.removeAll();
+ Iterator j = res.iterator();
+ while (j.hasNext())
+ out.println(msg_out((String)j.next()));
+ } else {
+ out.println(msg_out("removing key "+data[i]));
+ out.println(msg_out(server.remove(data[i])));
+ }
+ }
+ html_close(out); return;
+ }
+ if (cmd.equals("/list")) {
+ html_open(response, out);
+ out.println("<p>stylesheet list:</p><ul>");
+
+ Iterator i = server.list().iterator();
+ while (i.hasNext())
+ out.println("<li>"+i.next()+"</li>");
+ out.println("</ul>"); html_close(out); return;
+ }
+ if (cmd.equals("/reload")) {
+ final String key = request.getParameter("keys");
+ final String [] data = split(key, ",");
+ html_open(response, out);
+ for (int i = 0; i < data.length; i++) {
+ try {
+ if (data[i] == null) {
+ out.println(msg_out("reloading all keys"));
+ ArrayList res;
+ res = server.reloadAll();
+ Iterator j = res.iterator();
+ while(j.hasNext())
+ out.println(msg_out((String)j.next()));
+ } else {
+ out.println(msg_out("reloading key "+data[i]));
+ out.println(msg_out(server.reload(data[i])));
+ }
+ } catch (TransformerConfigurationException tce) {
+ out.println(exc_out("Stylesheet Error", tce));
+ } catch (Exception e) {
+ out.println(exc_out(null, e));
+ }
+ }
+ html_close(out); return;
+ }
+ if (cmd.equals("/help")) {
+ html_open(response, out);
+ out.println("<h2>Version "+server.VERSION+"</h1>");
+ out.println("<b>compiled "+server.DATE+" at "+server.TIME.substring(0,2)+":"+server.TIME.substring(2)+"</b>");
+ if(Server.SERIALIZATION_DIR.equals("")) {
+ out.println("<p><b>Stylesheet serialization is off.</b>");
+ out.println("(To turn it on, choose a non-empty value for the " +
+ "SERIALIZATION_DIR property.)</p>");
+ } else
+ out.println("<p><b>Serialized stylesheed are stored in "" +
+ Server.SERIALIZATION_DIR + "".</b></p>");
+ out.println("<p>usage:</p>"+help+"</body></html>");
+ html_close(out); return;
+ }
+ sendError(response, out, "unknown command", help); return;
+ } catch (Exception e) {
+ sendError(response, out, exc_out(null, e),"");
+ return;
+ }
+ }
- private void sendError(HttpServletResponse response, int code, String msg, Exception e) throws IOException {
- String err;
- if (e != null)
- err = "<p>"+e.getMessage()+"</P>";
- else
- err = "";
- response.setContentType("text/html");
- response.sendError(code, "<html><body><h1>Uwobo servlet</h1><p>"+msg+"</p>"+err+"</body></html>");
- }
-
- private void sendError(HttpServletResponse response, int code, String msg, String usage) throws IOException {
- response.setContentType("text/html");
- response.sendError(code, "<html><body><h1>Uwobo servlet</h1><p>"+msg+"</p>usage: "+usage+"</body></html>");
- }
+ private void sendError(HttpServletResponse resp, ServletOutputStream out,
+ String msg, String usage)
+ throws IOException
+ {
+ html_open(resp, out);
+ out.println("<p>"+msg+"</p>usage: "+usage);
+ html_close(out);
+ }
- public String getServletInfo() {
- return "The UWOBO servlet";
- }
+ public String getServletInfo()
+ {
+ return "The UWOBO servlet";
+ }
}