package dr.util; /** * @author Alexei Drummond * @author Marc A. Suchard */ public class Citation { Author[] authors; String title; int year; String journal; int volume; int startpage; int endpage; Status status; public Citation() { } public Citation(Author[] authors, Status status) { this(authors, null, -1, null, -1, -1, -1, status); if (status != Status.IN_PREPARATION) { throw new CitationException("Only citations in preparation may not contain titles or journals"); } } public Citation(Author[] authors, String title, String journal, Status status) { this(authors, title, -1, journal, -1, -1, -1, status); if (status == Status.PUBLISHED) { throw new CitationException("Published citations must have years, volumes and pages"); } } public Citation(Author[] authors, String title, int year, String journal, int volume, int startpage, int endpage, Status status) { this.authors = authors; this.title = title; this.year = year; this.journal = journal; this.volume = volume; this.startpage = startpage; this.endpage = endpage; this.status = status; } public String toString() { StringBuilder builder = new StringBuilder(); builder.append(authors[0].toString()); for (int i = 1; i < authors.length; i++) { builder.append(", "); builder.append(authors[i].toString()); } builder.append(" ("); switch (status) { case PUBLISHED: builder.append(year); break; default: builder.append(status.getText()); } builder.append(") "); if (title != null) { builder.append(title); } if (journal != null) { builder.append(". "); builder.append(journal); } if (status == Status.PUBLISHED) { builder.append(". "); builder.append(volume); builder.append(", "); builder.append(startpage); if (endpage > 0) builder.append("-").append(endpage); } return builder.toString(); } public String toHTML() { StringBuilder builder = new StringBuilder(); builder.append("<html>"); builder.append(authors[0].toString()); for (int i = 1; i < authors.length; i++) { builder.append(", "); builder.append(authors[i].toString()); } builder.append(" (").append(year).append(") "); builder.append(title).append(". "); builder.append("<i>").append(journal).append("</i>"); builder.append(" <b>").append(volume).append("</b>:"); builder.append(startpage); if (endpage > 0) builder.append("-").append(endpage); builder.append("</html>"); return builder.toString(); } public enum Status { IN_PREPARATION("in preparation"), IN_SUBMISSION("in submission"), IN_PRESS("in press"), ACCEPTED("accepted"), PUBLISHED("published"); Status(String text) { this.text = text; } public String getText() { return text; } private final String text; } class CitationException extends RuntimeException { CitationException(String message) { super(message); } } }