View Javadoc

1   /*
2    * $Id: PresentTag.java 471754 2006-11-06 14:55:09Z husted $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  package org.apache.struts.taglib.logic;
22  
23  import org.apache.struts.taglib.TagUtils;
24  
25  import javax.servlet.http.Cookie;
26  import javax.servlet.http.HttpServletRequest;
27  import javax.servlet.jsp.JspException;
28  
29  import java.security.Principal;
30  
31  import java.util.StringTokenizer;
32  
33  /**
34   * Evalute the nested body content of this tag if the specified value is
35   * present for this request.
36   *
37   * @version $Rev: 471754 $ $Date: 2004-10-16 12:38:42 -0400 (Sat, 16 Oct 2004)
38   *          $
39   */
40  public class PresentTag extends ConditionalTagBase {
41      public static final String ROLE_DELIMITER = ",";
42  
43      // ------------------------------------------------------ Protected Methods
44  
45      /**
46       * Evaluate the condition that is being tested by this particular tag, and
47       * return <code>true</code> if the nested body content of this tag should
48       * be evaluated, or <code>false</code> if it should be skipped. This
49       * method must be implemented by concrete subclasses.
50       *
51       * @throws JspException if a JSP exception occurs
52       */
53      protected boolean condition()
54          throws JspException {
55          return (condition(true));
56      }
57  
58      /**
59       * Evaluate the condition that is being tested by this particular tag, and
60       * return <code>true</code> if the nested body content of this tag should
61       * be evaluated, or <code>false</code> if it should be skipped. This
62       * method must be implemented by concrete subclasses.
63       *
64       * @param desired Desired outcome for a true result
65       * @throws JspException if a JSP exception occurs
66       */
67      protected boolean condition(boolean desired)
68          throws JspException {
69          // Evaluate the presence of the specified value
70          boolean present = false;
71          HttpServletRequest request =
72              (HttpServletRequest) pageContext.getRequest();
73  
74          if (cookie != null) {
75              present = this.isCookiePresent(request);
76          } else if (header != null) {
77              String value = request.getHeader(header);
78  
79              present = (value != null);
80          } else if (name != null) {
81              present = this.isBeanPresent();
82          } else if (parameter != null) {
83              String value = request.getParameter(parameter);
84  
85              present = (value != null);
86          } else if (role != null) {
87              StringTokenizer st =
88                  new StringTokenizer(role, ROLE_DELIMITER, false);
89  
90              while (!present && st.hasMoreTokens()) {
91                  present = request.isUserInRole(st.nextToken());
92              }
93          } else if (user != null) {
94              Principal principal = request.getUserPrincipal();
95  
96              present = (principal != null) && user.equals(principal.getName());
97          } else {
98              JspException e =
99                  new JspException(messages.getMessage("logic.selector"));
100 
101             TagUtils.getInstance().saveException(pageContext, e);
102             throw e;
103         }
104 
105         return (present == desired);
106     }
107 
108     /**
109      * Returns true if the bean given in the <code>name</code> attribute is
110      * found.
111      *
112      * @since Struts 1.2
113      */
114     protected boolean isBeanPresent() {
115         Object value = null;
116 
117         try {
118             if (this.property != null) {
119                 value =
120                     TagUtils.getInstance().lookup(pageContext, name,
121                         this.property, scope);
122             } else {
123                 value = TagUtils.getInstance().lookup(pageContext, name, scope);
124             }
125         } catch (JspException e) {
126             value = null;
127         }
128 
129         return (value != null);
130     }
131 
132     /**
133      * Returns true if the cookie is present in the request.
134      *
135      * @since Struts 1.2
136      */
137     protected boolean isCookiePresent(HttpServletRequest request) {
138         Cookie[] cookies = request.getCookies();
139 
140         if (cookies == null) {
141             return false;
142         }
143 
144         for (int i = 0; i < cookies.length; i++) {
145             if (this.cookie.equals(cookies[i].getName())) {
146                 return true;
147             }
148         }
149 
150         return false;
151     }
152 }