001    /*
002     * JBoss, Home of Professional Open Source.
003     * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004     * as indicated by the @author tags. See the copyright.txt file in the
005     * distribution for a full listing of individual contributors. 
006     *
007     * This is free software; you can redistribute it and/or modify it
008     * under the terms of the GNU Lesser General Public License as
009     * published by the Free Software Foundation; either version 2.1 of
010     * the License, or (at your option) any later version.
011     *
012     * This software is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015     * Lesser General Public License for more details.
016     *
017     * You should have received a copy of the GNU Lesser General Public
018     * License along with this software; if not, write to the Free
019     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021     */
022    package org.jboss.dna.connector.federation.merge;
023    
024    import java.util.Iterator;
025    import java.util.List;
026    import java.util.concurrent.CopyOnWriteArrayList;
027    import net.jcip.annotations.ThreadSafe;
028    import org.jboss.dna.connector.federation.contribution.Contribution;
029    
030    /**
031     * @author Randall Hauch
032     */
033    @ThreadSafe
034    public class MultipleContributionMergePlan extends MergePlan {
035    
036        private static final long serialVersionUID = 1L;
037        private final List<Contribution> contributions = new CopyOnWriteArrayList<Contribution>();
038    
039        /**
040         * @param contributions the contributions for this merge plan
041         */
042        /*package*/MultipleContributionMergePlan( Contribution... contributions ) {
043            assert contributions != null;
044            for (int i = 0; i != contributions.length; ++i) {
045                assert contributions[i] != null;
046                this.contributions.add(contributions[i]);
047            }
048            assert checkEachContributionIsFromDistinctSource();
049        }
050    
051        /**
052         * @param contributions the contributions for this merge plan
053         */
054        /*package*/MultipleContributionMergePlan( Iterable<Contribution> contributions ) {
055            assert contributions != null;
056            for (Contribution contribution : contributions) {
057                assert contribution != null;
058                this.contributions.add(contribution);
059            }
060            assert checkEachContributionIsFromDistinctSource();
061        }
062    
063        /**
064         * @param contributions the contributions for this merge plan
065         */
066        /*package*/MultipleContributionMergePlan( Iterator<Contribution> contributions ) {
067            assert contributions != null;
068            while (contributions.hasNext()) {
069                Contribution contribution = contributions.next();
070                assert contribution != null;
071                this.contributions.add(contribution);
072            }
073            assert checkEachContributionIsFromDistinctSource();
074        }
075    
076        /**
077         * {@inheritDoc}
078         * 
079         * @see org.jboss.dna.connector.federation.merge.MergePlan#getContributionCount()
080         */
081        @Override
082        public int getContributionCount() {
083            return contributions.size();
084        }
085    
086        /**
087         * {@inheritDoc}
088         * 
089         * @see org.jboss.dna.connector.federation.merge.MergePlan#getContributionFrom(java.lang.String)
090         */
091        @Override
092        public Contribution getContributionFrom( String sourceName ) {
093            for (Contribution contribution : contributions) {
094                if (contribution.getSourceName().equals(sourceName)) return contribution;
095            }
096            return null;
097        }
098    
099        /**
100         * {@inheritDoc}
101         * 
102         * @see java.lang.Iterable#iterator()
103         */
104        public Iterator<Contribution> iterator() {
105            final Iterator<Contribution> iterator = this.contributions.iterator();
106            return new Iterator<Contribution>() {
107                public boolean hasNext() {
108                    return iterator.hasNext();
109                }
110    
111                public Contribution next() {
112                    return iterator.next();
113                }
114    
115                public void remove() {
116                    throw new UnsupportedOperationException();
117                }
118            };
119        }
120    
121        /**
122         * {@inheritDoc}
123         * 
124         * @see org.jboss.dna.connector.federation.merge.MergePlan#isSource(java.lang.String)
125         */
126        @Override
127        public boolean isSource( String sourceName ) {
128            for (Contribution contribution : contributions) {
129                if (contribution.getSourceName().equals(sourceName)) return true;
130            }
131            return false;
132        }
133    
134        /**
135         * @param contribution
136         */
137        public void addContribution( Contribution contribution ) {
138            this.contributions.add(contribution);
139        }
140    
141        /**
142         * {@inheritDoc}
143         * 
144         * @see java.lang.Object#hashCode()
145         */
146        @Override
147        public int hashCode() {
148            return contributions.hashCode();
149        }
150    
151    }