Top Description Fields Constructors Methods
org.antlr.stringtemplate

public Class StringTemplateGroup

extends Object
Class Inheritance
Imports
org.antlr.stringtemplate.language.DefaultTemplateLexer, .GroupLexer, .GroupParser, .AngleBracketTemplateLexer, java.util.*, java.io.*, java.lang.reflect.Constructor

Manages a group of named mutually-referential StringTemplate objects. Currently the templates must all live under a directory so that you can reference them as foo.st or gutter/header.st. To refresh a group of templates, just create a new StringTemplateGroup and start pulling templates from there. Or, set the refresh interval. Use getInstanceOf(template-name) to get a string template to fill in. The name of a template is the file name minus ".st" ending if present unless you name it as you load it. You can use the group file format also to define a group of templates (this works better for code gen than for html page gen). You must give a Reader to the ctor for it to load the group; this is general and distinguishes it from the ctors for the old-style "load template files from the disk". 10/2005 I am adding a StringTemplateGroupLoader concept so people can define supergroups within a group and have it load that group automatically.

Field Summary

Modifier and TypeField and Description
protected Map<K, V>
attributeRenderers

A Map<class,object> that allows people to register a renderer for a particular kind of object to be displayed for any template in this group.

protected boolean
public static StringTemplateErrorListener
protected static Class<T>
defaultTemplateLexerClass

You can set the lexer once if you know all of your groups use the same separator.

pack-priv String
fileCharEncoding

How are the files encoded (ascii, UTF8, ...)?

private static StringTemplateGroupLoader
groupLoader

If a group file indicates it derives from a supergroup, how do we find it?

protected List<E>
interfaces

Keep track of all interfaces implemented by this group.

protected long
protected StringTemplateErrorListener
listener

Where to report errors.

protected Map<K, V>
maps

Maps map names to HashMap objects.

protected String
name

What is the group name

protected static Map<K, V>
nameToGroupMap

Track all groups by name; maps name to StringTemplateGroup

protected static Map<K, V>
nameToInterfaceMap

Track all interfaces by name; maps name to StringTemplateGroupInterface

protected Set<E>
noDebugStartStopStrings

The set of templates to ignore when dumping start/stop debug strings

protected static final StringTemplate
NOT_FOUND_ST

Used to indicate that the template doesn't exist.

protected int
refreshIntervalInSeconds

How long before tossing out all templates in seconds.

protected String
rootDir

Under what directory should I look for templates?

protected StringTemplateGroup
superGroup

Are we derived from another group?

protected Class<T>
templateLexerClass

How to pull apart a template into chunks?

protected Map<K, V>
templates

Maps template name to StringTemplate object

protected boolean
templatesDefinedInGroupFile

When templates are files on the disk, the refresh interval is used to know when to reload.

protected Class<T>
userSpecifiedWriter

Normally AutoIndentWriter is used to filter output, but user can specify a new one.

Constructor Summary

AccessConstructor and Description
public
StringTemplateGroup(String name, String rootDir)

Create a group manager for some templates, all of which are at or below the indicated directory.

public
StringTemplateGroup(String name, String rootDir, Class<T> lexer)

public
StringTemplateGroup(String name)

Create a group manager for some templates, all of which are loaded as resources via the classloader.

public
public
StringTemplateGroup(Reader r)

Create a group from the template group defined by a input stream.

public
public
public
public
StringTemplateGroup(Reader r, Class<T> lexer, StringTemplateErrorListener errors, StringTemplateGroup superGroup)

Create a group from the input stream, but use a nondefault lexer to break the templates up into chunks.

Method Summary

Modifier and TypeMethod and Description
protected void
public StringTemplate
createStringTemplate()

StringTemplate object factory; each group can have its own.

public StringTemplate
defineImplicitRegionTemplate(StringTemplate enclosingTemplate, String name)

Track all references to regions <@foo()>.

public void
defineMap(String name, Map<K, V> mapping)

Define a map for this group; not thread safe...do not keep adding these while you reference them.

public StringTemplate
defineRegionTemplate(String enclosingTemplateName, String regionName, String template, int type)

Track all references to regions <@foo>...

public StringTemplate
defineRegionTemplate(StringTemplate enclosingTemplate, String regionName, String template, int type)

Track all references to regions <@foo>...

public synchronized StringTemplate
defineTemplate(String name, String template)

Define an examplar template; precompiled and stored with no attributes.

public synchronized StringTemplate
defineTemplateAlias(String name, String target)

