r659 - branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene
Author: fdesbois Date: 2009-10-26 19:18:35 +0100 (Mon, 26 Oct 2009) New Revision: 659 Added: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/FileReader.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelReader.java Log: - Create FileReader abstract - Create ObjectModelReader Added: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/FileReader.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/FileReader.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/FileReader.java 2009-10-26 18:18:35 UTC (rev 659) @@ -0,0 +1,65 @@ + +package org.nuiton.eugene; + +import java.io.File; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.models.Model; + +/** + * FileReader + * + * Created: 26 oct. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public abstract class FileReader<M extends Model> { + + private static final Log log = LogFactory.getLog(FileReader.class); + + /** date de derniere modification de la source la plus recente */ + protected long lastModifiedSource = 0; + + protected void setLastModifiedSource(File[] files) { + for (File file : files) { + if (isNewerThanSource(file)) { + lastModifiedSource = file.lastModified(); + log.debug("source date: " + lastModifiedSource + + " files[i] date: " + file.lastModified() + "(" + file + + ")"); + } + } + } + + protected long getLastModifiedSource() { + return lastModifiedSource; + } + + /** + * @param file fichier a tester + * @return vrai si le fichier passé en parametre est plus recent que + * les sources sur generateur. + */ + protected boolean isNewerThanSource(File file) { + if (log.isDebugEnabled()) { + log.debug("source date: " + getLastModifiedSource() + + " file date: " + file.lastModified() + "(" + file + ")"); + } + return file.lastModified() > getLastModifiedSource(); + } + + public M read(File file, File destDir) { + return read(new File[] { file }, destDir); + } + + public M read(File file) { + return read(new File[] { file }, new File(".")); + } + + public abstract M read(File[] file, File destDir); + +} Added: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelReader.java =================================================================== --- branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelReader.java (rev 0) +++ branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelReader.java 2009-10-26 18:18:35 UTC (rev 659) @@ -0,0 +1,225 @@ + +package org.nuiton.eugene; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.digester.Digester; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.models.Model; +import org.nuiton.eugene.models.object.ObjectModel; +import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelClassifier; +import org.nuiton.eugene.models.object.ObjectModelElement; +import org.nuiton.eugene.models.object.xml.DigesterObjectModelRuleSet; +import org.nuiton.eugene.models.object.xml.ObjectModelClassifierImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelElementImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelImpl; +import org.nuiton.eugene.models.object.xml.ObjectModelImplRef; +import org.nuiton.eugene.models.object.xml.ObjectModelImplTagValue; +import org.nuiton.util.FileUtil; +import org.nuiton.util.RecursiveProperties; +import org.nuiton.util.StringUtil; +import org.xml.sax.SAXException; + +/** + * ObjectModelReader + * + * Created: 26 oct. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class ObjectModelReader extends FileReader<ObjectModel> { + + private static final Log log = LogFactory.getLog(ObjectModelReader.class); + + /** + * L'expression réguliere match les chaines de type + * <package.ClassName>.<class|attribute|operation>.[name].<stereotype|tagvalue>.[tag] + * fr.isisfish.entities.Population.class.stereotype=entity + * fr.isisfish.entities.Population.class.tagvalue.persistenceType=flatfile + * fr.isisfish.entities.Population.attribute.name.stereotype=... + * fr.isisfish.entities.Population.attribute.name.tagvalue.pk=topiaId + * fr.isisfish.entities.Population.operation.getRegion.stereotype=... + * fr.isisfish.entities.Population.operation.getRegion.tagvalue.pk=... + */ + protected Pattern propertiesPattern = Pattern + .compile("((?:[_a-zA-Z0-9]+\\.)+(?:_?[A-Z][_a-zA-Z0-9]*\\.)+)(?:(class|attribute|operation)\\.)(?:([_a-z0-9][_a-zA-Z0-9]*)\\.)?(?:(stereotype|tagvalue)\\.?)([_a-z0-9][_a-zA-Z0-9]*)?"); + + + /** + * @param files les noms des fichiers existant contenant du XML représentant + * des ObjectModel. Il est automatiquement recherche un fichier de + * propriété associé a ce fichier pour pouvoir ajouter des + * stereotype ou des tag value sur les class, attribute ou operation + * @param destDir le répertoire dans lequel il faudra mettre les fichiers + * générés + */ + @Override + public ObjectModel read(File[] files, File destDir) { + setLastModifiedSource(files); + ObjectModel objectModel = new ObjectModelImpl(); + + // Digester parser configuration + Digester digester = new Digester(); + digester.addRuleSet(new DigesterObjectModelRuleSet()); + + for (File file : files) { + try { + digester.push(objectModel); + objectModel = (ObjectModel) digester.parse(file); + } catch (IOException e) { + log.warn("Unable to parse ObjectModel input file : " + file, e); + } catch (SAXException e) { + log.warn("Unable to parse ObjectModel input file : " + file, e); + } + + // recherche est charge le fichier propriete associe au modele + File dir = file.getParentFile(); + String ext = FileUtil.extension(file); + String name = FileUtil.basename(file, "." + ext); + File propFile = new File(dir, name + ".properties"); + RecursiveProperties prop = new RecursiveProperties(); + if (!propFile.exists()) { + if (log.isInfoEnabled()) { + log.info("Pas de fichier de propriete " + propFile + + " associé au model"); + } + } else { + if (log.isInfoEnabled()) { + log.info("Lecture du fichier de propriete " + propFile + + " associé au model"); + } + try { + prop.load(new FileInputStream(propFile)); + } catch (IOException eee) { + log.warn("Impossible de lire le fichier de propriete " + + propFile, eee); + } + + // on ajoute les proprietes du fichier associe au model + for (Enumeration<Object> e = prop.keys(); e.hasMoreElements();) { + String key = (String) e.nextElement(); + String value = prop.getProperty(key); + + if (key.startsWith("model")) { + if (!key.startsWith("model.tagvalue.")) { + log.warn("only tagvalue is allowed on model in properties"); + } else { + String tag = key.substring("model.tagvalue." + .length()); + + ObjectModelImplTagValue tagvalue = new ObjectModelImplTagValue(); + tagvalue.setName(tag); + tagvalue.setValue(value); + ((ObjectModelImpl) objectModel) + .addTagValue(tagvalue); + } + } else { + + Matcher matcher = propertiesPattern.matcher(key); + + if (log.isDebugEnabled()) { + log.debug("Propriete: '" + key + "'"); + } + + if (matcher.find()) { + // fqn is fully qualified name of class + String fqn = matcher.group(1); + fqn = StringUtil.substring(fqn, 0, -1); // remove ended + // . + // target is class, attribute or operation + String target = matcher.group(2); + String targetName = matcher.group(3); + // type is stereotype or tagvalue + String type = matcher.group(4); + String tag = matcher.group(5); + + if (log.isDebugEnabled()) { + log.debug("Propriete: '" + key + "' => " + + "fqn:" + fqn + " target:" + target + + " targetName:" + targetName + + " type:" + type + " tag:" + tag); + } + + ObjectModelClassifier omc = objectModel + .getClassifier(fqn); + if (omc instanceof ObjectModelClassifierImpl) { + // on utilise une liste car il peut y avoir plusieur + // operation avec le nom donné + List<ObjectModelElement> elems = new ArrayList<ObjectModelElement>(); + if ("class".equals(target)) { + elems.add(omc); + } else if ("attribute".equals(target)) { + ObjectModelClass classmodel = (ObjectModelClass) omc; + elems.add(classmodel + .getAttribute(targetName)); + } else if ("operation".equals(target)) { + elems.addAll(omc.getOperations(targetName)); + } + for (Object elem1 : elems) { + ObjectModelElementImpl elem = (ObjectModelElementImpl) elem1; + if ("stereotype".equals(type)) { + // pour les stereotypes + ObjectModelImplRef stereotype = new ObjectModelImplRef(); + stereotype.setName(value); + elem.addStereotype(stereotype); + continue; + } + + if ("tagvalue".equals(type)) { + // pour les tagvalues + ObjectModelImplTagValue tagvalue = new ObjectModelImplTagValue(); + tagvalue.setName(tag); + tagvalue.setValue(value); + if (log.isDebugEnabled()) { + log.debug("tagValue:" + tagvalue + + ", tag:" + tag + + ", value:" + value + + ", element:" + elem); + } + if (elem == null) { + log.warn("can not attach tagValue " + + key); + } else { + elem.addTagValue(tagvalue); + } + } + } + } else { + // TODO il faudra avoir des methodes d'acces en + // Set sur l'interface pour eviter ce message + if (log.isWarnEnabled()) { + log.warn("Can't add properties to model, it's not an ObjectModelClassifierImpl"); + } + } + } + } + } + } + } + if (log.isDebugEnabled()) { + for (ObjectModelClass m : objectModel.getClasses()) { + log.debug("loaded class in objectmodel : " + m.getName()); + } + } + return objectModel; + /*try { + generate(objectModel, destDir); + } catch (IOException eee) { + if (log.isWarnEnabled()) { + log.warn("Unable to generate for file", eee); + } + }*/ + } +}
Le Mon, 26 Oct 2009 19:18:35 +0100 (CET), fdesbois@users.nuiton.org a écrit :
Added: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/FileReader.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelReader.java Log: - Create FileReader abstract - Create ObjectModelReader
Je ne pense pas que cela soit très pertinent d'utiliser un nom de classe de la JDK (java.io.FileReader) car ensuite on est exposé à des collisions de noms si on veut utiliser les deux classes dans la même classe... :) Si tu pouvais le changer ça serait bien ;) -- Tony Chemit -------------------- tél: +33 (0) 2 40 50 29 28 email: chemit@codelutin.com http://www.codelutin.com
Le lundi 26 octobre 2009 à 19:25 +0100, Tony Chemit a écrit :
Le Mon, 26 Oct 2009 19:18:35 +0100 (CET), fdesbois@users.nuiton.org a écrit :
Added: branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/FileReader.java branches/1.1.0-Javabuilder/eugene/src/main/java/org/nuiton/eugene/ObjectModelReader.java Log: - Create FileReader abstract - Create ObjectModelReader
Je ne pense pas que cela soit très pertinent d'utiliser un nom de classe de la JDK (java.io.FileReader) car ensuite on est exposé à des collisions de noms si on veut utiliser les deux classes dans la même classe... :)
Si tu pouvais le changer ça serait bien ;)
Je m'en étais rendu compte lorsque je l'ai importé dans une autre classe. Je l'ai déja renommé en ModelReader :P
participants (3)
-
fdesbois@users.nuiton.org -
Florian Desbois -
Tony Chemit