mekhq.campaign.universe.NewsItem.java Source code

Java tutorial

Introduction

Here is the source code for mekhq.campaign.universe.NewsItem.java

Source

/*
 * NewsItem.java
 * 
 * Copyright (c) 2011 Jay Lawson <jaylawson39 at yahoo.com>. All rights reserved.
 * 
 * This file is part of MekHQ.
 * 
 * MekHQ is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * MekHQ is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with MekHQ.  If not, see <http://www.gnu.org/licenses/>.
 */

package mekhq.campaign.universe;

import java.util.Locale;
import java.util.Random;

import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.chrono.GJChronology;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import mekhq.Utilities;

/**
 * NewsItem
 * 
 * @author Jay Lawson <jaylawson39 at yahoo.com>
 */
@XmlRootElement(name = "newsItem")
@XmlAccessorType(XmlAccessType.FIELD)
public class NewsItem {
    private final static DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd")
            .withChronology(GJChronology.getInstanceUTC());

    @XmlTransient
    private DateTime date;
    @XmlTransient
    private Precision datePrecision;
    private String headline;
    @XmlElement(name = "desc")
    private String description;
    private String service;
    private String location;

    @XmlElement(name = "date")
    private String dateString;

    //ids will only be assigned when news is read in for the year
    transient private int id;

    public NewsItem() {
        this.headline = "None";
        this.location = null;
        this.date = null;
        this.description = null;
        this.service = null;
    }

    public String getHeadline() {
        return headline;
    }

    public void setHeadline(String headline) {
        this.headline = Utilities.nonNull(headline, this.headline);
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getService() {
        return service;
    }

    public void setService(String service) {
        this.service = service;
    }

    public DateTime getDate() {
        return date;
    }

    public void setDate(DateTime date) {
        this.date = date;
    }

    public int getId() {
        return id;
    }

    public void setId(int i) {
        id = i;
    }

    public int getYear() {
        return date.getYear();
    }

    /** Finalize this news item's date according to its precision, using the supplied seed */
    public void finalizeDate(long seed) {
        if ((null == date) || (null == datePrecision) || (datePrecision == Precision.DAY)) {
            return;
        }
        Random rnd = new Random(seed + date.getMillis());
        int maxRandomDays = 0;
        switch (datePrecision) {
        case MONTH:
            maxRandomDays = Days.daysBetween(date, date.plusMonths(1)).getDays();
            break;
        case YEAR:
            maxRandomDays = Days.daysBetween(date, date.plusYears(1)).getDays();
            break;
        case DECADE:
            maxRandomDays = Days.daysBetween(date, date.plusYears(10)).getDays();
            break;
        default:
            return;
        }
        date = date.plusDays(rnd.nextInt(maxRandomDays));
        datePrecision = Precision.DAY;
    }

    // Precision-aware year checker
    public boolean isInYear(int year) {
        if (null == date) {
            return false;
        }
        if (datePrecision == Precision.DECADE) {
            return ((year / 10) * 10 == date.getYear());
        }
        return year == date.getYear();
    }

    public String getPrefix() {
        String prefix = "";
        if (null != location) {
            prefix = location;
        }
        if (null != service) {
            if (!prefix.isEmpty()) {
                prefix += " ";
            }
            prefix += "[" + service + "]";
        }
        if (!prefix.isEmpty()) {
            prefix += " - ";
        }
        return prefix;
    }

    public String getHeadlineForReport() {
        String s = getPrefix() + "<b>" + getHeadline() + "</b>";
        if (null != description) {
            s += " [<a href='NEWS|" + getId() + "'>read more</a>]";
        }
        return s;
    }

    public String getFullDescription() {
        String s = "<html><h1>" + getHeadline() + "</h1>(" + date.toString(FORMATTER) + ")<br><p>" + getPrefix()
                + description + "</p></html>";
        return s;
    }

    // JAXB marshalling support

    @SuppressWarnings({ "unused" })
    private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
        if (null != dateString) {
            dateString = dateString.trim().toUpperCase(Locale.ROOT);
            // Try to parse and set proper precision
            if (dateString.matches("^\\d\\d\\dX$")) {
                date = FORMATTER.parseDateTime(dateString.substring(0, 3) + "0-01-01");
                datePrecision = Precision.DECADE;
            } else if (dateString.matches("^\\d\\d\\d\\d$")) {
                date = FORMATTER.parseDateTime(dateString + "-01-01");
                datePrecision = Precision.YEAR;
            } else if (dateString.matches("^\\d\\d\\d\\d-\\d\\d$")) {
                date = FORMATTER.parseDateTime(dateString + "-01");
                datePrecision = Precision.MONTH;
            } else {
                date = FORMATTER.parseDateTime(dateString);
                datePrecision = Precision.DAY;
            }
        }
    }

    /** News precision enum */
    public static enum Precision {
        DAY, MONTH, YEAR, DECADE
    }
}