001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.el;
018
019import java.util.ArrayList;
020import java.util.Enumeration;
021import java.util.HashMap;
022import java.util.List;
023import java.util.Map;
024
025import javax.servlet.ServletContext;
026import javax.servlet.http.Cookie;
027import javax.servlet.http.HttpServletRequest;
028import javax.servlet.jsp.PageContext;
029
030/**
031 *
032 * <p>This class is used to generate the implicit Map and List objects
033 * that wrap various elements of the PageContext.  It also returns the
034 * correct implicit object for a given implicit object name.
035 * 
036 * @author Nathan Abramson - Art Technology Group
037 * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: mbenson $
038 **/
039
040public class ImplicitObjects
041{
042  //-------------------------------------
043  // Constants
044  //-------------------------------------
045
046  static final String sAttributeName = 
047    "org.apache.commons.el.ImplicitObjects";
048
049  //-------------------------------------
050  // Member variables
051  //-------------------------------------
052
053  PageContext mContext;
054  Map mPage;
055  Map mRequest;
056  Map mSession;
057  Map mApplication;
058  Map mParam;
059  Map mParams;
060  Map mHeader;
061  Map mHeaders;
062  Map mInitParam;
063  Map mCookie;
064
065  //-------------------------------------
066  /**
067   *
068   * Constructor
069   **/
070  public ImplicitObjects (PageContext pContext)
071  {
072    mContext = pContext;
073  }
074
075  //-------------------------------------
076  /**
077   *
078   * Finds the ImplicitObjects associated with the PageContext,
079   * creating it if it doesn't yet exist.
080   **/
081  public static ImplicitObjects getImplicitObjects (PageContext pContext)
082  {
083    ImplicitObjects objs = 
084      (ImplicitObjects)
085      pContext.getAttribute (sAttributeName,
086                             PageContext.PAGE_SCOPE);
087    if (objs == null) {
088      objs = new ImplicitObjects (pContext);
089      pContext.setAttribute (sAttributeName,
090                             objs,
091                             PageContext.PAGE_SCOPE);
092    }
093    return objs;
094  }
095
096  //-------------------------------------
097  /**
098   *
099   * Returns the Map that "wraps" page-scoped attributes
100   **/
101  public Map getPageScopeMap ()
102  {
103    if (mPage == null) {
104      mPage = createPageScopeMap (mContext);
105    }
106    return mPage;
107  }
108
109  //-------------------------------------
110  /**
111   *
112   * Returns the Map that "wraps" request-scoped attributes
113   **/
114  public Map getRequestScopeMap ()
115  {
116    if (mRequest == null) {
117      mRequest = createRequestScopeMap (mContext);
118    }
119    return mRequest;
120  }
121
122  //-------------------------------------
123  /**
124   *
125   * Returns the Map that "wraps" session-scoped attributes
126   **/
127  public Map getSessionScopeMap ()
128  {
129    if (mSession == null) {
130      mSession = createSessionScopeMap (mContext);
131    }
132    return mSession;
133  }
134
135  //-------------------------------------
136  /**
137   *
138   * Returns the Map that "wraps" application-scoped attributes
139   **/
140  public Map getApplicationScopeMap ()
141  {
142    if (mApplication == null) {
143      mApplication = createApplicationScopeMap (mContext);
144    }
145    return mApplication;
146  }
147
148  //-------------------------------------
149  /**
150   *
151   * Returns the Map that maps parameter name to a single parameter
152   * values.
153   **/
154  public Map getParamMap ()
155  {
156    if (mParam == null) {
157      mParam = createParamMap (mContext);
158    }
159    return mParam;
160  }
161
162  //-------------------------------------
163  /**
164   *
165   * Returns the Map that maps parameter name to an array of parameter
166   * values.
167   **/
168  public Map getParamsMap ()
169  {
170    if (mParams == null) {
171      mParams = createParamsMap (mContext);
172    }
173    return mParams;
174  }
175
176  //-------------------------------------
177  /**
178   *
179   * Returns the Map that maps header name to a single header
180   * values.
181   **/
182  public Map getHeaderMap ()
183  {
184    if (mHeader == null) {
185      mHeader = createHeaderMap (mContext);
186    }
187    return mHeader;
188  }
189
190  //-------------------------------------
191  /**
192   *
193   * Returns the Map that maps header name to an array of header
194   * values.
195   **/
196  public Map getHeadersMap ()
197  {
198    if (mHeaders == null) {
199      mHeaders = createHeadersMap (mContext);
200    }
201    return mHeaders;
202  }
203
204  //-------------------------------------
205  /**
206   *
207   * Returns the Map that maps init parameter name to a single init
208   * parameter values.
209   **/
210  public Map getInitParamMap ()
211  {
212    if (mInitParam == null) {
213      mInitParam = createInitParamMap (mContext);
214    }
215    return mInitParam;
216  }
217
218  //-------------------------------------
219  /**
220   *
221   * Returns the Map that maps cookie name to the first matching
222   * Cookie in request.getCookies().
223   **/
224  public Map getCookieMap ()
225  {
226    if (mCookie == null) {
227      mCookie = createCookieMap (mContext);
228    }
229    return mCookie;
230  }
231
232  //-------------------------------------
233  // Methods for generating wrapper maps
234  //-------------------------------------
235  /**
236   *
237   * Creates the Map that "wraps" page-scoped attributes
238   **/
239  public static Map createPageScopeMap (PageContext pContext)
240  {
241    final PageContext context = pContext;
242    return new EnumeratedMap ()
243      {
244        public Enumeration enumerateKeys () 
245        {
246          return context.getAttributeNamesInScope
247            (PageContext.PAGE_SCOPE);
248        }
249
250        public Object getValue (Object pKey) 
251        {
252          if (pKey instanceof String) {
253            return context.getAttribute
254              ((String) pKey, 
255               PageContext.PAGE_SCOPE);
256          }
257          else {
258            return null;
259          }
260        }
261
262        public boolean isMutable ()
263        {
264          return true;
265        }
266      };
267  }
268
269  //-------------------------------------
270  /**
271   *
272   * Creates the Map that "wraps" request-scoped attributes
273   **/
274  public static Map createRequestScopeMap (PageContext pContext)
275  {
276    final PageContext context = pContext;
277    return new EnumeratedMap ()
278      {
279        public Enumeration enumerateKeys () 
280        {
281          return context.getAttributeNamesInScope
282            (PageContext.REQUEST_SCOPE);
283        }
284
285        public Object getValue (Object pKey) 
286        {
287          if (pKey instanceof String) {
288            return context.getAttribute
289              ((String) pKey, 
290               PageContext.REQUEST_SCOPE);
291          }
292          else {
293            return null;
294          }
295        }
296
297        public boolean isMutable ()
298        {
299          return true;
300        }
301      };
302  }
303
304  //-------------------------------------
305  /**
306   *
307   * Creates the Map that "wraps" session-scoped attributes
308   **/
309  public static Map createSessionScopeMap (PageContext pContext)
310  {
311    final PageContext context = pContext;
312    return new EnumeratedMap ()
313      {
314        public Enumeration enumerateKeys () 
315        {
316          return context.getAttributeNamesInScope
317            (PageContext.SESSION_SCOPE);
318        }
319
320        public Object getValue (Object pKey) 
321        {
322          if (pKey instanceof String) {
323            return context.getAttribute
324              ((String) pKey, 
325               PageContext.SESSION_SCOPE);
326          }
327          else {
328            return null;
329          }
330        }
331
332        public boolean isMutable ()
333        {
334          return true;
335        }
336      };
337  }
338
339  //-------------------------------------
340  /**
341   *
342   * Creates the Map that "wraps" application-scoped attributes
343   **/
344  public static Map createApplicationScopeMap (PageContext pContext)
345  {
346    final PageContext context = pContext;
347    return new EnumeratedMap ()
348      {
349        public Enumeration enumerateKeys () 
350        {
351          return context.getAttributeNamesInScope
352            (PageContext.APPLICATION_SCOPE);
353        }
354
355        public Object getValue (Object pKey) 
356        {
357          if (pKey instanceof String) {
358            return context.getAttribute
359              ((String) pKey, 
360               PageContext.APPLICATION_SCOPE);
361          }
362          else {
363            return null;
364          }
365        }
366
367        public boolean isMutable ()
368        {
369          return true;
370        }
371      };
372  }
373
374  //-------------------------------------
375  /**
376   *
377   * Creates the Map that maps parameter name to single parameter
378   * value.
379   **/
380  public static Map createParamMap (PageContext pContext)
381  {
382    final HttpServletRequest request =
383      (HttpServletRequest) pContext.getRequest ();
384    return new EnumeratedMap ()
385      {
386        public Enumeration enumerateKeys () 
387        {
388          return request.getParameterNames ();
389        }
390
391        public Object getValue (Object pKey) 
392        {
393          if (pKey instanceof String) {
394            return request.getParameter ((String) pKey);
395          }
396          else {
397            return null;
398          }
399        }
400
401        public boolean isMutable ()
402        {
403          return false;
404        }
405      };
406  }
407
408  //-------------------------------------
409  /**
410   *
411   * Creates the Map that maps parameter name to an array of parameter
412   * values.
413   **/
414  public static Map createParamsMap (PageContext pContext)
415  {
416    final HttpServletRequest request =
417      (HttpServletRequest) pContext.getRequest ();
418    return new EnumeratedMap ()
419      {
420        public Enumeration enumerateKeys () 
421        {
422          return request.getParameterNames ();
423        }
424
425        public Object getValue (Object pKey) 
426        {
427          if (pKey instanceof String) {
428            return request.getParameterValues ((String) pKey);
429          }
430          else {
431            return null;
432          }
433        }
434
435        public boolean isMutable ()
436        {
437          return false;
438        }
439      };
440  }
441
442  //-------------------------------------
443  /**
444   *
445   * Creates the Map that maps header name to single header
446   * value.
447   **/
448  public static Map createHeaderMap (PageContext pContext)
449  {
450    final HttpServletRequest request =
451      (HttpServletRequest) pContext.getRequest ();
452    return new EnumeratedMap ()
453      {
454        public Enumeration enumerateKeys () 
455        {
456          return request.getHeaderNames ();
457        }
458
459        public Object getValue (Object pKey) 
460        {
461          if (pKey instanceof String) {
462            return request.getHeader ((String) pKey);
463          }
464          else {
465            return null;
466          }
467        }
468
469        public boolean isMutable ()
470        {
471          return false;
472        }
473      };
474  }
475
476  //-------------------------------------
477  /**
478   *
479   * Creates the Map that maps header name to an array of header
480   * values.
481   **/
482  public static Map createHeadersMap (PageContext pContext)
483  {
484    final HttpServletRequest request =
485      (HttpServletRequest) pContext.getRequest ();
486    return new EnumeratedMap ()
487      {
488        public Enumeration enumerateKeys () 
489        {
490          return request.getHeaderNames ();
491        }
492
493        public Object getValue (Object pKey) 
494        {
495          if (pKey instanceof String) {
496            // Drain the header enumeration
497            List l = new ArrayList ();
498            Enumeration e = request.getHeaders ((String) pKey);
499            if (e != null) {
500              while (e.hasMoreElements ()) {
501                l.add (e.nextElement ());
502              }
503            }
504            String [] ret = (String []) l.toArray (new String [l.size ()]);
505            return ret;
506          }
507          else {
508            return null;
509          }
510        }
511
512        public boolean isMutable ()
513        {
514          return false;
515        }
516      };
517  }
518
519  //-------------------------------------
520  /**
521   *
522   * Creates the Map that maps init parameter name to single init
523   * parameter value.
524   **/
525  public static Map createInitParamMap (PageContext pContext)
526  {
527    final ServletContext context = pContext.getServletContext ();
528    return new EnumeratedMap ()
529      {
530        public Enumeration enumerateKeys () 
531        {
532          return context.getInitParameterNames ();
533        }
534
535        public Object getValue (Object pKey) 
536        {
537          if (pKey instanceof String) {
538            return context.getInitParameter ((String) pKey);
539          }
540          else {
541            return null;
542          }
543        }
544
545        public boolean isMutable ()
546        {
547          return false;
548        }
549      };
550  }
551
552  //-------------------------------------
553  /**
554   *
555   * Creates the Map that maps cookie name to the first matching
556   * Cookie in request.getCookies().
557   **/
558  public static Map createCookieMap (PageContext pContext)
559  {
560    // Read all the cookies and construct the entire map
561    HttpServletRequest request = (HttpServletRequest) pContext.getRequest ();
562    Cookie [] cookies = request.getCookies ();
563    Map ret = new HashMap ();
564    for (int i = 0; cookies != null && i < cookies.length; i++) {
565      Cookie cookie = cookies [i];
566      if (cookie != null) {
567        String name = cookie.getName ();
568        if (!ret.containsKey (name)) {
569          ret.put (name, cookie);
570        }
571      }
572    }
573    return ret;
574  }
575
576  //-------------------------------------
577}