1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.portals.bridges.struts.taglib;
18
19 import javax.servlet.ServletRequest;
20 import javax.servlet.jsp.JspException;
21 import javax.servlet.jsp.tagext.BodyContent;
22
23 import org.apache.portals.bridges.struts.PortletServlet;
24 import org.apache.portals.bridges.struts.config.PortletURLTypes;
25 import org.apache.struts.taglib.TagUtils;
26 import org.apache.strutsel.taglib.utils.EvalHelper;
27
28 /***
29 * Supports the Struts html-el:rewrite tag to be used within a Portlet context.
30 *
31 * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
32 * @version $Id: ELRewriteTag.java 517068 2007-03-12 01:44:37Z ate $
33 */
34 public class ELRewriteTag extends org.apache.strutsel.taglib.html.ELRewriteTag
35 {
36 /***
37 * Indicates which type of a url must be generated: action, render or resource.
38 * <p>If not specified, the type will be determined by
39 * {@link PortletURLTypes#getType(String)}</p>.
40 */
41 protected PortletURLTypes.URLType urlType = null;
42
43 /***
44 * @return "true" if an ActionURL must be rendered
45 */
46 public String getActionURL()
47 {
48 return urlType != null && urlType.equals(PortletURLTypes.URLType.ACTION) ? "true" : "false";
49 }
50
51 private String actionURL;
52 /***
53 * Render an ActionURL when set to "true"
54 * <p>
55 * Supports jstl expression language.
56 * </p>
57 * @param actionURL when (evaluated to) "true" renders an ActionURL
58 */
59 public void setActionURL(String actionURL)
60 {
61
62 this.actionURL = actionURL;
63 }
64
65 public String getRenderURL()
66 {
67 return urlType != null && urlType.equals(PortletURLTypes.URLType.RENDER) ? "true" : "false";
68 }
69
70 private String renderURL;
71 /***
72 * Render a RenderURL when set to "true"
73 * <p>
74 * Supports jstl expression language.
75 * </p>
76 * @param renderURL when (evaluated to) "true" renders a RenderURL
77 */
78 public void setRenderURL(String renderURL)
79 {
80
81 this.renderURL = renderURL;
82 }
83
84 public String getResourceURL()
85 {
86 return urlType != null && urlType.equals(PortletURLTypes.URLType.RESOURCE) ? "true" : "false";
87 }
88
89 private String resourceURL;
90
91 /***
92 * Render a ResourceURL when set to "true"
93 * <p>
94 * Supports jstl expression language.
95 * </p>
96 * @param resourceURL when (evaluated to) "true" renders a ResourceURL
97 */
98 public void setResourceURL(String resourceURL)
99 {
100
101 this.resourceURL = resourceURL;
102 }
103
104 /***
105 * Generates a PortletURL or a ResourceURL for the link when in the context of a
106 * {@link PortletServlet#isPortletRequest(ServletRequest) PortletRequest}, otherwise
107 * the default behaviour is maintained.
108 * @return the link url
109 * @exception JspException if a JSP exception has occurred
110 */
111 public int doStartTag() throws JspException
112 {
113 evaluateExpressions();
114
115 if ( PortletServlet.isPortletRequest(pageContext.getRequest()))
116 {
117 String url = null;
118 BodyContent bodyContent = pageContext.pushBody();
119 try
120 {
121 super.doStartTag();
122 url = bodyContent.getString();
123
124
125 String anchor = null;
126 int hash = url.indexOf('#');
127 if ( hash > -1 )
128 {
129
130 anchor = url.substring(hash);
131 url = url.substring(0,hash);
132 }
133
134 url = TagsSupport.getURL(pageContext, url, urlType);
135
136 if ( anchor != null )
137 {
138 url = url + anchor;
139 }
140 }
141 finally
142 {
143 pageContext.popBody();
144 }
145 TagUtils.getInstance().write(pageContext, url);
146 return (SKIP_BODY);
147 }
148 else
149 {
150 return super.doStartTag();
151 }
152 }
153
154 /***
155 * Resolve the {@link #actionURL}, {@link #renderURL} and {@link #resourceURL} attributes
156 * using the Struts JSTL expression evaluation engine ({@link EvalHelper}).
157 * @exception JspException if a JSP exception has occurred
158 */
159 private void evaluateExpressions() throws JspException {
160 Boolean value;
161
162 value = EvalHelper.evalBoolean("actionURL", actionURL,this, pageContext);
163 if ( value != null && value.booleanValue() )
164 {
165 urlType = PortletURLTypes.URLType.ACTION;
166 }
167 if ( urlType == null )
168 {
169 value = EvalHelper.evalBoolean("renderURL", renderURL,this, pageContext);
170 if ( value != null && value.booleanValue() )
171 {
172 urlType = PortletURLTypes.URLType.RENDER;
173 }
174 }
175 if ( urlType == null )
176 {
177 value = EvalHelper.evalBoolean("resourceURL", resourceURL,this, pageContext);
178 if ( value != null && value.booleanValue() )
179 {
180 urlType = PortletURLTypes.URLType.RESOURCE;
181 }
182 }
183 }
184
185 public void release() {
186
187 super.release();
188 urlType = null;
189 actionURL = null;
190 renderURL = null;
191 resourceURL = null;
192 }
193 }