radeoxdecorator.java

### File Source: radeoxdecorator.java

             /*
        P/P   *  Method: net.sourceforge.pebble.decorator.RadeoxWikiRenderEngine__static_init
              */
         1  package net.sourceforge.pebble.decorator;
         2
         3  import net.sourceforge.pebble.domain.BlogEntry;
         4  import net.sourceforge.pebble.domain.Blog;
         5  import net.sourceforge.pebble.domain.StaticPage;
         6  import net.sourceforge.pebble.util.UrlRewriter;
         7  import net.sourceforge.pebble.api.decorator.ContentDecoratorContext;
             /*
        P/P   *  Method: void net.sourceforge.pebble.decorator.RadeoxDecorator()
              */
         8  import org.radeox.api.engine.RenderEngine;
         9  import org.radeox.api.engine.WikiRenderEngine;
        10  import org.radeox.api.engine.context.InitialRenderContext;
        11  import org.radeox.api.engine.context.RenderContext;
        12  import org.radeox.engine.BaseRenderEngine;
        13  import org.radeox.engine.context.BaseInitialRenderContext;
        14
        15  import java.util.regex.Matcher;
        16  import java.util.regex.Pattern;
        17
        18  /**
        19   * Decorates blog entries and comments by rendering them with Radeox, internal
        20   * links pointing to static pages within the blog.
        21   *
        22   * @author Simon Brown
        23   */
        24  public class RadeoxDecorator extends ContentDecoratorSupport {
        25
        26    private static final String WIKI_START_TAG = "<wiki>";
        27    private static final String WIKI_END_TAG = "</wiki>";
        28
        29    /**
        30     * Decorates the specified blog entry.
        31     *
        32     * @param context   the context in which the decoration is running
        33     * @param blogEntry the blog entry to be decorated
        34     */
        35    public void decorate(ContentDecoratorContext context, BlogEntry blogEntry) {
                 /*
        P/P       *  Method: void decorate(ContentDecoratorContext, BlogEntry)
                  *
                  *  Preconditions:
                  *    blogEntry != null
                  *    blogEntry.propertyChangeSupport != null
                  *    init'ed(blogEntry.body)
                  *    init'ed(blogEntry.excerpt)
                  *    this.blog != null
                  *    this.blog.properties != null
                  *
                  *  Postconditions:
                  *    blogEntry.body != null
                  *    init'ed(blogEntry.excerpt)
                  */
        36      InitialRenderContext initialContext = new BaseInitialRenderContext();
        37      initialContext.set(RenderContext.INPUT_LOCALE, getBlog().getLocale());
        38      RenderEngine engineWithContext = new RadeoxWikiRenderEngine(initialContext, getBlog());
        39
        40      blogEntry.setExcerpt(wikify(blogEntry.getExcerpt(), engineWithContext, initialContext));
        41      blogEntry.setBody(wikify(blogEntry.getBody(), engineWithContext, initialContext));
        42    }
        43
        44    /**
        45     * Decorates the specified static page.
        46     *
        47     * @param context    the context in which the decoration is running
        48     * @param staticPage the static page to be decorated
        49     */
        50    public void decorate(ContentDecoratorContext context, StaticPage staticPage) {
                 /*
        P/P       *  Method: void decorate(ContentDecoratorContext, StaticPage)
                  *
                  *  Preconditions:
                  *    init'ed(staticPage.body)
                  *    staticPage != null
                  *    staticPage.propertyChangeSupport != null
                  *    this.blog != null
                  *    this.blog.properties != null
                  *
                  *  Postconditions:
                  *    staticPage.body != null
                  */
        51      InitialRenderContext initialContext = new BaseInitialRenderContext();
        52      initialContext.set(RenderContext.INPUT_LOCALE, getBlog().getLocale());
        53      RenderEngine engineWithContext = new RadeoxWikiRenderEngine(initialContext, getBlog());
        54
        55      staticPage.setBody(wikify(staticPage.getBody(), engineWithContext, initialContext));
        56    }
        57
        58    private String wikify(String content, RenderEngine renderEngine, InitialRenderContext renderContext) {
        59      // is there work to do?
                 /*
        P/P       *  Method: String wikify(String, RenderEngine, InitialRenderContext)
                  *
                  *  Preconditions:
                  *    (soft) renderEngine != null
                  *
                  *  Presumptions:
                  *    java.lang.String:length(...)@79 - java.lang.String:length(...)@79 in -232+1..231
                  *    java.util.regex.Pattern:compile(...)@68 != null
                  *    java.util.regex.Pattern:matcher(...)@70 != null
                  *
                  *  Postconditions:
                  *    return_value != null
                  *
                  *  Test Vectors:
                  *    content: Addr_Set{null}, Inverse{null}
                  *    java.lang.String:length(...)@60: {1..232-1}, {0}
                  *    java.util.regex.Matcher:find(...)@73: {1}, {0}
                  */
        60      if (content == null || content.length() == 0) {
        61        return "";
        62      }
        63
        64      // this pattern says "take the shortest match you can find where there are
        65      // one or more characters between wiki tags"
        66      //  - the match is case insensitive and DOTALL means that newlines are
        67      //  - considered as a character match
        68      Pattern p = Pattern.compile(WIKI_START_TAG + ".+?" + WIKI_END_TAG,
        69          Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        70      Matcher m = p.matcher(content);
        71
        72      // while there are blocks to be escaped
        73      while (m.find()) {
        74        int start = m.start();
        75        int end = m.end();
        76
        77        // grab the text, strip off the escape tags and transform it
        78        String textToWikify = content.substring(start, end);
        79        textToWikify = textToWikify.substring(WIKI_START_TAG.length(), textToWikify.length() - WIKI_END_TAG.length());
        80        textToWikify = renderEngine.render(textToWikify, renderContext);
        81
        82        // now add it back into the original text
        83        content = content.substring(0, start) + textToWikify + content.substring(end, content.length());
        84        m = p.matcher(content);
        85      }
        86
        87      return content;
        88    }
        89
        90  }
        91
        92  class RadeoxWikiRenderEngine extends BaseRenderEngine implements WikiRenderEngine {
        93
        94    private Blog blog;
        95
        96    public RadeoxWikiRenderEngine(InitialRenderContext context, Blog blog) {
                 /*
        P/P       *  Method: void net.sourceforge.pebble.decorator.RadeoxWikiRenderEngine(InitialRenderContext, Blog)
                  *
                  *  Preconditions:
                  *    context != null
                  *
                  *  Postconditions:
                  *    this.blog == blog
                  *    init'ed(this.blog)
                  */
        97      super(context);
        98      context.setRenderEngine(this);
        99      this.blog = blog;
       100    }
       101
               /*
        P/P     *  Method: bool exists(String)
                *
                *  Preconditions:
                *    this.blog != null
                *    this.blog.staticPageIndex != null
                *    this.blog.staticPageIndex.index != null
                *
                *  Postconditions:
                *    init'ed(return_value)
                */
       102    public boolean exists(String name) {
       103      return blog.getStaticPageIndex().contains(name);
       104    }
       105
               /*
        P/P     *  Method: bool showCreate()
                *
                *  Postconditions:
                *    return_value == 1
                */
       106    public boolean showCreate() {
       107      return true;
       108    }
       109
               /*
        P/P     *  Method: void appendLink(StringBuffer, String, String)
                *
                *  Preconditions:
                *    buffer != null
                *    this.blog != null
                *    (soft) net/sourceforge/pebble/domain/BlogManager.instance != null
                *    (soft) init'ed(net/sourceforge/pebble/domain/BlogManager.instance.multiBlog)
                *    (soft) init'ed(this.blog.id)
                */
       110    public void appendLink(StringBuffer buffer, String name, String view) {
       111      appendLink(buffer, name, view, null);
       112    }
       113
               /*
        P/P     *  Method: void appendLink(StringBuffer, String, String, String)
                *
                *  Preconditions:
                *    buffer != null
                *    this.blog != null
                *    (soft) net/sourceforge/pebble/domain/BlogManager.instance != null
                *    (soft) init'ed(net/sourceforge/pebble/domain/BlogManager.instance.multiBlog)
                *    (soft) init'ed(this.blog.id)
                *
                *  Test Vectors:
                *    anchor: Addr_Set{null}, Inverse{null}
                *    java.lang.String:length(...)@118: {0}, {1..232-1}
                */
       114    public void appendLink(StringBuffer buffer, String name, String view, String anchor) {
       115      buffer.append("<a href=\"");
       116      StringBuffer url = new StringBuffer();
       117      url.append(blog.getUrl()).append("pages/").append(name).append(".html");
       118      if (anchor != null && anchor.trim().length() > 0) {
       119        url.append("#");
       120        url.append(anchor);
       121      }
       122      buffer.append(UrlRewriter.doRewrite(url.toString()));
       123      buffer.append("\">");
       124      buffer.append(view);
       125      buffer.append("</a>");
       126    }
       127
               /*
        P/P     *  Method: void appendCreateLink(StringBuffer, String, String)
                *
                *  Preconditions:
                *    buffer != null
                */
       128    public void appendCreateLink(StringBuffer buffer, String name, String view) {
       129      buffer.append("<a href=\"addStaticPage.secureaction?name=");
       130      buffer.append(name);
       131      buffer.append("\">");
       132      buffer.append(view);
       133      buffer.append("</a><sup>?</sup>");
       134    }
       135  }

SofCheck Inspector Build Version : 2.22510

radeoxdecorator.java | 2010-Jun-25 19:40:32
radeoxdecorator.class | 2010-Jul-19 20:23:40
radeoxwikirenderengine.class | 2010-Jul-19 20:23:40