File Source: blogentryhandler.java

     1  package net.sourceforge.pebble.dao.file;
     2  
     3  import net.sourceforge.pebble.domain.*;
     4  import org.apache.commons.logging.Log;
     5  import org.apache.commons.logging.LogFactory;
     6  import org.xml.sax.Attributes;
     7  import org.xml.sax.SAXException;
     8  import org.xml.sax.SAXParseException;
     9  import org.xml.sax.helpers.DefaultHandler;
    10  
    11  import java.text.ParseException;
    12  import java.text.SimpleDateFormat;
    13  import java.util.Date;
    14  import java.util.Locale;
    15  
    16  public class BlogEntryHandler extends DefaultHandler {
    17  
    18    /** the log used by this class */
           /* 
    P/P     *  Method: net.sourceforge.pebble.dao.file.BlogEntryHandler__static_init
            * 
            *  Postconditions:
            *    init'ed(log)
            */
    19    private static Log log = LogFactory.getLog(BlogEntryHandler.class);
    20  
    21    private static final int NOT_DEFINED = -1;
    22    private static final int TITLE = 0;
    23    private static final int EXCERPT = 1;
    24    private static final int BODY = 2;
    25    private static final int DATE = 3;
    26    private static final int AUTHOR = 4;
    27    private static final int ORIGINAL_PERMALINK = 5;
    28    private static final int STATIC_NAME = 6;
    29    private static final int CATEGORY = 7;
    30    private static final int COMMENTS_ENABLED = 8;
    31    private static final int TRACKBACKS_ENABLED = 9;
    32    private static final int EMAIL = 10;
    33    private static final int WEBSITE = 11;
    34    private static final int BLOG_NAME = 12;
    35    private static final int URL = 13;
    36    private static final int PARENT = 14;
    37    private static final int IP_ADDRESS = 15;
    38    private static final int SIZE = 16;
    39    private static final int TYPE = 17;
    40    private static final int STATE = 18;
    41    private static final int TAGS = 19;
    42    private static final int SUBTITLE = 20;
    43    private static final int TIME_ZONE = 21;
    44    private static final int AUTHENTICATED = 22;
    45  
    46    private static final int IN_BLOG_ENTRY = 100;
    47    private static final int IN_COMMENT = 101;
    48    private static final int IN_TRACKBACK = 102;
    49    private static final int IN_ATTACHMENT = 103;
    50  
    51    private BlogEntry blogEntry;
    52    private int groupStatus = IN_BLOG_ENTRY;
    53    private int elementStatus = NOT_DEFINED;
    54    private SimpleDateFormat dateTimeFormats[];
    55  
    56    private StringBuffer elementContent;
    57  
    58    private String attachmentUrl;
    59    private String attachmentSize;
    60    private String attachmentType;
    61  
    62    private String commentTitle;
    63    private String commentBody;
    64    private String commentAuthor;
    65    private String commentWebsite;
    66    private String commentIpAddress;
    67    private String commentEmail;
    68    private Date commentDate;
    69    private long commentParent = -1;
    70    private State commentState = State.APPROVED;
    71    private boolean commentAuthenticated = false;
    72  
    73    private String trackBackTitle;
    74    private String trackBackExcerpt;
    75    private String trackBackBlogName;
    76    private String trackBackUrl;
    77    private String trackBackIpAddress;
    78    private Date trackBackDate;
    79    private State trackBackState = State.APPROVED;
    80  
           /* 
    P/P     *  Method: void net.sourceforge.pebble.dao.file.BlogEntryHandler(BlogEntry)
            * 
            *  Preconditions:
            *    blogEntry != null
            * 
            *  Presumptions:
            *    init'ed(java.util.Locale.ENGLISH)
            * 
            *  Preconditions:
            *    blogEntry.blog != null
            * 
            *  Postconditions:
            *    this.blogEntry == blogEntry
            *    this.blogEntry != null
            *    this.commentAuthenticated == 0
            *    this.commentParent == -1
            *    this.elementStatus == -1
            *    this.commentState == &net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#1)
            *    this.trackBackState == &net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#1)
            *    this.dateTimeFormats == &new SimpleDateFormat[](BlogEntryHandler#1)
            *    this.groupStatus == 100
            *    new SimpleDateFormat(BlogEntryHandler#2) num objects == 1
            *    ...
            */
    81    public BlogEntryHandler(BlogEntry blogEntry) {
    82      this.blogEntry = blogEntry;
    83  
    84      // create all date/time formats, for backwards compatibility
    85      SimpleDateFormat format;
    86      dateTimeFormats = new SimpleDateFormat[6];
    87  
    88      format = new SimpleDateFormat(FileBlogEntryDAO.NEW_PERSISTENT_DATETIME_FORMAT, Locale.ENGLISH);
    89      format.setTimeZone(blogEntry.getBlog().getTimeZone());
    90      dateTimeFormats[0] = format;
    91  
    92      format = new SimpleDateFormat(FileBlogEntryDAO.NEW_PERSISTENT_DATETIME_FORMAT, blogEntry.getBlog().getLocale());
    93      format.setTimeZone(blogEntry.getBlog().getTimeZone());
    94      dateTimeFormats[1] = format;
    95  
    96      format = new SimpleDateFormat(FileBlogEntryDAO.NEW_PERSISTENT_DATETIME_FORMAT);
    97      format.setTimeZone(blogEntry.getBlog().getTimeZone());
    98      dateTimeFormats[2] = format;
    99  
   100      format = new SimpleDateFormat(FileBlogEntryDAO.OLD_PERSISTENT_DATETIME_FORMAT, Locale.ENGLISH);
   101      format.setTimeZone(blogEntry.getBlog().getTimeZone());
   102      dateTimeFormats[3] = format;
   103  
   104      format = new SimpleDateFormat(FileBlogEntryDAO.OLD_PERSISTENT_DATETIME_FORMAT, blogEntry.getBlog().getLocale());
   105      format.setTimeZone(blogEntry.getBlog().getTimeZone());
   106      dateTimeFormats[4] = format;
   107  
   108      format = new SimpleDateFormat(FileBlogEntryDAO.OLD_PERSISTENT_DATETIME_FORMAT);
   109      format.setTimeZone(blogEntry.getBlog().getTimeZone());
   110      dateTimeFormats[5] = format;
   111    }
   112  
   113    public void startElement(String uri, String name, String qName, Attributes attributes) throws SAXException {
   114      //log.info("startElement : " + name);
             /* 
    P/P       *  Method: void startElement(String, String, String, Attributes)
              * 
              *  Preconditions:
              *    name != null
              * 
              *  Postconditions:
              *    this.elementContent == &new StringBuffer(startElement#1)
              *    this.elementStatus in -1..22
              *    possibly_updated(this.groupStatus)
              *    new StringBuffer(startElement#1) num objects == 1
              * 
              *  Test Vectors:
              *    java.lang.String:equals(...)@116: {0}, {1}
              *    java.lang.String:equals(...)@118: {0}, {1}
              *    java.lang.String:equals(...)@120: {0}, {1}
              *    java.lang.String:equals(...)@122: {0}, {1}
              *    java.lang.String:equals(...)@124: {0}, {1}
              *    java.lang.String:equals(...)@126: {0}, {1}
              *    java.lang.String:equals(...)@128: {0}, {1}
              *    java.lang.String:equals(...)@130: {0}, {1}
              *    java.lang.String:equals(...)@132: {0}, {1}
              *    java.lang.String:equals(...)@134: {0}, {1}
              *    ...
              */
   115      elementContent = new StringBuffer();
   116      if (name.equals("title")) {
   117        elementStatus = TITLE;
   118      } else if (name.equals("subtitle")) {
   119        elementStatus = SUBTITLE;
   120      } else if (name.equals("excerpt")) {
   121        elementStatus = EXCERPT;
   122      } else if (name.equals("body")) {
   123        elementStatus = BODY;
   124      } else if (name.equals("date")) {
   125        elementStatus = DATE;
   126      } else if (name.equals("timeZone")) {
   127        elementStatus = TIME_ZONE;
   128      } else if (name.equals("author")) {
   129        elementStatus = AUTHOR;
   130      } else if (name.equals("originalPermalink")) {
   131        elementStatus = ORIGINAL_PERMALINK;
   132      } else if (name.equals("staticName")) {
   133        elementStatus = STATIC_NAME;
   134      } else if (name.equals("category")) {
   135        elementStatus = CATEGORY;
   136      } else if (name.equals("tags")) {
   137        elementStatus = TAGS;
   138      } else if (name.equals("commentsEnabled")) {
   139        elementStatus = COMMENTS_ENABLED;
   140      } else if (name.equals("trackBacksEnabled")) {
   141        elementStatus = TRACKBACKS_ENABLED;
   142      } else if (name.equals("email")) {
   143        elementStatus = EMAIL;
   144      } else if (name.equals("website")) {
   145        elementStatus = WEBSITE;
   146      } else if (name.equals("ipAddress")) {
   147        elementStatus = IP_ADDRESS;
   148      } else if (name.equals("authenticated")) {
   149        elementStatus = AUTHENTICATED;
   150      } else if (name.equals("blogName")) {
   151        elementStatus = BLOG_NAME;
   152      } else if (name.equals("url")) {
   153        elementStatus = URL;
   154      } else if (name.equals("parent")) {
   155        elementStatus = PARENT;
   156      } else if (name.equals("state")) {
   157        elementStatus = STATE;
   158      } else if (name.equals("size")) {
   159        elementStatus = SIZE;
   160      } else if (name.equals("type")) {
   161        elementStatus = TYPE;
   162      } else if (name.equals("attachment")) {
   163        groupStatus = IN_ATTACHMENT;
   164        elementStatus = NOT_DEFINED;
   165      } else if (name.equals("comment")) {
   166        groupStatus = IN_COMMENT;
   167        elementStatus = NOT_DEFINED;
   168      } else if (name.equals("trackback")) {
   169        groupStatus = IN_TRACKBACK;
   170        elementStatus = NOT_DEFINED;
   171      } else {
   172        elementStatus = NOT_DEFINED;
   173      }
   174    }
   175  
   176    public void endElement(String uri, String name, String qName) throws SAXException {
   177      //log.info("endElement : " + name);
             /* 
    P/P       *  Method: void endElement(String, String, String)
              * 
              *  Preconditions:
              *    init'ed(this.groupStatus)
              *    (soft) log != null
              *    (soft) name != null
              *    (soft) init'ed(net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#4).name)
              *    (soft) init'ed(this.attachmentSize)
              *    (soft) init'ed(this.attachmentType)
              *    (soft) init'ed(this.attachmentUrl)
              *    (soft) init'ed(this.blogEntry.attachment)
              *    (soft) init'ed(this.blogEntry.commentsEnabled)
              *    (soft) init'ed(this.blogEntry.date)
              *    ...
              * 
              *  Presumptions:
              *    java.lang.Boolean:valueOf(...)@218 != null
              *    java.lang.Boolean:valueOf(...)@221 != null
              *    java.util.Calendar:getTime(...)@187 != null
              * 
              *  Postconditions:
              *    init'ed(this.attachmentSize)
              *    (soft) init'ed(this.attachmentType)
              *    init'ed(this.attachmentUrl)
              *    (soft) init'ed(this.blogEntry.attachment)
              *    (soft) init'ed(this.blogEntry.commentsEnabled)
              *    (soft) init'ed(this.blogEntry.date)
              *    init'ed(this.blogEntry.excerpt)
              *    possibly_updated(this.blogEntry.id)
              *    possibly_updated(this.blogEntry.permalink)
              *    possibly_updated(this.blogEntry.timeZoneId)
              *    ...
              * 
              *  Preconditions:
              *    (soft) init'ed(this.blogEntry.body)
              *    (soft) init'ed(this.blogEntry.originalPermalink)
              *    (soft) init'ed(this.blogEntry.subtitle)
              *    (soft) init'ed(this.blogEntry.tags)
              *    (soft) this.blogEntry.blog != null
              *    (soft) init'ed(this.blogEntry.blog.rootCategory)
              * 
              *  Test Vectors:
              *    this.commentParent: {-1}, {-263..-2, 0..264-1}
              *    this.elementStatus: {0}, {1}, {3}, {12}, {13}, {15}, {18}, {2}, {4}, {10}, {11}, {14}, {22}, {16}, {17}, {5}, {7}, {8}, {9}, {19}, {20}, {21}
              *    this.groupStatus: {-231..99, 104..232-1}, {100}, {103}, {101}, {102}
              *    java.lang.String:equals(...)@199: {0}, {1}
              *    java.lang.String:equals(...)@224: {0}, {1}
              *    java.lang.String:equals(...)@247: {0}, {1}
              *    java.lang.String:equals(...)@300: {0}, {1}
              * 
              *  Postconditions:
              *    possibly_updated(this.blogEntry.author)
              *    (soft) init'ed(this.blogEntry.body)
              *    init'ed(this.blogEntry.originalPermalink)
              *    possibly_updated(this.blogEntry.state)
              *    (soft) init'ed(this.blogEntry.subtitle)
              *    init'ed(this.blogEntry.tags)
              *    possibly_updated(this.blogEntry.tagsAsCommaSeparated)
              *    possibly_updated(this.blogEntry.tagsAsList)
              *    init'ed(new ArrayList(Category#1) num objects)
              *    init'ed(new ArrayList(Category#2) num objects)
              *    ...
              */
   178      if (groupStatus == IN_BLOG_ENTRY) {
   179        switch (elementStatus) {
   180          case TITLE :
   181            blogEntry.setTitle(elementContent.toString());
   182            break;
   183          case SUBTITLE :
   184            blogEntry.setSubtitle(elementContent.toString());
   185            break;
   186          case EXCERPT :
   187            blogEntry.setExcerpt(elementContent.toString());
   188            break;
   189          case BODY :
   190            blogEntry.setBody(elementContent.toString());
   191            break;
   192          case DATE :
   193            blogEntry.setDate(getDate(elementContent.toString()));
   194            break;
   195          case TIME_ZONE :
   196            blogEntry.setTimeZoneId(elementContent.toString());
   197            break;
   198          case STATE :
   199            if (elementContent.toString().equals(State.UNPUBLISHED.getName())) {
   200              blogEntry.setPublished(false);
   201            } else {
   202              blogEntry.setPublished(true);
   203            }
   204            break;
   205          case AUTHOR :
   206            blogEntry.setAuthor(elementContent.toString());
   207            break;
   208          case ORIGINAL_PERMALINK :
   209            blogEntry.setOriginalPermalink(elementContent.toString());
   210            break;
   211          case CATEGORY :
   212            blogEntry.addCategory(blogEntry.getBlog().getCategory(elementContent.toString()));
   213            break;
   214          case TAGS :
   215            blogEntry.setTags(elementContent.toString());
   216            break;
   217          case COMMENTS_ENABLED :
   218            blogEntry.setCommentsEnabled(Boolean.valueOf(elementContent.toString()).booleanValue());
   219            break;
   220          case TRACKBACKS_ENABLED :
   221            blogEntry.setTrackBacksEnabled(Boolean.valueOf(elementContent.toString()).booleanValue());
   222            break;
   223        }
   224      } else if (groupStatus == IN_ATTACHMENT && name.equals("attachment")) {
   225        Attachment attachment = new Attachment();
   226        attachment.setUrl(attachmentUrl);
   227        attachment.setSize(Long.parseLong(attachmentSize));
   228        attachment.setType(attachmentType);
   229        blogEntry.setAttachment(attachment);
   230        groupStatus = IN_BLOG_ENTRY;
   231  
   232        attachmentUrl = null;
   233        attachmentSize = null;
   234        attachmentType = null;
   235      } else if (groupStatus == IN_ATTACHMENT) {
   236        switch (elementStatus) {
   237          case URL :
   238            attachmentUrl = elementContent.toString();
   239            break;
   240          case SIZE :
   241            attachmentSize = elementContent.toString();
   242            break;
   243          case TYPE :
   244            attachmentType = elementContent.toString();
   245            break;
   246        }
   247      } else if (groupStatus == IN_COMMENT && name.equals("comment")) {
   248        Comment comment = blogEntry.createComment(commentTitle, commentBody, commentAuthor, commentEmail, commentWebsite, commentIpAddress, commentDate, commentState);
   249        if (commentParent != -1) {
   250          comment.setParent(blogEntry.getComment(commentParent));
   251        }
   252        comment.setAuthenticated(commentAuthenticated);
   253        blogEntry.addComment(comment);
   254        groupStatus = IN_BLOG_ENTRY;
   255  
   256        // and blank all the comment variables
   257        commentTitle = null;
   258        commentBody = null;
   259        commentAuthor = null;
   260        commentWebsite = null;
   261        commentIpAddress = null;
   262        commentEmail = null;
   263        commentDate = null;
   264        commentParent = -1;
   265        commentState = State.APPROVED;
   266        commentAuthenticated = false;
   267      } else if (groupStatus == IN_COMMENT) {
   268        switch (elementStatus) {
   269          case TITLE :
   270            commentTitle = elementContent.toString();
   271            break;
   272          case BODY :
   273            commentBody = elementContent.toString();
   274            break;
   275          case DATE :
   276            commentDate = getDate(elementContent.toString());
   277            break;
   278          case AUTHOR :
   279            commentAuthor = elementContent.toString();
   280            break;
   281          case EMAIL :
   282            commentEmail = elementContent.toString();
   283            break;
   284          case WEBSITE :
   285            commentWebsite = elementContent.toString();
   286            break;
   287          case IP_ADDRESS :
   288            commentIpAddress = elementContent.toString();
   289            break;
   290          case PARENT :
   291            commentParent = Long.parseLong(elementContent.toString());
   292            break;
   293          case STATE :
   294            commentState = State.getState(elementContent.toString());
   295            break;
   296          case AUTHENTICATED :
   297            commentAuthenticated = Boolean.parseBoolean(elementContent.toString());
   298            break;
   299        }
   300      } else if (groupStatus == IN_TRACKBACK && name.equals("trackback")) {
   301        TrackBack trackBack = blogEntry.createTrackBack(trackBackTitle, trackBackExcerpt, trackBackUrl, trackBackBlogName, trackBackIpAddress, trackBackDate, trackBackState);
   302        blogEntry.addTrackBack(trackBack);
   303        groupStatus = IN_BLOG_ENTRY;
   304  
   305        // and blank all the TrackBack variables
   306        trackBackTitle = null;
   307        trackBackExcerpt = null;
   308        trackBackBlogName = null;
   309        trackBackUrl = null;
   310        trackBackIpAddress = null;
   311        trackBackDate = null;
   312        trackBackState = State.APPROVED;
   313      } else if (groupStatus == IN_TRACKBACK) {
   314        switch (elementStatus) {
   315          case TITLE :
   316            trackBackTitle = elementContent.toString();
   317            break;
   318          case EXCERPT :
   319            trackBackExcerpt = elementContent.toString();
   320            break;
   321          case DATE :
   322            trackBackDate = getDate(elementContent.toString());
   323            break;
   324          case BLOG_NAME :
   325            trackBackBlogName = elementContent.toString();
   326            break;
   327          case URL :
   328            trackBackUrl = elementContent.toString();
   329            break;
   330          case IP_ADDRESS :
   331            trackBackIpAddress = elementContent.toString();
   332            break;
   333          case STATE :
   334            trackBackState = State.getState(elementContent.toString());
   335            break;
   336        }
   337      }
   338  
   339      elementStatus = NOT_DEFINED;
   340    }
   341  
   342    public void characters(char ch[], int start, int length) throws SAXException {
             /* 
    P/P       *  Method: void characters(char[], int, int)
              * 
              *  Preconditions:
              *    this.elementContent != null
              */
   343      elementContent.append(new String(ch, start, length));
   344      //log.info("characters : " + s);
   345    }
   346  
   347    public void warning(SAXParseException e) throws SAXException {
             /* 
    P/P       *  Method: void warning(SAXParseException)
              * 
              *  Preconditions:
              *    log != null
              */
   348      log.warn("Exception encountered", e);
   349    }
   350  
   351    public void error(SAXParseException e) throws SAXException {
             /* 
    P/P       *  Method: void error(SAXParseException)
              * 
              *  Preconditions:
              *    log != null
              */
   352      log.error("Exception encountered", e);
   353    }
   354  
   355    public void fatalError(SAXParseException e) throws SAXException {
             /* 
    P/P       *  Method: void fatalError(SAXParseException)
              * 
              *  Preconditions:
              *    log != null
              */
   356      log.fatal("Exception encountered", e);
   357    }
   358  
   359    private Date getDate(String s) {
             /* 
    P/P       *  Method: Date getDate(String)
              * 
              *  Preconditions:
              *    this.dateTimeFormats != null
              *    (soft) log != null
              *    (soft) this.dateTimeFormats.length <= 232-1
              *    (soft) this.dateTimeFormats[...] != null
              * 
              *  Postconditions:
              *    init'ed(return_value)
              */
   360      for (int i = 0; i < dateTimeFormats.length; i++) {
   361        try {
   362          return dateTimeFormats[i].parse(s);
   363        } catch (ParseException pe) {
   364        }
   365      }
   366  
   367      log.error("Could not parse date of " + s);
   368      return null;
   369    }
   370  
   371  }








SofCheck Inspector Build Version : 2.22510
blogentryhandler.java 2010-Jun-25 19:40:32
blogentryhandler.class 2010-Jul-19 20:23:40