View Javadoc

1   /*
2    * Copyright 2003,2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  /* 
17  
18   */
19  
20  package org.apache.pluto.core.impl;
21  
22  import java.io.IOException;
23  import java.io.PrintWriter;
24  import java.io.UnsupportedEncodingException;
25  import java.util.HashMap;
26  import java.util.Map;
27  
28  import javax.portlet.PortletResponse;
29  import javax.servlet.ServletOutputStream;
30  import javax.servlet.http.HttpServletRequest;
31  
32  import org.apache.pluto.core.InternalPortletResponse;
33  import org.apache.pluto.om.window.PortletWindow;
34  import org.apache.pluto.services.information.InformationProviderAccess;
35  import org.apache.pluto.services.information.ResourceURLProvider;
36  import org.apache.pluto.services.property.PropertyManager;
37  import org.apache.pluto.util.PrintWriterServletOutputStream;
38  
39  public abstract class PortletResponseImpl extends javax.servlet.http.HttpServletResponseWrapper 
40  implements InternalPortletResponse, PortletResponse
41  {
42  
43      PortletWindow portletWindow;
44  
45      /***
46       * this variable holds the servlet request of the target/portlet's
47       * web module
48       */
49      private javax.servlet.http.HttpServletRequest webModuleServletRequest;
50  
51      private boolean usingWriter;
52      private boolean usingStream;
53  
54      private ServletOutputStream wrappedWriter;
55      private Map properties;
56  
57      /***
58       * true if we are in an include call
59       */
60      private boolean included;
61  
62      public PortletResponseImpl(PortletWindow portletWindow,
63                                 javax.servlet.http.HttpServletRequest servletRequest,
64                                 javax.servlet.http.HttpServletResponse servletResponse)
65      {
66          super(servletResponse);
67  
68          this.webModuleServletRequest = servletRequest;
69          this.portletWindow = portletWindow;
70      }
71  
72      // javax.portlet.PortletResponse --------------------------------------------------------------
73      public void addProperty(String key, String value) 
74      {
75          if (key == null)
76          {
77              throw new IllegalArgumentException("Property key == null");
78          }
79  
80          Map props = getProperties();
81          
82          String[] oldValues = (String[]) props.get(key);
83          String[] newValues = null;
84          if (oldValues == null)
85          {
86              newValues = new String[]{value}; 
87          }
88          else
89          {
90              int len = oldValues.length;
91              newValues = new String[len+1];
92              System.arraycopy(oldValues, 0, newValues, 0, len);
93              newValues[len] = value;
94          }
95          props.put(key, newValues);
96  
97          PropertyManager.setResponseProperties(portletWindow, this.getHttpServletRequest(), _getHttpServletResponse(), props);
98  
99      }
100     
101     public void setProperty(String key, String value) 
102     {
103         if (key == null)
104         {
105             throw new IllegalArgumentException("Property key == null");
106         }
107 
108         Map props = getProperties();
109         
110         String[] newValues = new String[]{value}; 
111         props.put(key, newValues);
112 
113         PropertyManager.setResponseProperties(portletWindow, this.getHttpServletRequest(), _getHttpServletResponse(), props);
114     }
115     
116     public String encodeURL(String path)
117     {
118         if (path.indexOf("://") == -1 && !path.startsWith("/"))
119         {
120             throw new IllegalArgumentException("only absolute URLs or full path URIs are allowed");
121         }
122         ResourceURLProvider provider = InformationProviderAccess.getDynamicProvider(getHttpServletRequest()).getResourceURLProvider(portletWindow);
123         if (path.indexOf("://") != -1)
124         {
125             provider.setAbsoluteURL(path);
126         }
127         else
128         {
129             provider.setFullPath(path);
130         }
131         return this._getHttpServletResponse().encodeURL(provider.toString());
132     }
133     // --------------------------------------------------------------------------------------------
134 
135     // org.apache.pluto.core.InternalPortletResponse implementation -------------------------------
136     public void lateInit(javax.servlet.http.HttpServletRequest webModuleServletRequest,
137                          javax.servlet.http.HttpServletResponse webModuleServletResponse)
138     {
139         this.webModuleServletRequest = webModuleServletRequest;
140         this.setResponse(webModuleServletResponse);
141     }
142     // --------------------------------------------------------------------------------------------
143 
144     // internal methods ---------------------------------------------------------------------------
145     protected javax.servlet.http.HttpServletResponse _getHttpServletResponse()
146     {
147         return(javax.servlet.http.HttpServletResponse) super.getResponse();
148     }
149 
150     protected javax.servlet.http.HttpServletRequest getHttpServletRequest()
151     {
152         return webModuleServletRequest;
153     }
154 
155     private Map getProperties() {
156         if (properties == null)
157             properties = new HashMap();
158         return properties;
159     }
160     // --------------------------------------------------------------------------------------------
161 
162     // additional methods -------------------------------------------------------------------------
163     // servlet-only implementation 
164     // (inherited from HttpServletResponseWrapper)
165     public void addCookie(javax.servlet.http.Cookie cookie)
166     {
167         this._getHttpServletResponse().addCookie(cookie);
168     }
169 
170     public boolean containsHeader(String name)
171     {
172         return this._getHttpServletResponse().containsHeader(name);
173     }
174 
175     public String encodeRedirectUrl(String url)
176     {
177         return included ? null : this._getHttpServletResponse().encodeRedirectUrl(url);
178     }
179 
180     public String encodeRedirectURL(String url)
181     {
182         return included ? null : this._getHttpServletResponse().encodeRedirectURL(url);
183     }
184 
185     public void sendRedirect(String location) throws java.io.IOException
186     {
187         this._getHttpServletResponse().sendRedirect(location);
188     }
189 
190     public void setDateHeader(String name, long date)
191     {
192         this._getHttpServletResponse().setDateHeader(name,date);
193     }
194 
195     public void sendError(int sc, String msg) throws java.io.IOException
196     {
197         this._getHttpServletResponse().sendError(sc,msg);
198     }
199 
200     public void sendError(int sc) throws java.io.IOException
201     {
202         this._getHttpServletResponse().sendError(sc);
203     }
204 
205     public void addHeader(String name, String value)
206     {
207         this._getHttpServletResponse().addHeader(name,value);
208     }
209 
210     public void setIntHeader(String name, int value)
211     {
212         this._getHttpServletResponse().setIntHeader(name,value);
213     }
214 
215     public void addDateHeader(String name, long date)
216     {
217         this._getHttpServletResponse().addDateHeader(name,date);
218     }
219 
220     public void setHeader(String name, String value)
221     {
222         this._getHttpServletResponse().setHeader(name,value);
223     }
224 
225     public void setStatus(int sc)
226     {
227         this._getHttpServletResponse().setStatus(sc);
228     }
229 
230     public void setStatus(int sc, String sm)
231     {
232         this._getHttpServletResponse().setStatus(sc,sm);
233     }
234 
235     public void addIntHeader(String name, int value)
236     {
237         this._getHttpServletResponse().addIntHeader(name,value);
238     }
239 
240     public void setContentLength(int len)
241     {
242         this._getHttpServletResponse().setContentLength(len);
243     }
244 
245     public String encodeUrl(String url)
246     {
247         return this.encodeURL(url);
248     }
249 
250     public void setLocale(java.util.Locale loc)
251     {
252         this._getHttpServletResponse().setLocale(loc);
253     }
254 
255     public ServletOutputStream getOutputStream() throws IllegalStateException, IOException {
256         if (usingWriter)
257         {
258             throw new IllegalStateException("getPortletOutputStream can't be used after getWriter was invoked");
259         }
260 
261         if (wrappedWriter == null)
262         {
263             wrappedWriter = new PrintWriterServletOutputStream(_getHttpServletResponse().getWriter());
264         }
265 
266         usingStream = true;
267 
268         return wrappedWriter;
269     }
270 
271     public PrintWriter getWriter() throws UnsupportedEncodingException, IllegalStateException, IOException {
272         if (usingStream)
273         {
274             throw new IllegalStateException("getWriter can't be used after getOutputStream was invoked");
275         }
276 
277         usingWriter = true;
278 
279         return _getHttpServletResponse().getWriter();
280     }
281 
282     // other
283     public PortletWindow getInternalPortletWindow()
284     {
285         return portletWindow;
286     }
287     
288     // internal
289     
290     HttpServletRequest getHttpDServletRequest()
291     {
292         return webModuleServletRequest;
293     }
294 
295    public void setIncluded(boolean included)
296    {
297        this.included = included;
298    }
299 
300    public boolean isIncluded()
301    {
302        return included;
303    }
304 }