001/*
002 *                    BioJava development code
003 *
004 * This code may be freely distributed and modified under the
005 * terms of the GNU Lesser General Public Licence.  This should
006 * be distributed with the code.  If you do not have a copy,
007 * see:
008 *
009 *      http://www.gnu.org/copyleft/lesser.html
010 *
011 * Copyright for this code is held jointly by the individual
012 * authors.  These should be listed in @author doc comments.
013 *
014 * @author Karl Nicholas <github:karlnicholas>
015 *
016 * For more information on the BioJava project and its aims,
017 * or to join the biojava-l mailing list, visit the home page
018 * at:
019 *
020 *      http://www.biojava.org/
021 *
022 * Created on 01-21-2010
023 */
024package org.biojava.nbio.core.sequence.io;
025
026import org.biojava.nbio.core.exceptions.ParserException;
027import org.biojava.nbio.core.sequence.AccessionID;
028import org.biojava.nbio.core.sequence.io.template.SequenceHeaderParserInterface;
029import org.biojava.nbio.core.sequence.reference.AbstractReference;
030import org.biojava.nbio.core.sequence.template.AbstractSequence;
031import org.biojava.nbio.core.sequence.template.Compound;
032
033import java.util.ArrayList;
034import java.util.List;
035
036import org.biojava.nbio.core.sequence.DataSource;
037
038public class GenericGenbankHeaderParser<S extends AbstractSequence<C>, C extends Compound> implements SequenceHeaderParserInterface<S,C> {
039
040        private String accession = null;
041        private String identifier = null;
042        private String name = null;
043        @SuppressWarnings("unused")
044        private int version;
045        private boolean versionSeen;
046        private ArrayList<String> comments = new ArrayList<>();
047        private List<AbstractReference> references = new ArrayList<>();
048
049        /**
050         * Parse the header and set the values in the sequence
051         * @param header
052         * @param sequence
053         */
054        @Override
055        public void parseHeader(String header, S sequence) {
056                sequence.setOriginalHeader(header);
057                sequence.setAccession(new AccessionID(accession, DataSource.GENBANK, version, identifier));
058                sequence.setDescription(description);
059                sequence.setComments(comments);
060                sequence.setReferences(references);
061        }
062
063        /**
064         * Sets the sequence info back to default values, ie. in order to start
065         * constructing a new sequence from scratch.
066         */
067        @SuppressWarnings("unused")
068        private void reset() {
069                this.version = 0;
070                this.versionSeen = false;
071                this.accession = null;
072                this.description = null;
073                this.identifier = null;
074                this.name = null;
075                this.comments.clear();
076        }
077
078        /**
079         * {@inheritDoc}
080         */
081        public void setVersion(int version) throws ParserException {
082                if (this.versionSeen) throw new ParserException("Current BioEntry already has a version");
083                else {
084                        try {
085                                this.version = version;
086                                this.versionSeen = true;
087                        } catch (NumberFormatException e) {
088                                throw new ParserException("Could not parse version as an integer");
089                        }
090                }
091        }
092
093
094        /**
095         * {@inheritDoc}
096         * The last accession passed to this routine will always be the one used.
097         */
098        public void setAccession(String accession) throws ParserException {
099                if (accession==null) throw new ParserException("Accession cannot be null");
100                this.accession = accession;
101        }
102
103        /**
104         * {@inheritDoc}
105         */
106        public void setDescription(String description) throws ParserException {
107                if (this.description!=null) throw new ParserException("Current BioEntry already has a description");
108                this.description = description;
109        }
110        private String description;
111
112        /**
113         * {@inheritDoc}
114         */
115        public void setIdentifier(String identifier) throws ParserException {
116                if (identifier==null) throw new ParserException("Identifier cannot be null");
117                if (this.identifier!=null) throw new ParserException("Current BioEntry already has a identifier");
118                this.identifier = identifier;
119        }
120
121        /**
122         * {@inheritDoc}
123         */
124        public void setName(String name) throws ParserException {
125                if (name==null) throw new ParserException("Name cannot be null");
126                if (this.name!=null) throw new ParserException("Current BioEntry already has a name");
127                this.name = name;
128        }
129
130        /**
131         * {@inheritDoc}
132         */
133        public void setComment(String comment) throws ParserException {
134                if (comment==null) throw new ParserException("Comment cannot be null");
135                this.comments.add(comment);
136        }
137
138        public void addReference(AbstractReference abstractReference){
139                this.references.add(abstractReference);
140        }
141}