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
023package org.granite.generator;
024
025import java.io.IOException;
026import java.util.ArrayList;
027import java.util.Collection;
028
029import org.granite.generator.exception.GenerationException;
030import org.granite.generator.exception.TransformerNotFoundException;
031
032/**
033 * @author Franck WOLFF
034 */
035public 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}