View Javadoc

1   /*
2    * $Id: BaseTag.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.html;
22  
23  import org.apache.struts.Globals;
24  import org.apache.struts.taglib.TagUtils;
25  import org.apache.struts.util.MessageResources;
26  import org.apache.struts.util.RequestUtils;
27  
28  import javax.servlet.http.HttpServletRequest;
29  import javax.servlet.jsp.JspException;
30  import javax.servlet.jsp.JspWriter;
31  import javax.servlet.jsp.PageContext;
32  import javax.servlet.jsp.tagext.TagSupport;
33  
34  import java.io.IOException;
35  
36  import java.util.StringTokenizer;
37  
38  /**
39   * Renders an HTML <base> element with an href attribute pointing to the
40   * absolute location of the enclosing JSP page. This tag is only valid when
41   * nested inside a head tag body. The presence of this tag allows the browser
42   * to resolve relative URL's to images, CSS stylesheets  and other resources
43   * in a manner independent of the URL used to call the ActionServlet.
44   *
45   * @version $Rev: 471754 $ $Date: 2005-09-20 02:29:01 -0400 (Tue, 20 Sep 2005)
46   *          $
47   */
48  public class BaseTag extends TagSupport {
49      /**
50       * The message resources for this package.
51       */
52      protected static MessageResources messages =
53          MessageResources.getMessageResources(Constants.Package
54              + ".LocalStrings");
55      protected final String REF_SITE = "site";
56      protected final String REF_PAGE = "page";
57  
58      /**
59       * The server name to use instead of request.getServerName().
60       */
61      protected String server = null;
62  
63      /**
64       * The target window for this base reference.
65       */
66      protected String target = null;
67  
68      /**
69       * The reference to which the base will created.
70       */
71      protected String ref = REF_PAGE;
72  
73      /**
74       * Gets the reference to which the base will be created
75       */
76      public String getRef() {
77          return (this.ref);
78      }
79  
80      /**
81       * Sets the reference to which the base will be created.
82       *
83       * @param ref Either "page" to render the base as the jsp path located, or
84       *            "site" as the application's context
85       */
86      public void setRef(String ref) {
87          if (ref == null) {
88              throw new IllegalArgumentException("Ref attribute cannot be null");
89          }
90  
91          ref = ref.toLowerCase();
92  
93          if (ref.equals(REF_PAGE) || ref.equals(REF_SITE)) {
94              this.ref = ref;
95          } else {
96              throw new IllegalArgumentException("Ref attribute must either be "
97                  + "'" + REF_PAGE + "' or '" + REF_SITE + "'");
98          }
99      }
100 
101     public String getTarget() {
102         return (this.target);
103     }
104 
105     public void setTarget(String target) {
106         this.target = target;
107     }
108 
109     /**
110      * Process the start of this tag.
111      *
112      * @throws JspException if a JSP exception has occurred
113      */
114     public int doStartTag() throws JspException {
115         HttpServletRequest request =
116             (HttpServletRequest) pageContext.getRequest();
117         String serverName =
118             (this.server == null) ? request.getServerName() : this.server;
119 
120         int port = request.getServerPort();
121         String headerHost = request.getHeader("Host");
122 
123         if ((serverName == null) && (headerHost != null)) {
124             StringTokenizer tokenizer = new StringTokenizer(headerHost, ":");
125 
126             serverName = tokenizer.nextToken();
127 
128             if (tokenizer.hasMoreTokens()) {
129                 String portS = tokenizer.nextToken();
130 
131                 try {
132                     port = Integer.parseInt(portS);
133                 } catch (Exception e) {
134                     port = 80;
135                 }
136             } else {
137                 port = 80;
138             }
139         }
140 
141         String baseTag =
142             renderBaseElement(request.getScheme(), serverName, port,
143                 request.getRequestURI());
144 
145         JspWriter out = pageContext.getOut();
146 
147         try {
148             out.write(baseTag);
149         } catch (IOException e) {
150             pageContext.setAttribute(Globals.EXCEPTION_KEY, e,
151                 PageContext.REQUEST_SCOPE);
152             throw new JspException(messages.getMessage("common.io", e.toString()));
153         }
154 
155         return EVAL_BODY_INCLUDE;
156     }
157 
158     /**
159      * Render a fully formed HTML &lt;base&gt; element and return it as a
160      * String.
161      *
162      * @param scheme     The scheme used in the url (ie. http or https).
163      * @param serverName
164      * @param port
165      * @param uri        The portion of the url from the protocol name up to
166      *                   the query string.
167      * @return String An HTML &lt;base&gt; element.
168      * @since Struts 1.1
169      */
170     protected String renderBaseElement(String scheme, String serverName,
171         int port, String uri) {
172         StringBuffer tag = new StringBuffer("<base href=\"");
173 
174         if (ref.equals(REF_SITE)) {
175             StringBuffer contextBase =
176                 new StringBuffer(((HttpServletRequest) pageContext.getRequest())
177                     .getContextPath());
178 
179             contextBase.append("/");
180             tag.append(RequestUtils.createServerUriStringBuffer(scheme,
181                     serverName, port, contextBase.toString()).toString());
182         } else {
183             tag.append(RequestUtils.createServerUriStringBuffer(scheme,
184                     serverName, port, uri).toString());
185         }
186 
187         tag.append("\"");
188 
189         if (this.target != null) {
190             tag.append(" target=\"");
191             tag.append(this.target);
192             tag.append("\"");
193         }
194 
195         if (TagUtils.getInstance().isXhtml(this.pageContext)) {
196             tag.append(" />");
197         } else {
198             tag.append(">");
199         }
200 
201         return tag.toString();
202     }
203 
204     /**
205      * Returns the server.
206      *
207      * @return String
208      */
209     public String getServer() {
210         return this.server;
211     }
212 
213     /**
214      * Sets the server.
215      *
216      * @param server The server to set
217      */
218     public void setServer(String server) {
219         this.server = server;
220     }
221 }