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.http.HttpServletRequest;
20 import javax.servlet.jsp.PageContext;
21
22 import org.apache.portals.bridges.struts.PortletServlet;
23 import org.apache.portals.bridges.struts.StrutsPortlet;
24 import org.apache.portals.bridges.struts.StrutsPortletURL;
25 import org.apache.portals.bridges.struts.config.StrutsPortletConfig;
26 import org.apache.portals.bridges.struts.config.PortletURLTypes;
27
28 /***
29 * Utility class providing common Struts Bridge Tags functionality.
30 *
31 * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
32 * @version $Id: TagsSupport.java 517068 2007-03-12 01:44:37Z ate $
33 */
34 class TagsSupport
35 {
36 /***
37 * Private constructor as this class isn't supposed to be instantiated.
38 *
39 */
40 private TagsSupport(){}
41
42 /***
43 * Resolves a, possibly relative, url to a context relative one for use within a Portlet context.
44 * <p>
45 * The url parameter may contain relative (../) elements.
46 * </p>
47 * @param pageContext the JSP pageContext
48 * @param url the url to resolve
49 * @return the resolved url
50 */
51 public static String getContextRelativeURL(PageContext pageContext, String url, boolean addContextPath)
52 {
53 if ( !url.startsWith("/"))
54 {
55 String newUrl = url;
56 String currentPath = (String)pageContext.getRequest().getAttribute(StrutsPortlet.PAGE_URL);
57 if ( addContextPath )
58 {
59 currentPath = ((HttpServletRequest)pageContext.getRequest()).getContextPath() + currentPath;
60 }
61 if ( addContextPath || currentPath.length() > 1
62 {
63 currentPath = currentPath.substring(0,currentPath.lastIndexOf('/'));
64 }
65 if ( currentPath.length() == 0 )
66 {
67 currentPath = "/";
68 }
69 while ( currentPath.length() > 0 )
70 {
71 if ( newUrl.startsWith("../"))
72 {
73 currentPath = currentPath.substring(0, currentPath.lastIndexOf('/'));
74 newUrl = newUrl.substring(3);
75 }
76 else
77 {
78 break;
79 }
80 }
81 if ( currentPath.length() > 1 )
82 {
83 url = currentPath + "/" + newUrl;
84 }
85 else
86 {
87 url = "/" + newUrl;
88 }
89 }
90 return url;
91 }
92
93 /***
94 * Creates an action or render PortletURL, or a ResourceURL.
95 * <p>
96 * The url parameter is first {@link #getContextRelativeURL(PageContext, String) resolved}
97 * to an context relative url.<br/>
98 * Then, a prefixed contextPath is removed from the resulting url.<br/>
99 * If the type parameter is specified (not null), the type of url created is based on its value.<br/>
100 * Otherwise, {@link PortletURLTypes#getType(String)} is used to determine which
101 * type of url must be created.
102 * </p>
103 * @param pageContext the JSP pageContext
104 * @param url the url to resolve
105 * @param type indicated which type of url must be created
106 * @return an action or render PortletURL, or a ResourceURL
107 */
108 public static String getURL(PageContext pageContext, String url, PortletURLTypes.URLType type)
109 {
110 url = getContextRelativeURL(pageContext,url,false);
111 String contextPath = ((HttpServletRequest)pageContext.getRequest()).getContextPath();
112 if (url.startsWith(contextPath + "/"))
113 {
114 url = url.substring(contextPath.length());
115 }
116
117 if ( type == null )
118 {
119 StrutsPortletConfig strutsPortletConfig = (StrutsPortletConfig)pageContext.getAttribute(StrutsPortlet.STRUTS_PORTLET_CONFIG,PageContext.APPLICATION_SCOPE);
120 type = strutsPortletConfig.getPortletURLTypes().getType(url);
121 }
122
123 if ( type.equals(PortletURLTypes.URLType.ACTION) )
124 {
125 return StrutsPortletURL.createActionURL(pageContext.getRequest(),url).toString();
126 }
127 else if ( type.equals(PortletURLTypes.URLType.RENDER) )
128 {
129 return StrutsPortletURL.createRenderURL(pageContext.getRequest(),url).toString();
130 }
131 else
132 {
133 if ( url.startsWith("/"))
134 {
135 return contextPath + url;
136 }
137 return contextPath + "/" + url;
138 }
139 }
140
141 /***
142 * Replaces the action url as generated by the struts:form tag with an action PortletURL.
143 * @param pageContext the JSP pageContext
144 * @param formStartElement the formStartElement as generated by the struts:form tag
145 * @return the formStartElement containing an action PortletURL
146 */
147 public static String getFormTagRenderFormStartElement(PageContext pageContext, String formStartElement)
148 {
149 if ( PortletServlet.isPortletRequest(pageContext.getRequest()))
150 {
151 int actionURLStart = formStartElement.indexOf("action=") + 8;
152 int actionURLEnd = formStartElement.indexOf('"', actionURLStart);
153 String actionURL = formStartElement.substring(actionURLStart,
154 actionURLEnd);
155 formStartElement = formStartElement.substring(0, actionURLStart)
156 + StrutsPortletURL.createActionURL(pageContext.getRequest(),
157 actionURL).toString()
158 + formStartElement.substring(actionURLEnd);
159 }
160 return formStartElement;
161 }
162 }