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}