/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview 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. * * Jalview 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 Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.datamodel; import org.apache.logging.log4j.util.Strings; public class SequenceDummy extends Sequence { public SequenceDummy(String sequenceId) { super(sequenceId, "THISAPLACEHOLDER"); } private boolean dummy = true; /** * become a proxy for mseq, merging any existing annotation on this sequence * * @param mseq */ public void become(SequenceI mseq) { initSeqFrom(mseq, null); dummy = false; } /** * Test if the SequenceDummy has been promoted to a real sequence via * SequenceDummy.become * * @return true if this is a placeholder and contains no actual sequence data */ public boolean isDummy() { return dummy; } /** * Always suppress /start-end for display name as we don't know it */ @Override public String getDisplayId(boolean jvsuffix) { // required for correct behaviour of SequenceIdMatcher return super.getDisplayId(false); } @Override public int getStart() { return super.getStart(); } @Override public int getEnd() { if (datasetSequence == null && dummy && getFeatures() != null && getFeatures().hasFeatures()) { return getFeatures().getFeatureExtent().get(1); } return super.getEnd(); } @Override public char[] getSequence() { checkSeqData(); return super.getSequence(); } @Override public String getSequenceAsString(int start, int end) { checkSeqData(); return super.getSequenceAsString(start, end); } private void checkSeqData() { // materialise a dummy sequence of the correct length if (datasetSequence == null && dummy && getFeatures() != null && getFeatures().hasFeatures()) { int endS = getEnd(); char[] sq = super.getSequence(); if (endS > sq.length) { setSequence( String.valueOf(sq) + Strings.repeat("X", endS - sq.length)); } } } @Override public String getSequenceAsString() { checkSeqData(); return super.getSequenceAsString(); } @Override public SequenceI createDatasetSequence() { if (dummy && datasetSequence == null) { checkSeqData(); datasetSequence = new SequenceDummy(this.getName()); super.updateDatasetFrom((Sequence) datasetSequence, this); super.setEnd(datasetSequence.getEnd()); } return super.createDatasetSequence(); } }