Index: lutingenerator/src/java/org/codelutin/generator/StateModelGenerator.java diff -u lutingenerator/src/java/org/codelutin/generator/StateModelGenerator.java:1.1 lutingenerator/src/java/org/codelutin/generator/StateModelGenerator.java:1.2 --- lutingenerator/src/java/org/codelutin/generator/StateModelGenerator.java:1.1 Fri May 25 16:20:08 2007 +++ lutingenerator/src/java/org/codelutin/generator/StateModelGenerator.java Tue May 29 09:58:15 2007 @@ -19,18 +19,35 @@ package org.codelutin.generator; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; import org.apache.commons.digester.Digester; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.codelutin.generator.models.object.ObjectModelClass; +import org.codelutin.generator.models.object.ObjectModelClassifier; +import org.codelutin.generator.models.object.ObjectModelElement; +import org.codelutin.generator.models.object.xml.ObjectModelClassifierImpl; +import org.codelutin.generator.models.object.xml.ObjectModelElementImpl; +import org.codelutin.generator.models.object.xml.ObjectModelImpl; +import org.codelutin.generator.models.object.xml.ObjectModelImplRef; +import org.codelutin.generator.models.object.xml.ObjectModelImplTagValue; 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.codelutin.util.FileUtil; +import org.codelutin.util.RecursiveProperties; +import org.codelutin.util.StringUtil; import org.xml.sax.SAXException; /** @@ -38,9 +55,8 @@ * * 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é. + * 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 @@ -48,15 +64,18 @@ * s'implifier l'écriture des templates. * * @author chatellier - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ * - * Last update : $Date: 2007/05/25 16:20:08 $ By : $Author: chatellier $ + * Last update : $Date: 2007/05/29 09:58:15 $ By : $Author: chatellier $ */ public class StateModelGenerator extends ChildGenerator { /** Logger for this class */ private static final Log log = LogFactory.getLog(StateModelGenerator.class); + /** Model */ + protected StateModel _model; + /** * Empty constructor */ @@ -65,12 +84,22 @@ /** * Constructor with parent generator - * @param parent parent generator + * + * @param parent + * parent generator */ public StateModelGenerator(Generator parent) { super(parent); } + + /** + * @return the _model + */ + public StateModel getModel() { + return _model; + } + /* * (non-Javadoc) * @@ -82,16 +111,19 @@ Digester digester = new Digester(); digester.addRuleSet(new DigesterStateModelRuleSet()); - - StateModel stateModel = new StateModelImpl(); - + + StateModelImpl stateModel = new StateModelImpl(); + // process each file for (File file : files) { - + // fin a deplacer try { digester.push(stateModel); digester.parse(file); + + // try to load property file + loadPropertyFile(file, stateModel); } catch (IOException e) { log.warn("Can't read model file", e); } catch (SAXException e) { @@ -108,10 +140,51 @@ } /** - * Par défaut, appel {@link generateFromState(Writer,StateModelState)} pour - * tous les etats du model + * Try to load property file, associated to current statemodel file * - * FIXME la generation par defaut est pas evidente a trouver. + * @param stateModel + */ + protected void loadPropertyFile(File stateModelFile, StateModelImpl stateModel) { + // recherche et charge le fichier propriete associe au modele + File dir = stateModelFile.getParentFile(); + String ext = FileUtil.extension(stateModelFile); + String name = FileUtil.basename(stateModelFile, "." + ext); + File propFile = new File(dir, name + ".properties"); + RecursiveProperties prop = new RecursiveProperties(); + + if (!propFile.exists()) { + if (log.isInfoEnabled()) { + log.info("No property file associated to model : " + propFile); + } + } else { + if (log.isInfoEnabled()) { + log.info("Reading model property file " + propFile); + } + try { + prop.load(new FileInputStream(propFile)); + } catch (IOException e) { + log.warn("Cannot read property file " + propFile, e); + } + + // on ajoute les proprietes du fichier associe au model + for (Enumeration e = prop.keys(); e.hasMoreElements();) { + String key = (String) e.nextElement(); + String value = prop.getProperty(key); + + if (!key.startsWith("model.tagvalue.")) { + log.warn("only tagvalue is allowed on model in properties"); + } else { + String tag = key.substring("model.tagvalue.".length()); + stateModel.addTagValue(tag, value); + } + } + } + } + + /** + * Par défaut, appel {@link generateFromModel(Writer,StateModel)} pour le + * model et {@link generateFromState(Writer,StateModelState)} pour tous les + * etats du modele. * * @param stateModel * Le modele d'état @@ -120,26 +193,53 @@ */ public void generate(StateModel stateModel, File destDir) throws IOException { - // pour tous les diagramme du model + + _model = stateModel; + + /*********************************************************************** + * generateFromModel * + **********************************************************************/ + String filename = getFilenameFromModel(stateModel); + File outputFile = getDestinationFile(destDir, filename); + if (getOverwrite() || !isNewerThanSource(outputFile)) { + try { + StringWriter out = new StringWriter(); + MonitorWriter monitorOut = new MonitorWriter(out); + generateFromModel(monitorOut, stateModel); + 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); + } + } + + /*********************************************************************** + * generateFromState * + **********************************************************************/ + // pour tous les diagrammes du modele 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)) { + String filenameState = getFilenameFromState(state, chart + .getName()); + File outputFiletate = getDestinationFile(destDir, filenameState); + if (getOverwrite() || !isNewerThanSource(outputFiletate)) { try { StringWriter out = new StringWriter(); MonitorWriter monitorOut = new MonitorWriter(out); - generateFromState(monitorOut, chart, state); - write(outputFile, monitorOut); + generateFromState(monitorOut, state); + write(outputFiletate, monitorOut); } catch (Exception eee) { log.warn("Erreur lors de la génération du fichier " - + outputFile); + + outputFiletate); throw new RuntimeException( "Erreur lors de la génération du fichier " - + outputFile, eee); + + outputFiletate, eee); } } } @@ -147,27 +247,51 @@ } /** - * Return filename for a state + * Generate model code + * + * @param monitorOut + * @param stateModel + */ + protected void generateFromModel(MonitorWriter monitorOut, + StateModel stateModel) { + + } + + /** + * Return filename from model + * + * @param stateModel + * @return + */ + protected String getFilenameFromModel(StateModel stateModel) { + return stateModel.getName(); + } + + /** + * Return filename from state * - * @param chart the chart - * @param state the 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('.', + public String getFilenameFromState(StateModelState state, String packageName) { + return (packageName + '.' + state.getName()).replace('.', File.separatorChar); } /** * Generate a state code * - * @param monitorOut the output writer - * @param chart the chart - * @param state the state + * @param monitorOut + * the output writer + * @param chart + * the chart + * @param state + * the state */ - public void generateFromState(Writer monitorOut, - StateModelStateChart chart, StateModelState state) + public void generateFromState(Writer monitorOut, StateModelState state) throws IOException { }