//# 3 errors, 658 messages
//#
/*
    //#TopicTagPlugin.java:1:1: class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  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.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */

package org.apache.roller.weblogger.business.plugins.entry;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.config.WebloggerConfig;
import org.apache.roller.weblogger.business.BookmarkManager;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.pojos.WeblogBookmark;
import org.apache.roller.weblogger.pojos.WeblogEntry;
import org.apache.roller.weblogger.pojos.Weblog;
import org.apache.roller.weblogger.business.plugins.entry.WeblogEntryPlugin;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.FieldPosition;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;


/**
 * Provides an easy way to write topic tag links for Technorati (or similar services).
 * <p/>
 * Looks for occurrences of topic tag specifiers of the form
 * <pre>
 * <code>topic:{topicbookmark}[tag]</code>  OR    <code>topic:[tag]</code>
 * </pre>
 * and replaces them with a topic tag link of the form:
 * <pre>
 * <code>&lt;a rel="tag" href="site/tag"&gt;tag&lt;/a&gt;</code>
 * </pre>
 * <p/>
 * More information on topic tag links can be found at <a href="http://www.technorati.com">Technorati</a>.
 * <p/>
 * <p/>
 * In the first form, the <code>topicbookmark</code> is used as the name of a bookmark, and the URL from that bookmark
 * entry is used as the <code>site</code> portion in the <code>href</code> of the link.
 * <p/>
 * All folders are searched to find a bookmark with the name specified by <code>topicbookmark</code>. A name must match
 * exactly, ignoring case.  The first matching bookmark is used, and folders may be searched in any order.  The
 * bookmark's URL value can end in a "/" or not; either will work.
 * <p/>
 * The second form is equivalent to using the string "Default Topic Site" as the value of <code>topicbookmark</code>.
 * <p/>
 * If the bookmark lookup fails, then "http://www.technorati.com/tag" is used as the site name in the topic tag link.
 * <p/>
 * You can specify some Roller site-wide properties in the roller.properties or roller-custom.properties to override
 * some of the defaults of this plugin. All of these are optional.
 * <p/>
 * <dl> <dt><code>org.apache.roller.weblogger.presentation.velocity.plugins.topictag.TopicTagPlugin.defaultTopicBookmarkName</code></dt>
 * <dd>Specify the name of the default topic bookmark instead of "Default Topic Site"</dd>
 * <p/>
 * <dt><code>org.apache.roller.weblogger.presentation.velocity.plugins.topictag.TopicTagPlugin.defaultTopicSite</code></dt> <dd>Specify
 * the default site name to be used instead of "http://www.technorati.com" for the case in which all of the lookups
 * fail.</dd>
 * <p/>
 * <dt><code>org.apache.roller.weblogger.presentation.velocity.plugins.topictag.TopicTagPlugin.tagPatternWithBookmark</code></dt> <dd>Can
 * be used to redefine the regular expression used to find a long-form topic tag specifiers in the input.  This pattern
 * corresponds to the "long form" and must have two matching groups.  Group 1 must correspond to the bookmark name.
 * Group 2 must correspond to the tag.</dd>
 * <p/>
 * <dt><code>org.apache.roller.weblogger.presentation.velocity.plugins.topictag.TopicTagPlugin.tagPatternDefaultBookmark</code></dt>
 * <dd>Can be used to redefine the regular expression used to find short-form topic tag specifiers in the input. This
 * pattern must have one matching group, which corresponds to the tag.</dd>
 * <p/>
 * <dt><code>org.apache.roller.weblogger.presentation.velocity.plugins.topictag.TopicTagPlugin.linkFormatString</code></dt> <dd>Can be
 * used to redefine the format of the generated link.  This string is a message format string with three positional
 * parameters.  Parameter <code>{0}</code> represents the site including a trailing "/",  parameter <code>{1}</code>
 * represents the url-encoded tag and parameter <code>{2}</code> represents the original unencoded tag text.</dd>
 * <p/>
 * </dl>
 *
 * @author <a href="mailto:anil@busybuddha.org">Anil Gangolli</a>
 * @version 0.3
 */
