no stacktrace
[opensuse:sxkeeper.git] / src / de / suse / sx / engines / RequestHandler.java
1 /*
2  * Copyright (c) - 2005 by Klaas Freitag <freitag@suse.de>
3  * 
4  * This file is part of the SUSE XML (SX) project. 
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of version 2 of the GNU General Public License as
8  * published by the Free Software Foundation.
9  */
10
11 package de.suse.sx.engines;
12
13 import java.io.*;
14 import java.util.*;
15
16 import javax.servlet.http.*;
17
18 import org.apache.log4j.*;
19 import org.jdom.*;
20 import org.jdom.input.*;
21
22 import de.suse.backends.*;
23 import de.suse.xml.*;
24
25 /**
26  * Parses the request URL and provides the data for the underlying engines
27  */
28 public class RequestHandler {
29     
30     protected String sxkeeperIdentifier;
31     protected String containerName;
32     protected SxBackendIface dataman = null;
33     protected final static Logger log = Logger.getLogger("de.suse.sx.engines.RequestHandler");
34     
35     protected HttpServletRequest request;
36     protected HttpServletResponse response;
37     protected SXDocumentType docType;
38     protected String docId;
39     protected String docRev;
40     protected Properties requestProperties;
41     
42    
43     // populate some variables needed by all requests
44     RequestHandler(HttpServletRequest req, HttpServletResponse response) throws SXException {
45         
46         request = req;
47         this.response = response;
48         setRequestProperties(req);
49                
50         try {
51                 dataman = DataManager.getInstance().getBackend();
52         } catch (Exception e) {
53             throw new SXException("Could not initialize datamanager. " + e.getMessage());
54         }
55         
56         String path = request.getRequestURI();
57         String query = (request.getQueryString() != null ? "?" + request.getQueryString() : "");
58         log.debug("User: " + requestProperties.getProperty("userid")  + "; Agent: " + req.getHeader("user-agent") + 
59                 "; URL: " + path + query + "; Encoding: " + req.getCharacterEncoding());
60         StringTokenizer tok = new StringTokenizer(path, "/");
61
62         try {
63             sxkeeperIdentifier = tok.nextToken();
64         } catch( NoSuchElementException e) {
65             throw new SXException("The URI is too short! (no /sxkeeper)");
66         }
67             
68         // containername is mandatory for all requests
69         if (tok.hasMoreTokens()) {
70             containerName = tok.nextToken();
71             docType = new SXDocumentType(containerName);
72
73         }
74         
75         // optional parameters
76         if (tok.hasMoreTokens()){
77             docId = tok.nextToken();
78         }
79         if (tok.hasMoreTokens()){
80             docRev = tok.nextToken();
81         }
82                 
83     }
84
85         
86         protected Document getDocument() throws SXException {
87         if (request.getContentLength() > 0){
88             try {
89                 BufferedReader reader = request.getReader();
90                 SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser");
91                 Document xdoc = builder.build(reader);
92                 return xdoc;
93             } catch (IOException e) {    
94                 SXException sxe = new SXException(e, 400);
95                 throw sxe;
96             } catch (Exception e) {
97                 SXException sxe = new SXException("Invalid XML posted! Message: " + e.getMessage(), 400);
98                 throw sxe;
99             }
100         } else {
101             throw new SXException("PUT/POST request with empty body", 400);
102         }
103         }
104         
105         
106     protected SXDocument verifyDocument(Document doc) throws SXException {
107         try {
108             new SXValidator().validateDocumentMSV(doc);
109             if (SXConverter.needsTransformation(doc)) {
110                 PropertyManager propMan = PropertyManager.getInstance();
111                 SXConverter c = new SXConverter(propMan.getValue("xmlPath"));
112                 doc = c.convertToCurrent(doc, true);
113                 // validate converted document
114                 new SXValidator().validateDocumentMSV(doc);
115             }
116             return new SXDocument(containerName, doc);
117         } catch (Exception e) {
118             SXException sxe = new SXException("XML verification failed! Message: " + e.getMessage(), 400);
119             throw sxe;
120         }
121     }
122         
123         
124         
125         private void setRequestProperties(HttpServletRequest req) throws SXException {
126             
127             requestProperties = new Properties();
128             Enumeration<String> params = req.getParameterNames(); 
129             
130             while (params.hasMoreElements()) {
131                 String param = params.nextElement();
132                 requestProperties.put(param, req.getParameter(param));
133             }
134             
135             // iChain sets the headers: x-username, x-email
136             String userId = req.getHeader("x-username");
137             if (userId == null) {
138                 throw new SXException("Could not get iChain username.", 401);
139                 //userId = "fate_noreply";
140             }
141         
142         requestProperties.put("userid", userId);
143         requestProperties.put("hostname", req.getServerName());
144         }
145
146
147     public Properties getRequestProperties() {
148         return requestProperties;
149     }
150         
151         
152 }