001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: * $Header:$
018: */
019: package org.apache.beehive.netui.tags.html;
020:
021: import org.apache.beehive.netui.tags.AbstractClassicTag;
022: import org.apache.beehive.netui.tags.TagConfig;
023: import org.apache.beehive.netui.tags.javascript.IScriptReporter;
024: import org.apache.beehive.netui.tags.javascript.ScriptRequestState;
025:
026: import javax.servlet.http.HttpServletRequest;
027: import javax.servlet.jsp.JspException;
028:
029: /**
030: * Allow a name, typically either an <code>id</code> or <code>name</code> attribute, to participate in URL
031: * rewritting. Some containers rewrite name attributes so they are unique.
032: * This tag will cause the name to be made available from <code>lookupIdByTagId</code>
033: * JavaScript, which is output from the <netui:html> tag.
034: * @jsptagref.tagdescription Allows a name, typically either an <code>id</code> or <code>name</code> attribute,
035: * to participate in URL rewritting. Some containers rewrite name attributes so they are unique.
036: * This tag will cause the name to be made available from the <code>lookupIdByTagId( id, tag )</code>
037: * JavaScript function.
038: * @example In this sample, we are setting the id attribute of the span tag to 'foo'. The
039: * actual value that will be rendered in the HTML may change depending on the
040: * container where the web application resides. For example, a Portal container may
041: * render <span name="scope1_foo"> instead of <span name="foo">.
042: * But the value 'foo' can be passed to <code>lookupIdByTagId( id, tag )</code> to find the rendered
043: * value of the name attribute.
044: *
045: * <pre> <span id="<netui:rewriteName name="foo"/>"></pre>
046: * @netui:tag name="rewriteName" description="Allows the URL Rewriter to rewrite the name attribute before it is output into the HTML stream."
047: */
048: public class RewriteName extends AbstractClassicTag {
049: private String _name = null;
050: private String _resultId = null;
051:
052: /**
053: * Return the name of the Tag.
054: */
055: public String getTagName() {
056: return "RewriteName";
057: }
058:
059: /**
060: * Sets the name to be rewritten.
061: * @param name the parameter name.
062: * @jsptagref.attributedescription The name which will be rewritten. This value will be output to the page rendered in the browser and may be looked up using 'name'.
063: * @jsptagref.databindable false
064: * @jsptagref.attributesyntaxvalue <i>string_name</i>
065: * @netui:attribute required="true" rtexprvalue="true"
066: * description="The name which will be rewritten. This value will be output to the page rendered in the browser and may be looked up using 'name'."
067: */
068: public void setName(String name) {
069: _name = name;
070: }
071:
072: /**
073: * Sets the resultId which, if non-null, will store the real name
074: * in the page context under the resultId name;
075: * @param resultId the parameter name.
076: * @jsptagref.attributedescription A name that will cause the real name to be stored into the page context under this name.
077: * @jsptagref.databindable false
078: * @jsptagref.attributesyntaxvalue <i>string_resultId</i>
079: * @netui:attribute required="false" rtexprvalue="true"
080: * description="A name that will cause the real name to be stored into the page context under this name."
081: */
082: public void setResultId(String resultId) {
083: _resultId = resultId;
084: }
085:
086: /**
087: * Pass the name attribute to the URLRewriter and output the
088: * returned value. Updates the HTML tag to output the mapping.
089: * @throws JspException if a JSP exception has occurred
090: */
091: public int doStartTag() throws JspException {
092: String realName = rewriteName(_name);
093: if (_resultId != null)
094: pageContext.setAttribute(_resultId, realName);
095:
096: // @TODO: Is there any way to make this work. Currently if
097: // there is now script container, we will eat the <script> blocks
098: // because we cannot write them out in the middle of the tag being
099: // written
100: IScriptReporter scriptReporter = getScriptReporter();
101: ScriptRequestState srs = ScriptRequestState
102: .getScriptRequestState((HttpServletRequest) pageContext
103: .getRequest());
104: if (TagConfig.isLegacyJavaScript()) {
105: srs.mapLegacyTagId(scriptReporter, _name, realName);
106: }
107: write(realName);
108: localRelease();
109: return SKIP_BODY;
110: }
111:
112: /**
113: * Release any acquired resources.
114: */
115: protected void localRelease() {
116: super.localRelease();
117: _name = null;
118: _resultId = null;
119: }
120: }
|