public class TopicTagPlugin implements WeblogEntryPlugin
{
    private static final String version = "0.3";
    private static final Log mLogger = LogFactory.getFactory().getInstance(TopicTagPlugin.class);
    //#TopicTagPlugin.java:103: method: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init
    //#TopicTagPlugin.java:103: Warning: method not available
    //#    -- call on LogFactory org.apache.commons.logging.LogFactory:getFactory()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init
    //#    unanalyzed callee: LogFactory org.apache.commons.logging.LogFactory:getFactory()
    //#TopicTagPlugin.java:103: Warning: method not available
    //#    -- call on Log org.apache.commons.logging.LogFactory:getInstance(Class)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init
    //#    unanalyzed callee: Log org.apache.commons.logging.LogFactory:getInstance(Class)
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin]
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.buildBookmarkMap(Lorg/apache/roller/weblogger/pojos/Weblog;)Ljava/util/Map;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.generateLink(Ljava/text/MessageFormat;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getBookmarkSite(Ljava/lang/String;)Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getDefaultTopicBookmarkName()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getDefaultTopicSite()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getDescription()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getLinkFormat()Ljava/text/MessageFormat;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getLinkFormatString()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getName()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getSetting(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getTagPatternWithBookmark()Ljava/util/regex/Pattern;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getTagPatternWithoutBookmark()Ljava/util/regex/Pattern;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getTagRegexWithBookmark()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getTagRegexWithoutBookmark()Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getUserBookmarks()Ljava/util/Map;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.init(Lorg/apache/roller/weblogger/pojos/Weblog;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.initializeProperties()V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.render(Lorg/apache/roller/weblogger/pojos/WeblogEntry;Ljava/lang/String;)Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setDefaultTopicBookmarkName(Ljava/lang/String;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setDefaultTopicSite(Ljava/lang/String;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setLinkFormat(Ljava/text/MessageFormat;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setLinkFormatString(Ljava/lang/String;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setTagPatternWithBookmark(Ljava/util/regex/Pattern;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setTagPatternWithoutBookmark(Ljava/util/regex/Pattern;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setTagRegexWithBookmark(Ljava/lang/String;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setTagRegexWithoutBookmark(Ljava/lang/String;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setUserBookmarks(Ljava/util/Map;)V
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.urlEncode(Ljava/lang/String;)Ljava/lang/String;
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): mLogger
    //#output(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): org/apache/roller/weblogger/business/plugins/entry/WeblogEntryPlugin.__Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin]
    //#presumption(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): org.apache.commons.logging.LogFactory:getFactory(...)@103 != null
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin] == &__Dispatch_Table
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): org/apache/roller/weblogger/business/plugins/entry/WeblogEntryPlugin.__Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin] == &__Dispatch_Table
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.buildBookmarkMap(Lorg/apache/roller/weblogger/pojos/Weblog;)Ljava/util/Map; == &buildBookmarkMap
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.generateLink(Ljava/text/MessageFormat;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; == &generateLink
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getBookmarkSite(Ljava/lang/String;)Ljava/lang/String; == &getBookmarkSite
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getDefaultTopicBookmarkName()Ljava/lang/String; == &getDefaultTopicBookmarkName
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getDefaultTopicSite()Ljava/lang/String; == &getDefaultTopicSite
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getDescription()Ljava/lang/String; == &getDescription
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getLinkFormat()Ljava/text/MessageFormat; == &getLinkFormat
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getLinkFormatString()Ljava/lang/String; == &getLinkFormatString
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getName()Ljava/lang/String; == &getName
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getSetting(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; == &getSetting
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getTagPatternWithBookmark()Ljava/util/regex/Pattern; == &getTagPatternWithBookmark
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getTagPatternWithoutBookmark()Ljava/util/regex/Pattern; == &getTagPatternWithoutBookmark
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getTagRegexWithBookmark()Ljava/lang/String; == &getTagRegexWithBookmark
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getTagRegexWithoutBookmark()Ljava/lang/String; == &getTagRegexWithoutBookmark
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.getUserBookmarks()Ljava/util/Map; == &getUserBookmarks
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.init(Lorg/apache/roller/weblogger/pojos/Weblog;)V == &init
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.initializeProperties()V == &initializeProperties
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.render(Lorg/apache/roller/weblogger/pojos/WeblogEntry;Ljava/lang/String;)Ljava/lang/String; == &render
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setDefaultTopicBookmarkName(Ljava/lang/String;)V == &setDefaultTopicBookmarkName
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setDefaultTopicSite(Ljava/lang/String;)V == &setDefaultTopicSite
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setLinkFormat(Ljava/text/MessageFormat;)V == &setLinkFormat
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setLinkFormatString(Ljava/lang/String;)V == &setLinkFormatString
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setTagPatternWithBookmark(Ljava/util/regex/Pattern;)V == &setTagPatternWithBookmark
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setTagPatternWithoutBookmark(Ljava/util/regex/Pattern;)V == &setTagPatternWithoutBookmark
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setTagRegexWithBookmark(Ljava/lang/String;)V == &setTagRegexWithBookmark
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setTagRegexWithoutBookmark(Ljava/lang/String;)V == &setTagRegexWithoutBookmark
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.setUserBookmarks(Ljava/util/Map;)V == &setUserBookmarks
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): __Dispatch_Table.urlEncode(Ljava/lang/String;)Ljava/lang/String; == &urlEncode
    //#post(org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init): init'ed(mLogger)
    //#TopicTagPlugin.java:103: end of method: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin__static_init


    // Default values of properties that can be set from the web.xml configuration.
    private String defaultTopicBookmarkName = "Default Topic Site";
    private String defaultTopicSite = "http://www.technorati.com/tag";
    private String tagRegexWithBookmark = "topic:\\{(.*?)\\}\\[(.*?)\\]";
    private String tagRegexWithoutBookmark = "topic:\\[(.*?)\\]";
    private String linkFormatString = "<a rel=\"tag\" href=\"{0}{1}\">{2}</a>";

    // Compiled form of the regular expressions above.  Compiled during the init()
    private Pattern tagPatternWithBookmark;
    private Pattern tagPatternWithoutBookmark;
    private MessageFormat linkFormat;

    // A map of the user's bookmarks (values of type BookmarkData) keyed by name (String).   If the user has multiple
    // bookmarks with the same name in different folders, only one gets used (the last encountered).
    private Map userBookmarks;


    public TopicTagPlugin()
    {
    //#TopicTagPlugin.java:124: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()
    //#input(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this
    //#output(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.defaultTopicBookmarkName
    //#output(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.defaultTopicSite
    //#output(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.linkFormatString
    //#output(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.tagRegexWithBookmark
    //#output(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.tagRegexWithoutBookmark
    //#post(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.defaultTopicBookmarkName == &"Default Topic Site"
    //#post(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.defaultTopicSite == &"http:..www.technorati.com.tag"
    //#post(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.linkFormatString == &"<a rel="tag" href="{0}{1}">{2}<.a>"
    //#post(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.tagRegexWithBookmark == &"topic:\{(.*?)\}\[(.*?)\]"
    //#post(void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()): this.tagRegexWithoutBookmark == &"topic:\[(.*?)\]"
    }
    //#TopicTagPlugin.java:125: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin()

    /**
     * Initialize the plugin instance.   This sets up the configurable properties and default topic site.
     * 
     * @param rreq Plugins may need to access RollerRequest.
     * @param ctx  Plugins may place objects into the Velocity Context.
     * @see PagWeblogEntryPluginit(org.apache.roller.weblogger.presentation.RollerRequest, org.apache.velocity.context.Context)
     */
    public void init(Weblog website) throws WebloggerException
    {
        if (mLogger.isDebugEnabled())
    //#TopicTagPlugin.java:136: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.init(Weblog)
    //#TopicTagPlugin.java:136: Warning: method not available
    //#    -- call on bool org.apache.commons.logging.Log:isDebugEnabled()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: void init(Weblog)
    //#    unanalyzed callee: bool org.apache.commons.logging.Log:isDebugEnabled()
    //#TopicTagPlugin.java:136: Warning: suspicious precondition
    //#    the precondition for org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: void init(Weblog)
    //#    suspicious precondition index: [7]
    //#    Attribs:  Soft
    //#input(void init(Weblog)): "' contains wrong number of capture groups.  Must have exactly 1.  Contains "._tainted
    //#input(void init(Weblog)): "' contains wrong number of capture groups.  Must have exactly 2.  Contains "._tainted
    //#input(void init(Weblog)): "': "._tainted
    //#input(void init(Weblog)): "."._tainted
    //#input(void init(Weblog)): "="._tainted
    //#input(void init(Weblog)): "Fetching property ["._tainted
    //#input(void init(Weblog)): "Invalid regular expression for topic tags with bookmark '"._tainted
    //#input(void init(Weblog)): "Invalid regular expression for topic tags without bookmark '"._tainted
    //#input(void init(Weblog)): "Regular expression for topic tags with bookmark '"._tainted
    //#input(void init(Weblog)): "Regular expression for topic tags without bookmark '"._tainted
    //#input(void init(Weblog)): "]"._tainted
    //#input(void init(Weblog)): "defaultTopicBookmarkName"._tainted
    //#input(void init(Weblog)): "defaultTopicSite"._tainted
    //#input(void init(Weblog)): "linkFormatString"._tainted
    //#input(void init(Weblog)): "plugins.topictag."._tainted
    //#input(void init(Weblog)): "plugins.topictag.ignoreBookmarks"._tainted
    //#input(void init(Weblog)): "tagRegexWithBookmark"._tainted
    //#input(void init(Weblog)): "tagRegexWithoutBookmark"._tainted
    //#input(void init(Weblog)): __Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin]
    //#input(void init(Weblog)): __Descendant_Table[others]
    //#input(void init(Weblog)): __Dispatch_Table.buildBookmarkMap(Lorg/apache/roller/weblogger/pojos/Weblog;)Ljava/util/Map;
    //#input(void init(Weblog)): __Dispatch_Table.getDefaultTopicBookmarkName()Ljava/lang/String;
    //#input(void init(Weblog)): __Dispatch_Table.getDefaultTopicSite()Ljava/lang/String;
    //#input(void init(Weblog)): __Dispatch_Table.getLinkFormatString()Ljava/lang/String;
    //#input(void init(Weblog)): __Dispatch_Table.getTagRegexWithBookmark()Ljava/lang/String;
    //#input(void init(Weblog)): __Dispatch_Table.getTagRegexWithoutBookmark()Ljava/lang/String;
    //#input(void init(Weblog)): __Dispatch_Table.setDefaultTopicBookmarkName(Ljava/lang/String;)V
    //#input(void init(Weblog)): __Dispatch_Table.setDefaultTopicSite(Ljava/lang/String;)V
    //#input(void init(Weblog)): __Dispatch_Table.setLinkFormat(Ljava/text/MessageFormat;)V
    //#input(void init(Weblog)): __Dispatch_Table.setLinkFormatString(Ljava/lang/String;)V
    //#input(void init(Weblog)): __Dispatch_Table.setTagRegexWithBookmark(Ljava/lang/String;)V
    //#input(void init(Weblog)): __Dispatch_Table.setTagRegexWithoutBookmark(Ljava/lang/String;)V
    //#input(void init(Weblog)): mLogger
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Descendant_Table[org/apache/roller/weblogger/business/BookmarkManager]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Descendant_Table[org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Descendant_Table[others]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Dispatch_Table.getBookmarks(Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;Z)Ljava/util/List;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Dispatch_Table.getRootFolder(Lorg/apache/roller/weblogger/pojos/Weblog;)Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/GuiceWebloggerProvider.__Dispatch_Table.getWeblogger()Lorg/apache/roller/weblogger/business/Weblogger;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Descendant_Table[org/apache/roller/weblogger/business/WebloggerImpl]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Descendant_Table[org/apache/roller/weblogger/business/Weblogger]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Descendant_Table[org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Descendant_Table[others]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Dispatch_Table.getBookmarkManager()Lorg/apache/roller/weblogger/business/BookmarkManager;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.__Tag
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.__Tag
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.__Tag
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.strategy
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.strategy.__Tag
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.strategy.threadLocalEntityManager
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerImpl.__Dispatch_Table.getBookmarkManager()Lorg/apache/roller/weblogger/business/BookmarkManager;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerProvider.__Descendant_Table[org/apache/roller/weblogger/business/GuiceWebloggerProvider]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerProvider.__Descendant_Table[org/apache/roller/weblogger/business/WebloggerProvider]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerProvider.__Descendant_Table[others]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/WebloggerProvider.__Dispatch_Table.getWeblogger()Lorg/apache/roller/weblogger/business/Weblogger;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.__Dispatch_Table.getBookmarks(Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;Z)Ljava/util/List;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.__Dispatch_Table.getRootFolder(Lorg/apache/roller/weblogger/pojos/Weblog;)Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy.__Descendant_Table[org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy.__Descendant_Table[others]
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy.__Dispatch_Table.getNamedQuery(Ljava/lang/String;)Ljavax/persistence/Query;
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy.javax.persistence.FlushModeType.COMMIT
    //#input(void init(Weblog)): org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.__Dispatch_Table.getBookmarkManager()Lorg/apache/roller/weblogger/business/BookmarkManager;
    //#input(void init(Weblog)): org/apache/roller/weblogger/config/WebloggerConfig.config
    //#input(void init(Weblog)): org/apache/roller/weblogger/config/WebloggerConfig.log
    //#input(void init(Weblog)): this
    //#input(void init(Weblog)): this.__Tag
    //#input(void init(Weblog)): this.defaultTopicBookmarkName
    //#input(void init(Weblog)): this.defaultTopicSite
    //#input(void init(Weblog)): this.defaultTopicSite._tainted
    //#input(void init(Weblog)): this.linkFormatString
    //#input(void init(Weblog)): this.tagRegexWithBookmark
    //#input(void init(Weblog)): this.tagRegexWithBookmark._tainted
    //#input(void init(Weblog)): this.tagRegexWithoutBookmark
    //#input(void init(Weblog)): this.tagRegexWithoutBookmark._tainted
    //#input(void init(Weblog)): website
    //#output(void init(Weblog)): java.lang.StringBuilder:toString(...)._tainted
    //#output(void init(Weblog)): new HashMap(buildBookmarkMap#1) num objects
    //#output(void init(Weblog)): new MessageFormat(init#10) num objects
    //#output(void init(Weblog)): this.defaultTopicBookmarkName
    //#output(void init(Weblog)): this.defaultTopicSite
    //#output(void init(Weblog)): this.linkFormat
    //#output(void init(Weblog)): this.linkFormatString
    //#output(void init(Weblog)): this.tagPatternWithBookmark
    //#output(void init(Weblog)): this.tagPatternWithoutBookmark
    //#output(void init(Weblog)): this.tagRegexWithBookmark
    //#output(void init(Weblog)): this.tagRegexWithoutBookmark
    //#output(void init(Weblog)): this.userBookmarks
    //#new obj(void init(Weblog)): java.lang.StringBuilder:toString(...)
    //#new obj(void init(Weblog)): new HashMap(buildBookmarkMap#1)
    //#new obj(void init(Weblog)): new MessageFormat(init#10)
    //#pre[1] (void init(Weblog)): init'ed(this.defaultTopicBookmarkName)
    //#pre[2] (void init(Weblog)): init'ed(this.defaultTopicSite)
    //#pre[3] (void init(Weblog)): init'ed(this.linkFormatString)
    //#pre[4] (void init(Weblog)): init'ed(this.tagRegexWithBookmark)
    //#pre[5] (void init(Weblog)): init'ed(this.tagRegexWithoutBookmark)
    //#pre[16] (void init(Weblog)): org/apache/roller/weblogger/config/WebloggerConfig.config != null
    //#pre[17] (void init(Weblog)): org/apache/roller/weblogger/config/WebloggerConfig.log != null
    //#pre[19] (void init(Weblog)): this.__Tag == org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin
    //#pre[6] (void init(Weblog)): (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider != null
    //#pre[7] (void init(Weblog)): (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.__Tag in {org/apache/roller/weblogger/business/GuiceWebloggerProvider, org/apache/roller/weblogger/business/WebloggerProvider}
    //#pre[8] (void init(Weblog)): (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance != null
    //#presumption(void init(Weblog)): java.util.regex.Matcher:groupCount(...)@167 == 2
    //#presumption(void init(Weblog)): java.util.regex.Matcher:groupCount(...)@183 == 1
    //#presumption(void init(Weblog)): java.util.regex.Pattern:compile(...)@160 != null
    //#presumption(void init(Weblog)): java.util.regex.Pattern:compile(...)@176 != null
    //#presumption(void init(Weblog)): java.util.regex.Pattern:matcher(...)@167 != null
    //#presumption(void init(Weblog)): java.util.regex.Pattern:matcher(...)@183 != null
    //#presumption(void init(Weblog)): org.apache.commons.logging.LogFactory:getInstance(...)@103 != null
    //#presumption(void init(Weblog)): org.apache.roller.weblogger.pojos.WeblogBookmark:getUrl(...)@149 != null
    //#post(void init(Weblog)): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(void init(Weblog)): init'ed(this.defaultTopicBookmarkName)
    //#post(void init(Weblog)): this.defaultTopicSite != null
    //#post(void init(Weblog)): this.linkFormat == &new MessageFormat(init#10)
    //#post(void init(Weblog)): init'ed(this.linkFormatString)
    //#post(void init(Weblog)): (soft) this.tagPatternWithBookmark != null
    //#post(void init(Weblog)): (soft) this.tagPatternWithoutBookmark != null
    //#post(void init(Weblog)): init'ed(this.tagRegexWithBookmark)
    //#post(void init(Weblog)): init'ed(this.tagRegexWithoutBookmark)
    //#post(void init(Weblog)): this.userBookmarks == &new HashMap(buildBookmarkMap#1)
    //#post(void init(Weblog)): new HashMap(buildBookmarkMap#1) num objects == 1
    //#post(void init(Weblog)): new MessageFormat(init#10) num objects == 1
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(void init(Weblog)): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.util.Properties:getProperty
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.Boolean
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.Boolean:booleanValue
    //#unanalyzed(void init(Weblog)): Effects-of-calling:getWeblogger
    //#unanalyzed(void init(Weblog)): Effects-of-calling:getBookmarkManager
    //#unanalyzed(void init(Weblog)): Effects-of-calling:getRootFolder
    //#unanalyzed(void init(Weblog)): Effects-of-calling:getBookmarks
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void init(Weblog)): Effects-of-calling:org.apache.roller.weblogger.pojos.WeblogBookmark:getName
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.util.Map:put
    //#unanalyzed(void init(Weblog)): Effects-of-calling:org.apache.roller.RollerException
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.ThreadLocal:get
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.EntityManagerFactory:createEntityManager
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.ThreadLocal:set
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.EntityManager:getTransaction
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.EntityTransaction:isActive
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.EntityTransaction:begin
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.EntityManager:createNamedQuery
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.Query:setFlushMode
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.Query:setParameter
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.Query:getSingleResult
    //#unanalyzed(void init(Weblog)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void init(Weblog)): Effects-of-calling:org.apache.roller.weblogger.pojos.WeblogBookmarkFolder:getPath
    //#unanalyzed(void init(Weblog)): Effects-of-calling:org.apache.roller.weblogger.pojos.WeblogBookmarkFolder:getWebsite
    //#unanalyzed(void init(Weblog)): Effects-of-calling:javax.persistence.Query:getResultList
    //#test_vector(void init(Weblog)): java.lang.String:endsWith(...)@152: {1}, {0}
    //#test_vector(void init(Weblog)): java.util.Map:get(...)@148: Addr_Set{null}, Inverse{null}
    //#test_vector(void init(Weblog)): org.apache.commons.logging.Log:isDebugEnabled(...)@136: {0}, {1}
        {
            mLogger.debug("TopicTagPlugin v. " + version);
    //#TopicTagPlugin.java:138: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: void init(Weblog)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
        }

        // Initialize property settings
        initializeProperties();

        // Build map of the user's bookmarks
        userBookmarks = buildBookmarkMap(website);

        // Determine default topic site from bookmark if present
        WeblogBookmark defaultTopicBookmark = (WeblogBookmark) userBookmarks.get(defaultTopicBookmarkName);
        if (defaultTopicBookmark != null) defaultTopicSite = defaultTopicBookmark.getUrl();
    //#TopicTagPlugin.java:149: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogBookmark:getUrl()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: void init(Weblog)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogBookmark:getUrl()

        // Append / to defaultTopicSite if it doesn't have it
        if (!defaultTopicSite.endsWith("/"))
    //#TopicTagPlugin.java:152: ?null dereference
    //#    this.defaultTopicSite != null
    //#    severity: MEDIUM
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: void init(Weblog)
    //#    basic block: bb_5
    //#    assertion: this.defaultTopicSite != null
    //#    VN: this.defaultTopicSite
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
        {
            defaultTopicSite += "/";
        }

        // Compile patterns and make sure they have the correct number of matching groups in them.
        try
        {
            tagPatternWithBookmark = Pattern.compile(tagRegexWithBookmark);
        }
        catch (PatternSyntaxException e)
        {
            throw new WebloggerException("Invalid regular expression for topic tags with bookmark '" +
                tagRegexWithBookmark + "': " + e.getMessage());
        }
        int groupCount = tagPatternWithBookmark.matcher("").groupCount();
        if (groupCount != 2)
        {
            throw new WebloggerException("Regular expression for topic tags with bookmark '" + tagRegexWithBookmark +
                "' contains wrong number of capture groups.  Must have exactly 2.  Contains " + groupCount);
        }

        try
        {
            tagPatternWithoutBookmark = Pattern.compile(tagRegexWithoutBookmark);
        }
        catch (PatternSyntaxException e)
        {
            throw new WebloggerException("Invalid regular expression for topic tags without bookmark '" +
                tagRegexWithoutBookmark + "': " + e.getMessage());
        }
        groupCount = tagPatternWithoutBookmark.matcher("").groupCount();
        if (groupCount != 1)
        {
            throw new WebloggerException("Regular expression for topic tags without bookmark '" + tagRegexWithoutBookmark +
                "' contains wrong number of capture groups.  Must have exactly 1.  Contains " + groupCount);
        }

        // Create link format from format string
        setLinkFormat(new MessageFormat(linkFormatString));
    }
    //#TopicTagPlugin.java:192: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.init(Weblog)

    /**
     * Apply the plugin to the given entry.  Returns the entry text with topic tags expanded.
     *
     * @param entry           WeblogEntry to which plugin should be applied.
     * @param singleEntry     Ignored.
     * @return Results of applying plugin to entry.
     */
    public String render(WeblogEntry entry, String str)
    {
        String entryText = str;
    //#TopicTagPlugin.java:203: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.render(WeblogEntry, String)
    //#input(String render(WeblogEntry, String)): "."._tainted
    //#input(String render(WeblogEntry, String)): __Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin]
    //#input(String render(WeblogEntry, String)): __Descendant_Table[others]
    //#input(String render(WeblogEntry, String)): __Dispatch_Table.generateLink(Ljava/text/MessageFormat;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //#input(String render(WeblogEntry, String)): __Dispatch_Table.getBookmarkSite(Ljava/lang/String;)Ljava/lang/String;
    //#input(String render(WeblogEntry, String)): __Dispatch_Table.getDefaultTopicSite()Ljava/lang/String;
    //#input(String render(WeblogEntry, String)): __Dispatch_Table.getLinkFormat()Ljava/text/MessageFormat;
    //#input(String render(WeblogEntry, String)): __Dispatch_Table.getLinkFormatString()Ljava/lang/String;
    //#input(String render(WeblogEntry, String)): __Dispatch_Table.getUserBookmarks()Ljava/util/Map;
    //#input(String render(WeblogEntry, String)): str
    //#input(String render(WeblogEntry, String)): this
    //#input(String render(WeblogEntry, String)): this.__Tag
    //#input(String render(WeblogEntry, String)): this.defaultTopicSite
    //#input(String render(WeblogEntry, String)): this.defaultTopicSite._tainted
    //#input(String render(WeblogEntry, String)): this.linkFormat
    //#input(String render(WeblogEntry, String)): this.linkFormatString
    //#input(String render(WeblogEntry, String)): this.tagPatternWithBookmark
    //#input(String render(WeblogEntry, String)): this.tagPatternWithoutBookmark
    //#input(String render(WeblogEntry, String)): this.userBookmarks
    //#output(String render(WeblogEntry, String)): java.lang.StringBuffer:toString(...)._tainted
    //#output(String render(WeblogEntry, String)): return_value
    //#new obj(String render(WeblogEntry, String)): java.lang.StringBuffer:toString(...)
    //#pre[1] (String render(WeblogEntry, String)): str != null
    //#pre[3] (String render(WeblogEntry, String)): this.__Tag == org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin
    //#pre[8] (String render(WeblogEntry, String)): this.tagPatternWithBookmark != null
    //#pre[9] (String render(WeblogEntry, String)): this.tagPatternWithoutBookmark != null
    //#pre[4] (String render(WeblogEntry, String)): (soft) this.defaultTopicSite != null
    //#pre[6] (String render(WeblogEntry, String)): (soft) this.linkFormat != null
    //#pre[7] (String render(WeblogEntry, String)): (soft) this.linkFormatString != null
    //#pre[10] (String render(WeblogEntry, String)): (soft) this.userBookmarks != null
    //#presumption(String render(WeblogEntry, String)): java.util.regex.Matcher:group(...)@212 != null
    //#presumption(String render(WeblogEntry, String)): java.util.regex.Matcher:group(...)@233 != null
    //#presumption(String render(WeblogEntry, String)): java.util.regex.Pattern:matcher(...)@208 != null
    //#presumption(String render(WeblogEntry, String)): java.util.regex.Pattern:matcher(...)@230 != null
    //#post(String render(WeblogEntry, String)): java.lang.StringBuffer:toString(...)._tainted == 0
    //#post(String render(WeblogEntry, String)): return_value == &java.lang.StringBuffer:toString(...)
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.net.URLEncoder:encode
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.text.FieldPosition
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.text.MessageFormat:format
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(String render(WeblogEntry, String)): Effects-of-calling:org.apache.roller.weblogger.pojos.WeblogBookmark:getUrl
    //#test_vector(String render(WeblogEntry, String)): java.lang.String:endsWith(...)@218: {1}, {0}
    //#test_vector(String render(WeblogEntry, String)): java.util.regex.Matcher:find(...)@209: {0}, {1}
    //#test_vector(String render(WeblogEntry, String)): java.util.regex.Matcher:find(...)@231: {0}, {1}
        StringBuffer result = new StringBuffer(entryText.length());
        MessageFormat fmt = getLinkFormat();

        // Replace all of the instances matching the pattern with bookmark specified.
        Matcher m = tagPatternWithBookmark.matcher(entryText);
        while (m.find())
        {
            String bookmark = m.group(1);
            String tag = m.group(2);
            String site = getBookmarkSite(bookmark);
            if (site == null)
            {
                site = getDefaultTopicSite();
            }
            if (!site.endsWith("/"))
            {
                site += "/";
            }
            String link = generateLink(fmt, site, tag);
            m.appendReplacement(result, link);
        }
        m.appendTail(result);

        // Now, in a second phase replace all of the instances matching the pattern without bookmark specified.
        entryText = result.toString();
        result = new StringBuffer(entryText.length());
        m = tagPatternWithoutBookmark.matcher(entryText);
        while (m.find())
        {
            String tag = m.group(1);
            String site = getDefaultTopicSite();
            String link = generateLink(fmt, site, tag);
            m.appendReplacement(result, link);
        }
        m.appendTail(result);

        return result.toString();
    //#TopicTagPlugin.java:240: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.render(WeblogEntry, String)
    }
    

    /**
     * Returns the human-friendly name of this Plugin. This is what users will see.
     *
     * @return The human-friendly name of this Plugin.
     */
    public String getName()
    {
        // TODO: i18n
        return "Topic Tags";
    //#TopicTagPlugin.java:252: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getName()
    //#output(String getName()): return_value
    //#post(String getName()): return_value == &"Topic Tags"
    //#TopicTagPlugin.java:252: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getName()
    }

    /**
     * Briefly describes the function of the Plugin. May contain HTML.
     *
     * @return A brief description of the Plugin.
     */
    public String getDescription()
    {
        // TODO: i18n
        return "Expands topic tags for <a href=\\'http://www.technorati.com\\'>Technorati</a> and similar sites. " +
    //#TopicTagPlugin.java:263: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getDescription()
    //#output(String getDescription()): return_value
    //#post(String getDescription()): return_value == &"Expands topic tags for <a href=\'http:..www.technorati.com\'>Technorat ... de> bookmark, if that is defined, otherwise http:..www.technorati.com."
    //#TopicTagPlugin.java:263: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getDescription()
            "Topic tags are of the form <code>topic:{topicbookmark}[tag]</code>, where <code>topicbookmark</code> " +
            "is the name of a bookmark whose URL will be used for the site name in the topic tag. " +
            "If <code>{topicbookmark}</code> is omitted the plugin will use the URL of the <code>Default Topic Site</code> " +
            "bookmark, if that is defined, otherwise http://www.technorati.com.";
    }

    /**
     * Helper to generate the link from the link format and values of the site and tag.
     *
     * @param fmt  link format.  This should have positional parameters {0} representing site with terminal /,  {1} for
     *             url-encoded-tag, and {2} for visible tag text.
     * @param site base portion of the URL
     * @param tag  tag value
     * @return the generated link as a string
     */
    protected String generateLink(MessageFormat fmt, String site, String tag)
    {
        // Allocate initial capacity of buffer of approximately the right length.
        StringBuffer sb = new StringBuffer(site.length() + tag.length() + getLinkFormatString().length());
    //#TopicTagPlugin.java:282: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.generateLink(MessageFormat, String, String)
    //#input(String generateLink(MessageFormat, String, String)): __Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin]
    //#input(String generateLink(MessageFormat, String, String)): __Descendant_Table[others]
    //#input(String generateLink(MessageFormat, String, String)): __Dispatch_Table.getLinkFormatString()Ljava/lang/String;
    //#input(String generateLink(MessageFormat, String, String)): fmt
    //#input(String generateLink(MessageFormat, String, String)): site
    //#input(String generateLink(MessageFormat, String, String)): tag
    //#input(String generateLink(MessageFormat, String, String)): this
    //#input(String generateLink(MessageFormat, String, String)): this.__Tag
    //#input(String generateLink(MessageFormat, String, String)): this.linkFormatString
    //#output(String generateLink(MessageFormat, String, String)): java.lang.StringBuffer:toString(...)._tainted
    //#output(String generateLink(MessageFormat, String, String)): return_value
    //#new obj(String generateLink(MessageFormat, String, String)): java.lang.StringBuffer:toString(...)
    //#pre[1] (String generateLink(MessageFormat, String, String)): fmt != null
    //#pre[2] (String generateLink(MessageFormat, String, String)): site != null
    //#pre[3] (String generateLink(MessageFormat, String, String)): tag != null
    //#pre[5] (String generateLink(MessageFormat, String, String)): this.__Tag == org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin
    //#pre[6] (String generateLink(MessageFormat, String, String)): this.linkFormatString != null
    //#presumption(String generateLink(MessageFormat, String, String)): java.lang.String:length(...)@282 + java.lang.String:length(...)@282 in 0..4_294_967_295
    //#presumption(String generateLink(MessageFormat, String, String)): java.lang.String:length(...)@282 + java.lang.String:length(...)@282 + java.lang.String:length(...)@282 in 0..4_294_967_295
    //#post(String generateLink(MessageFormat, String, String)): java.lang.StringBuffer:toString(...)._tainted == 0
    //#post(String generateLink(MessageFormat, String, String)): return_value == &java.lang.StringBuffer:toString(...)
    //#unanalyzed(String generateLink(MessageFormat, String, String)): Effects-of-calling:java.net.URLEncoder:encode
    //#unanalyzed(String generateLink(MessageFormat, String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(String generateLink(MessageFormat, String, String)): Effects-of-calling:java.lang.RuntimeException
        fmt.format(new Object[]{site, urlEncode(tag), tag}, sb, new FieldPosition(0));
        return sb.toString();
    //#TopicTagPlugin.java:284: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.generateLink(MessageFormat, String, String)
    }

    /**
     * Resolve the bookmark name and return the URL from it.  If the bookmark can't be found, return null
     *
     * @param bookmarkName name of the bookmark
     * @return String form of the URL from the bookmark by that name from any of the user's folders, or null if not
     *         found.
     */
    protected String getBookmarkSite(String bookmarkName)
    {
        WeblogBookmark bookmark = (WeblogBookmark) getUserBookmarks().get(bookmarkName);
    //#TopicTagPlugin.java:296: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getBookmarkSite(String)
    //#input(String getBookmarkSite(String)): __Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin]
    //#input(String getBookmarkSite(String)): __Descendant_Table[others]
    //#input(String getBookmarkSite(String)): __Dispatch_Table.getUserBookmarks()Ljava/util/Map;
    //#input(String getBookmarkSite(String)): bookmarkName
    //#input(String getBookmarkSite(String)): this
    //#input(String getBookmarkSite(String)): this.__Tag
    //#input(String getBookmarkSite(String)): this.userBookmarks
    //#output(String getBookmarkSite(String)): return_value
    //#pre[3] (String getBookmarkSite(String)): this.__Tag == org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin
    //#pre[4] (String getBookmarkSite(String)): this.userBookmarks != null
    //#post(String getBookmarkSite(String)): init'ed(return_value)
        return bookmark == null ? null : bookmark.getUrl();
    //#TopicTagPlugin.java:297: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogBookmark:getUrl()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: String getBookmarkSite(String)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogBookmark:getUrl()
    //#TopicTagPlugin.java:297: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getBookmarkSite(String)
    }


    /**
     * Build the bookmark map.
     * If ignoreBookmarks property is set, an empty map is returned.
     * @return map of the user's bookmarks (type BookmarkData), keyed by name (type String).
     */
    protected Map buildBookmarkMap(Weblog website) throws WebloggerException
    {
        Map bookmarkMap = new HashMap();
    //#TopicTagPlugin.java:308: method: Map org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.buildBookmarkMap(Weblog)
    //#TopicTagPlugin.java:308: Warning: suspicious precondition
    //#    the precondition for org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: Map buildBookmarkMap(Weblog)
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(Map buildBookmarkMap(Weblog)): "="._tainted
    //#input(Map buildBookmarkMap(Weblog)): "Fetching property ["._tainted
    //#input(Map buildBookmarkMap(Weblog)): "]"._tainted
    //#input(Map buildBookmarkMap(Weblog)): "plugins.topictag.ignoreBookmarks"._tainted
    //#input(Map buildBookmarkMap(Weblog)): mLogger
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Descendant_Table[org/apache/roller/weblogger/business/BookmarkManager]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Descendant_Table[org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Descendant_Table[others]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Dispatch_Table.getBookmarks(Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;Z)Ljava/util/List;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/BookmarkManager.__Dispatch_Table.getRootFolder(Lorg/apache/roller/weblogger/pojos/Weblog;)Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/GuiceWebloggerProvider.__Dispatch_Table.getWeblogger()Lorg/apache/roller/weblogger/business/Weblogger;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Descendant_Table[org/apache/roller/weblogger/business/WebloggerImpl]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Descendant_Table[org/apache/roller/weblogger/business/Weblogger]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Descendant_Table[org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Descendant_Table[others]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/Weblogger.__Dispatch_Table.getBookmarkManager()Lorg/apache/roller/weblogger/business/BookmarkManager;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.__Tag
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.__Tag
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.__Tag
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.strategy
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.strategy.__Tag
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.strategy.emf
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance.bookmarkManager.strategy.threadLocalEntityManager
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerImpl.__Dispatch_Table.getBookmarkManager()Lorg/apache/roller/weblogger/business/BookmarkManager;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerProvider.__Descendant_Table[org/apache/roller/weblogger/business/GuiceWebloggerProvider]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerProvider.__Descendant_Table[org/apache/roller/weblogger/business/WebloggerProvider]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerProvider.__Descendant_Table[others]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/WebloggerProvider.__Dispatch_Table.getWeblogger()Lorg/apache/roller/weblogger/business/Weblogger;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.__Dispatch_Table.getBookmarks(Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;Z)Ljava/util/List;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.__Dispatch_Table.getRootFolder(Lorg/apache/roller/weblogger/pojos/Weblog;)Lorg/apache/roller/weblogger/pojos/WeblogBookmarkFolder;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy.__Descendant_Table[org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy.__Descendant_Table[others]
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy.__Dispatch_Table.getNamedQuery(Ljava/lang/String;)Ljavax/persistence/Query;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy.javax.persistence.FlushModeType.COMMIT
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl.__Dispatch_Table.getBookmarkManager()Lorg/apache/roller/weblogger/business/BookmarkManager;
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/config/WebloggerConfig.config
    //#input(Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/config/WebloggerConfig.log
    //#input(Map buildBookmarkMap(Weblog)): website
    //#output(Map buildBookmarkMap(Weblog)): new HashMap(buildBookmarkMap#1) num objects
    //#output(Map buildBookmarkMap(Weblog)): return_value
    //#new obj(Map buildBookmarkMap(Weblog)): new HashMap(buildBookmarkMap#1)
    //#pre[4] (Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/config/WebloggerConfig.config != null
    //#pre[5] (Map buildBookmarkMap(Weblog)): org/apache/roller/weblogger/config/WebloggerConfig.log != null
    //#pre[1] (Map buildBookmarkMap(Weblog)): (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider != null
    //#pre[2] (Map buildBookmarkMap(Weblog)): (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.__Tag in {org/apache/roller/weblogger/business/GuiceWebloggerProvider, org/apache/roller/weblogger/business/WebloggerProvider}
    //#pre[3] (Map buildBookmarkMap(Weblog)): (soft) org/apache/roller/weblogger/business/WebloggerFactory.webloggerProvider.webloggerInstance != null
    //#presumption(Map buildBookmarkMap(Weblog)): bMgr.__Tag in {org/apache/roller/weblogger/business/BookmarkManager, org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl}
    //#presumption(Map buildBookmarkMap(Weblog)): bMgr.strategy != null
    //#presumption(Map buildBookmarkMap(Weblog)): bMgr.strategy.__Tag == org/apache/roller/weblogger/business/jpa/JPAPersistenceStrategy
    //#presumption(Map buildBookmarkMap(Weblog)): bMgr.strategy.emf != null
    //#presumption(Map buildBookmarkMap(Weblog)): bMgr.strategy.emf@319 != null
    //#presumption(Map buildBookmarkMap(Weblog)): bMgr.strategy.threadLocalEntityManager != null
    //#presumption(Map buildBookmarkMap(Weblog)): getWeblogger(...).__Tag in {org/apache/roller/weblogger/business/Weblogger, org/apache/roller/weblogger/business/WebloggerImpl, org/apache/roller/weblogger/business/jpa/JPAWebloggerImpl}
    //#presumption(Map buildBookmarkMap(Weblog)): getWeblogger(...).bookmarkManager != null
    //#presumption(Map buildBookmarkMap(Weblog)): java.util.Iterator:next(...)@323 != null
    //#presumption(Map buildBookmarkMap(Weblog)): org.apache.commons.logging.LogFactory:getInstance(...)@103 != null
    //#post(Map buildBookmarkMap(Weblog)): return_value == &new HashMap(buildBookmarkMap#1)
    //#post(Map buildBookmarkMap(Weblog)): new HashMap(buildBookmarkMap#1) num objects == 1
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.util.Properties:getProperty
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.Boolean
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.Boolean:booleanValue
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:getWeblogger
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.ThreadLocal:get
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.EntityManagerFactory:createEntityManager
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.ThreadLocal:set
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.EntityManager:getTransaction
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.EntityTransaction:isActive
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.EntityTransaction:begin
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.EntityManager:createNamedQuery
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.Query:setFlushMode
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.Query:setParameter
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.Query:getSingleResult
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:org.apache.roller.weblogger.pojos.WeblogBookmarkFolder:getPath
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:org.apache.roller.weblogger.pojos.WeblogBookmarkFolder:getWebsite
    //#unanalyzed(Map buildBookmarkMap(Weblog)): Effects-of-calling:javax.persistence.Query:getResultList
    //#test_vector(Map buildBookmarkMap(Weblog)): website: Inverse{null}, Addr_Set{null}
    //#test_vector(Map buildBookmarkMap(Weblog)): java.util.Iterator:hasNext(...)@321: {0}, {1}
        if (WebloggerConfig.getBooleanProperty("plugins.topictag.ignoreBookmarks")) {
            return bookmarkMap;
        }
        if (website == null)
        {
            mLogger.debug("Init called without website.  Skipping bookmark initialization.");
    //#TopicTagPlugin.java:314: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:debug(Object)
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: Map buildBookmarkMap(Weblog)
    //#    unanalyzed callee: void org.apache.commons.logging.Log:debug(Object)
        }
        else
        {
            BookmarkManager bMgr = WebloggerFactory.getWeblogger().getBookmarkManager();
            List bookmarks = bMgr.getBookmarks(bMgr.getRootFolder(website), true);
    //#TopicTagPlugin.java:319: ?precondition failure
    //#    org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.getBookmarks: (soft) folder != null
    //#    severity: SUPPRESSED
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: Map buildBookmarkMap(Weblog)
    //#    basic block: bb_5
    //#    assertion: (soft) getRootFolder(...) != null
    //#    callee: List org/apache/roller/weblogger/business/jpa/JPABookmarkManagerImpl.getBookmarks(WeblogBookmarkFolder, bool)
    //#    callee assertion: (soft) folder != null
    //#    callee file: JPABookmarkManagerImpl.java
    //#    callee precondition index: [1]
    //#    callee srcpos: 322
    //#    VN: getRootFolder(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Soft

            for (Iterator i = bookmarks.iterator(); i.hasNext();)
    //#TopicTagPlugin.java:321: ?null dereference
    //#    bookmarks != null
    //#    severity: MEDIUM
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: Map buildBookmarkMap(Weblog)
    //#    basic block: bb_5
    //#    assertion: bookmarks != null
    //#    VN: getBookmarks(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
            {
                WeblogBookmark b = (WeblogBookmark) i.next();
                bookmarkMap.put(b.getName(), b);
    //#TopicTagPlugin.java:324: Warning: method not available
    //#    -- call on String org.apache.roller.weblogger.pojos.WeblogBookmark:getName()
    //#    severity: INFORMATIONAL
    //#    class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
    //#    method: Map buildBookmarkMap(Weblog)
    //#    unanalyzed callee: String org.apache.roller.weblogger.pojos.WeblogBookmark:getName()
            }
        }
        return bookmarkMap;
    //#TopicTagPlugin.java:327: end of method: Map org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.buildBookmarkMap(Weblog)
    }


    // Sets up properties.  For better and worse, doesn't use reflection
    private void initializeProperties()
    {
        setDefaultTopicBookmarkName(getSetting("defaultTopicBookmarkName", getDefaultTopicBookmarkName()));
    //#TopicTagPlugin.java:334: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.initializeProperties()
    //#input(void initializeProperties()): "="._tainted
    //#input(void initializeProperties()): "Fetching property ["._tainted
    //#input(void initializeProperties()): "]"._tainted
    //#input(void initializeProperties()): "defaultTopicBookmarkName"._tainted
    //#input(void initializeProperties()): "defaultTopicSite"._tainted
    //#input(void initializeProperties()): "linkFormatString"._tainted
    //#input(void initializeProperties()): "plugins.topictag."._tainted
    //#input(void initializeProperties()): "tagRegexWithBookmark"._tainted
    //#input(void initializeProperties()): "tagRegexWithoutBookmark"._tainted
    //#input(void initializeProperties()): __Descendant_Table[org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin]
    //#input(void initializeProperties()): __Descendant_Table[others]
    //#input(void initializeProperties()): __Dispatch_Table.getDefaultTopicBookmarkName()Ljava/lang/String;
    //#input(void initializeProperties()): __Dispatch_Table.getDefaultTopicSite()Ljava/lang/String;
    //#input(void initializeProperties()): __Dispatch_Table.getLinkFormatString()Ljava/lang/String;
    //#input(void initializeProperties()): __Dispatch_Table.getTagRegexWithBookmark()Ljava/lang/String;
    //#input(void initializeProperties()): __Dispatch_Table.getTagRegexWithoutBookmark()Ljava/lang/String;
    //#input(void initializeProperties()): __Dispatch_Table.setDefaultTopicBookmarkName(Ljava/lang/String;)V
    //#input(void initializeProperties()): __Dispatch_Table.setDefaultTopicSite(Ljava/lang/String;)V
    //#input(void initializeProperties()): __Dispatch_Table.setLinkFormatString(Ljava/lang/String;)V
    //#input(void initializeProperties()): __Dispatch_Table.setTagRegexWithBookmark(Ljava/lang/String;)V
    //#input(void initializeProperties()): __Dispatch_Table.setTagRegexWithoutBookmark(Ljava/lang/String;)V
    //#input(void initializeProperties()): org/apache/roller/weblogger/config/WebloggerConfig.config
    //#input(void initializeProperties()): org/apache/roller/weblogger/config/WebloggerConfig.log
    //#input(void initializeProperties()): this
    //#input(void initializeProperties()): this.__Tag
    //#input(void initializeProperties()): this.defaultTopicBookmarkName
    //#input(void initializeProperties()): this.defaultTopicSite
    //#input(void initializeProperties()): this.linkFormatString
    //#input(void initializeProperties()): this.tagRegexWithBookmark
    //#input(void initializeProperties()): this.tagRegexWithoutBookmark
    //#output(void initializeProperties()): this.defaultTopicBookmarkName
    //#output(void initializeProperties()): this.defaultTopicSite
    //#output(void initializeProperties()): this.linkFormatString
    //#output(void initializeProperties()): this.tagRegexWithBookmark
    //#output(void initializeProperties()): this.tagRegexWithoutBookmark
    //#pre[1] (void initializeProperties()): init'ed(this.defaultTopicBookmarkName)
    //#pre[2] (void initializeProperties()): init'ed(this.defaultTopicSite)
    //#pre[3] (void initializeProperties()): init'ed(this.linkFormatString)
    //#pre[4] (void initializeProperties()): init'ed(this.tagRegexWithBookmark)
    //#pre[5] (void initializeProperties()): init'ed(this.tagRegexWithoutBookmark)
    //#pre[6] (void initializeProperties()): org/apache/roller/weblogger/config/WebloggerConfig.config != null
    //#pre[7] (void initializeProperties()): org/apache/roller/weblogger/config/WebloggerConfig.log != null
    //#pre[9] (void initializeProperties()): this.__Tag == org/apache/roller/weblogger/business/plugins/entry/TopicTagPlugin
    //#post(void initializeProperties()): init'ed(this.defaultTopicBookmarkName)
    //#post(void initializeProperties()): init'ed(this.defaultTopicSite)
    //#post(void initializeProperties()): init'ed(this.linkFormatString)
    //#post(void initializeProperties()): init'ed(this.tagRegexWithBookmark)
    //#post(void initializeProperties()): init'ed(this.tagRegexWithoutBookmark)
    //#unanalyzed(void initializeProperties()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void initializeProperties()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void initializeProperties()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void initializeProperties()): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(void initializeProperties()): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(void initializeProperties()): Effects-of-calling:java.util.Properties:getProperty
        setDefaultTopicSite(getSetting("defaultTopicSite", getDefaultTopicSite()));
        setTagRegexWithBookmark(getSetting("tagRegexWithBookmark", getTagRegexWithBookmark()));
        setTagRegexWithoutBookmark(getSetting("tagRegexWithoutBookmark", getTagRegexWithoutBookmark()));
        setLinkFormatString(getSetting("linkFormatString", getLinkFormatString()));
    }
    //#TopicTagPlugin.java:339: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.initializeProperties()

    private String getSetting(String propName, String defaultValue)
    {
        String fullPropName = "plugins.topictag." + propName;
    //#TopicTagPlugin.java:343: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getSetting(String, String)
    //#input(String getSetting(String, String)): "="._tainted
    //#input(String getSetting(String, String)): "Fetching property ["._tainted
    //#input(String getSetting(String, String)): "]"._tainted
    //#input(String getSetting(String, String)): "plugins.topictag."._tainted
    //#input(String getSetting(String, String)): defaultValue
    //#input(String getSetting(String, String)): org/apache/roller/weblogger/config/WebloggerConfig.config
    //#input(String getSetting(String, String)): org/apache/roller/weblogger/config/WebloggerConfig.log
    //#input(String getSetting(String, String)): propName
    //#input(String getSetting(String, String)): propName._tainted
    //#output(String getSetting(String, String)): return_value
    //#pre[2] (String getSetting(String, String)): org/apache/roller/weblogger/config/WebloggerConfig.config != null
    //#pre[3] (String getSetting(String, String)): org/apache/roller/weblogger/config/WebloggerConfig.log != null
    //#post(String getSetting(String, String)): init'ed(return_value)
    //#unanalyzed(String getSetting(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String getSetting(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String getSetting(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(String getSetting(String, String)): Effects-of-calling:java.lang.String:trim
    //#unanalyzed(String getSetting(String, String)): Effects-of-calling:org.apache.commons.logging.Log:debug
    //#unanalyzed(String getSetting(String, String)): Effects-of-calling:java.util.Properties:getProperty
        String val = (String) WebloggerConfig.getProperty(fullPropName);
        return (val != null) ? val : defaultValue;
    //#TopicTagPlugin.java:345: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getSetting(String, String)
    }


    // Private helper to URL encode the tag text.
    private String urlEncode(String text)
    {
        // URL encode the searchtext
        try
        {
            return URLEncoder.encode(text, "UTF-8");
    //#TopicTagPlugin.java:355: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.urlEncode(String)
    //#input(String urlEncode(String)): text
    //#output(String urlEncode(String)): return_value
    //#post(String urlEncode(String)): init'ed(return_value)
        }
        catch (UnsupportedEncodingException uex)
        {
            // Should never actually occur for UTF-8.  If it does, we barf bitterly.
            throw new RuntimeException(uex);
    //#TopicTagPlugin.java:360: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.urlEncode(String)
        }
    }


    // Property getters and setters


    public String getDefaultTopicSite()
    {
        return defaultTopicSite;
    //#TopicTagPlugin.java:370: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getDefaultTopicSite()
    //#input(String getDefaultTopicSite()): this
    //#input(String getDefaultTopicSite()): this.defaultTopicSite
    //#output(String getDefaultTopicSite()): return_value
    //#pre[2] (String getDefaultTopicSite()): init'ed(this.defaultTopicSite)
    //#post(String getDefaultTopicSite()): return_value == this.defaultTopicSite
    //#post(String getDefaultTopicSite()): init'ed(return_value)
    //#TopicTagPlugin.java:370: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getDefaultTopicSite()
    }

    public void setDefaultTopicSite(String defaultTopicSite)
    {
        this.defaultTopicSite = defaultTopicSite;
    //#TopicTagPlugin.java:375: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setDefaultTopicSite(String)
    //#input(void setDefaultTopicSite(String)): defaultTopicSite
    //#input(void setDefaultTopicSite(String)): this
    //#output(void setDefaultTopicSite(String)): this.defaultTopicSite
    //#post(void setDefaultTopicSite(String)): this.defaultTopicSite == defaultTopicSite
    //#post(void setDefaultTopicSite(String)): init'ed(this.defaultTopicSite)
    }
    //#TopicTagPlugin.java:376: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setDefaultTopicSite(String)

    public String getTagRegexWithBookmark()
    {
        return tagRegexWithBookmark;
    //#TopicTagPlugin.java:380: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getTagRegexWithBookmark()
    //#input(String getTagRegexWithBookmark()): this
    //#input(String getTagRegexWithBookmark()): this.tagRegexWithBookmark
    //#output(String getTagRegexWithBookmark()): return_value
    //#pre[2] (String getTagRegexWithBookmark()): init'ed(this.tagRegexWithBookmark)
    //#post(String getTagRegexWithBookmark()): return_value == this.tagRegexWithBookmark
    //#post(String getTagRegexWithBookmark()): init'ed(return_value)
    //#TopicTagPlugin.java:380: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getTagRegexWithBookmark()
    }

    public void setTagRegexWithBookmark(String tagRegexWithBookmark)
    {
        this.tagRegexWithBookmark = tagRegexWithBookmark;
    //#TopicTagPlugin.java:385: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setTagRegexWithBookmark(String)
    //#input(void setTagRegexWithBookmark(String)): tagRegexWithBookmark
    //#input(void setTagRegexWithBookmark(String)): this
    //#output(void setTagRegexWithBookmark(String)): this.tagRegexWithBookmark
    //#post(void setTagRegexWithBookmark(String)): this.tagRegexWithBookmark == tagRegexWithBookmark
    //#post(void setTagRegexWithBookmark(String)): init'ed(this.tagRegexWithBookmark)
    }
    //#TopicTagPlugin.java:386: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setTagRegexWithBookmark(String)

    public String getTagRegexWithoutBookmark()
    {
        return tagRegexWithoutBookmark;
    //#TopicTagPlugin.java:390: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getTagRegexWithoutBookmark()
    //#input(String getTagRegexWithoutBookmark()): this
    //#input(String getTagRegexWithoutBookmark()): this.tagRegexWithoutBookmark
    //#output(String getTagRegexWithoutBookmark()): return_value
    //#pre[2] (String getTagRegexWithoutBookmark()): init'ed(this.tagRegexWithoutBookmark)
    //#post(String getTagRegexWithoutBookmark()): return_value == this.tagRegexWithoutBookmark
    //#post(String getTagRegexWithoutBookmark()): init'ed(return_value)
    //#TopicTagPlugin.java:390: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getTagRegexWithoutBookmark()
    }

    public void setTagRegexWithoutBookmark(String tagRegexWithoutBookmark)
    {
        this.tagRegexWithoutBookmark = tagRegexWithoutBookmark;
    //#TopicTagPlugin.java:395: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setTagRegexWithoutBookmark(String)
    //#input(void setTagRegexWithoutBookmark(String)): tagRegexWithoutBookmark
    //#input(void setTagRegexWithoutBookmark(String)): this
    //#output(void setTagRegexWithoutBookmark(String)): this.tagRegexWithoutBookmark
    //#post(void setTagRegexWithoutBookmark(String)): this.tagRegexWithoutBookmark == tagRegexWithoutBookmark
    //#post(void setTagRegexWithoutBookmark(String)): init'ed(this.tagRegexWithoutBookmark)
    }
    //#TopicTagPlugin.java:396: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setTagRegexWithoutBookmark(String)

    public String getLinkFormatString()
    {
        return linkFormatString;
    //#TopicTagPlugin.java:400: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getLinkFormatString()
    //#input(String getLinkFormatString()): this
    //#input(String getLinkFormatString()): this.linkFormatString
    //#output(String getLinkFormatString()): return_value
    //#pre[2] (String getLinkFormatString()): init'ed(this.linkFormatString)
    //#post(String getLinkFormatString()): return_value == this.linkFormatString
    //#post(String getLinkFormatString()): init'ed(return_value)
    //#TopicTagPlugin.java:400: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getLinkFormatString()
    }

    public void setLinkFormatString(String linkFormatString)
    {
        this.linkFormatString = linkFormatString;
    //#TopicTagPlugin.java:405: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setLinkFormatString(String)
    //#input(void setLinkFormatString(String)): linkFormatString
    //#input(void setLinkFormatString(String)): this
    //#output(void setLinkFormatString(String)): this.linkFormatString
    //#post(void setLinkFormatString(String)): this.linkFormatString == linkFormatString
    //#post(void setLinkFormatString(String)): init'ed(this.linkFormatString)
    }
    //#TopicTagPlugin.java:406: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setLinkFormatString(String)

    public MessageFormat getLinkFormat()
    {
        return linkFormat;
    //#TopicTagPlugin.java:410: method: MessageFormat org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getLinkFormat()
    //#input(MessageFormat getLinkFormat()): this
    //#input(MessageFormat getLinkFormat()): this.linkFormat
    //#output(MessageFormat getLinkFormat()): return_value
    //#pre[2] (MessageFormat getLinkFormat()): init'ed(this.linkFormat)
    //#post(MessageFormat getLinkFormat()): return_value == this.linkFormat
    //#post(MessageFormat getLinkFormat()): init'ed(return_value)
    //#TopicTagPlugin.java:410: end of method: MessageFormat org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getLinkFormat()
    }

    public void setLinkFormat(MessageFormat linkFormat)
    {
        this.linkFormat = linkFormat;
    //#TopicTagPlugin.java:415: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setLinkFormat(MessageFormat)
    //#input(void setLinkFormat(MessageFormat)): linkFormat
    //#input(void setLinkFormat(MessageFormat)): this
    //#output(void setLinkFormat(MessageFormat)): this.linkFormat
    //#post(void setLinkFormat(MessageFormat)): this.linkFormat == linkFormat
    //#post(void setLinkFormat(MessageFormat)): init'ed(this.linkFormat)
    }
    //#TopicTagPlugin.java:416: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setLinkFormat(MessageFormat)

    public Pattern getTagPatternWithBookmark()
    {
        return tagPatternWithBookmark;
    //#TopicTagPlugin.java:420: method: Pattern org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getTagPatternWithBookmark()
    //#input(Pattern getTagPatternWithBookmark()): this
    //#input(Pattern getTagPatternWithBookmark()): this.tagPatternWithBookmark
    //#output(Pattern getTagPatternWithBookmark()): return_value
    //#pre[2] (Pattern getTagPatternWithBookmark()): init'ed(this.tagPatternWithBookmark)
    //#post(Pattern getTagPatternWithBookmark()): return_value == this.tagPatternWithBookmark
    //#post(Pattern getTagPatternWithBookmark()): init'ed(return_value)
    //#TopicTagPlugin.java:420: end of method: Pattern org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getTagPatternWithBookmark()
    }

    public void setTagPatternWithBookmark(Pattern tagPatternWithBookmark)
    {
        this.tagPatternWithBookmark = tagPatternWithBookmark;
    //#TopicTagPlugin.java:425: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setTagPatternWithBookmark(Pattern)
    //#input(void setTagPatternWithBookmark(Pattern)): tagPatternWithBookmark
    //#input(void setTagPatternWithBookmark(Pattern)): this
    //#output(void setTagPatternWithBookmark(Pattern)): this.tagPatternWithBookmark
    //#post(void setTagPatternWithBookmark(Pattern)): this.tagPatternWithBookmark == tagPatternWithBookmark
    //#post(void setTagPatternWithBookmark(Pattern)): init'ed(this.tagPatternWithBookmark)
    }
    //#TopicTagPlugin.java:426: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setTagPatternWithBookmark(Pattern)

    public Pattern getTagPatternWithoutBookmark()
    {
        return tagPatternWithoutBookmark;
    //#TopicTagPlugin.java:430: method: Pattern org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getTagPatternWithoutBookmark()
    //#input(Pattern getTagPatternWithoutBookmark()): this
    //#input(Pattern getTagPatternWithoutBookmark()): this.tagPatternWithoutBookmark
    //#output(Pattern getTagPatternWithoutBookmark()): return_value
    //#pre[2] (Pattern getTagPatternWithoutBookmark()): init'ed(this.tagPatternWithoutBookmark)
    //#post(Pattern getTagPatternWithoutBookmark()): return_value == this.tagPatternWithoutBookmark
    //#post(Pattern getTagPatternWithoutBookmark()): init'ed(return_value)
    //#TopicTagPlugin.java:430: end of method: Pattern org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getTagPatternWithoutBookmark()
    }

    public void setTagPatternWithoutBookmark(Pattern tagPatternWithoutBookmark)
    {
        this.tagPatternWithoutBookmark = tagPatternWithoutBookmark;
    //#TopicTagPlugin.java:435: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setTagPatternWithoutBookmark(Pattern)
    //#input(void setTagPatternWithoutBookmark(Pattern)): tagPatternWithoutBookmark
    //#input(void setTagPatternWithoutBookmark(Pattern)): this
    //#output(void setTagPatternWithoutBookmark(Pattern)): this.tagPatternWithoutBookmark
    //#post(void setTagPatternWithoutBookmark(Pattern)): this.tagPatternWithoutBookmark == tagPatternWithoutBookmark
    //#post(void setTagPatternWithoutBookmark(Pattern)): init'ed(this.tagPatternWithoutBookmark)
    }
    //#TopicTagPlugin.java:436: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setTagPatternWithoutBookmark(Pattern)

    public String getDefaultTopicBookmarkName()
    {
        return defaultTopicBookmarkName;
    //#TopicTagPlugin.java:440: method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getDefaultTopicBookmarkName()
    //#input(String getDefaultTopicBookmarkName()): this
    //#input(String getDefaultTopicBookmarkName()): this.defaultTopicBookmarkName
    //#output(String getDefaultTopicBookmarkName()): return_value
    //#pre[2] (String getDefaultTopicBookmarkName()): init'ed(this.defaultTopicBookmarkName)
    //#post(String getDefaultTopicBookmarkName()): return_value == this.defaultTopicBookmarkName
    //#post(String getDefaultTopicBookmarkName()): init'ed(return_value)
    //#TopicTagPlugin.java:440: end of method: String org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getDefaultTopicBookmarkName()
    }

    public void setDefaultTopicBookmarkName(String defaultTopicBookmarkName)
    {
        this.defaultTopicBookmarkName = defaultTopicBookmarkName;
    //#TopicTagPlugin.java:445: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setDefaultTopicBookmarkName(String)
    //#input(void setDefaultTopicBookmarkName(String)): defaultTopicBookmarkName
    //#input(void setDefaultTopicBookmarkName(String)): this
    //#output(void setDefaultTopicBookmarkName(String)): this.defaultTopicBookmarkName
    //#post(void setDefaultTopicBookmarkName(String)): this.defaultTopicBookmarkName == defaultTopicBookmarkName
    //#post(void setDefaultTopicBookmarkName(String)): init'ed(this.defaultTopicBookmarkName)
    }
    //#TopicTagPlugin.java:446: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setDefaultTopicBookmarkName(String)

    public Map getUserBookmarks()
    {
        return userBookmarks;
    //#TopicTagPlugin.java:450: method: Map org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getUserBookmarks()
    //#input(Map getUserBookmarks()): this
    //#input(Map getUserBookmarks()): this.userBookmarks
    //#output(Map getUserBookmarks()): return_value
    //#pre[2] (Map getUserBookmarks()): init'ed(this.userBookmarks)
    //#post(Map getUserBookmarks()): return_value == this.userBookmarks
    //#post(Map getUserBookmarks()): init'ed(return_value)
    //#TopicTagPlugin.java:450: end of method: Map org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.getUserBookmarks()
    }

    public void setUserBookmarks(Map userBookmarks)
    {
        this.userBookmarks = userBookmarks;
    //#TopicTagPlugin.java:455: method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setUserBookmarks(Map)
    //#input(void setUserBookmarks(Map)): this
    //#input(void setUserBookmarks(Map)): userBookmarks
    //#output(void setUserBookmarks(Map)): this.userBookmarks
    //#post(void setUserBookmarks(Map)): this.userBookmarks == userBookmarks
    //#post(void setUserBookmarks(Map)): init'ed(this.userBookmarks)
    }
    //#TopicTagPlugin.java:456: end of method: void org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin.setUserBookmarks(Map)
    
}
    //#TopicTagPlugin.java:: end of class: org.apache.roller.weblogger.business.plugins.entry.TopicTagPlugin
