View Javadoc

1   /*
2    * $Id: PortletUrlRenderer.java 788633 2009-06-26 08:43:42Z nilsga $
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  
22  package org.apache.struts2.components;
23  
24  import java.io.IOException;
25  import java.io.Writer;
26  
27  import org.apache.struts2.dispatcher.mapper.ActionMapper; 
28  import org.apache.struts2.StrutsException;
29  import org.apache.struts2.portlet.context.PortletActionContext;
30  import org.apache.struts2.portlet.util.PortletUrlHelper;
31  import org.apache.commons.lang.xwork.StringUtils;
32  
33  import com.opensymphony.xwork2.ActionContext;
34  import com.opensymphony.xwork2.ActionInvocation;
35  import com.opensymphony.xwork2.inject.Inject;
36  
37  /***
38   * Implementation of the {@link UrlRenderer} interface that renders URLs for portlet environments.
39   * 
40   * @see UrlRenderer
41   *
42   */
43  public class PortletUrlRenderer implements UrlRenderer {
44  	
45  	/***
46  	 * The servlet renderer used when not executing in a portlet context.
47  	 */
48  	private UrlRenderer servletRenderer = null;
49  	
50  	public PortletUrlRenderer() {
51  		this.servletRenderer = new ServletUrlRenderer();
52  	}
53  
54  	@Inject
55  	public void setActionMapper(ActionMapper actionMapper) {
56  		servletRenderer.setActionMapper(actionMapper);
57  	}
58  	
59  	/***
60  	 * {@inheritDoc}
61  	 */
62  	public void renderUrl(Writer writer, UrlProvider urlComponent) {
63  		if(PortletActionContext.getPortletContext() == null || "none".equalsIgnoreCase(urlComponent.getPortletUrlType())) {
64  			servletRenderer.renderUrl(writer, urlComponent);
65  		}
66  		else {
67  			String action = null;
68  			if(urlComponent.getAction() != null) {
69  				action = urlComponent.findString(urlComponent.getAction());
70  			}
71  			String scheme = urlComponent.getHttpServletRequest().getScheme();
72  
73  			if (urlComponent.getScheme() != null) {
74  				scheme = urlComponent.getScheme();
75  			}
76  
77  			String result;
78  			urlComponent.setNamespace(urlComponent.determineNamespace(urlComponent.getNamespace(), urlComponent.getStack(), urlComponent.getHttpServletRequest()));
79  			if (onlyActionSpecified(urlComponent)) {
80  				result = PortletUrlHelper.buildUrl(action, urlComponent.getNamespace(), urlComponent.getMethod(), urlComponent.getParameters(), urlComponent.getPortletUrlType(),
81                          urlComponent.getPortletMode(), urlComponent.getWindowState());
82  			} else if(onlyValueSpecified(urlComponent)){
83  				result = PortletUrlHelper.buildResourceUrl(urlComponent.getValue(), urlComponent.getParameters());
84  			}
85  			else {
86  				result = createDefaultUrl(urlComponent);
87  			}
88              String anchor = urlComponent.getAnchor();
89  			if (StringUtils.isNotEmpty(anchor)) {
90  				result += '#' + urlComponent.findString(anchor);
91  			}
92  
93  			String var = urlComponent.getVar();
94  
95  			if (var != null) {
96  				urlComponent.putInContext(result);
97  
98  				// add to the request and page scopes as well
99  				urlComponent.getHttpServletRequest().setAttribute(var, result);
100 			} else {
101 				try {
102 					writer.write(result);
103 				} catch (IOException e) {
104 					throw new StrutsException("IOError: " + e.getMessage(), e);
105 				}
106 			}
107 		}
108 	}
109 
110 	private String createDefaultUrl(UrlProvider urlComponent) {
111 		String result;
112 		ActionInvocation ai = (ActionInvocation)urlComponent.getStack().getContext().get(
113 				ActionContext.ACTION_INVOCATION);
114 		String action = ai.getProxy().getActionName();
115 		result = PortletUrlHelper.buildUrl(action, urlComponent.getNamespace(), urlComponent.getMethod(), urlComponent.getParameters(),
116                 urlComponent.getPortletUrlType(), urlComponent.getPortletMode(), urlComponent.getWindowState());
117 		return result;
118 	}
119 
120 	private boolean onlyValueSpecified(UrlProvider urlComponent) {
121 		return urlComponent.getValue() != null && urlComponent.getAction() == null;
122 	}
123 
124 	private boolean onlyActionSpecified(UrlProvider urlComponent) {
125 		return urlComponent.getValue() == null && urlComponent.getAction() != null;
126 	}
127 
128 	/***
129 	 * {@inheritDoc}
130 	 */
131 	public void renderFormUrl(Form formComponent) {
132 		if(PortletActionContext.getPortletContext() == null) {
133 			servletRenderer.renderFormUrl(formComponent);
134 		}
135 		else {
136 			String namespace = formComponent.determineNamespace(formComponent.namespace, formComponent.getStack(),
137 					formComponent.request);
138 			String action = null;
139 			if (formComponent.action != null) {
140 				action = formComponent.findString(formComponent.action);
141 			}
142 			else {
143 				ActionInvocation ai = (ActionInvocation) formComponent.getStack().getContext().get(ActionContext.ACTION_INVOCATION);
144 				action = ai.getProxy().getActionName();
145 			}
146 			String type = "action";
147 			if (StringUtils.isNotEmpty(formComponent.method)) {
148 				if ("GET".equalsIgnoreCase(formComponent.method.trim())) {
149 					type = "render";
150 				}
151 			}
152 			if (action != null) {
153 				String result = PortletUrlHelper.buildUrl(action, namespace, null,
154 						formComponent.getParameters(), type, formComponent.portletMode, formComponent.windowState);
155 				formComponent.addParameter("action", result);
156 
157 
158 				// name/id: cut out anything between / and . should be the id and
159 				// name
160 				String id = formComponent.getId();
161 				if (id == null) {
162 					int slash = action.lastIndexOf('/');
163 					int dot = action.indexOf('.', slash);
164 					if (dot != -1) {
165 						id = action.substring(slash + 1, dot);
166 					} else {
167 						id = action.substring(slash + 1);
168 					}
169 					formComponent.addParameter("id", formComponent.escape(id));
170 				}
171 			}
172 		}
173 		
174 	}
175 
176 	public void beforeRenderUrl(UrlProvider urlComponent) {
177 		if(PortletActionContext.getPortletContext() == null) {
178 			servletRenderer.beforeRenderUrl(urlComponent);
179 		}
180 	}
181 
182 	public void setServletRenderer(UrlRenderer nonPortletRenderer) {
183 		this.servletRenderer = nonPortletRenderer;
184 		
185 	}
186 
187 }