photodecorator.java

### File Source: photodecorator.java

         1  /*
         2   * Copyright (c) 2003-2006, Simon Brown
         3   * All rights reserved.
         4   *
         5   * Redistribution and use in source and binary forms, with or without
         6   * modification, are permitted provided that the following conditions are met:
         7   *
         8   *   - Redistributions of source code must retain the above copyright
         9   *     notice, this list of conditions and the following disclaimer.
        10   *
        11   *   - Redistributions in binary form must reproduce the above copyright
        12   *     notice, this list of conditions and the following disclaimer in
        13   *     the documentation and/or other materials provided with the
        14   *     distribution.
        15   *
        16   *   - Neither the name of Pebble nor the names of its contributors may
        17   *     be used to endorse or promote products derived from this software
        18   *     without specific prior written permission.
        19   *
        20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
        21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
        24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        30   * POSSIBILITY OF SUCH DAMAGE.
        31   */
        32  package net.sourceforge.pebble.decorator;
        33
        34  import net.sourceforge.pebble.api.decorator.ContentDecoratorContext;
        35  import net.sourceforge.pebble.domain.BlogEntry;
        36  import net.sourceforge.pebble.domain.StaticPage;
        37  import net.sourceforge.pebble.util.StringUtils;
        38
        39  import java.util.regex.Pattern;
        40  import java.util.regex.Matcher;
        41  import java.io.BufferedReader;
        42  import java.io.StringReader;
        43  import java.io.IOException;
        44
        45  import org.apache.commons.logging.Log;
        46  import org.apache.commons.logging.LogFactory;
        47
        48  /**
        49   * Takes a simple description of photos and generates boilerplate markup.
        50   *
        51   * @author Simon Brown
        52   */
             /*
        P/P   *  Method: void net.sourceforge.pebble.decorator.PhotoDecorator()
              */
        53  public class PhotoDecorator extends ContentDecoratorSupport {
        54
               /*
        P/P     *  Method: net.sourceforge.pebble.decorator.PhotoDecorator__static_init
                *
                *  Postconditions:
                *    init'ed(log)
                */
        55    private static final Log log = LogFactory.getLog(PhotoDecorator.class);
        56
        57    private static final String PHOTOS_START_TAG = "<photos>";
        58    private static final String PHOTOS_END_TAG = "</photos>";
        59
        60    /**
        61     * Decorates the specified blog entry.
        62     *
        63     * @param context   the context in which the decoration is running
        64     * @param blogEntry the blog entry to be decorated
        65     */
        66    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)
                  *
                  *  Postconditions:
                  *    blogEntry.body != null
                  *    init'ed(blogEntry.excerpt)
                  */
        67      blogEntry.setBody(markup(blogEntry.getBody()));
        68      blogEntry.setExcerpt(markup(blogEntry.getExcerpt()));
        69    }
        70
        71    /**
        72     * Decorates the specified static page.
        73     *
        74     * @param context    the context in which the decoration is running
        75     * @param staticPage the static page to be decorated
        76     */
        77    public void decorate(ContentDecoratorContext context, StaticPage staticPage) {
                 /*
        P/P       *  Method: void decorate(ContentDecoratorContext, StaticPage)
                  *
                  *  Preconditions:
                  *    staticPage != null
                  *    init'ed(staticPage.body)
                  *    staticPage.propertyChangeSupport != null
                  *
                  *  Postconditions:
                  *    staticPage.body != null
                  */
        78      staticPage.setBody(markup(staticPage.getBody()));
        79    }
        80
        81    private String markup(String content) {
        82      // is there work to do?
                 /*
        P/P       *  Method: String markup(String)
                  *
                  *  Presumptions:
                  *    java.lang.String:length(...)@102 - java.lang.String:length(...)@102 in -232+1..231
                  *    java.util.regex.Pattern:compile(...)@91 != null
                  *    java.util.regex.Pattern:matcher(...)@93 != null
                  *    org.apache.commons.logging.LogFactory:getLog(...)@55 != null
                  *    tokens.length@119 >= 1
                  *
                  *  Postconditions:
                  *    return_value != null
                  *
                  *  Test Vectors:
                  *    content: Addr_Set{null}, Inverse{null}
                  *    java.lang.String:equals(...)@113: {0}, {1}
                  *    java.lang.String:length(...)@83: {1..232-1}, {0}
                  *    java.util.regex.Matcher:find(...)@96: {1}, {0}
                  *    tokens.length@119: {1, 3..+Inf}, {2}
                  */
        83      if (content == null || content.length() == 0) {
        84        return "";
        85      }
        86
        87      // this pattern says "take the shortest match you can find where there are
        88      // one or more characters between escape tags"
        89      //  - the match is case insensitive and DOTALL means that newlines are
        90      //  - considered as a character match
        91      Pattern p = Pattern.compile(PHOTOS_START_TAG + ".+?" + PHOTOS_END_TAG,
        92          Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        93      Matcher m = p.matcher(content);
        94
        95      // while there are blocks to be escaped
        96      while (m.find()) {
        97        int start = m.start();
        98        int end = m.end();
        99
       100        // grab the text, strip off the "photos" tags and transform it
       101        String textToMarkup = content.substring(start, end);
       102        textToMarkup = textToMarkup.substring(PHOTOS_START_TAG.length(), textToMarkup.length() - PHOTOS_END_TAG.length());
       103
       104        StringBuffer buf = new StringBuffer();
       105        buf.append("<div class=\"photos\">\n");
       106
       107        try {
       108          BufferedReader reader = new BufferedReader(new StringReader(textToMarkup));
       109          String line = reader.readLine();
       110          buf.append("<div>\n");
       111          boolean foundPhotos = false;
       112          while (line != null) {
       113            if (line.trim().equals("")) {
       114              if (foundPhotos) {
       115                buf.append("</div>\n");
       116                buf.append("<div>\n");
       117              }
       118            } else {
       119              String[] tokens = line.split("\\|");
       120              buf.append("<img src=\"");
       121              buf.append(tokens[0]);
       122              buf.append("\" class=\"photo\" alt=\"");
       123              if (tokens.length == 2) {
       124                buf.append(tokens[1]);
       125              }
       126              buf.append("\" />\n");
       127              foundPhotos = true;
       128            }
       129
       130            line = reader.readLine();
       131          }
       132          buf.append("</div>\n");
       133        } catch (IOException ioe) {
       134          log.warn(ioe);
       135        }
       136
       137        buf.append("</div>");
       138
       139        // now add it back into the original text
       140        content = content.substring(0, start) + buf.toString() + content.substring(end, content.length());
       141        m = p.matcher(content);
       142      }
       143
       144      return content;
       145    }
       146
       147  }

SofCheck Inspector Build Version : 2.22510

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