1 10 package org.mmbase.applications.dove.servlet; 11 12 import java.io.*; 13 14 import javax.servlet.http.*; 15 import javax.servlet.*; 16 17 18 import javax.xml.parsers.DocumentBuilder ; 19 import javax.xml.parsers.DocumentBuilderFactory ; 20 import org.xml.sax.*; 21 import org.w3c.dom.*; 22 23 import org.mmbase.util.*; 24 25 import org.mmbase.util.logging.*; 26 import org.mmbase.util.xml.*; 27 import org.mmbase.applications.dove.*; 28 import org.mmbase.servlet.MMBaseServlet; 29 30 38 public class DoveServlet extends MMBaseServlet { 40 private static final Logger log = Logging.getLoggerInstance(DoveServlet.class); 41 42 48 public void doGet(HttpServletRequest req, HttpServletResponse res) 49 throws ServletException, IOException { 50 PrintWriter out = res.getWriter(); 51 52 res.setContentType("text/html"); 53 out.println("<html><head><title>Dove</title></head>"); 54 out.println("<body><h1>Dove RPC Router</h1>"); 55 out.println("<p>The Dove servlet is active. use HTTP Post to send RPC commands.</p></body></html>"); 56 } 57 58 78 public void doPost(HttpServletRequest req, HttpServletResponse res) 79 throws ServletException, IOException { 80 String error="unknown error"; 81 String errortype="unknown"; 82 boolean pretty="yes".equals(req.getParameter("pretty")); 83 boolean plain="yes".equals(req.getParameter("plain")); 84 try { 85 DoveErrorHandler errorhandler = new DoveErrorHandler(); 86 DocumentBuilder db = XMLBasicReader.getDocumentBuilder(false,errorhandler); 87 88 String s = req.getParameter("xml"); 92 if (log.isDebugEnabled()){ log.debug("received : "+s);}; 93 Document document = db.parse(new InputSource(new StringReader(s))); 94 if (errorhandler.erroroccurred) { 95 error=errorhandler.parsingerrors; 96 errortype="parser"; 97 } else { 98 Element rootin=document.getDocumentElement(); 99 if (rootin.getTagName().equals(AbstractDove.REQUEST)) { 100 DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 101 Document doc = docBuilder.newDocument(); 102 Element rootout =doc.createElement(AbstractDove.RESPONSE); 103 doc.appendChild(rootout); 104 Dove birdy = new Dove(doc); 105 birdy.doRequest(rootin, rootout); 106 res.setStatus(HttpServletResponse.SC_OK); 107 if (plain) { 108 res.setContentType("text/plain"); 109 } else { 110 res.setContentType("text/xml"); 111 } 112 113 BufferedWriter out=new BufferedWriter( new OutputStreamWriter(res.getOutputStream())); 114 String content = XMLWriter.write(doc,pretty); 115 if (log.isDebugEnabled()){log.debug("sending : " + content);} 116 out.write(content); 117 out.flush(); 118 return; 119 } else { 120 error="No request found."; 121 errortype="parser"; 122 } 123 } 124 } catch (Exception e) { 125 log.error(Logging.stackTrace(e)); 126 error="System error: "+e; 127 errortype="server"; 128 } 129 ServletOutputStream out = res.getOutputStream(); 130 res.setStatus(HttpServletResponse.SC_OK); 131 if (plain) { 132 res.setContentType("text/plain"); 133 } else { 134 res.setContentType("text/xml"); 135 } 136 out.println("<response><error type=\"" + errortype + "\">" + error + "</error></response>"); 137 out.flush(); 138 } 139 140 146 public class DoveErrorHandler implements ErrorHandler { 147 148 151 public String parsingerrors=""; 152 153 156 public boolean erroroccurred=false; 157 158 162 public void error(SAXParseException ex) { 163 erroroccurred=true; 164 String s = getErrorString(ex); 165 log.error(s); 166 parsingerrors=parsingerrors+s+"\n"; 167 } 168 169 174 public void warning(SAXParseException ex) { 175 log.warn(getErrorString(ex)); 176 } 177 178 184 public void fatalError(SAXParseException ex) throws SAXException { 185 log.error("[Fatal Error] "+ getErrorString(ex)); 186 throw ex; 187 } 188 189 194 private String getErrorString(SAXParseException ex) { 195 String msg = ""; 196 String systemId = ex.getSystemId(); 197 if (systemId != null) { 198 int index = systemId.lastIndexOf('/'); 199 msg=systemId.substring(index + 1)+":"; 200 } 201 return msg +ex.getLineNumber()+":"+ 202 ex.getColumnNumber()+":"+ 203 ex.getMessage(); 204 } 205 } 206 207 } 208 | Popular Tags |