package org.nextprot.api.commons.bio.variation.prot; import org.nextprot.api.commons.bio.AminoAcidCode; import org.nextprot.api.commons.bio.variation.prot.seqchange.SequenceChange; import org.nextprot.api.commons.bio.variation.prot.seqchange.SequenceChangeFormat; import org.nextprot.api.commons.bio.variation.prot.varseq.VaryingSequenceFormatter; import java.text.ParseException; import java.util.Collection; /** * Provides contract for formatting and parsing <code>SequenceVariation</code>s * * Created by fnikitin on 07/09/15. */ public abstract class SequenceVariationFormat implements SequenceVariationFormatter<String>, SequenceVariationParser { @Override public String format(SequenceVariation variation, AminoAcidCode.CodeType type) { StringBuilder sb = new StringBuilder(prefixFormatter()); // format changing amino acids part getChangingSequenceFormatter() .format(variation, type, sb); // format change part //noinspection unchecked getSequenceChangeFormat(variation.getSequenceChange().getType()) .format(sb, variation.getSequenceChange(), type); return sb.toString(); } @Override public SequenceVariation parse(String source, SequenceVariationBuilder.FluentBuilding builder) throws ParseException { for (SequenceChange.Type changeType : getAvailableChangeTypes()) { SequenceChangeFormat format = getSequenceChangeFormat(changeType); if (format.matches(source)) return format.parse(source, builder); } throw new ParseException(source + ": not a valid protein sequence variation", 0); } // prefix the protein sequence format protected String prefixFormatter() { return ""; } // get the changing sequence formatter protected abstract VaryingSequenceFormatter getChangingSequenceFormatter(); // get the specific object handling formatting and parsing of sequence change protected abstract SequenceChangeFormat getSequenceChangeFormat(SequenceChange.Type changeType); protected abstract Collection<SequenceChange.Type> getAvailableChangeTypes(); }