//# 16 errors, 997 messages
//#
/*
    //#categoryindex.java:1:1: class: net.sourceforge.pebble.index.CategoryIndex
 * Copyright (c) 2003-2006, Simon Brown
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *
 *   - Neither the name of Pebble nor the names of its contributors may
 *     be used to endorse or promote products derived from this software
 *     without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package net.sourceforge.pebble.index;

import net.sourceforge.pebble.domain.Blog;
import net.sourceforge.pebble.domain.BlogEntry;
import net.sourceforge.pebble.domain.Category;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Collection;
import java.io.*;

/**
 * Represents the category index for a blog.
 *
 * @author    Simon Brown
 */
public class CategoryIndex {

  private static final Log log = LogFactory.getLog(CategoryIndex.class);
    //#categoryindex.java:52: method: net.sourceforge.pebble.index.CategoryIndex.net.sourceforge.pebble.index.CategoryIndex__static_init
    //#categoryindex.java:52: Warning: method not available
    //#    -- call on Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: net.sourceforge.pebble.index.CategoryIndex__static_init
    //#    unanalyzed callee: Log org.apache.commons.logging.LogFactory:getLog(Class)
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): __Descendant_Table[net/sourceforge/pebble/index/CategoryIndex]
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.clear()V
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.getRecentBlogEntries(Lnet/sourceforge/pebble/domain/Category;)Ljava/util/List;
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.index(Ljava/util/Collection;)V
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.index(Lnet/sourceforge/pebble/domain/BlogEntry;)V
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.readIndex()V
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.unindex(Lnet/sourceforge/pebble/domain/BlogEntry;)V
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.writeIndex()V
    //#output(net.sourceforge.pebble.index.CategoryIndex__static_init): log
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): __Descendant_Table[net/sourceforge/pebble/index/CategoryIndex] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.clear()V == &clear
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.getRecentBlogEntries(Lnet/sourceforge/pebble/domain/Category;)Ljava/util/List; == &getRecentBlogEntries
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.index(Ljava/util/Collection;)V == &index
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.index(Lnet/sourceforge/pebble/domain/BlogEntry;)V == &index
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.readIndex()V == &readIndex
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.unindex(Lnet/sourceforge/pebble/domain/BlogEntry;)V == &unindex
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): __Dispatch_Table.writeIndex()V == &writeIndex
    //#post(net.sourceforge.pebble.index.CategoryIndex__static_init): init'ed(log)
    //#categoryindex.java:52: end of method: net.sourceforge.pebble.index.CategoryIndex.net.sourceforge.pebble.index.CategoryIndex__static_init

  private Blog blog;

  public CategoryIndex(Blog blog) {
    //#categoryindex.java:56: method: void net.sourceforge.pebble.index.CategoryIndex.net.sourceforge.pebble.index.CategoryIndex(Blog)
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): blog
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): blog.__Tag
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): blog.rootCategory
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): blog.rootCategory...__Tag
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): blog.rootCategory.__Tag
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): log
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCategory(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/Category;
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Descendant_Table[net/sourceforge/pebble/domain/Category]
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addBlogEntry(Ljava/lang/String;)V
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addSubCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getParent()Lnet/sourceforge/pebble/domain/Category;
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getSubCategories()Ljava/util/List;
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.isRootCategory()Z
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setId(Ljava/lang/String;)V
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setParent(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[net/sourceforge/pebble/domain/CategoryBuilder]
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[others]
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.addCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategory(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/Category;
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getRootCategory()Lnet/sourceforge/pebble/domain/Category;
    //#input(void net.sourceforge.pebble.index.CategoryIndex(Blog)): this
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new ArrayList(Category#1) num objects
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new ArrayList(Category#2) num objects
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new ArrayList(Category#3) num objects
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*) num objects
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).__Tag
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).blog
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).blogEntries
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).id
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).name
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).parent
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).subCategories
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).tags
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*).tagsAsList
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*) num objects
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).__Tag
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).blog
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).blogEntries
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).id
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).name
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).parent
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).subCategories
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).tags
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*).tagsAsList
    //#output(void net.sourceforge.pebble.index.CategoryIndex(Blog)): this.blog
    //#new obj(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new ArrayList(Category#1)
    //#new obj(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new ArrayList(Category#2)
    //#new obj(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new ArrayList(Category#3)
    //#new obj(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#2*)
    //#new obj(void net.sourceforge.pebble.index.CategoryIndex(Blog)): new Category(getCategory#3*)
    //#pre[1] (void net.sourceforge.pebble.index.CategoryIndex(Blog)): blog != null
    //#pre[2] (void net.sourceforge.pebble.index.CategoryIndex(Blog)): (soft) blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[3] (void net.sourceforge.pebble.index.CategoryIndex(Blog)): (soft) init'ed(blog.rootCategory)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): this.blog == blog
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): this.blog != null
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new ArrayList(Category#1) num objects)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new ArrayList(Category#2) num objects)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new ArrayList(Category#3) num objects)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*) num objects)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).__Tag)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).blog)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).blogEntries)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).id)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).name)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).parent)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).subCategories)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).tags)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#2*).tagsAsList)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*) num objects)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).__Tag)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).blog)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).blogEntries)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).id)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).name)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).parent)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).subCategories)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).tags)
    //#post(void net.sourceforge.pebble.index.CategoryIndex(Blog)): init'ed(new Category(getCategory#3*).tagsAsList)
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:addBlogEntry
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getIndexesDirectory
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.io.File
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:getId
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.io.File:exists
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.io.FileReader
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.io.BufferedReader
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.io.BufferedReader:readLine
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:getCategory
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.io.BufferedReader:close
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:getSubCategories
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:net.sourceforge.pebble.util.I18n:getMessage
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:net.sourceforge.pebble.domain.Category
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:addCategory
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:setBlog
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:isRootCategory
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:addSubCategory
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void net.sourceforge.pebble.index.CategoryIndex(Blog)): Effects-of-calling:java.util.Collections:unmodifiableList
    this.blog = blog;