Make name and alias for target.

public void
public void
emitDebugStartStopStrings(boolean emit)

Indicate whether ST should emit <templatename>...</templatename>

public void
public void
public void
public void
public AttributeRenderer
getAttributeRenderer(Class<T> attributeClassType)

What renderer is registered for this attributeClassType for this group?

public StringTemplate
getEmbeddedInstanceOf(StringTemplate enclosingInstance, String name)

public StringTemplateErrorListener
public String
public String
getFileNameFromTemplateName(String templateName)

(public so that people can override behavior; not a general purpose method)

public String
getGroupHierarchyStackString()

Walk up group hierarchy and show top down to this group

protected InputStreamReader
protected StringTemplate
getInstanceOf(StringTemplate enclosingInstance, String name)

A support routine that gets an instance of name knowing which ST encloses it for error messages.

public StringTemplate
getInstanceOf(String name)

The primary means of getting an instance of a template from this group.

public StringTemplate
getInstanceOf(String name, Map<K, V> attributes)

The primary means of getting an instance of a template from this group when you have a predefined set of attributes you want to use.

public String
getMangledRegionName(String enclosingTemplateName, String name)

The "foo" of t() ::= "<@foo()>" is mangled to "region#t#foo"

public Map<K, V>
getMap(String name)

public String
public int
public String
public StringTemplateWriter
getStringTemplateWriter(Writer w)

return an instance of a StringTemplateWriter that spits output to w.

public StringTemplateGroup
public synchronized StringTemplate
getTemplateDefinition(String name)

Get the ST for 'name' in this group only

public Class<T>
getTemplateLexerClass()

What lexer class to use to break up templates.

public String
getTemplateNameFromFileName(String fileName)

Convert a filename relativePath/name.st to relativePath/name.

public synchronized Set<E>
public String
getUnMangledTemplateName(String mangledName)

Return "t" from "region__t__foo"

public void
implementInterface(StringTemplateGroupInterface I)

Just track the new interface; check later.

public void
implementInterface(String interfaceName)

Indicate that this group implements this interface; load if necessary if not in the nameToInterfaceMap.

public boolean
isDefined(String name)

Is there *any* definition for template 'name' in this template or above it in the group hierarchy?

public synchronized boolean
public static StringTemplateGroup
public static StringTemplateGroup
public static StringTemplateGroup
loadGroup(String name, Class<T> lexer, StringTemplateGroup superGroup)

public static StringTemplateGroupInterface
protected StringTemplate
protected StringTemplate
loadTemplate(String name, String fileName)

protected StringTemplate
loadTemplateFromBeneathRootDirOrCLASSPATH(String fileName)

Load a template whose name is derived from the template filename.

public synchronized StringTemplate
lookupTemplate(StringTemplate enclosingInstance, String name)

Get the template called 'name' from the group.

public StringTemplate
protected void
public static void
registerDefaultLexer(Class<T> lexerClass)

public static void
public void
registerRenderer(Class<T> attributeClassType, Object renderer)

Register a renderer for all objects of a particular type for all templates in this group.

public void
setAttributeRenderers(Map<K, V> renderers)

