View Javadoc

1   package net.trajano.twiff.internal.servlet;
2   
3   import java.util.Collections;
4   import java.util.HashMap;
5   import java.util.List;
6   import java.util.Map;
7   import java.util.Set;
8   import javax.servlet.http.HttpServletRequest;
9   import javax.servlet.http.HttpSession;
10  import net.trajano.twiff.MissingSessionException;
11  import net.trajano.twiff.MissingTokenException;
12  import net.trajano.twiff.adapter.RequestAdapter;
13  import org.apache.commons.collections.MultiHashMap;
14  import org.apache.commons.collections.MultiMap;
15  import org.apache.commons.fileupload.DiskFileUpload;
16  import org.apache.commons.fileupload.FileItem;
17  import org.apache.commons.fileupload.FileUpload;
18  import org.apache.commons.fileupload.FileUploadException;
19  
20  /***
21   * This adapts a request so {@link net.trajano.twiff.web.ActionServlet} can use
22   * it in a more type safe manner.
23   * 
24   * @author Archimedes Trajano
25   */
26  public class ActionServletRequestAdapter extends RequestAdapter {
27      /***
28       * POST data from the request.
29       */
30      private final Map<String, Object[]> postData;
31  
32      /***
33       * The servlet request.
34       */
35      private final HttpServletRequest request;
36  
37      /***
38       * Session ID.
39       */
40      private final String sessionId;
41  
42      /***
43       * Token ID.
44       */
45      private final String tokenId;
46  
47      /***
48       * Constructs the adapter and initializes all its data.
49       * 
50       * @param request
51       *                   the servlet request.
52       * @param tokenFieldName
53       *                   the name of the field that contains the token ID.
54       * @throws FileUploadException
55       * @throws MissingSessionException
56       *                    thrown when there is no session data in the request.
57       * @throws MissingTokenException
58       *                    thrown when there is no token id in the request.
59       */
60      public ActionServletRequestAdapter(final HttpServletRequest request, final String tokenFieldName) throws FileUploadException {
61          super(request);
62          this.request = request;
63          final HttpSession session = request.getSession(false);
64          if (session == null) {
65              throw new MissingSessionException();
66          }
67          this.sessionId = session.getId();
68          this.postData = initPostData();
69          this.tokenId = (String) postData.get(tokenFieldName)[0];
70          if (tokenId == null) {
71              throw new MissingTokenException();
72          }
73      }
74  
75      /***
76       * @return Returns the postData.
77       */
78      public final Map<String, Object[]> getPostData() {
79          return postData;
80      }
81  
82      /***
83       * @return Returns the sessionId.
84       */
85      public final String getSessionId() {
86          return sessionId;
87      }
88  
89      /***
90       * @return Returns the tokenId.
91       */
92      public final String getTokenId() {
93          return tokenId;
94      }
95  
96      /***
97       * Extracts the POST data from the request. It supports multiple elements
98       * for a single key using the {@link MultiMap} structure. The map returned
99       * is unmodifiable.
100      * 
101      * @return the map of POST data with a key of strings.
102      * @throws FileUploadException
103      */
104     private Map<String, Object[]> initPostData() throws FileUploadException {
105         Map<String, Object[]> resultMap;
106         if (FileUpload.isMultipartContent(request)) {
107             DiskFileUpload upload = new DiskFileUpload();
108             List<FileItem> fileItems = (List<FileItem>) upload.parseRequest(request);
109             MultiMap tempMap = new MultiHashMap(fileItems.size());
110             for (FileItem item : fileItems) {
111                 if (item.isFormField()) {
112                     tempMap.put(item.getFieldName(), item.getString());
113                 } else {
114                     tempMap.put(item.getFieldName(), item.get());
115                 }
116             }
117             resultMap = new HashMap<String, Object[]>(tempMap.size());
118             for (String key : (Set<String>) tempMap.keySet()) {
119                 resultMap.put(key, ((List) tempMap.get(key)).toArray());
120             }
121         } else {
122             Map<String, String[]> parameterMap = (Map<String, String[]>) request.getParameterMap();
123             resultMap = new HashMap<String, Object[]>(parameterMap.size());
124             for (String name : parameterMap.keySet()) {
125                 resultMap.put(name, parameterMap.get(name));
126             }
127         }
128         return (Map<String, Object[]>) Collections.unmodifiableMap(resultMap);
129     }
130 }