year.java

### File Source: year.java

             /*
        P/P   *  Method: net.sourceforge.pebble.domain.Year__static_init
              */
         1  /*
         2   * Copyright (c) 2003-2006, Simon Brown
         3   * All rights reserved.
         4   *
         5   * Redistribution and use in source and binary forms, with or without
         6   * modification, are permitted provided that the following conditions are met:
         7   *
         8   *   - Redistributions of source code must retain the above copyright
         9   *     notice, this list of conditions and the following disclaimer.
        10   *
        11   *   - Redistributions in binary form must reproduce the above copyright
        12   *     notice, this list of conditions and the following disclaimer in
        13   *     the documentation and/or other materials provided with the
        14   *     distribution.
        15   *
        16   *   - Neither the name of Pebble nor the names of its contributors may
        17   *     be used to endorse or promote products derived from this software
        18   *     without specific prior written permission.
        19   *
        20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
        21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
        24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        30   * POSSIBILITY OF SUCH DAMAGE.
        31   */
        32  package net.sourceforge.pebble.domain;
        33
        34  import java.util.Calendar;
        35  import java.util.List;
        36  import java.util.LinkedList;
        37
        38  /**
        39   * Represents a blog at a yearly level. This manages a collection of Month instances.
        40   *
        41   * @author    Simon Brown
        42   */
        43  public class Year extends TimePeriod implements Comparable {
        44
        45    /** the year that this blog is for */
        46    private int year;
        47
        48    /** a collection of the monthly blogs that this instance is managing */
        49    private Month[] months;
        50
        51    /**
        52     * Creates a new Year instance for the specified year.
        53     *
        54     * @param blog    the Blog on which this Year is based
        55     * @param year    the year that this Year is for
        56     */
        57    public Year(Blog blog, int year) {
                 /*
        P/P       *  Method: void net.sourceforge.pebble.domain.Year(Blog, int)
                  *
                  *  Preconditions:
                  *    blog != null
                  *
                  *  Postconditions:
                  *    this.blog != null
                  *    init'ed(this.date)
                  *    this.months == &new Month[](init#1)
                  *    this.year == year
                  *    init'ed(this.year)
                  *    init'ed(new ArrayList(Day#1) num objects)
                  *    init'ed(new ArrayList(Day#2) num objects)
                  *    init'ed(new ArrayList(Day#3) num objects)
                  *    init'ed(new Day(Month#2) num objects)
                  *    init'ed(new Day(Month#2).blog)
                  *    ...
                  */
        58      super(blog);
        59
        60      this.year = year;
        61      init();
        62    }
        63
        64    /**
        65     * Initialises internal data, such as the collection of Month instances.
        66     */
        67    private void init() {
                 /*
        P/P       *  Method: void init()
                  *
                  *  Preconditions:
                  *    this.blog != null
                  *    init'ed(this.year)
                  *
                  *  Postconditions:
                  *    init'ed(this.date)
                  *    this.months == &new Month[](init#1)
                  *    init'ed(this.months[...])
                  *    init'ed(new ArrayList(Day#1) num objects)
                  *    init'ed(new ArrayList(Day#2) num objects)
                  *    init'ed(new ArrayList(Day#3) num objects)
                  *    init'ed(new Day(Month#2) num objects)
                  *    init'ed(new Day(Month#2).blog)
                  *    init'ed(new Day(Month#2).blogEntries)
                  *    init'ed(new Day(Month#2).date)
                  *    ...
                  */
        68      setDate(getCalendar().getTime());
        69      this.months = new Month[12];
        70
        71      for (int i = 1; i <= 12; i++) {
        72        months[i-1] = new Month(this, i);
        73      }
        74    }
        75
        76    private Calendar getCalendar() {
        77      // set the date corresponding to the 1st of January of the specified year
                 /*
        P/P       *  Method: Calendar getCalendar()
                  *
                  *  Preconditions:
                  *    this.blog != null
                  *    init'ed(this.year)
                  *
                  *  Presumptions:
                  *    net.sourceforge.pebble.domain.Blog:getCalendar(...)@78 != null
                  *
                  *  Postconditions:
                  *    (soft) return_value != null
                  */
        78      Calendar cal = getBlog().getCalendar();
        79      cal.set(Calendar.YEAR, year);
        80      cal.set(Calendar.MONTH, 0);
        81      cal.set(Calendar.DAY_OF_MONTH, 2);
        82      cal.set(Calendar.HOUR_OF_DAY, 0);
        83      cal.set(Calendar.MINUTE, 0);
        84      cal.set(Calendar.SECOND, 0);
        85      cal.set(Calendar.MILLISECOND, 0);
        86
        87      return cal;
        88    }
        89
        90    /**
        91     * Gets an integer representing the year that this yearly blog is for.
        92     *
        93     * @return  an int representing the year (e.g. 2003)
        94     */
        95    public int getYear() {
                 /*
        P/P       *  Method: int getYear()
                  *
                  *  Preconditions:
                  *    init'ed(this.year)
                  *
                  *  Postconditions:
                  *    return_value == this.year
                  *    init'ed(return_value)
                  */
        96      return year;
        97    }
        98
        99    /**
       100     * Gets the Month for the specified month. Months are lazy
       101     * loaded as needed.
       102     *
       103     * @param month   the month as an int
       104     * @return  a Month instance
       105     */
       106    public synchronized Month getBlogForMonth(int month) {
       107
       108      // some bounds checking
                 /*
        P/P       *  Method: Month getBlogForMonth(int)
                  *
                  *  Preconditions:
                  *    month in 1..12
                  *    this.months != null
                  *    this.months.length >= 1
                  *    month <= this.months.length
                  *    (soft) init'ed(this.months[...])
                  *
                  *  Postconditions:
                  *    return_value == this.months[...]
                  *    init'ed(return_value)
                  */
       109      if (month < 1 || month > 12) {
       110        throw new IllegalArgumentException("Invalid month of " + month + " specified, should be between 1 and 12");
       111      }
       112
       113      return months[month-1];
       114    }
       115
       116    /**
       117     * Given a Month, this method returns the Month instance for the
       118     * previous month.
       119     *
       120     * @param month   a Month instance
       121     * @return  a Month instance representing the previous month
       122     */
       123    Month getBlogForPreviousMonth(Month month) {
                 /*
        P/P       *  Method: Month getBlogForPreviousMonth(Month)
                  *
                  *  Preconditions:
                  *    month != null
                  *    month.month <= 13
                  *    (soft) month.month <= this.months.length + 1
                  *    (soft) this.blog != null
                  *    (soft) this.months != null
                  *    (soft) init'ed(this.months[...])
                  *
                  *  Postconditions:
                  *    init'ed(return_value)
                  *
                  *  Test Vectors:
                  *    month.month: {-231..1}, {2..13}
                  *
                  *  Preconditions:
                  *    (soft) this.blog.years != null
                  *    (soft) this.year >= -231+1
                  *
                  *  Presumptions:
                  *    getBlogForPreviousYear(...).months.length@127 >= 12
                  *    getBlogForPreviousYear(...).months@127 != null
                  *
                  *  Postconditions:
                  *    init'ed(new ArrayList(Day#1) num objects)
                  *    init'ed(new ArrayList(Day#2) num objects)
                  *    init'ed(new ArrayList(Day#3) num objects)
                  *    init'ed(new Day(Month#2) num objects)
                  *    init'ed(new Day(Month#2).blog)
                  *    init'ed(new Day(Month#2).blogEntries)
                  *    init'ed(new Day(Month#2).date)
                  *    init'ed(new Day(Month#2).day)
                  *    init'ed(new Day(Month#2).month)
                  *    init'ed(new Day(Month#2).publishedBlogEntries)
                  *    ...
                  */
       124      if (month.getMonth() > 1) {
       125        return this.getBlogForMonth(month.getMonth() - 1);
       126      } else {
       127        return getBlog().getBlogForPreviousYear(this).getBlogForMonth(12);
       128      }
       129    }
       130
       131    /**
       132     * Given a Month, this method returns the Month instance for the
       133     * next month.
       134     *
       135     * @param month   a Month instance
       136     * @return  a Month instance representing the next month
       137     */
       138    Month getBlogForNextMonth(Month month) {
                 /*
        P/P       *  Method: Month getBlogForNextMonth(Month)
                  *
                  *  Preconditions:
                  *    month != null
                  *    month.month >= 0
                  *    (soft) month.month - this.months.length in {-Inf..-1, 12..232-1}
                  *    (soft) this.blog != null
                  *    (soft) this.months != null
                  *    (soft) init'ed(this.months[...])
                  *
                  *  Postconditions:
                  *    init'ed(return_value)
                  *
                  *  Test Vectors:
                  *    month.month: {12..232-1}, {0..11}
                  *
                  *  Preconditions:
                  *    (soft) this.blog.years != null
                  *    (soft) this.year <= 232-2
                  *
                  *  Presumptions:
                  *    getBlogForNextYear(...).months.length@142 >= 1
                  *    getBlogForNextYear(...).months@142 != null
                  *
                  *  Postconditions:
                  *    init'ed(new ArrayList(Day#1) num objects)
                  *    init'ed(new ArrayList(Day#2) num objects)
                  *    init'ed(new ArrayList(Day#3) num objects)
                  *    init'ed(new Day(Month#2) num objects)
                  *    init'ed(new Day(Month#2).blog)
                  *    init'ed(new Day(Month#2).blogEntries)
                  *    init'ed(new Day(Month#2).date)
                  *    init'ed(new Day(Month#2).day)
                  *    init'ed(new Day(Month#2).month)
                  *    init'ed(new Day(Month#2).publishedBlogEntries)
                  *    ...
                  */
       139      if (month.getMonth() < 12) {
       140        return this.getBlogForMonth(month.getMonth() + 1);
       141      } else {
       142        return getBlog().getBlogForNextYear(this).getBlogForMonth(1);
       143      }
       144    }
       145
       146    /**
       147     * Gets the first Month that actually contains blog entries.
       148     *
       149     * @return  a Month instance
       150     */
       151    public Month getBlogForFirstMonth() {
                 /*
        P/P       *  Method: Month getBlogForFirstMonth()
                  *
                  *  Preconditions:
                  *    this.months != null
                  *    this.months.length >= 1
                  *    (soft) init'ed(this.months[...])
                  *
                  *  Postconditions:
                  *    return_value == this.months[...]
                  *    init'ed(return_value)
                  */
       152      return getBlogForMonth(1);
       153    }
       154
       155    /**
       156     * Gets a collection of all Months managed by this blog.
       157     *
       158     * @return  a Collection of Month instances
       159     */
       160    public Month[] getMonths() {
                 /*
        P/P       *  Method: Month[] getMonths()
                  *
                  *  Preconditions:
                  *    (soft) this.months != null
                  *    (soft) this.months.length >= 1
                  *    (soft) init'ed(this.months[...])
                  *
                  *  Postconditions:
                  *    return_value == &new Month[](getMonths#1)
                  *    new Month[](getMonths#1) num objects == 1
                  *    return_value.length == 12
                  *    return_value[...] == null
                  */
       161      Month[] months = new Month[12];
       162      for (int i = 1; i <= 12; i++) {
       163        months[i-1] = getBlogForMonth(i);
       164      }
       165
       166      return months;
       167    }
       168
       169    /**
       170     * Gets a collection of all Months, to date and in reverse order.
       171     *
       172     * @return  a Collection of Month instances
       173     */
       174    public List<Month> getArchives() {
                 /*
        P/P       *  Method: List getArchives()
                  *
                  *  Preconditions:
                  *    this.blog != null
                  *    (soft) this.months != null
                  *    (soft) this.months.length >= 1
                  *    (soft) this.months[...] != null
                  *    (soft) this.months[...].date != null
                  *
                  *  Postconditions:
                  *    return_value == &new LinkedList(getArchives#1)
                  *    new LinkedList(getArchives#1) num objects == 1
                  *
                  *  Test Vectors:
                  *    java.util.Date:after(...)@267: {1}, {0}
                  *    java.util.Date:before(...)@256: {1}, {0}
                  *
                  *  Preconditions:
                  *    init'ed(this.blog.blogEntryIndex)
                  *    this.blog.properties != null
                  *    this.blog.years != null
                  *    (soft) init'ed(this.blog.blogEntryIndex.indexEntries)
                  */
       175      List<Month> list = new LinkedList<Month>();
       176      Month thisMonth = getBlog().getBlogForThisMonth();
       177      Month firstMonth = getBlog().getBlogForFirstMonth();
       178      for (int i = 12; i >=1; i--) {
       179        Month month = getBlogForMonth(i);
    +  180        if (!month.after(thisMonth) && !month.before(firstMonth)) {
       181          list.add(month);
       182        }
       183      }
       184
       185      return list;
       186    }
       187
       188    /**
       189     * Compares this object with the specified object for order.  Returns a
       190     * negative integer, zero, or a positive integer as this object is less
       191     * than, equal to, or greater than the specified object.<p>
       192     *
       193     * @param o the Object to be compared.
       194     * @return a negative integer, zero, or a positive integer as this object
       195     *         is less than, equal to, or greater than the specified object.
       196     * @throws ClassCastException if the specified object's type prevents it
       197     *                            from being compared to this Object.
       198     */
       199    public int compareTo(Object o) {
                 /*
        P/P       *  Method: int compareTo(Object)
                  *
                  *  Preconditions:
                  *    o != null
                  *    init'ed(o.year)
                  *    o.year - this.year in -232+1..231
                  *    init'ed(this.year)
                  *
                  *  Postconditions:
                  *    return_value == -(o.year - this.year)
                  *    init'ed(return_value)
                  */
       200      return this.getYear() - ((Year)o).getYear();
       201    }
       202
       203    /**
       204     * Gets a string representation of this object.
       205     *
       206     * @return  a String
       207     */
       208    public String toString() {
                 /*
        P/P       *  Method: String toString()
                  *
                  *  Preconditions:
                  *    init'ed(this.year)
                  *
                  *  Postconditions:
                  *    return_value != null
                  */
       209      return "" + this.year;
       210    }
       211
       212  }

SofCheck Inspector Build Version : 2.22510

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