Specify a complete map of what object classes should map to which renderer objects for every template in this group (that doesn't override it per template).

public void
public void
setFileCharEncoding(String fileCharEncoding)

public void
public void
setRefreshInterval(int refreshInterval)

How often to refresh all templates from disk.

public void
setRootDir(String rootDir)

public void
setStringTemplateWriter(Class<T> c)

Specify a StringTemplateWriter implementing class to use for filtering output

public void
public void
setSuperGroup(String superGroupName)

Called by group parser when ": supergroupname" is found.

public String
toString()

Overrides java.lang.Object.toString.

Returns a string representation of the object.
public String
toString(boolean showTemplatePatterns)

protected void
verifyInterfaceImplementations()

verify that this group satisfies its interfaces

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAllwaitwaitwait

Field Detail

attributeRenderersback to summary
protected Map<K, V> attributeRenderers

A Map that allows people to register a renderer for a particular kind of object to be displayed for any template in this group. For example, a date should be formatted differently depending on the locale. You can set Date.class to an object whose toString(Object) method properly formats a Date attribute according to locale. Or you can have a different renderer object for each locale. These render objects are used way down in the evaluation chain right before an attribute's toString() method would normally be called in ASTExpr.write(). Synchronized at creation time.

debugTemplateOutputback to summary
protected boolean debugTemplateOutput
DEFAULT_ERROR_LISTENERback to summary
public static StringTemplateErrorListener DEFAULT_ERROR_LISTENER
defaultTemplateLexerClassback to summary
protected static Class<T> defaultTemplateLexerClass

You can set the lexer once if you know all of your groups use the same separator. If the instance has templateLexerClass set then it is used as an override.

fileCharEncodingback to summary
pack-priv String fileCharEncoding

How are the files encoded (ascii, UTF8, ...)? You might want to read UTF8 for example on an ascii machine.

groupLoaderback to summary
private static StringTemplateGroupLoader groupLoader

If a group file indicates it derives from a supergroup, how do we find it? Shall we make it so the initial StringTemplateGroup file can be loaded via this loader? Right now we pass a Reader to ctor to distinguish from the other variety.

interfacesback to summary
protected List<E> interfaces

Keep track of all interfaces implemented by this group.

lastCheckedDiskback to summary
protected long lastCheckedDisk
listenerback to summary
protected StringTemplateErrorListener listener

Where to report errors. All string templates in this group use this error handler by default.

mapsback to summary
protected Map<K, V> maps

Maps map names to HashMap objects. This is the list of maps defined by the user like typeInitMap ::= ["int":"0"]

nameback to summary
protected String name

What is the group name

nameToGroupMapback to summary
protected static Map<K, V> nameToGroupMap

Track all groups by name; maps name to StringTemplateGroup

nameToInterfaceMapback to summary
protected static Map<K, V> nameToInterfaceMap

Track all interfaces by name; maps name to StringTemplateGroupInterface

noDebugStartStopStringsback to summary
protected Set<E> noDebugStartStopStrings

The set of templates to ignore when dumping start/stop debug strings

NOT_FOUND_STback to summary
protected static final StringTemplate NOT_FOUND_ST

Used to indicate that the template doesn't exist. We don't have to check disk for it; we know it's not there.

refreshIntervalInSecondsback to summary
protected int refreshIntervalInSeconds

How long before tossing out all templates in seconds.

rootDirback to summary
protected String rootDir

Under what directory should I look for templates? If null, to look into the CLASSPATH for templates as resources.

superGroupback to summary
protected StringTemplateGroup superGroup

Are we derived from another group? Templates not found in this group will be searched for in the superGroup recursively.

templateLexerClassback to summary
protected Class<T> templateLexerClass

How to pull apart a template into chunks?

templatesback to summary
protected Map<K, V> templates

Maps template name to StringTemplate object

templatesDefinedInGroupFileback to summary
protected boolean templatesDefinedInGroupFile

When templates are files on the disk, the refresh interval is used to know when to reload. When a Reader is passed to the ctor, it is a stream full of template definitions. The former is used for web development, but the latter is most likely used for source code generation for translators; a refresh is unlikely. Anyway, I decided to track the source of templates in case such info is useful in other situations than just turning off refresh interval. I just found another: don't ever look on the disk for individual templates if this group is a group file...immediately look into any super group. If not in the super group, report no such template.

userSpecifiedWriterback to summary
protected Class<T> userSpecifiedWriter

Normally AutoIndentWriter is used to filter output, but user can specify a new one.

Constructor Detail

StringTemplateGroupback to summary
public StringTemplateGroup(String name, String rootDir)

Create a group manager for some templates, all of which are at or below the indicated directory.

StringTemplateGroupback to summary
public StringTemplateGroup(String name, String rootDir, Class<T> lexer)
StringTemplateGroupback to summary
public StringTemplateGroup(String name)

Create a group manager for some templates, all of which are loaded as resources via the classloader.

StringTemplateGroupback to summary
public StringTemplateGroup(String name, Class<T> lexer)
StringTemplateGroupback to summary
public StringTemplateGroup(Reader r)

Create a group from the template group defined by a input stream. The name is pulled from the file. The format is group name; t1(args) ::= "..." t2() ::= << >> ...

StringTemplateGroupback to summary
public StringTemplateGroup(Reader r, StringTemplateErrorListener errors)
StringTemplateGroupback to summary
public StringTemplateGroup(Reader r, Class<T> lexer)
StringTemplateGroupback to summary
public StringTemplateGroup(Reader r, Class<T> lexer, StringTemplateErrorListener errors)
StringTemplateGroupback to summary
public StringTemplateGroup(Reader r, Class<T> lexer, StringTemplateErrorListener errors, StringTemplateGroup superGroup)

Create a group from the input stream, but use a nondefault lexer to break the templates up into chunks. This is usefor changing the delimiter from the default $...$ to <...>, for example.

Method Detail

checkRefreshIntervalback to summary
protected void checkRefreshInterval()
createStringTemplateback to summary
public StringTemplate createStringTemplate()

StringTemplate object factory; each group can have its own.

defineImplicitRegionTemplateback to summary
public StringTemplate defineImplicitRegionTemplate(StringTemplate enclosingTemplate, String name)

Track all references to regions <@foo()>. We automatically define as @enclosingtemplate.foo() ::= "" You cannot set these manually in the same group; you have to subgroup to override.

defineMapback to summary
public void defineMap(String name, Map<K, V> mapping)

Define a map for this group; not thread safe...do not keep adding these while you reference them.

defineRegionTemplateback to summary
public StringTemplate defineRegionTemplate(String enclosingTemplateName, String regionName, String template, int type)

Track all references to regions <@foo>...<@end> or <@foo()>.

defineRegionTemplateback to summary
public StringTemplate defineRegionTemplate(StringTemplate enclosingTemplate, String regionName, String template, int type)

Track all references to regions <@foo>...<@end> or <@foo()>.

defineTemplateback to summary
public synchronized StringTemplate defineTemplate(String name, String template)

Define an examplar template; precompiled and stored with no attributes. Remove any previous definition.

defineTemplateAliasback to summary
public synchronized StringTemplate defineTemplateAlias(String name, String target)

Make name and alias for target. Replace any previous def of name

doNotEmitDebugStringsForTemplateback to summary
public void doNotEmitDebugStringsForTemplate(String templateName)
emitDebugStartStopStringsback to summary
public void emitDebugStartStopStrings(boolean emit)

Indicate whether ST should emit ... strings for debugging around output for templates from this group.

emitTemplateStartDebugStringback to summary
public void emitTemplateStartDebugString(StringTemplate st, StringTemplateWriter out) throws IOException
emitTemplateStopDebugStringback to summary
public void emitTemplateStopDebugString(StringTemplate st, StringTemplateWriter out) throws IOException
errorback to summary
public void error(String msg)
errorback to summary
public void error(String msg, Exception e)
getAttributeRendererback to summary
public AttributeRenderer getAttributeRenderer(Class<T> attributeClassType)

What renderer is registered for this attributeClassType for this group? If not found, as superGroup if it has one.

getEmbeddedInstanceOfback to summary
public StringTemplate getEmbeddedInstanceOf(StringTemplate enclosingInstance, String name) throws IllegalArgumentException
getErrorListenerback to summary
public StringTemplateErrorListener getErrorListener()
getFileCharEncodingback to summary
public String getFileCharEncoding()
getFileNameFromTemplateNameback to summary
public String getFileNameFromTemplateName(String templateName)

(public so that people can override behavior; not a general purpose method)

getGroupHierarchyStackStringback to summary
public String getGroupHierarchyStackString()

Walk up group hierarchy and show top down to this group

getInputStreamReaderback to summary
protected InputStreamReader getInputStreamReader(InputStream in)
getInstanceOfback to summary
protected StringTemplate getInstanceOf(StringTemplate enclosingInstance, String name) throws IllegalArgumentException

A support routine that gets an instance of name knowing which ST encloses it for error messages.

getInstanceOfback to summary
public StringTemplate getInstanceOf(String name)

The primary means of getting an instance of a template from this group.

getInstanceOfback to summary
public StringTemplate getInstanceOf(String name, Map<K, V> attributes)

The primary means of getting an instance of a template from this group when you have a predefined set of attributes you want to use.

getMangledRegionNameback to summary
public String getMangledRegionName(String enclosingTemplateName, String name)

The "foo" of t() ::= "<@foo()>" is mangled to "region#t#foo"

getMapback to summary
public Map<K, V> getMap(String name)
getNameback to summary
public String getName()
getRefreshIntervalback to summary
public int getRefreshInterval()
getRootDirback to summary
public String getRootDir()
getStringTemplateWriterback to summary
public StringTemplateWriter getStringTemplateWriter(Writer w)

return an instance of a StringTemplateWriter that spits output to w. If a writer is specified, use it instead of the default.

getSuperGroupback to summary
public StringTemplateGroup getSuperGroup()
getTemplateDefinitionback to summary
public synchronized StringTemplate getTemplateDefinition(String name)

Get the ST for 'name' in this group only

getTemplateLexerClassback to summary
public Class<T> getTemplateLexerClass()

What lexer class to use to break up templates. If not lexer set for this group, use static default.

getTemplateNameFromFileNameback to summary
public String getTemplateNameFromFileName(String fileName)

Convert a filename relativePath/name.st to relativePath/name. (public so that people can override behavior; not a general purpose method)

getTemplateNamesback to summary
public synchronized Set<E> getTemplateNames()
getUnMangledTemplateNameback to summary
public String getUnMangledTemplateName(String mangledName)

Return "t" from "region__t__foo"

implementInterfaceback to summary
public void implementInterface(StringTemplateGroupInterface I)

Just track the new interface; check later. Allows dups, but no biggie.

implementInterfaceback to summary
public void implementInterface(String interfaceName)

Indicate that this group implements this interface; load if necessary if not in the nameToInterfaceMap.

isDefinedback to summary
public boolean isDefined(String name)

Is there *any* definition for template 'name' in this template or above it in the group hierarchy?

isDefinedInThisGroupback to summary
public synchronized boolean isDefinedInThisGroup(String name)
loadGroupback to summary
public static StringTemplateGroup loadGroup(String name)
loadGroupback to summary
public static StringTemplateGroup loadGroup(String name, StringTemplateGroup superGroup)
loadGroupback to summary
public static StringTemplateGroup loadGroup(String name, Class<T> lexer, StringTemplateGroup superGroup)
loadInterfaceback to summary
public static StringTemplateGroupInterface loadInterface(String name)
loadTemplateback to summary
protected StringTemplate loadTemplate(String name, BufferedReader r) throws IOException
loadTemplateback to summary
protected StringTemplate loadTemplate(String name, String fileName)
loadTemplateFromBeneathRootDirOrCLASSPATHback to summary
protected StringTemplate loadTemplateFromBeneathRootDirOrCLASSPATH(String fileName)

Load a template whose name is derived from the template filename. If there is no root directory, try to load the template from the classpath. If there is a rootDir, try to load the file from there.

lookupTemplateback to summary
public synchronized StringTemplate lookupTemplate(StringTemplate enclosingInstance, String name) throws IllegalArgumentException

Get the template called 'name' from the group. If not found, attempt to load. If not found on disk, then try the superGroup if any. If not even there, then record that it's NOT_FOUND so we don't waste time looking again later. If we've gone past refresh interval, flush and look again. If I find a template in a super group, copy an instance down here

lookupTemplateback to summary
public StringTemplate lookupTemplate(String name)
parseGroupback to summary
protected void parseGroup(Reader r)
registerDefaultLexerback to summary
public static void registerDefaultLexer(Class<T> lexerClass)
registerGroupLoaderback to summary
public static void registerGroupLoader(StringTemplateGroupLoader loader)
registerRendererback to summary
public void registerRenderer(Class<T> attributeClassType, Object renderer)

Register a renderer for all objects of a particular type for all templates in this group.

setAttributeRenderersback to summary
public void setAttributeRenderers(Map<K, V> renderers)

Specify a complete map of what object classes should map to which renderer objects for every template in this group (that doesn't override it per template).

setErrorListenerback to summary
public void setErrorListener(StringTemplateErrorListener listener)
setFileCharEncodingback to summary
public void setFileCharEncoding(String fileCharEncoding)
setNameback to summary
public void setName(String name)
setRefreshIntervalback to summary
public void setRefreshInterval(int refreshInterval)

How often to refresh all templates from disk. This is a crude mechanism at the moment--just tosses everything out at this frequency. Set interval to 0 to refresh constantly (no caching). Set interval to a huge number like MAX_INT to have no refreshing at all (DEFAULT); it will cache stuff.

setRootDirback to summary
public void setRootDir(String rootDir)
setStringTemplateWriterback to summary
public void setStringTemplateWriter(Class<T> c)

Specify a StringTemplateWriter implementing class to use for filtering output

setSuperGroupback to summary
public void setSuperGroup(StringTemplateGroup superGroup)
setSuperGroupback to summary
public void setSuperGroup(String superGroupName)

Called by group parser when ": supergroupname" is found. This method forces the supergroup's lexer to be same as lexer for this (sub) group.

toStringback to summary
public String toString()

Overrides java.lang.Object.toString.

Doc from java.lang.Object.toString.

Returns a string representation of the object.

Returns:String

a string representation of the object.

toStringback to summary
public String toString(boolean showTemplatePatterns)
verifyInterfaceImplementationsback to summary
protected void verifyInterfaceImplementations()

verify that this group satisfies its interfaces