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 }