package org.jabref.model.entry; import java.util.Arrays; import java.util.List; import java.util.Optional; /** * This class represents all supported BibTex entry types. * <p> * Article, Book, Booklet, Conference, Inbook, Incollection, Inproceedings, * Manual, Mastersthesis, Misc, Phdthesis, Proceedings, Techreport, Unpublished */ public class BibtexEntryTypes { /** * An article from a journal or magazine. * <p> * Required fields: author, title, journal, year. * Optional fields: volume, number, pages, month, note. */ public static final EntryType ARTICLE = new BibtexEntryType() { { addAllRequired(FieldName.AUTHOR, FieldName.TITLE, FieldName.JOURNAL, FieldName.YEAR); addAllOptional(FieldName.VOLUME, FieldName.NUMBER, FieldName.PAGES, FieldName.MONTH, FieldName.ISSN, FieldName.NOTE); } @Override public String getName() { return "Article"; } }; /** * A book with an explicit publisher. * <p> * Required fields: author or editor, title, publisher, year. * Optional fields: volume or number, series, address, edition, month, note. */ public static final EntryType BOOK = new BibtexEntryType() { { addAllRequired(FieldName.TITLE, FieldName.PUBLISHER, FieldName.YEAR, FieldName.orFields(FieldName.AUTHOR, FieldName.EDITOR)); addAllOptional(FieldName.VOLUME, FieldName.NUMBER, FieldName.SERIES, FieldName.ADDRESS, FieldName.EDITION, FieldName.MONTH, FieldName.ISBN, FieldName.NOTE); } @Override public String getName() { return "Book"; } }; /** * A work that is printed and bound, but without a named publisher or sponsoring institution. * <p> * Required field: title. * Optional fields: author, howpublished, address, month, year, note. */ public static final EntryType BOOKLET = new BibtexEntryType() { { addAllRequired(FieldName.TITLE); addAllOptional(FieldName.AUTHOR, FieldName.HOWPUBLISHED, FieldName.ADDRESS, FieldName.MONTH, FieldName.YEAR, FieldName.NOTE); } @Override public String getName() { return "Booklet"; } }; /** * An article in a conference proceedings. * <p> * Required fields: author, title, booktitle, year. * Optional fields: editor, volume or number, series, pages, address, month, organization, publisher, note. */ public static final EntryType CONFERENCE = new BibtexEntryType() { { addAllRequired(FieldName.AUTHOR, FieldName.TITLE, FieldName.BOOKTITLE, FieldName.YEAR); addAllOptional(FieldName.EDITOR, FieldName.VOLUME, FieldName.NUMBER, FieldName.SERIES, FieldName.PAGES, FieldName.ADDRESS, FieldName.MONTH, FieldName.ORGANIZATION, FieldName.PUBLISHER, FieldName.NOTE); } @Override public String getName() { return "Conference"; } }; /** * A part of a book, which may be a chapter (or section or whatever) and/or a range of pages. * <p> * Required fields: author or editor, title, chapter and/or pages, publisher, year. * Optional fields: volume or number, series, type, address, edition, month, note. */ public static final EntryType INBOOK = new BibtexEntryType() { { addAllRequired(FieldName.orFields(FieldName.CHAPTER, FieldName.PAGES), FieldName.TITLE, FieldName.PUBLISHER, FieldName.YEAR, FieldName.orFields(FieldName.AUTHOR, FieldName.EDITOR)); addAllOptional(FieldName.VOLUME, FieldName.NUMBER, FieldName.SERIES, FieldName.TYPE, FieldName.ADDRESS, FieldName.EDITION, FieldName.MONTH, FieldName.ISBN, FieldName.NOTE); } @Override public String getName() { return "InBook"; } }; /** * A part of a book having its own title. * Required fields: author, title, booktitle, publisher, year. * Optional fields: editor, volume or number, series, type, chapter, pages, address, edition, month, note. */ public static final EntryType INCOLLECTION = new BibtexEntryType() { { addAllRequired(FieldName.AUTHOR, FieldName.TITLE, FieldName.BOOKTITLE, FieldName.PUBLISHER, FieldName.YEAR); addAllOptional(FieldName.EDITOR, FieldName.VOLUME, FieldName.NUMBER, FieldName.SERIES, FieldName.TYPE, FieldName.CHAPTER, FieldName.PAGES, FieldName.ADDRESS, FieldName.EDITION, FieldName.MONTH, FieldName.ISBN, FieldName.NOTE); } @Override public String getName() { return "InCollection"; } }; /** * An article in a conference proceedings. * <p> * Required fields: author, title, booktitle, year. * Optional fields: editor, volume or number, series, pages, address, month, organization, publisher, note. */ public static final EntryType INPROCEEDINGS = new BibtexEntryType() { { addAllRequired(FieldName.AUTHOR, FieldName.TITLE, FieldName.BOOKTITLE, FieldName.YEAR); addAllOptional(FieldName.EDITOR, FieldName.VOLUME, FieldName.NUMBER, FieldName.SERIES, FieldName.PAGES, FieldName.ADDRESS, FieldName.MONTH, FieldName.ORGANIZATION, FieldName.PUBLISHER, FieldName.NOTE); } @Override public String getName() { return "InProceedings"; } }; /** * Technical documentation. * Required field: title. * Optional fields: author, organization, address, edition, month, year, note. */ public static final EntryType MANUAL = new BibtexEntryType() { { addAllRequired(FieldName.TITLE); addAllOptional(FieldName.AUTHOR, FieldName.ORGANIZATION, FieldName.ADDRESS, FieldName.EDITION, FieldName.MONTH, FieldName.YEAR, FieldName.ISBN, FieldName.NOTE); } @Override public String getName() { return "Manual"; } }; /** * A Master's thesis. * <p> * Required fields: author, title, school, year. * Optional fields: type, address, month, note. */ public static final EntryType MASTERSTHESIS = new BibtexEntryType() { { addAllRequired(FieldName.AUTHOR, FieldName.TITLE, FieldName.SCHOOL, FieldName.YEAR); addAllOptional(FieldName.TYPE, FieldName.ADDRESS, FieldName.MONTH, FieldName.NOTE); } @Override public String getName() { return "MastersThesis"; } }; /** * Use this type when nothing else fits. * <p> * Required fields: none. * Optional fields: author, title, howpublished, month, year, note. */ public static final EntryType MISC = new BibtexEntryType() { { addAllOptional(FieldName.AUTHOR, FieldName.TITLE, FieldName.HOWPUBLISHED, FieldName.MONTH, FieldName.YEAR, FieldName.NOTE); } @Override public String getName() { return "Misc"; } }; /** * A PhD thesis. * <p> * Required fields: author, title, school, year. * Optional fields: type, address, month, note. */ public static final EntryType PHDTHESIS = new BibtexEntryType() { { addAllRequired(FieldName.AUTHOR, FieldName.TITLE, FieldName.SCHOOL, FieldName.YEAR); addAllOptional(FieldName.TYPE, FieldName.ADDRESS, FieldName.MONTH, FieldName.NOTE); } @Override public String getName() { return "PhdThesis"; } }; /** * The proceedings of a conference. * <p> * Required fields: title, year. * Optional fields: editor, volume or number, series, address, month, organization, publisher, note. */ public static final EntryType PROCEEDINGS = new BibtexEntryType() { { addAllRequired(FieldName.TITLE, FieldName.YEAR); addAllOptional(FieldName.EDITOR, FieldName.VOLUME, FieldName.NUMBER, FieldName.SERIES, FieldName.ADDRESS, FieldName.PUBLISHER, FieldName.MONTH, FieldName.ORGANIZATION, FieldName.ISBN, FieldName.NOTE); } @Override public String getName() { return "Proceedings"; } }; /** * A report published by a school or other institution, usually numbered within a series. * <p> * Required fields: author, title, institution, year. * Optional fields: type, number, address, month, note. */ public static final EntryType TECHREPORT = new BibtexEntryType() { { addAllRequired(FieldName.AUTHOR, FieldName.TITLE, FieldName.INSTITUTION, FieldName.YEAR); addAllOptional(FieldName.TYPE, FieldName.NUMBER, FieldName.ADDRESS, FieldName.MONTH, FieldName.NOTE); } @Override public String getName() { return "TechReport"; } }; /** * A document having an author and title, but not formally published. * <p> * Required fields: author, title, note. * Optional fields: month, year. */ public static final EntryType UNPUBLISHED = new BibtexEntryType() { { addAllRequired(FieldName.AUTHOR, FieldName.TITLE, FieldName.NOTE); addAllOptional(FieldName.MONTH, FieldName.YEAR); } @Override public String getName() { return "Unpublished"; } }; public static final List<EntryType> ALL = Arrays.asList(ARTICLE, INBOOK, BOOK, BOOKLET, INCOLLECTION, CONFERENCE, INPROCEEDINGS, PROCEEDINGS, MANUAL, MASTERSTHESIS, PHDTHESIS, TECHREPORT, UNPUBLISHED, MISC); private BibtexEntryTypes() { } public static Optional<EntryType> getType(String name) { return ALL.stream().filter(e -> e.getName().equalsIgnoreCase(name)).findFirst(); } }