001 /**
002 * Copyright (c) 2010, SIB. All rights reserved.
003 *
004 * SIB (Swiss Institute of Bioinformatics) - http://www.isb-sib.ch Host -
005 * https://sourceforge.net/projects/javaprotlib/
006 *
007 * Redistribution and use in source and binary forms, with or without
008 * modification, are permitted provided that the following conditions are met:
009 * Redistributions of source code must retain the above copyright notice, this
010 * list of conditions and the following disclaimer. Redistributions in binary
011 * form must reproduce the above copyright notice, this list of conditions and
012 * the following disclaimer in the documentation and/or other materials provided
013 * with the distribution. Neither the name of the SIB/GENEBIO nor the names of
014 * its contributors may be used to endorse or promote products derived from this
015 * software without specific prior written permission.
016 *
017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
020 * ARE DISCLAIMED. IN NO EVENT SHALL SIB/GENEBIO BE LIABLE FOR ANY DIRECT,
021 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
024 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027 */
028 package org.expasy.jpl.commons.collection.symbol.seq;
029
030
031 import java.util.Arrays;
032 import java.util.Collection;
033 import org.expasy.jpl.commons.collection.symbol.seq.SymbolSequenceImpl.Builder;
034
035
036 /**
037 * This class simply concatenates {@code SymbolSequence}s in a new {@code
038 * SymbolSequence}.
039 *
040 * @author nikitin
041 *
042 * @param <T> the symbol type.
043 *
044 * @version 1.0
045 */
046 public final class SequenceSymbolMergerImpl<T> implements SequenceMerger<T> {
047
048 /** the merged sequence */
049 private SymbolSequenceImpl<T> sequence;
050
051 /** private constructor */
052 private SequenceSymbolMergerImpl() {}
053
054 /**
055 * Build a new merger.
056 *
057 * @param <T> the symbol type.
058 * @return a new instance of {@code JPLSymbolSequenceMerger}
059 */
060 public static <T> SequenceSymbolMergerImpl<T> newInstance() {
061 return new SequenceSymbolMergerImpl<T>();
062 }
063
064 /**
065 * {@inheritDoc}
066 */
067 @SuppressWarnings("unchecked")
068 public void process(SymbolSequence<T> seq1, SymbolSequence<T> seq2) {
069 process(Arrays.asList(seq1, seq2));
070 }
071
072 /**
073 * Concatenate all sequences.
074 *
075 * @param sequences the sequences to concatenate.
076 *
077 */
078 public void process(Collection<SymbolSequence<T>> sequences) {
079
080 StringBuilder concat = new StringBuilder();
081
082 boolean hasAmbiguousSeq = false;
083 for (SymbolSequence<T> seq : sequences) {
084 concat.append(seq.toString());
085
086 if (seq.isAmbiguous()) {
087 hasAmbiguousSeq = true;
088 }
089 }
090
091 SymbolSequence<T> firstSeq = sequences.iterator().next();
092
093 Builder<T> builder =
094 new SymbolSequenceImpl.Builder<T>(concat.toString(), firstSeq
095 .getSymbolType());
096
097 if (hasAmbiguousSeq) {
098 builder.ambiguityEnabled();
099 }
100
101 sequence = builder.build();
102 }
103
104 /**
105 * {@inheritDoc}
106 */
107 public SymbolSequenceImpl<T> getMergedSequence() {
108 return sequence;
109 }
110
111 }