org.apache.commons.jelly.impl
Class TagScript

java.lang.Object
  extended by org.apache.commons.jelly.impl.TagScript
All Implemented Interfaces:
Script
Direct Known Subclasses:
StaticTagScript

public class TagScript
extends java.lang.Object
implements Script

TagScript is a Script that evaluates a custom tag.

Note that this class should be re-entrant and used concurrently by multiple threads.

Version:
$Revision: 1807798 $
Author:
James Strachan

Field Summary
protected  java.util.Map attributes
          The attribute expressions that are created
private  int columnNumber
          the column number of the tag
private  java.lang.String elementName
          the qualified element name which caused the problem
private  java.lang.String fileName
          the Jelly file which caused the problem
private  int lineNumber
          the line number of the tag
private  java.lang.String localName
          the local (non-namespaced) tag name
private static org.apache.commons.logging.Log log
          The Log to which logging calls will be made.
private  java.util.Map namespaceContext
          The optional namespace context mapping all prefixes -> URIs in scope at the point this tag is used.
private  TagScript parent
          the parent TagScript
private  org.xml.sax.Attributes saxAttributes
          the SAX attributes
private  java.net.URL scriptURL
          the url of the script when parsed
private  Script tagBody
          the body script used for this tag
private  TagFactory tagFactory
          the factory of Tag instances
private  java.util.Map tagNamespacesMap
          the optional namespaces Map of prefix -> URI of this single Tag
private  java.util.Map threadLocalTagCache
          A synchronized WeakHashMap from the current Thread (key) to a Tag object (value).
 
Constructor Summary
TagScript()
           
TagScript(TagFactory tagFactory)
           
 
Method Summary
 void addAttribute(java.lang.String name, Expression expression)
          Add an initialization attribute for the tag.
protected  void applyLocation(LocationAware locationAware)
           
 Script compile()
          Compiles the tags body
protected  void configureTag(Tag tag, JellyContext context)
          Compiles a newly created tag if required, sets its parent and body.
protected  java.lang.Object convertType(java.lang.Object value, java.lang.Class requiredType)
          Converts the given value to the required type.
protected  JellyException createJellyException(java.lang.String reason)
          Creates a new Jelly exception, adorning it with location information
protected  JellyException createJellyException(java.lang.String reason, java.lang.Exception cause)
          Creates a new Jelly exception, adorning it with location information
protected  Tag createTag()
          Factory method to create a new Tag instance.
protected  void endNamespacePrefixes(XMLOutput output)
          End the new namespace prefixes mapped for the current element
 int getColumnNumber()
           
 java.lang.String getElementName()
           
 java.lang.String getFileName()
           
private  java.net.URL getJellyContextURL(java.net.URL url)
          Strips off the name of a script to create a new context URL FIXME: Copied from JellyContext
 int getLineNumber()
           
 java.lang.String getLocalName()
          Returns the local, non namespaced XML name of this tag
 java.util.Map getNamespaceContext()
          Returns the namespace context of this tag.
 TagScript getParent()
          Returns the parent.
 org.xml.sax.Attributes getSaxAttributes()
          Returns the SAX attributes of this tag
 Tag getTag(JellyContext context)
           
 Script getTagBody()
          Returns the tagBody.
 TagFactory getTagFactory()
          Returns the Factory of Tag instances.
protected  void handleException(java.lang.Error e)
          A helper method to handle this non-Jelly exception.
protected  void handleException(java.lang.Exception e)
          A helper method to handle this non-Jelly exception.
protected  void handleException(JellyException e)
          A helper method to handle this Jelly exception.
protected  void handleException(JellyTagException e)
          A helper method to handle this Jelly exception.
static TagScript newInstance(java.lang.Class tagClass)
           
 void run(JellyContext context, XMLOutput output)
          Evaluates the body of a tag
 void setColumnNumber(int columnNumber)
          Sets the column number of the tag
protected  void setContextURLs(JellyContext context)
          Set the context's root and current URL if not present
 void setElementName(java.lang.String elementName)
          Sets the element name which caused the problem
 void setFileName(java.lang.String fileName)
          Sets the Jelly file which caused the problem
 void setLineNumber(int lineNumber)
          Sets the line number of the tag
 void setLocalName(java.lang.String localName)
          Sets the local, non namespaced name of this tag.
 void setLocator(org.xml.sax.Locator locator)
          Configures this TagScript from the SAX Locator, setting the column and line numbers
 void setParent(TagScript parent)
          Sets the parent.
 void setSaxAttributes(org.xml.sax.Attributes saxAttributes)
          Sets the SAX attributes of this tag
