001/**
002 *   GRANITE DATA SERVICES
003 *   Copyright (C) 2006-2014 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 */
022package org.granite.generator;
023
024import java.io.IOException;
025import java.util.ArrayList;
026import java.util.Collection;
027
028import org.granite.generator.exception.GenerationException;
029import org.granite.generator.exception.TransformerNotFoundException;
030
031/**
032 * @author Franck WOLFF
033 */
034public class Generator extends ArrayList<Transformer<?, ?, ?>> {
035
036        ///////////////////////////////////////////////////////////////////////////
037        // Fields.
038
039        private static final long serialVersionUID = 1L;
040
041        public static final String VERSION = "3.0.0";
042        
043        private Configuration config = null;
044
045        ///////////////////////////////////////////////////////////////////////////
046        // Constructors.
047        
048        public Generator() {
049        }
050        
051        public Generator(Configuration config) {
052                this.config = config;
053        }
054
055        ///////////////////////////////////////////////////////////////////////////
056        // Getters/Setters.
057        
058        public Configuration getConfig() {
059                return config;
060        }
061
062        public void setConfig(Configuration config) {
063                this.config = config;
064        }
065
066        ///////////////////////////////////////////////////////////////////////////
067        // Generation method.
068        
069        public Output<?>[] generate(Input<?> input) throws IOException, GenerationException {
070                updateTransformers();
071                
072                Transformer<?, ?, ?> transformer = null;
073                
074                for (Transformer<?, ?, ?> t : this) {
075                        if (t.accept(input)) {
076                                transformer = t;
077                                break;
078                        }
079                }
080                
081                if (transformer == null)
082                        throw new TransformerNotFoundException(input);
083                
084                return transformer.generate(input);
085        }
086
087        ///////////////////////////////////////////////////////////////////////////
088        // Utilities.
089
090        protected void updateTransformers() {
091                for (Transformer<?, ?, ?> transformer : this)
092                        transformer.setConfig(config);
093        }
094        
095        protected boolean checkAdd(Transformer<?, ?, ?> transformer) {
096                if (transformer == null)
097                        throw new NullPointerException("A transformer cannot be null");
098                return !contains(transformer);
099        }
100
101        ///////////////////////////////////////////////////////////////////////////
102        // ArrayList overridden methods (check for null & duplicates).
103
104        @Override
105        public void add(int index, Transformer<?, ?, ?> transformer) {
106                if (checkAdd(transformer))
107                        super.add(index, transformer);
108        }
109
110        @Override
111        public boolean add(Transformer<?, ?, ?> transformer) {
112                if (checkAdd(transformer))
113                        return super.add(transformer);
114                return false;
115        }
116
117        @Override
118        public boolean addAll(Collection<? extends Transformer<?, ?, ?>> transformers) {
119                boolean changed = false;
120                for (Transformer<?, ?, ?> transformer : transformers) {
121                        if (checkAdd(transformer)) {
122                                super.add(transformer);
123                                changed = true;
124                        }
125                }
126                return changed;
127        }
128
129        @Override
130        public boolean addAll(int index, Collection<? extends Transformer<?, ?, ?>> transformers) {
131                boolean changed = false;
132                for (Transformer<?, ?, ?> transformer : transformers) {
133                        if (checkAdd(transformer)) {
134                                super.add(index++, transformer);
135                                changed = true;
136                        }
137                }
138                return changed;
139        }
140
141        @Override
142        public Transformer<?, ?, ?> set(int index, Transformer<?, ?, ?> transformer) {
143                if (checkAdd(transformer))
144                        return super.set(index, transformer);
145                return null;
146        }
147}