Index: lutingenerator/src/java/org/codelutin/generator/StateModelGenerator.java diff -u /dev/null lutingenerator/src/java/org/codelutin/generator/StateModelGenerator.java:1.1 --- /dev/null Fri May 25 16:20:13 2007 +++ lutingenerator/src/java/org/codelutin/generator/StateModelGenerator.java Fri May 25 16:20:08 2007 @@ -0,0 +1,174 @@ +/* *##% + * Copyright (C) 2007 Code Lutin + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *##%*/ + +package org.codelutin.generator; + +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + +import org.apache.commons.digester.Digester; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.codelutin.generator.models.state.StateModel; +import org.codelutin.generator.models.state.StateModelState; +import org.codelutin.generator.models.state.StateModelStateChart; +import org.codelutin.generator.models.state.xml.DigesterStateModelRuleSet; +import org.codelutin.generator.models.state.xml.StateModelImpl; +import org.xml.sax.SAXException; + +/** + * StateModelGenerator + * + * Pour utiliser ce type de générateur, il faut implanter au moins une des + * méthodes generateFrom... et le getFilenameFor... associé si l'on souhaite un + * nom de fichier convenable. + * Si dans une méthode generateFrom... on utilise pas le writer (output) alors + * aucun fichier n'est généré. + * + * Le nom de l'argument writer doit absolument etre output et pas autre chose si + * vous souhaitez utiliser le processeur + * {@link org.codelutin.processor.filters.GeneratorTemplatesFilter} pour vous + * s'implifier l'écriture des templates. + * + * @author chatellier + * @version $Revision: 1.1 $ + * + * Last update : $Date: 2007/05/25 16:20:08 $ By : $Author: chatellier $ + */ +public class StateModelGenerator extends ChildGenerator { + + /** Logger for this class */ + private static final Log log = LogFactory.getLog(StateModelGenerator.class); + + /** + * Empty constructor + */ + public StateModelGenerator() { + } + + /** + * Constructor with parent generator + * @param parent parent generator + */ + public StateModelGenerator(Generator parent) { + super(parent); + } + + /* + * (non-Javadoc) + * + * @see org.codelutin.generator.Generator#generate(java.io.File[], + * java.io.File) + */ + @Override + public void generate(File[] files, File destDir) { + + Digester digester = new Digester(); + digester.addRuleSet(new DigesterStateModelRuleSet()); + + StateModel stateModel = new StateModelImpl(); + + // process each file + for (File file : files) { + + // fin a deplacer + try { + digester.push(stateModel); + digester.parse(file); + } catch (IOException e) { + log.warn("Can't read model file", e); + } catch (SAXException e) { + log.warn("Can't read model file", e); + } + } + + // generate code + try { + generate(stateModel, destDir); + } catch (IOException e) { + log.warn("Can't generate code for files", e); + } + } + + /** + * Par défaut, appel {@link generateFromState(Writer,StateModelState)} pour + * tous les etats du model + * + * FIXME la generation par defaut est pas evidente a trouver. + * + * @param stateModel + * Le modele d'état + * @param destDir + * le dossier de destination + */ + public void generate(StateModel stateModel, File destDir) + throws IOException { + // pour tous les diagramme du model + for (StateModelStateChart chart : stateModel.getStateCharts()) { + + // et tous les états de ces diagrammes + for (Object oState : chart.getStates().toArray()) { + StateModelState state = (StateModelState) oState; + String filename = getFilenameFromState(chart, state); + File outputFile = getDestinationFile(destDir, filename); + if (getOverwrite() || !isNewerThanSource(outputFile)) { + try { + StringWriter out = new StringWriter(); + MonitorWriter monitorOut = new MonitorWriter(out); + generateFromState(monitorOut, chart, state); + write(outputFile, monitorOut); + } catch (Exception eee) { + log.warn("Erreur lors de la génération du fichier " + + outputFile); + throw new RuntimeException( + "Erreur lors de la génération du fichier " + + outputFile, eee); + } + } + } + } + } + + /** + * Return filename for a state + * + * @param chart the chart + * @param state the state + * @return the filename + */ + public String getFilenameFromState(StateModelStateChart chart, + StateModelState state) { + return (chart.getPackageName() + '.' + state.getName()).replace('.', + File.separatorChar); + } + + /** + * Generate a state code + * + * @param monitorOut the output writer + * @param chart the chart + * @param state the state + */ + public void generateFromState(Writer monitorOut, + StateModelStateChart chart, StateModelState state) + throws IOException { + + } +}