protected  void setTag(Tag tag, JellyContext context)
          Allows the script to set the tag instance to be used, such as in a StaticTagScript when a StaticTag is switched with a DynamicTag
 void setTagBody(Script tagBody)
          Sets the tagBody.
 void setTagFactory(TagFactory tagFactory)
          Sets the Factory of Tag instances.
 void setTagNamespacesMap(java.util.Map tagNamespacesMap)
          Sets the optional namespaces prefix -> URI map of the namespaces attached to this Tag
protected  void startNamespacePrefixes(XMLOutput output)
          Output the new namespace prefixes used for this element
 java.lang.String toString()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

log

private static final org.apache.commons.logging.Log log
The Log to which logging calls will be made.


attributes

protected java.util.Map attributes
The attribute expressions that are created


tagNamespacesMap

private java.util.Map tagNamespacesMap
the optional namespaces Map of prefix -> URI of this single Tag


namespaceContext

private java.util.Map namespaceContext
The optional namespace context mapping all prefixes -> URIs in scope at the point this tag is used. This Map is only created lazily if it is required by the NamespaceAwareTag.


fileName

private java.lang.String fileName
the Jelly file which caused the problem


elementName

private java.lang.String elementName
the qualified element name which caused the problem


localName

private java.lang.String localName
the local (non-namespaced) tag name


lineNumber

private int lineNumber
the line number of the tag


columnNumber

private int columnNumber
the column number of the tag


tagFactory

private TagFactory tagFactory
the factory of Tag instances


tagBody

private Script tagBody
the body script used for this tag


parent

private TagScript parent
the parent TagScript


saxAttributes

private org.xml.sax.Attributes saxAttributes
the SAX attributes


scriptURL

private java.net.URL scriptURL
the url of the script when parsed


threadLocalTagCache

private java.util.Map threadLocalTagCache
A synchronized WeakHashMap from the current Thread (key) to a Tag object (value).

Constructor Detail

TagScript

public TagScript()

TagScript

public TagScript(TagFactory tagFactory)
Method Detail

newInstance

public static TagScript newInstance(java.lang.Class tagClass)
Returns:
a new TagScript based on whether the given Tag class is a bean tag or DynaTag

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

compile

public Script compile()
               throws JellyException
Compiles the tags body

Specified by:
compile in interface Script
Throws:
JellyException

setTagNamespacesMap

public void setTagNamespacesMap(java.util.Map tagNamespacesMap)
Sets the optional namespaces prefix -> URI map of the namespaces attached to this Tag


setLocator

public void setLocator(org.xml.sax.Locator locator)
Configures this TagScript from the SAX Locator, setting the column and line numbers


addAttribute

public void addAttribute(java.lang.String name,
                         Expression expression)
Add an initialization attribute for the tag. This method must be called after the setTag() method


getJellyContextURL

private java.net.URL getJellyContextURL(java.net.URL url)
                                 throws java.net.MalformedURLException
Strips off the name of a script to create a new context URL FIXME: Copied from JellyContext

Throws:
java.net.MalformedURLException

run

public void run(JellyContext context,
                XMLOutput output)
         throws JellyTagException
Evaluates the body of a tag

Specified by:
run in interface Script
Throws:
JellyTagException

setContextURLs

protected void setContextURLs(JellyContext context)
                       throws JellyTagException
Set the context's root and current URL if not present

Parameters:
context -
Throws:
JellyTagException

getTag

public Tag getTag(JellyContext context)
           throws JellyException
Returns:
the tag to be evaluated, creating it lazily if required.
Throws:
JellyException

getTagFactory

public TagFactory getTagFactory()
Returns the Factory of Tag instances.

Returns:
the factory

setTagFactory

public void setTagFactory(TagFactory tagFactory)
Sets the Factory of Tag instances.

Parameters:
tagFactory - The factory to set

getParent

public TagScript getParent()
Returns the parent.

Returns:
TagScript

getTagBody

public Script getTagBody()
Returns the tagBody.

Returns:
Script

setParent

