| /* |
| * Copyright 2004 The Apache Software Foundation |
| * |
| * Licensed 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. |
| */ |
| |
| package javax.servlet.jsp.tagext; |
| |
| import javax.servlet.jsp.*; |
| |
| |
| /** |
| * Wraps any SimpleTag and exposes it using a Tag interface. This is used |
| * to allow collaboration between classic Tag handlers and SimpleTag |
| * handlers. |
| * <p> |
| * Because SimpleTag does not extend Tag, and because Tag.setParent() |
| * only accepts a Tag instance, a classic tag handler (one |
| * that implements Tag) cannot have a SimpleTag as its parent. To remedy |
| * this, a TagAdapter is created to wrap the SimpleTag parent, and the |
| * adapter is passed to setParent() instead. A classic Tag Handler can |
| * call getAdaptee() to retrieve the encapsulated SimpleTag instance. |
| * |
| * @since 2.0 |
| */ |
| public class TagAdapter |
| implements Tag |
| { |
| /** The simple tag that's being adapted. */ |
| private SimpleTag simpleTagAdaptee; |
| |
| /** The parent, of this tag, converted (if necessary) to be of type Tag. */ |
| private Tag parent; |
| |
| // Flag indicating whether we have already determined the parent |
| private boolean parentDetermined; |
| |
| /** |
| * Creates a new TagAdapter that wraps the given SimpleTag and |
| * returns the parent tag when getParent() is called. |
| * |
| * @param adaptee The SimpleTag being adapted as a Tag. |
| */ |
| public TagAdapter( SimpleTag adaptee ) { |
| if( adaptee == null ) { |
| // Cannot wrap a null adaptee. |
| throw new IllegalArgumentException(); |
| } |
| this.simpleTagAdaptee = adaptee; |
| } |
| |
| /** |
| * Must not be called. |
| * |
| * @param pc ignored. |
| * @throws UnsupportedOperationException Must not be called |
| */ |
| public void setPageContext(PageContext pc) { |
| throw new UnsupportedOperationException( |
| "Illegal to invoke setPageContext() on TagAdapter wrapper" ); |
| } |
| |
| |
| /** |
| * Must not be called. The parent of this tag is always |
| * getAdaptee().getParent(). |
| * |
| * @param parentTag ignored. |
| * @throws UnsupportedOperationException Must not be called. |
| */ |
| public void setParent( Tag parentTag ) { |
| throw new UnsupportedOperationException( |
| "Illegal to invoke setParent() on TagAdapter wrapper" ); |
| } |
| |
| |
| /** |
| * Returns the parent of this tag, which is always |
| * getAdaptee().getParent(). |
| * |
| * This will either be the enclosing Tag (if getAdaptee().getParent() |
| * implements Tag), or an adapter to the enclosing Tag (if |
| * getAdaptee().getParent() does not implement Tag). |
| * |
| * @return The parent of the tag being adapted. |
| */ |
| public Tag getParent() { |
| if (!parentDetermined) { |
| JspTag adapteeParent = simpleTagAdaptee.getParent(); |
| if (adapteeParent != null) { |
| if (adapteeParent instanceof Tag) { |
| this.parent = (Tag) adapteeParent; |
| } else { |
| // Must be SimpleTag - no other types defined. |
| this.parent = new TagAdapter((SimpleTag) adapteeParent); |
| } |
| } |
| parentDetermined = true; |
| } |
| |
| return this.parent; |
| } |
| |
| /** |
| * Gets the tag that is being adapted to the Tag interface. |
| * This should be an instance of SimpleTag in JSP 2.0, but room |
| * is left for other kinds of tags in future spec versions. |
| * |
| * @return the tag that is being adapted |
| */ |
| public JspTag getAdaptee() { |
| return this.simpleTagAdaptee; |
| } |
| |
| /** |
| * Must not be called. |
| * |
| * @return always throws UnsupportedOperationException |
| * @throws UnsupportedOperationException Must not be called |
| * @throws JspException never thrown |
| */ |
| public int doStartTag() throws JspException { |
| throw new UnsupportedOperationException( |
| "Illegal to invoke doStartTag() on TagAdapter wrapper" ); |
| } |
| |
| /** |
| * Must not be called. |
| * |
| * @return always throws UnsupportedOperationException |
| * @throws UnsupportedOperationException Must not be called |
| * @throws JspException never thrown |
| */ |
| public int doEndTag() throws JspException { |
| throw new UnsupportedOperationException( |
| "Illegal to invoke doEndTag() on TagAdapter wrapper" ); |
| } |
| |
| /** |
| * Must not be called. |
| * |
| * @throws UnsupportedOperationException Must not be called |
| */ |
| public void release() { |
| throw new UnsupportedOperationException( |
| "Illegal to invoke release() on TagAdapter wrapper" ); |
| } |
| } |