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    }