//    File indexes = new File(blog.getIndexesDirectory());
//    if (!indexes.exists()) {
//      indexes.mkdir();
//    }
    readIndex();
  }
    //#categoryindex.java:64: end of method: void net.sourceforge.pebble.index.CategoryIndex.net.sourceforge.pebble.index.CategoryIndex(Blog)

  /**
   * Clears the index.
   */
  public void clear() {
    for (Category category : blog.getCategories()) {
    //#categoryindex.java:70: method: void net.sourceforge.pebble.index.CategoryIndex.clear()
    //#input(void clear()): log
    //#input(void clear()): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void clear()): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void clear()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Descendant_Table[net/sourceforge/pebble/domain/Category]
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Descendant_Table[others]
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addSubCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getBlogEntries()Ljava/util/List;
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getSubCategories()Ljava/util/List;
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.isRootCategory()Z
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.removeAllBlogEntries()V
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setId(Ljava/lang/String;)V
    //#input(void clear()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setParent(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void clear()): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[net/sourceforge/pebble/domain/CategoryBuilder]
    //#input(void clear()): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[others]
    //#input(void clear()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.addCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void clear()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void clear()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories(Lnet/sourceforge/pebble/domain/Category;)Ljava/util/List;
    //#input(void clear()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getRootCategory()Lnet/sourceforge/pebble/domain/Category;
    //#input(void clear()): this
    //#input(void clear()): this.blog
    //#input(void clear()): this.blog.__Tag
    //#input(void clear()): this.blog.rootCategory
    //#input(void clear()): this.blog.rootCategory.__Tag
    //#output(void clear()): new ArrayList(Category#1) num objects
    //#output(void clear()): new ArrayList(Category#2) num objects
    //#output(void clear()): new ArrayList(Category#3) num objects
    //#output(void clear()): new ArrayList(removeAllBlogEntries#1) num objects
    //#output(void clear()): new Category(getCategory#2) num objects
    //#output(void clear()): new Category(getCategory#2).__Tag
    //#output(void clear()): new Category(getCategory#2).blog
    //#output(void clear()): new Category(getCategory#2).blogEntries
    //#output(void clear()): new Category(getCategory#2).id
    //#output(void clear()): new Category(getCategory#2).name
    //#output(void clear()): new Category(getCategory#2).parent
    //#output(void clear()): new Category(getCategory#2).subCategories
    //#output(void clear()): new Category(getCategory#2).tags
    //#output(void clear()): new Category(getCategory#2).tagsAsList
    //#output(void clear()): new Category(getCategory#3) num objects
    //#output(void clear()): new Category(getCategory#3).__Tag
    //#output(void clear()): new Category(getCategory#3).blog
    //#output(void clear()): new Category(getCategory#3).blogEntries
    //#output(void clear()): new Category(getCategory#3).id
    //#output(void clear()): new Category(getCategory#3).name
    //#output(void clear()): new Category(getCategory#3).parent
    //#output(void clear()): new Category(getCategory#3).subCategories
    //#output(void clear()): new Category(getCategory#3).tags
    //#output(void clear()): new Category(getCategory#3).tagsAsList
    //#new obj(void clear()): new ArrayList(Category#1)
    //#new obj(void clear()): new ArrayList(Category#2)
    //#new obj(void clear()): new ArrayList(Category#3)
    //#new obj(void clear()): new ArrayList(removeAllBlogEntries#1)
    //#new obj(void clear()): new Category(getCategory#2)
    //#new obj(void clear()): new Category(getCategory#3)
    //#pre[2] (void clear()): this.blog != null
    //#pre[3] (void clear()): this.blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[4] (void clear()): init'ed(this.blog.rootCategory)
    //#presumption(void clear()): java.util.Iterator:next(...).__Tag@70 == net/sourceforge/pebble/domain/Category
    //#presumption(void clear()): java.util.Iterator:next(...)@70 != null
    //#post(void clear()): init'ed(new ArrayList(Category#1) num objects)
    //#post(void clear()): init'ed(new ArrayList(Category#2) num objects)
    //#post(void clear()): init'ed(new ArrayList(Category#3) num objects)
    //#post(void clear()): init'ed(new ArrayList(removeAllBlogEntries#1) num objects)
    //#post(void clear()): init'ed(new Category(getCategory#2) num objects)
    //#post(void clear()): init'ed(new Category(getCategory#2).__Tag)
    //#post(void clear()): possibly_updated(new Category(getCategory#2).blog)
    //#post(void clear()): init'ed(new Category(getCategory#2).blogEntries)
    //#post(void clear()): possibly_updated(new Category(getCategory#2).id)
    //#post(void clear()): init'ed(new Category(getCategory#2).name)
    //#post(void clear()): possibly_updated(new Category(getCategory#2).parent)
    //#post(void clear()): possibly_updated(new Category(getCategory#2).subCategories)
    //#post(void clear()): init'ed(new Category(getCategory#2).tags)
    //#post(void clear()): init'ed(new Category(getCategory#2).tagsAsList)
    //#post(void clear()): init'ed(new Category(getCategory#3) num objects)
    //#post(void clear()): init'ed(new Category(getCategory#3).__Tag)
    //#post(void clear()): possibly_updated(new Category(getCategory#3).blog)
    //#post(void clear()): init'ed(new Category(getCategory#3).blogEntries)
    //#post(void clear()): possibly_updated(new Category(getCategory#3).id)
    //#post(void clear()): init'ed(new Category(getCategory#3).name)
    //#post(void clear()): possibly_updated(new Category(getCategory#3).parent)
    //#post(void clear()): possibly_updated(new Category(getCategory#3).subCategories)
    //#post(void clear()): init'ed(new Category(getCategory#3).tags)
    //#post(void clear()): init'ed(new Category(getCategory#3).tagsAsList)
    //#unanalyzed(void clear()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void clear()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void clear()): Effects-of-calling:getCategories
    //#unanalyzed(void clear()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void clear()): Effects-of-calling:getBlogEntries
    //#unanalyzed(void clear()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getIndexesDirectory
    //#unanalyzed(void clear()): Effects-of-calling:java.io.File
    //#unanalyzed(void clear()): Effects-of-calling:java.io.FileWriter
    //#unanalyzed(void clear()): Effects-of-calling:java.io.BufferedWriter
    //#unanalyzed(void clear()): Effects-of-calling:getId
    //#unanalyzed(void clear()): Effects-of-calling:java.io.BufferedWriter:write
    //#unanalyzed(void clear()): Effects-of-calling:java.io.BufferedWriter:newLine
    //#unanalyzed(void clear()): Effects-of-calling:java.io.BufferedWriter:flush
    //#unanalyzed(void clear()): Effects-of-calling:java.io.BufferedWriter:close
    //#unanalyzed(void clear()): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(void clear()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void clear()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void clear()): Effects-of-calling:getSubCategories
    //#unanalyzed(void clear()): Effects-of-calling:getCategory
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void clear()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(void clear()): Effects-of-calling:net.sourceforge.pebble.util.I18n:getMessage
    //#unanalyzed(void clear()): Effects-of-calling:net.sourceforge.pebble.domain.Category
    //#unanalyzed(void clear()): Effects-of-calling:addCategory
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void clear()): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void clear()): Effects-of-calling:setBlog
    //#unanalyzed(void clear()): Effects-of-calling:isRootCategory
    //#unanalyzed(void clear()): Effects-of-calling:addSubCategory
    //#unanalyzed(void clear()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void clear()): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void clear()): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void clear()): Effects-of-calling:java.util.Collections:unmodifiableList
    //#test_vector(void clear()): java.util.Iterator:hasNext(...)@70: {1}, {0}
      category.removeAllBlogEntries();
    }

    writeIndex();
  }
    //#categoryindex.java:75: end of method: void net.sourceforge.pebble.index.CategoryIndex.clear()

  /**
   * Indexes one or more blog entries.
   *
   * @param blogEntries   a List of BlogEntry instances
   */
  public synchronized void index(Collection<BlogEntry> blogEntries) {
    for (BlogEntry blogEntry : blogEntries) {
    //#categoryindex.java:83: method: void net.sourceforge.pebble.index.CategoryIndex.index(Collection)
    //#input(void index(Collection)): blogEntries
    //#input(void index(Collection)): log
    //#input(void index(Collection)): net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#5).__Tag
    //#input(void index(Collection)): net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#5).name
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/BlogEntry.__Descendant_Table[net/sourceforge/pebble/domain/BlogEntry]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/BlogEntry.__Descendant_Table[others]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.getCategories()Ljava/util/Set;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.getState()Lnet/sourceforge/pebble/domain/State;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.isPublished()Z
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Descendant_Table[net/sourceforge/pebble/domain/Category]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Descendant_Table[others]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addBlogEntry(Ljava/lang/String;)V
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addSubCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getBlogEntries()Ljava/util/List;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getParent()Lnet/sourceforge/pebble/domain/Category;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getSubCategories()Ljava/util/List;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.isRootCategory()Z
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setId(Ljava/lang/String;)V
    //#input(void index(Collection)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setParent(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void index(Collection)): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[net/sourceforge/pebble/domain/CategoryBuilder]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[others]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.addCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void index(Collection)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories(Lnet/sourceforge/pebble/domain/Category;)Ljava/util/List;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getRootCategory()Lnet/sourceforge/pebble/domain/Category;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/PageBasedContent.__Descendant_Table[net/sourceforge/pebble/domain/BlogEntry]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/PageBasedContent.__Descendant_Table[net/sourceforge/pebble/domain/PageBasedContent]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/PageBasedContent.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/PageBasedContent.__Descendant_Table[others]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/PageBasedContent.__Dispatch_Table.getState()Lnet/sourceforge/pebble/domain/State;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/State.PUBLISHED
    //#input(void index(Collection)): net/sourceforge/pebble/domain/State.__Descendant_Table[net/sourceforge/pebble/domain/State]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/State.__Descendant_Table[others]
    //#input(void index(Collection)): net/sourceforge/pebble/domain/State.__Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void index(Collection)): net/sourceforge/pebble/domain/State.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void index(Collection)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getState()Lnet/sourceforge/pebble/domain/State;
    //#input(void index(Collection)): this
    //#input(void index(Collection)): this.blog
    //#input(void index(Collection)): this.blog.__Tag
    //#input(void index(Collection)): this.blog.rootCategory
    //#input(void index(Collection)): this.blog.rootCategory.__Tag
    //#output(void index(Collection)): new ArrayList(Category#1) num objects
    //#output(void index(Collection)): new ArrayList(Category#2) num objects
    //#output(void index(Collection)): new ArrayList(Category#3) num objects
    //#output(void index(Collection)): new Category(getCategory#2) num objects
    //#output(void index(Collection)): new Category(getCategory#2).__Tag
    //#output(void index(Collection)): new Category(getCategory#2).blog
    //#output(void index(Collection)): new Category(getCategory#2).blogEntries
    //#output(void index(Collection)): new Category(getCategory#2).id
    //#output(void index(Collection)): new Category(getCategory#2).name
    //#output(void index(Collection)): new Category(getCategory#2).parent
    //#output(void index(Collection)): new Category(getCategory#2).subCategories
    //#output(void index(Collection)): new Category(getCategory#2).tags
    //#output(void index(Collection)): new Category(getCategory#2).tagsAsList
    //#output(void index(Collection)): new Category(getCategory#3) num objects
    //#output(void index(Collection)): new Category(getCategory#3).__Tag
    //#output(void index(Collection)): new Category(getCategory#3).blog
    //#output(void index(Collection)): new Category(getCategory#3).blogEntries
    //#output(void index(Collection)): new Category(getCategory#3).id
    //#output(void index(Collection)): new Category(getCategory#3).name
    //#output(void index(Collection)): new Category(getCategory#3).parent
    //#output(void index(Collection)): new Category(getCategory#3).subCategories
    //#output(void index(Collection)): new Category(getCategory#3).tags
    //#output(void index(Collection)): new Category(getCategory#3).tagsAsList
    //#new obj(void index(Collection)): new ArrayList(Category#1)
    //#new obj(void index(Collection)): new ArrayList(Category#2)
    //#new obj(void index(Collection)): new ArrayList(Category#3)
    //#new obj(void index(Collection)): new Category(getCategory#2)
    //#new obj(void index(Collection)): new Category(getCategory#3)
    //#pre[1] (void index(Collection)): blogEntries != null
    //#pre[2] (void index(Collection)): (soft) net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#5).name != null
    //#pre[4] (void index(Collection)): (soft) this.blog != null
    //#pre[5] (void index(Collection)): (soft) this.blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[6] (void index(Collection)): (soft) init'ed(this.blog.rootCategory)
    //#presumption(void index(Collection)): blogEntry.state.__Tag@83 == net/sourceforge/pebble/domain/State
    //#presumption(void index(Collection)): blogEntry.state@83 != null
    //#presumption(void index(Collection)): category.blogEntries@85 != null
    //#presumption(void index(Collection)): java.util.Iterator:next(...).__Tag@83 == net/sourceforge/pebble/domain/BlogEntry
    //#presumption(void index(Collection)): java.util.Iterator:next(...).__Tag@85 == net/sourceforge/pebble/domain/Category
    //#presumption(void index(Collection)): java.util.Iterator:next(...)@83 != null
    //#presumption(void index(Collection)): java.util.Iterator:next(...)@85 != null
    //#post(void index(Collection)): init'ed(new ArrayList(Category#1) num objects)
    //#post(void index(Collection)): init'ed(new ArrayList(Category#2) num objects)
    //#post(void index(Collection)): init'ed(new ArrayList(Category#3) num objects)
    //#post(void index(Collection)): init'ed(new Category(getCategory#2) num objects)
    //#post(void index(Collection)): init'ed(new Category(getCategory#2).__Tag)
    //#post(void index(Collection)): possibly_updated(new Category(getCategory#2).blog)
    //#post(void index(Collection)): init'ed(new Category(getCategory#2).blogEntries)
    //#post(void index(Collection)): possibly_updated(new Category(getCategory#2).id)
    //#post(void index(Collection)): init'ed(new Category(getCategory#2).name)
    //#post(void index(Collection)): possibly_updated(new Category(getCategory#2).parent)
    //#post(void index(Collection)): init'ed(new Category(getCategory#2).subCategories)
    //#post(void index(Collection)): init'ed(new Category(getCategory#2).tags)
    //#post(void index(Collection)): init'ed(new Category(getCategory#2).tagsAsList)
    //#post(void index(Collection)): init'ed(new Category(getCategory#3) num objects)
    //#post(void index(Collection)): init'ed(new Category(getCategory#3).__Tag)
    //#post(void index(Collection)): possibly_updated(new Category(getCategory#3).blog)
    //#post(void index(Collection)): init'ed(new Category(getCategory#3).blogEntries)
    //#post(void index(Collection)): possibly_updated(new Category(getCategory#3).id)
    //#post(void index(Collection)): init'ed(new Category(getCategory#3).name)
    //#post(void index(Collection)): possibly_updated(new Category(getCategory#3).parent)
    //#post(void index(Collection)): init'ed(new Category(getCategory#3).subCategories)
    //#post(void index(Collection)): init'ed(new Category(getCategory#3).tags)
    //#post(void index(Collection)): init'ed(new Category(getCategory#3).tagsAsList)
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void index(Collection)): Effects-of-calling:addBlogEntry
    //#unanalyzed(void index(Collection)): Effects-of-calling:getCategories
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void index(Collection)): Effects-of-calling:getBlogEntries
    //#unanalyzed(void index(Collection)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getIndexesDirectory
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.io.File
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.io.FileWriter
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.io.BufferedWriter
    //#unanalyzed(void index(Collection)): Effects-of-calling:getId
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.io.BufferedWriter:write
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.io.BufferedWriter:newLine
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.io.BufferedWriter:flush
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.io.BufferedWriter:close
    //#unanalyzed(void index(Collection)): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void index(Collection)): Effects-of-calling:getSubCategories
    //#unanalyzed(void index(Collection)): Effects-of-calling:getCategory
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void index(Collection)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(void index(Collection)): Effects-of-calling:net.sourceforge.pebble.util.I18n:getMessage
    //#unanalyzed(void index(Collection)): Effects-of-calling:net.sourceforge.pebble.domain.Category
    //#unanalyzed(void index(Collection)): Effects-of-calling:addCategory
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void index(Collection)): Effects-of-calling:setBlog
    //#unanalyzed(void index(Collection)): Effects-of-calling:isRootCategory
    //#unanalyzed(void index(Collection)): Effects-of-calling:addSubCategory
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void index(Collection)): Effects-of-calling:java.util.Collections:unmodifiableList
    //#test_vector(void index(Collection)): java.util.Iterator:hasNext(...)@83: {1}, {0}
    //#test_vector(void index(Collection)): java.util.Iterator:hasNext(...)@85: {1}, {0}
      if (blogEntry.isPublished()) {
        for (Category category: blogEntry.getCategories()) {
          category.addBlogEntry(blogEntry.getId());
    //#categoryindex.java:86: ?!precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) this...__Tag == net/sourceforge/pebble/domain/Category
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void index(Collection)
    //#    basic block: bb_10
    //#    assertion: (soft) undefined == 792_320
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) this...__Tag == net/sourceforge/pebble/domain/Category
    //#    callee file: category.java
    //#    callee precondition index: [3]
    //#    callee srcpos: 373
    //#    VN: undefined
    //#    Expected: {792_320}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Exp singleton  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
    //#categoryindex.java:86: ?!precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) this...blogEntries != null
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void index(Collection)
    //#    basic block: bb_10
    //#    assertion: (soft) undefined != null
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) this...blogEntries != null
    //#    callee file: category.java
    //#    callee precondition index: [4]
    //#    callee srcpos: 373
    //#    VN: undefined
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#categoryindex.java:86: ?precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) init'ed(this...parent)
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void index(Collection)
    //#    basic block: bb_10
    //#    assertion: (soft) init'ed(undefined)
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) init'ed(this...parent)
    //#    callee file: category.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 373
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
        }
      }
    }

    writeIndex();
  }
    //#categoryindex.java:92: end of method: void net.sourceforge.pebble.index.CategoryIndex.index(Collection)

  /**
   * Indexes a single blog entry.
   *
   * @param blogEntry   a BlogEntry instance
   */
  public synchronized void index(BlogEntry blogEntry) {
    if (blogEntry.isPublished()) {
    //#categoryindex.java:100: method: void net.sourceforge.pebble.index.CategoryIndex.index(BlogEntry)
    //#input(void index(BlogEntry)): blogEntry
    //#input(void index(BlogEntry)): blogEntry.__Tag
    //#input(void index(BlogEntry)): blogEntry.categories
    //#input(void index(BlogEntry)): blogEntry.id
    //#input(void index(BlogEntry)): blogEntry.state
    //#input(void index(BlogEntry)): blogEntry.state.__Tag
    //#input(void index(BlogEntry)): blogEntry.state.name
    //#input(void index(BlogEntry)): log
    //#input(void index(BlogEntry)): net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#5).__Tag
    //#input(void index(BlogEntry)): net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#5).name
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Descendant_Table[net/sourceforge/pebble/domain/BlogEntry]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Descendant_Table[others]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.getCategories()Ljava/util/Set;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.getState()Lnet/sourceforge/pebble/domain/State;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.isPublished()Z
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Descendant_Table[net/sourceforge/pebble/domain/Category]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Descendant_Table[others]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addBlogEntry(Ljava/lang/String;)V
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addSubCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getBlogEntries()Ljava/util/List;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getParent()Lnet/sourceforge/pebble/domain/Category;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getSubCategories()Ljava/util/List;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.isRootCategory()Z
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setId(Ljava/lang/String;)V
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setParent(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[net/sourceforge/pebble/domain/CategoryBuilder]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[others]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.addCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories(Lnet/sourceforge/pebble/domain/Category;)Ljava/util/List;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getRootCategory()Lnet/sourceforge/pebble/domain/Category;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/PageBasedContent.__Descendant_Table[net/sourceforge/pebble/domain/BlogEntry]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/PageBasedContent.__Descendant_Table[net/sourceforge/pebble/domain/PageBasedContent]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/PageBasedContent.__Descendant_Table[net/sourceforge/pebble/domain/StaticPage]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/PageBasedContent.__Descendant_Table[others]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/PageBasedContent.__Dispatch_Table.getState()Lnet/sourceforge/pebble/domain/State;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/State.PUBLISHED
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/State.__Descendant_Table[net/sourceforge/pebble/domain/State]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/State.__Descendant_Table[others]
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/State.__Dispatch_Table.equals(Ljava/lang/Object;)Z
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/State.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void index(BlogEntry)): net/sourceforge/pebble/domain/StaticPage.__Dispatch_Table.getState()Lnet/sourceforge/pebble/domain/State;
    //#input(void index(BlogEntry)): this
    //#input(void index(BlogEntry)): this.blog
    //#input(void index(BlogEntry)): this.blog.__Tag
    //#input(void index(BlogEntry)): this.blog.rootCategory
    //#input(void index(BlogEntry)): this.blog.rootCategory.__Tag
    //#output(void index(BlogEntry)): new ArrayList(Category#1) num objects
    //#output(void index(BlogEntry)): new ArrayList(Category#2) num objects
    //#output(void index(BlogEntry)): new ArrayList(Category#3) num objects
    //#output(void index(BlogEntry)): new Category(getCategory#2) num objects
    //#output(void index(BlogEntry)): new Category(getCategory#2).__Tag
    //#output(void index(BlogEntry)): new Category(getCategory#2).blog
    //#output(void index(BlogEntry)): new Category(getCategory#2).blogEntries
    //#output(void index(BlogEntry)): new Category(getCategory#2).id
    //#output(void index(BlogEntry)): new Category(getCategory#2).name
    //#output(void index(BlogEntry)): new Category(getCategory#2).parent
    //#output(void index(BlogEntry)): new Category(getCategory#2).subCategories
    //#output(void index(BlogEntry)): new Category(getCategory#2).tags
    //#output(void index(BlogEntry)): new Category(getCategory#2).tagsAsList
    //#output(void index(BlogEntry)): new Category(getCategory#3) num objects
    //#output(void index(BlogEntry)): new Category(getCategory#3).__Tag
    //#output(void index(BlogEntry)): new Category(getCategory#3).blog
    //#output(void index(BlogEntry)): new Category(getCategory#3).blogEntries
    //#output(void index(BlogEntry)): new Category(getCategory#3).id
    //#output(void index(BlogEntry)): new Category(getCategory#3).name
    //#output(void index(BlogEntry)): new Category(getCategory#3).parent
    //#output(void index(BlogEntry)): new Category(getCategory#3).subCategories
    //#output(void index(BlogEntry)): new Category(getCategory#3).tags
    //#output(void index(BlogEntry)): new Category(getCategory#3).tagsAsList
    //#new obj(void index(BlogEntry)): new ArrayList(Category#1)
    //#new obj(void index(BlogEntry)): new ArrayList(Category#2)
    //#new obj(void index(BlogEntry)): new ArrayList(Category#3)
    //#new obj(void index(BlogEntry)): new Category(getCategory#2)
    //#new obj(void index(BlogEntry)): new Category(getCategory#3)
    //#pre[1] (void index(BlogEntry)): blogEntry != null
    //#pre[2] (void index(BlogEntry)): blogEntry.__Tag == net/sourceforge/pebble/domain/BlogEntry
    //#pre[5] (void index(BlogEntry)): blogEntry.state != null
    //#pre[6] (void index(BlogEntry)): blogEntry.state.__Tag == net/sourceforge/pebble/domain/State
    //#pre[3] (void index(BlogEntry)): (soft) init'ed(blogEntry.categories)
    //#pre[4] (void index(BlogEntry)): (soft) init'ed(blogEntry.id)
    //#pre[7] (void index(BlogEntry)): (soft) init'ed(blogEntry.state.name)
    //#pre[8] (void index(BlogEntry)): (soft) net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#5).name != null
    //#pre[10] (void index(BlogEntry)): (soft) this.blog != null
    //#pre[11] (void index(BlogEntry)): (soft) this.blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[12] (void index(BlogEntry)): (soft) init'ed(this.blog.rootCategory)
    //#presumption(void index(BlogEntry)): category.blogEntries@101 != null
    //#presumption(void index(BlogEntry)): java.util.Iterator:next(...).__Tag@101 == net/sourceforge/pebble/domain/Category
    //#presumption(void index(BlogEntry)): java.util.Iterator:next(...)@101 != null
    //#post(void index(BlogEntry)): init'ed(new ArrayList(Category#1) num objects)
    //#post(void index(BlogEntry)): init'ed(new ArrayList(Category#2) num objects)
    //#post(void index(BlogEntry)): init'ed(new ArrayList(Category#3) num objects)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#2) num objects)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#2).__Tag)
    //#post(void index(BlogEntry)): possibly_updated(new Category(getCategory#2).blog)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#2).blogEntries)
    //#post(void index(BlogEntry)): possibly_updated(new Category(getCategory#2).id)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#2).name)
    //#post(void index(BlogEntry)): possibly_updated(new Category(getCategory#2).parent)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#2).subCategories)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#2).tags)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#2).tagsAsList)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#3) num objects)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#3).__Tag)
    //#post(void index(BlogEntry)): possibly_updated(new Category(getCategory#3).blog)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#3).blogEntries)
    //#post(void index(BlogEntry)): possibly_updated(new Category(getCategory#3).id)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#3).name)
    //#post(void index(BlogEntry)): possibly_updated(new Category(getCategory#3).parent)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#3).subCategories)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#3).tags)
    //#post(void index(BlogEntry)): init'ed(new Category(getCategory#3).tagsAsList)
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:addBlogEntry
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:getCategories
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:getBlogEntries
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getIndexesDirectory
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.io.File
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.io.FileWriter
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.io.BufferedWriter
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:getId
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.io.BufferedWriter:write
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.io.BufferedWriter:newLine
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.io.BufferedWriter:flush
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.io.BufferedWriter:close
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.HashSet
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:getSubCategories
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:getCategory
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:net.sourceforge.pebble.util.I18n:getMessage
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:net.sourceforge.pebble.domain.Category
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:addCategory
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:setBlog
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:isRootCategory
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:addSubCategory
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void index(BlogEntry)): Effects-of-calling:java.util.Collections:unmodifiableList
    //#test_vector(void index(BlogEntry)): java.util.Iterator:hasNext(...)@101: {1}, {0}
      for (Category category : blogEntry.getCategories()) {
        category.addBlogEntry(blogEntry.getId());
    //#categoryindex.java:102: ?!precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) this...__Tag == net/sourceforge/pebble/domain/Category
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void index(BlogEntry)
    //#    basic block: bb_7
    //#    assertion: (soft) undefined == 792_320
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) this...__Tag == net/sourceforge/pebble/domain/Category
    //#    callee file: category.java
    //#    callee precondition index: [3]
    //#    callee srcpos: 373
    //#    VN: undefined
    //#    Expected: {792_320}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Exp singleton  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
    //#categoryindex.java:102: ?!precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) this...blogEntries != null
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void index(BlogEntry)
    //#    basic block: bb_7
    //#    assertion: (soft) undefined != null
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) this...blogEntries != null
    //#    callee file: category.java
    //#    callee precondition index: [4]
    //#    callee srcpos: 373
    //#    VN: undefined
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#categoryindex.java:102: ?precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) init'ed(this...parent)
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void index(BlogEntry)
    //#    basic block: bb_7
    //#    assertion: (soft) init'ed(undefined)
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) init'ed(this...parent)
    //#    callee file: category.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 373
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
      }

      writeIndex();
    }
  }
    //#categoryindex.java:107: end of method: void net.sourceforge.pebble.index.CategoryIndex.index(BlogEntry)

  /**
   * Unindexes a single blog entry.
   *
   * @param blogEntry   a BlogEntry instance
   */
  public synchronized void unindex(BlogEntry blogEntry) {
    for (Category category : blog.getCategories()) {
    //#categoryindex.java:115: method: void net.sourceforge.pebble.index.CategoryIndex.unindex(BlogEntry)
    //#input(void unindex(BlogEntry)): blogEntry
    //#input(void unindex(BlogEntry)): blogEntry.__Tag
    //#input(void unindex(BlogEntry)): blogEntry.id
    //#input(void unindex(BlogEntry)): log
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Descendant_Table[net/sourceforge/pebble/domain/BlogEntry]
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Descendant_Table[others]
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/BlogEntry.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Descendant_Table[net/sourceforge/pebble/domain/Category]
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Descendant_Table[others]
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addSubCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getBlogEntries()Ljava/util/List;
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getParent()Lnet/sourceforge/pebble/domain/Category;
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getSubCategories()Ljava/util/List;
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.isRootCategory()Z
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.removeBlogEntry(Ljava/lang/String;)V
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setId(Ljava/lang/String;)V
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setParent(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[net/sourceforge/pebble/domain/CategoryBuilder]
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[others]
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.addCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories(Lnet/sourceforge/pebble/domain/Category;)Ljava/util/List;
    //#input(void unindex(BlogEntry)): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getRootCategory()Lnet/sourceforge/pebble/domain/Category;
    //#input(void unindex(BlogEntry)): this
    //#input(void unindex(BlogEntry)): this.blog
    //#input(void unindex(BlogEntry)): this.blog.__Tag
    //#input(void unindex(BlogEntry)): this.blog.rootCategory
    //#input(void unindex(BlogEntry)): this.blog.rootCategory.__Tag
    //#output(void unindex(BlogEntry)): new ArrayList(Category#1) num objects
    //#output(void unindex(BlogEntry)): new ArrayList(Category#2) num objects
    //#output(void unindex(BlogEntry)): new ArrayList(Category#3) num objects
    //#output(void unindex(BlogEntry)): new Category(getCategory#2) num objects
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).__Tag
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).blog
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).blogEntries
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).id
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).name
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).parent
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).subCategories
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).tags
    //#output(void unindex(BlogEntry)): new Category(getCategory#2).tagsAsList
    //#output(void unindex(BlogEntry)): new Category(getCategory#3) num objects
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).__Tag
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).blog
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).blogEntries
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).id
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).name
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).parent
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).subCategories
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).tags
    //#output(void unindex(BlogEntry)): new Category(getCategory#3).tagsAsList
    //#new obj(void unindex(BlogEntry)): new ArrayList(Category#1)
    //#new obj(void unindex(BlogEntry)): new ArrayList(Category#2)
    //#new obj(void unindex(BlogEntry)): new ArrayList(Category#3)
    //#new obj(void unindex(BlogEntry)): new Category(getCategory#2)
    //#new obj(void unindex(BlogEntry)): new Category(getCategory#3)
    //#pre[5] (void unindex(BlogEntry)): this.blog != null
    //#pre[6] (void unindex(BlogEntry)): this.blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[7] (void unindex(BlogEntry)): init'ed(this.blog.rootCategory)
    //#pre[1] (void unindex(BlogEntry)): (soft) blogEntry != null
    //#pre[2] (void unindex(BlogEntry)): (soft) blogEntry.__Tag == net/sourceforge/pebble/domain/BlogEntry
    //#pre[3] (void unindex(BlogEntry)): (soft) init'ed(blogEntry.id)
    //#presumption(void unindex(BlogEntry)): category.blogEntries@115 != null
    //#presumption(void unindex(BlogEntry)): java.util.Iterator:next(...).__Tag@115 == net/sourceforge/pebble/domain/Category
    //#presumption(void unindex(BlogEntry)): java.util.Iterator:next(...)@115 != null
    //#post(void unindex(BlogEntry)): init'ed(new ArrayList(Category#1) num objects)
    //#post(void unindex(BlogEntry)): init'ed(new ArrayList(Category#2) num objects)
    //#post(void unindex(BlogEntry)): init'ed(new ArrayList(Category#3) num objects)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#2) num objects)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#2).__Tag)
    //#post(void unindex(BlogEntry)): possibly_updated(new Category(getCategory#2).blog)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#2).blogEntries)
    //#post(void unindex(BlogEntry)): possibly_updated(new Category(getCategory#2).id)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#2).name)
    //#post(void unindex(BlogEntry)): possibly_updated(new Category(getCategory#2).parent)
    //#post(void unindex(BlogEntry)): possibly_updated(new Category(getCategory#2).subCategories)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#2).tags)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#2).tagsAsList)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#3) num objects)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#3).__Tag)
    //#post(void unindex(BlogEntry)): possibly_updated(new Category(getCategory#3).blog)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#3).blogEntries)
    //#post(void unindex(BlogEntry)): possibly_updated(new Category(getCategory#3).id)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#3).name)
    //#post(void unindex(BlogEntry)): possibly_updated(new Category(getCategory#3).parent)
    //#post(void unindex(BlogEntry)): possibly_updated(new Category(getCategory#3).subCategories)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#3).tags)
    //#post(void unindex(BlogEntry)): init'ed(new Category(getCategory#3).tagsAsList)
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:getCategories
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:removeBlogEntry
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:getBlogEntries
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getIndexesDirectory
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.io.File
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.io.FileWriter
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.io.BufferedWriter
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:getId
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.io.BufferedWriter:write
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.io.BufferedWriter:newLine
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.io.BufferedWriter:flush
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.io.BufferedWriter:close
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:org.apache.commons.logging.Log:error
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:getSubCategories
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:getCategory
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:net.sourceforge.pebble.util.I18n:getMessage
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:net.sourceforge.pebble.domain.Category
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:addCategory
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:setBlog
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:isRootCategory
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:addSubCategory
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void unindex(BlogEntry)): Effects-of-calling:java.util.Collections:unmodifiableList
    //#test_vector(void unindex(BlogEntry)): java.util.Iterator:hasNext(...)@115: {1}, {0}
      category.removeBlogEntry(blogEntry.getId());
    //#categoryindex.java:116: ?!precondition failure
    //#    net/sourceforge/pebble/domain/Category.removeBlogEntry: (soft) this...__Tag == net/sourceforge/pebble/domain/Category
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void unindex(BlogEntry)
    //#    basic block: bb_5
    //#    assertion: (soft) undefined == 792_320
    //#    callee: void net/sourceforge/pebble/domain/Category.removeBlogEntry(String)
    //#    callee assertion: (soft) this...__Tag == net/sourceforge/pebble/domain/Category
    //#    callee file: category.java
    //#    callee precondition index: [7]
    //#    callee srcpos: 389
    //#    VN: undefined
    //#    Expected: {792_320}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Exp singleton  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
    //#categoryindex.java:116: ?!precondition failure
    //#    net/sourceforge/pebble/domain/Category.removeBlogEntry: (soft) this...blogEntries != null
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void unindex(BlogEntry)
    //#    basic block: bb_5
    //#    assertion: (soft) undefined != null
    //#    callee: void net/sourceforge/pebble/domain/Category.removeBlogEntry(String)
    //#    callee assertion: (soft) this...blogEntries != null
    //#    callee file: category.java
    //#    callee precondition index: [8]
    //#    callee srcpos: 389
    //#    VN: undefined
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#categoryindex.java:116: ?precondition failure
    //#    net/sourceforge/pebble/domain/Category.removeBlogEntry: (soft) init'ed(this...parent)
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void unindex(BlogEntry)
    //#    basic block: bb_5
    //#    assertion: (soft) init'ed(undefined)
    //#    callee: void net/sourceforge/pebble/domain/Category.removeBlogEntry(String)
    //#    callee assertion: (soft) init'ed(this...parent)
    //#    callee file: category.java
    //#    callee precondition index: [9]
    //#    callee srcpos: 389
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
    }

    writeIndex();
  }
    //#categoryindex.java:120: end of method: void net.sourceforge.pebble.index.CategoryIndex.unindex(BlogEntry)

  /**
   * Helper method to load the index.
   */
  private void readIndex() {
    File indexFile = new File(blog.getIndexesDirectory(), "categories.index");
    //#categoryindex.java:126: method: void net.sourceforge.pebble.index.CategoryIndex.readIndex()
    //#categoryindex.java:126: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.domain.Blog:getIndexesDirectory()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    unanalyzed callee: String net.sourceforge.pebble.domain.Blog:getIndexesDirectory()
    //#input(void readIndex()): log
    //#input(void readIndex()): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void readIndex()): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void readIndex()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCategory(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/Category;
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Descendant_Table[net/sourceforge/pebble/domain/Category]
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Descendant_Table[others]
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addBlogEntry(Ljava/lang/String;)V
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addSubCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getParent()Lnet/sourceforge/pebble/domain/Category;
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getSubCategories()Ljava/util/List;
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.isRootCategory()Z
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setId(Ljava/lang/String;)V
    //#input(void readIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setParent(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void readIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[net/sourceforge/pebble/domain/CategoryBuilder]
    //#input(void readIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[others]
    //#input(void readIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.addCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void readIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategory(Ljava/lang/String;)Lnet/sourceforge/pebble/domain/Category;
    //#input(void readIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getRootCategory()Lnet/sourceforge/pebble/domain/Category;
    //#input(void readIndex()): this
    //#input(void readIndex()): this.blog
    //#input(void readIndex()): this.blog.__Tag
    //#input(void readIndex()): this.blog.rootCategory
    //#input(void readIndex()): this.blog.rootCategory.__Tag
    //#output(void readIndex()): new ArrayList(Category#1) num objects
    //#output(void readIndex()): new ArrayList(Category#2) num objects
    //#output(void readIndex()): new ArrayList(Category#3) num objects
    //#output(void readIndex()): new Category(getCategory#2*) num objects
    //#output(void readIndex()): new Category(getCategory#2*).__Tag
    //#output(void readIndex()): new Category(getCategory#2*).blog
    //#output(void readIndex()): new Category(getCategory#2*).blogEntries
    //#output(void readIndex()): new Category(getCategory#2*).id
    //#output(void readIndex()): new Category(getCategory#2*).name
    //#output(void readIndex()): new Category(getCategory#2*).parent
    //#output(void readIndex()): new Category(getCategory#2*).subCategories
    //#output(void readIndex()): new Category(getCategory#2*).tags
    //#output(void readIndex()): new Category(getCategory#2*).tagsAsList
    //#output(void readIndex()): new Category(getCategory#3*) num objects
    //#output(void readIndex()): new Category(getCategory#3*).__Tag
    //#output(void readIndex()): new Category(getCategory#3*).blog
    //#output(void readIndex()): new Category(getCategory#3*).blogEntries
    //#output(void readIndex()): new Category(getCategory#3*).id
    //#output(void readIndex()): new Category(getCategory#3*).name
    //#output(void readIndex()): new Category(getCategory#3*).parent
    //#output(void readIndex()): new Category(getCategory#3*).subCategories
    //#output(void readIndex()): new Category(getCategory#3*).tags
    //#output(void readIndex()): new Category(getCategory#3*).tagsAsList
    //#new obj(void readIndex()): new ArrayList(Category#1)
    //#new obj(void readIndex()): new ArrayList(Category#2)
    //#new obj(void readIndex()): new ArrayList(Category#3)
    //#new obj(void readIndex()): new Category(getCategory#2*)
    //#new obj(void readIndex()): new Category(getCategory#3*)
    //#pre[2] (void readIndex()): this.blog != null
    //#pre[3] (void readIndex()): (soft) this.blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[4] (void readIndex()): (soft) init'ed(this.blog.rootCategory)
    //#presumption(void readIndex()): blogEntries.length@136 <= 4_294_967_295
    //#presumption(void readIndex()): category...__Tag@133 == net/sourceforge/pebble/domain/Category
    //#presumption(void readIndex()): category...blogEntries@133 != null
    //#presumption(void readIndex()): category.__Tag@133 == net/sourceforge/pebble/domain/Category
    //#presumption(void readIndex()): category.blogEntries@133 != null
    //#presumption(void readIndex()): org.apache.commons.logging.LogFactory:getLog(...)@52 != null
    //#presumption(void readIndex()): tuple.length@132 >= 1
    //#post(void readIndex()): init'ed(new ArrayList(Category#1) num objects)
    //#post(void readIndex()): init'ed(new ArrayList(Category#2) num objects)
    //#post(void readIndex()): init'ed(new ArrayList(Category#3) num objects)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*) num objects)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).__Tag)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).blog)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).blogEntries)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).id)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).name)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).parent)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).subCategories)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).tags)
    //#post(void readIndex()): init'ed(new Category(getCategory#2*).tagsAsList)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*) num objects)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).__Tag)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).blog)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).blogEntries)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).id)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).name)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).parent)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).subCategories)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).tags)
    //#post(void readIndex()): init'ed(new Category(getCategory#3*).tagsAsList)
    //#unanalyzed(void readIndex()): Effects-of-calling:addBlogEntry
    //#unanalyzed(void readIndex()): Effects-of-calling:getId
    //#unanalyzed(void readIndex()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void readIndex()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void readIndex()): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void readIndex()): Effects-of-calling:getSubCategories
    //#unanalyzed(void readIndex()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void readIndex()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void readIndex()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void readIndex()): Effects-of-calling:getCategory
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void readIndex()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(void readIndex()): Effects-of-calling:net.sourceforge.pebble.util.I18n:getMessage
    //#unanalyzed(void readIndex()): Effects-of-calling:net.sourceforge.pebble.domain.Category
    //#unanalyzed(void readIndex()): Effects-of-calling:addCategory
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void readIndex()): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void readIndex()): Effects-of-calling:setBlog
    //#unanalyzed(void readIndex()): Effects-of-calling:isRootCategory
    //#unanalyzed(void readIndex()): Effects-of-calling:addSubCategory
    //#unanalyzed(void readIndex()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void readIndex()): Effects-of-calling:java.util.Collections:unmodifiableList
    //#test_vector(void readIndex()): java.io.File:exists(...)@127: {0}, {1}
    //#test_vector(void readIndex()): tuple.length@132: {1}, {2..+Inf}
    //#test_vector(void readIndex()): tuple[1]@132: Addr_Set{null}, Inverse{null}
    if (indexFile.exists()) {
      try {
        BufferedReader reader = new BufferedReader(new FileReader(indexFile));
        String indexEntry = reader.readLine();
        while (indexEntry != null) {
          String[] tuple = indexEntry.split("=");
          Category category = blog.getCategory(tuple[0]);

          if (tuple.length > 1 && tuple[1] != null) {
            String[] blogEntries = tuple[1].split(",");
            for (String blogEntry : blogEntries) {
              category.addBlogEntry(blogEntry);
    //#categoryindex.java:138: ?null dereference
    //#    category != null
    //#    severity: MEDIUM
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    basic block: bb_7
    //#    assertion: category != null
    //#    VN: getCategory(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#categoryindex.java:138: ?use of default init
    //#    init'ed(category.__Tag)
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    basic block: bb_7
    //#    assertion: init'ed(category.__Tag)
    //#    VN: category.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#categoryindex.java:138: ?null dereference
    //#    net/sourceforge/pebble/domain/Category.__Descendant_Table[category.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    basic block: bb_7
    //#    assertion: net/sourceforge/pebble/domain/Category.__Descendant_Table[category.__Tag] != null
    //#    VN: net/sourceforge/pebble/domain/Category.__Descendant_Table[category.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#categoryindex.java:138: ?precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) this...blogEntries != null
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    basic block: bb_7
    //#    assertion: (soft) category...blogEntries != null
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) this...blogEntries != null
    //#    callee file: category.java
    //#    callee precondition index: [4]
    //#    callee srcpos: 373
    //#    VN: category...blogEntries
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#categoryindex.java:138: ?precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) init'ed(this...parent)
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    basic block: bb_7
    //#    assertion: (soft) init'ed(category...parent)
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) init'ed(this...parent)
    //#    callee file: category.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 373
    //#    VN: category...parent
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
    //#categoryindex.java:138: ?precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) this.blogEntries != null
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    basic block: bb_7
    //#    assertion: (soft) category.blogEntries != null
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) this.blogEntries != null
    //#    callee file: category.java
    //#    callee precondition index: [7]
    //#    callee srcpos: 373
    //#    VN: category.blogEntries
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#categoryindex.java:138: ?precondition failure
    //#    net/sourceforge/pebble/domain/Category.addBlogEntry: (soft) init'ed(this.parent)
    //#    severity: SUPPRESSED
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    basic block: bb_7
    //#    assertion: (soft) init'ed(category.parent)
    //#    callee: void net/sourceforge/pebble/domain/Category.addBlogEntry(String)
    //#    callee assertion: (soft) init'ed(this.parent)
    //#    callee file: category.java
    //#    callee precondition index: [8]
    //#    callee srcpos: 373
    //#    VN: category.parent
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
            }
          }

          indexEntry = reader.readLine();
        }

        reader.close();
      } catch (Exception e) {
        log.error("Error while reading index", e);
    //#categoryindex.java:147: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void readIndex()
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object, Throwable)
      }
    }
  }
    //#categoryindex.java:150: end of method: void net.sourceforge.pebble.index.CategoryIndex.readIndex()

  /**
   * Helper method to write out the index to disk.
   */
  private void writeIndex() {
    try {
      File indexFile = new File(blog.getIndexesDirectory(), "categories.index");
    //#categoryindex.java:157: method: void net.sourceforge.pebble.index.CategoryIndex.writeIndex()
    //#categoryindex.java:157: Warning: method not available
    //#    -- call on String net.sourceforge.pebble.domain.Blog:getIndexesDirectory()
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void writeIndex()
    //#    unanalyzed callee: String net.sourceforge.pebble.domain.Blog:getIndexesDirectory()
    //#input(void writeIndex()): log
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Blog.__Descendant_Table[net/sourceforge/pebble/domain/Blog]
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Blog.__Descendant_Table[others]
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Blog.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Descendant_Table[net/sourceforge/pebble/domain/Category]
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Descendant_Table[others]
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.addSubCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getBlogEntries()Ljava/util/List;
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getId()Ljava/lang/String;
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getSubCategories()Ljava/util/List;
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.isRootCategory()Z
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setBlog(Lnet/sourceforge/pebble/domain/Blog;)V
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setId(Ljava/lang/String;)V
    //#input(void writeIndex()): net/sourceforge/pebble/domain/Category.__Dispatch_Table.setParent(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void writeIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[net/sourceforge/pebble/domain/CategoryBuilder]
    //#input(void writeIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Descendant_Table[others]
    //#input(void writeIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.addCategory(Lnet/sourceforge/pebble/domain/Category;)V
    //#input(void writeIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories()Ljava/util/List;
    //#input(void writeIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getCategories(Lnet/sourceforge/pebble/domain/Category;)Ljava/util/List;
    //#input(void writeIndex()): net/sourceforge/pebble/domain/CategoryBuilder.__Dispatch_Table.getRootCategory()Lnet/sourceforge/pebble/domain/Category;
    //#input(void writeIndex()): this
    //#input(void writeIndex()): this.blog
    //#input(void writeIndex()): this.blog.__Tag
    //#input(void writeIndex()): this.blog.rootCategory
    //#input(void writeIndex()): this.blog.rootCategory.__Tag
    //#output(void writeIndex()): new ArrayList(Category#1) num objects
    //#output(void writeIndex()): new ArrayList(Category#2) num objects
    //#output(void writeIndex()): new ArrayList(Category#3) num objects
    //#output(void writeIndex()): new Category(getCategory#2) num objects
    //#output(void writeIndex()): new Category(getCategory#2).__Tag
    //#output(void writeIndex()): new Category(getCategory#2).blog
    //#output(void writeIndex()): new Category(getCategory#2).blogEntries
    //#output(void writeIndex()): new Category(getCategory#2).id
    //#output(void writeIndex()): new Category(getCategory#2).name
    //#output(void writeIndex()): new Category(getCategory#2).parent
    //#output(void writeIndex()): new Category(getCategory#2).subCategories
    //#output(void writeIndex()): new Category(getCategory#2).tags
    //#output(void writeIndex()): new Category(getCategory#2).tagsAsList
    //#output(void writeIndex()): new Category(getCategory#3) num objects
    //#output(void writeIndex()): new Category(getCategory#3).__Tag
    //#output(void writeIndex()): new Category(getCategory#3).blog
    //#output(void writeIndex()): new Category(getCategory#3).blogEntries
    //#output(void writeIndex()): new Category(getCategory#3).id
    //#output(void writeIndex()): new Category(getCategory#3).name
    //#output(void writeIndex()): new Category(getCategory#3).parent
    //#output(void writeIndex()): new Category(getCategory#3).subCategories
    //#output(void writeIndex()): new Category(getCategory#3).tags
    //#output(void writeIndex()): new Category(getCategory#3).tagsAsList
    //#new obj(void writeIndex()): new ArrayList(Category#1)
    //#new obj(void writeIndex()): new ArrayList(Category#2)
    //#new obj(void writeIndex()): new ArrayList(Category#3)
    //#new obj(void writeIndex()): new Category(getCategory#2)
    //#new obj(void writeIndex()): new Category(getCategory#3)
    //#pre[2] (void writeIndex()): (soft) this.blog != null
    //#pre[3] (void writeIndex()): (soft) this.blog.__Tag == net/sourceforge/pebble/domain/Blog
    //#pre[4] (void writeIndex()): (soft) init'ed(this.blog.rootCategory)
    //#presumption(void writeIndex()): java.util.Iterator:next(...).__Tag@160 == net/sourceforge/pebble/domain/Category
    //#presumption(void writeIndex()): java.util.Iterator:next(...)@160 != null
    //#presumption(void writeIndex()): org.apache.commons.logging.LogFactory:getLog(...)@52 != null
    //#post(void writeIndex()): init'ed(new ArrayList(Category#1) num objects)
    //#post(void writeIndex()): init'ed(new ArrayList(Category#2) num objects)
    //#post(void writeIndex()): init'ed(new ArrayList(Category#3) num objects)
    //#post(void writeIndex()): init'ed(new Category(getCategory#2) num objects)
    //#post(void writeIndex()): init'ed(new Category(getCategory#2).__Tag)
    //#post(void writeIndex()): possibly_updated(new Category(getCategory#2).blog)
    //#post(void writeIndex()): init'ed(new Category(getCategory#2).blogEntries)
    //#post(void writeIndex()): possibly_updated(new Category(getCategory#2).id)
    //#post(void writeIndex()): init'ed(new Category(getCategory#2).name)
    //#post(void writeIndex()): possibly_updated(new Category(getCategory#2).parent)
    //#post(void writeIndex()): init'ed(new Category(getCategory#2).subCategories)
    //#post(void writeIndex()): init'ed(new Category(getCategory#2).tags)
    //#post(void writeIndex()): init'ed(new Category(getCategory#2).tagsAsList)
    //#post(void writeIndex()): init'ed(new Category(getCategory#3) num objects)
    //#post(void writeIndex()): init'ed(new Category(getCategory#3).__Tag)
    //#post(void writeIndex()): possibly_updated(new Category(getCategory#3).blog)
    //#post(void writeIndex()): init'ed(new Category(getCategory#3).blogEntries)
    //#post(void writeIndex()): possibly_updated(new Category(getCategory#3).id)
    //#post(void writeIndex()): init'ed(new Category(getCategory#3).name)
    //#post(void writeIndex()): possibly_updated(new Category(getCategory#3).parent)
    //#post(void writeIndex()): init'ed(new Category(getCategory#3).subCategories)
    //#post(void writeIndex()): init'ed(new Category(getCategory#3).tags)
    //#post(void writeIndex()): init'ed(new Category(getCategory#3).tagsAsList)
    //#unanalyzed(void writeIndex()): Effects-of-calling:getId
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.List:contains
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.List:add
    //#unanalyzed(void writeIndex()): Effects-of-calling:getSubCategories
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void writeIndex()): Effects-of-calling:getCategory
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void writeIndex()): Effects-of-calling:net.sourceforge.pebble.domain.Blog:getLocale
    //#unanalyzed(void writeIndex()): Effects-of-calling:net.sourceforge.pebble.util.I18n:getMessage
    //#unanalyzed(void writeIndex()): Effects-of-calling:net.sourceforge.pebble.domain.Category
    //#unanalyzed(void writeIndex()): Effects-of-calling:addCategory
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.lang.String:lastIndexOf
    //#unanalyzed(void writeIndex()): Effects-of-calling:setBlog
    //#unanalyzed(void writeIndex()): Effects-of-calling:isRootCategory
    //#unanalyzed(void writeIndex()): Effects-of-calling:addSubCategory
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void writeIndex()): Effects-of-calling:getCategories
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.Collections:sort
    //#unanalyzed(void writeIndex()): Effects-of-calling:java.util.Collections:unmodifiableList
    //#test_vector(void writeIndex()): java.util.Iterator:hasNext(...)@160: {1}, {0}
    //#test_vector(void writeIndex()): java.util.Iterator:hasNext(...)@163: {1}, {0}
      BufferedWriter writer = new BufferedWriter(new FileWriter(indexFile));

      for (Category category : blog.getCategories()) {
        writer.write(category.getId());
        writer.write("=");
        for (String blogEntry : category.getBlogEntries()) {
          writer.write(blogEntry);
          writer.write(",");
        }
        writer.newLine();
      }

      writer.flush();
      writer.close();
    } catch (Exception e) {
      log.error("Error while writing index", e);
    //#categoryindex.java:173: Warning: method not available
    //#    -- call on void org.apache.commons.logging.Log:error(Object, Throwable)
    //#    severity: INFORMATIONAL
    //#    class: net.sourceforge.pebble.index.CategoryIndex
    //#    method: void writeIndex()
    //#    unanalyzed callee: void org.apache.commons.logging.Log:error(Object, Throwable)
    }
  }
    //#categoryindex.java:175: end of method: void net.sourceforge.pebble.index.CategoryIndex.writeIndex()

  /**
   * Gets the the list of blog entries for a given category.
   *
   * @param category    a category
   * @return  a List of blog entry IDs
   */
  public List<String> getRecentBlogEntries(Category category) {
    return new ArrayList<String>(category.getBlogEntries());
    //#categoryindex.java:184: method: List net.sourceforge.pebble.index.CategoryIndex.getRecentBlogEntries(Category)
    //#input(List getRecentBlogEntries(Category)): category
    //#input(List getRecentBlogEntries(Category)): category.__Tag
    //#input(List getRecentBlogEntries(Category)): category.blogEntries
    //#input(List getRecentBlogEntries(Category)): net/sourceforge/pebble/domain/Category.__Descendant_Table[net/sourceforge/pebble/domain/Category]
    //#input(List getRecentBlogEntries(Category)): net/sourceforge/pebble/domain/Category.__Descendant_Table[others]
    //#input(List getRecentBlogEntries(Category)): net/sourceforge/pebble/domain/Category.__Dispatch_Table.getBlogEntries()Ljava/util/List;
    //#output(List getRecentBlogEntries(Category)): new ArrayList(getRecentBlogEntries#1) num objects
    //#output(List getRecentBlogEntries(Category)): return_value
    //#new obj(List getRecentBlogEntries(Category)): new ArrayList(getRecentBlogEntries#1)
    //#pre[1] (List getRecentBlogEntries(Category)): category != null
    //#pre[2] (List getRecentBlogEntries(Category)): category.__Tag == net/sourceforge/pebble/domain/Category
    //#pre[3] (List getRecentBlogEntries(Category)): init'ed(category.blogEntries)
    //#post(List getRecentBlogEntries(Category)): return_value == &new ArrayList(getRecentBlogEntries#1)
    //#post(List getRecentBlogEntries(Category)): new ArrayList(getRecentBlogEntries#1) num objects == 1
    //#unanalyzed(List getRecentBlogEntries(Category)): Effects-of-calling:java.util.ArrayList
    //#categoryindex.java:184: end of method: List net.sourceforge.pebble.index.CategoryIndex.getRecentBlogEntries(Category)
  }

}
    //#categoryindex.java:: end of class: net.sourceforge.pebble.index.CategoryIndex
