168 lines
6.5 KiB
Java
168 lines
6.5 KiB
Java
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
* (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* $Header:$
|
|
*/
|
|
package org.apache.beehive.netui.tags.html;
|
|
|
|
import org.apache.beehive.netui.core.urls.FreezableMutableURI;
|
|
import org.apache.beehive.netui.core.urls.URIContext;
|
|
import org.apache.beehive.netui.core.urls.URLType;
|
|
import org.apache.beehive.netui.core.urls.URLRewriterService;
|
|
import org.apache.beehive.netui.pageflow.PageFlowUtils;
|
|
import org.apache.beehive.netui.pageflow.internal.URIContextFactory;
|
|
import org.apache.beehive.netui.tags.AbstractClassicTag;
|
|
import org.apache.beehive.netui.tags.rendering.TagRenderingBase;
|
|
import org.apache.beehive.netui.util.Bundle;
|
|
import org.apache.beehive.netui.util.ParamHelper;
|
|
import org.apache.beehive.netui.util.config.ConfigUtil;
|
|
import org.apache.beehive.netui.util.config.bean.UrlConfig;
|
|
|
|
import javax.servlet.ServletContext;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.jsp.JspException;
|
|
import java.net.URISyntaxException;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* Allow a URL to participate in rewritting. Some containers rewrite URLs.
|
|
* This tag will pass the URL attribute through the rewriters to generate a
|
|
* rewritten URL before it is output into the HTML stream.
|
|
* @jsptagref.tagdescription Allows a URL to participate in URL rewritting.
|
|
* Some containers rewrite URLs. This tag will pass the URL attribute through
|
|
* the rewriters to generate a rewritten URL before it is output into the HTML stream.
|
|
* @example In this sample, the URL attribute will be rewritten and output within
|
|
* the span tags. The actual value that will be written to the rendered HTML may
|
|
* change depending on the application container.
|
|
* <pre> <span>URL: <netui:rewriteURL URL="foo.do"/></span></pre>
|
|
* @netui:tag name="rewriteURL" description="Allows the URL Rewriter to rewrite the url attribute before it is output into the HTML stream."
|
|
*/
|
|
public class RewriteURL extends AbstractClassicTag implements IUrlParams
|
|
{
|
|
private Map _params; // Any parameters to the submit
|
|
protected String url = null;
|
|
|
|
/**
|
|
* Return the name of the Tag.
|
|
*/
|
|
public String getTagName()
|
|
{
|
|
return "RewriteURL";
|
|
}
|
|
|
|
/**
|
|
* Sets the URL to be rewritten.
|
|
* @param url the value of the URL that will be rewritten.
|
|
* @jsptagref.attributedescription The value of the URL that will be rewritten.
|
|
* @jsptagref.attributesyntaxvalue <i>string_url</i>
|
|
* @netui:attribute required="true" rtexprvalue="true"
|
|
* description="The value of the URL that will be rewritten."
|
|
*/
|
|
public void setURL(String url)
|
|
{
|
|
this.url = url;
|
|
}
|
|
|
|
/**
|
|
* This method will allow a tag that produces one or more Urls to have parameters set
|
|
* on the tag. The name and value should be required. The facet is optional, and
|
|
* allows tags producing more than one URL to have parameters set on different URLs.
|
|
*
|
|
* @param name The name of the parameter to be added to the URL.
|
|
* @param value The value of the parameter.
|
|
* @param facet The name of a facet for which the parameter should be added.
|
|
* @throws javax.servlet.jsp.JspException
|
|
*/
|
|
public void addParameter(String name, Object value, String facet)
|
|
throws JspException
|
|
{
|
|
if (_params == null) {
|
|
_params = new HashMap();
|
|
}
|
|
ParamHelper.addParam(_params, name, value);
|
|
}
|
|
|
|
/**
|
|
* Render the beginning of the rewriteURL tag.
|
|
* @throws JspException if a JSP exception has occurred
|
|
*/
|
|
public int doStartTag() throws JspException
|
|
{
|
|
// Evaluate the body of this tag
|
|
return EVAL_BODY_BUFFERED;
|
|
}
|
|
|
|
/**
|
|
* Render the end of the rewriteURL tag.
|
|
* @throws JspException if a JSP exception has occurred
|
|
*/
|
|
public int doEndTag() throws JspException
|
|
{
|
|
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
|
|
HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();
|
|
ServletContext context = pageContext.getServletContext();
|
|
|
|
try {
|
|
boolean encoded = false;
|
|
UrlConfig urlConfig = ConfigUtil.getConfig().getUrlConfig();
|
|
if (urlConfig != null) {
|
|
encoded = !urlConfig.isUrlEncodeUrls();
|
|
}
|
|
|
|
FreezableMutableURI uri = new FreezableMutableURI();
|
|
uri.setEncoding(response.getCharacterEncoding());
|
|
uri.setURI(url, encoded);
|
|
boolean needsToBeSecure = false;
|
|
if (_params != null) {
|
|
uri.addParameters(_params, false );
|
|
}
|
|
if (!uri.isAbsolute() && PageFlowUtils.needsToBeSecure(context, request, url, true)) {
|
|
needsToBeSecure = true;
|
|
}
|
|
|
|
URLRewriterService.rewriteURL(context, request, response, uri, URLType.ACTION, needsToBeSecure);
|
|
String key = PageFlowUtils.getURLTemplateKey(URLType.ACTION, needsToBeSecure);
|
|
boolean forXML = TagRenderingBase.Factory.isXHTML(request);
|
|
URIContext uriContext = URIContextFactory.getInstance(forXML);
|
|
String uriString = URLRewriterService.getTemplatedURL(context, request, uri, key, uriContext);
|
|
write(response.encodeURL(uriString));
|
|
}
|
|
catch (URISyntaxException e) {
|
|
// report the error...
|
|
String s = Bundle.getString("Tags_RewriteURL_URLException",
|
|
new Object[]{url, e.getMessage()});
|
|
registerTagError(s, e);
|
|
reportErrors();
|
|
}
|
|
|
|
localRelease();
|
|
return EVAL_PAGE;
|
|
}
|
|
|
|
/**
|
|
* Release any acquired resources.
|
|
*/
|
|
protected void localRelease()
|
|
{
|
|
super.localRelease();
|
|
_params = null;
|
|
url = null;
|
|
}
|
|
|
|
}
|