001    /**
002     *   GRANITE DATA SERVICES
003     *   Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004     *
005     *   This file is part of the Granite Data Services Platform.
006     *
007     *   Granite Data Services is free software; you can redistribute it and/or
008     *   modify it under the terms of the GNU Lesser General Public
009     *   License as published by the Free Software Foundation; either
010     *   version 2.1 of the License, or (at your option) any later version.
011     *
012     *   Granite Data Services 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 Lesser
015     *   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 library; if not, write to the Free Software
019     *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020     *   USA, or see <http://www.gnu.org/licenses/>.
021     */
022    
023    package org.granite.generator;
024    
025    import java.io.IOException;
026    import java.util.ArrayList;
027    import java.util.Collection;
028    
029    import org.granite.generator.exception.GenerationException;
030    import org.granite.generator.exception.TransformerNotFoundException;
031    
032    /**
033     * @author Franck WOLFF
034     */
035    public class Generator extends ArrayList<Transformer<?, ?, ?>> {
036    
037            ///////////////////////////////////////////////////////////////////////////
038            // Fields.
039    
040            private static final long serialVersionUID = 1L;
041    
042            public static final String VERSION = "3.0.0";
043            
044            private Configuration config = null;
045    
046            ///////////////////////////////////////////////////////////////////////////
047            // Constructors.
048            
049            public Generator() {
050            }
051            
052            public Generator(Configuration config) {
053                    this.config = config;
054            }
055    
056            ///////////////////////////////////////////////////////////////////////////
057            // Getters/Setters.
058            
059            public Configuration getConfig() {
060                    return config;
061            }
062    
063            public void setConfig(Configuration config) {
064                    this.config = config;
065            }
066    
067            ///////////////////////////////////////////////////////////////////////////
068            // Generation method.
069            
070            public Output<?>[] generate(Input<?> input) throws IOException, GenerationException {
071                    updateTransformers();
072                    
073                    Transformer<?, ?, ?> transformer = null;
074                    
075                    for (Transformer<?, ?, ?> t : this) {
076                            if (t.accept(input)) {
077                                    transformer = t;
078                                    break;
079                            }
080                    }
081                    
082                    if (transformer == null)
083                            throw new TransformerNotFoundException(input);
084                    
085                    return transformer.generate(input);
086            }
087    
088            ///////////////////////////////////////////////////////////////////////////
089            // Utilities.
090    
091            protected void updateTransformers() {
092                    for (Transformer<?, ?, ?> transformer : this)
093                            transformer.setConfig(config);
094            }
095            
096            protected boolean checkAdd(Transformer<?, ?, ?> transformer) {
097                    if (transformer == null)
098                            throw new NullPointerException("A transformer cannot be null");
099                    return !contains(transformer);
100            }
101    
102            ///////////////////////////////////////////////////////////////////////////
103            // ArrayList overridden methods (check for null & duplicates).
104    
105            @Override
106            public void add(int index, Transformer<?, ?, ?> transformer) {
107                    if (checkAdd(transformer))
108                            super.add(index, transformer);
109            }
110    
111            @Override
112            public boolean add(Transformer<?, ?, ?> transformer) {
113                    if (checkAdd(transformer))
114                            return super.add(transformer);
115                    return false;
116            }
117    
118            @Override
119            public boolean addAll(Collection<? extends Transformer<?, ?, ?>> transformers) {
120                    boolean changed = false;
121                    for (Transformer<?, ?, ?> transformer : transformers) {
122                            if (checkAdd(transformer)) {
123                                    super.add(transformer);
124                                    changed = true;
125                            }
126                    }
127                    return changed;
128            }
129    
130            @Override
131            public boolean addAll(int index, Collection<? extends Transformer<?, ?, ?>> transformers) {
132                    boolean changed = false;
133                    for (Transformer<?, ?, ?> transformer : transformers) {
134                            if (checkAdd(transformer)) {
135                                    super.add(index++, transformer);
136                                    changed = true;
137                            }
138                    }
139                    return changed;
140            }
141    
142            @Override
143            public Transformer<?, ?, ?> set(int index, Transformer<?, ?, ?> transformer) {
144                    if (checkAdd(transformer))
145                            return super.set(index, transformer);
146                    return null;
147            }
148    }