public void setParent(TagScript parent)
Sets the parent.

Parameters:
parent - The parent to set

setTagBody

public void setTagBody(Script tagBody)
Sets the tagBody.

Parameters:
tagBody - The tagBody to set

getFileName

public java.lang.String getFileName()
Returns:
the Jelly file which caused the problem

setFileName

public void setFileName(java.lang.String fileName)
Sets the Jelly file which caused the problem


getElementName

public java.lang.String getElementName()
Returns:
the element name which caused the problem

setElementName

public void setElementName(java.lang.String elementName)
Sets the element name which caused the problem


getLineNumber

public int getLineNumber()
Returns:
the line number of the tag

setLineNumber

public void setLineNumber(int lineNumber)
Sets the line number of the tag


getColumnNumber

public int getColumnNumber()
Returns:
the column number of the tag

setColumnNumber

public void setColumnNumber(int columnNumber)
Sets the column number of the tag


getSaxAttributes

public org.xml.sax.Attributes getSaxAttributes()
Returns the SAX attributes of this tag

Returns:
Attributes

setSaxAttributes

public void setSaxAttributes(org.xml.sax.Attributes saxAttributes)
Sets the SAX attributes of this tag

Parameters:
saxAttributes - The saxAttributes to set

getLocalName

public java.lang.String getLocalName()
Returns the local, non namespaced XML name of this tag

Returns:
String

setLocalName

public void setLocalName(java.lang.String localName)
Sets the local, non namespaced name of this tag.

Parameters:
localName - The localName to set

getNamespaceContext

public java.util.Map getNamespaceContext()
Returns the namespace context of this tag. This is all the prefixes in scope in the document where this tag is used which are mapped to their namespace URIs.

Returns:
a Map with the keys are namespace prefixes and the values are namespace URIs.

createTag

protected Tag createTag()
                 throws JellyException
Factory method to create a new Tag instance. The default implementation is to delegate to the TagFactory

Throws:
JellyException

configureTag

protected void configureTag(Tag tag,
                            JellyContext context)
                     throws JellyException
Compiles a newly created tag if required, sets its parent and body.

Throws:
JellyException

setTag

protected void setTag(Tag tag,
                      JellyContext context)
Allows the script to set the tag instance to be used, such as in a StaticTagScript when a StaticTag is switched with a DynamicTag


startNamespacePrefixes

protected void startNamespacePrefixes(XMLOutput output)
                               throws org.xml.sax.SAXException
Output the new namespace prefixes used for this element

Throws:
org.xml.sax.SAXException

endNamespacePrefixes

protected void endNamespacePrefixes(XMLOutput output)
                             throws org.xml.sax.SAXException
End the new namespace prefixes mapped for the current element

Throws:
org.xml.sax.SAXException

convertType

protected java.lang.Object convertType(java.lang.Object value,
                                       java.lang.Class requiredType)
                                throws JellyException
Converts the given value to the required type.

Parameters:
value - is the value to be converted. This will not be null
requiredType - the type that the value should be converted to
Throws:
JellyException

createJellyException

protected JellyException createJellyException(java.lang.String reason)
Creates a new Jelly exception, adorning it with location information


createJellyException

protected JellyException createJellyException(java.lang.String reason,
                                              java.lang.Exception cause)
Creates a new Jelly exception, adorning it with location information


handleException

protected void handleException(JellyTagException e)
                        throws JellyTagException
A helper method to handle this Jelly exception. This method adorns the JellyException with location information such as adding line number information etc.

Throws:
JellyTagException

handleException

protected void handleException(JellyException e)
                        throws JellyTagException
A helper method to handle this Jelly exception. This method adorns the JellyException with location information such as adding line number information etc.

Throws:
JellyTagException

applyLocation

protected void applyLocation(LocationAware locationAware)

handleException

protected void handleException(java.lang.Exception e)
                        throws JellyTagException
A helper method to handle this non-Jelly exception. This method will rethrow the exception, wrapped in a JellyException while adding line number information etc.

Throws:
JellyTagException

handleException

protected void handleException(java.lang.Error e)
                        throws java.lang.Error,
                               JellyTagException
A helper method to handle this non-Jelly exception. This method will rethrow the exception, wrapped in a JellyException while adding line number information etc. Is this method wise?

Throws:
java.lang.Error
JellyTagException