Index: topia2/src/java/org/codelutin/topia/persistence/flatfile/TopiaDAOFlatFile.java diff -u topia2/src/java/org/codelutin/topia/persistence/flatfile/TopiaDAOFlatFile.java:1.3 topia2/src/java/org/codelutin/topia/persistence/flatfile/TopiaDAOFlatFile.java:1.4 --- topia2/src/java/org/codelutin/topia/persistence/flatfile/TopiaDAOFlatFile.java:1.3 Thu Jan 5 04:50:47 2006 +++ topia2/src/java/org/codelutin/topia/persistence/flatfile/TopiaDAOFlatFile.java Fri Jan 6 12:15:20 2006 @@ -23,9 +23,9 @@ * * @author poussin * - * @version $Revision: 1.3 $ + * @version $Revision: 1.4 $ * - * Last update: $Date: 2006/01/05 04:50:47 $ by : $Author: bpoussin $ + * Last update: $Date: 2006/01/06 12:15:20 $ by : $Author: bpoussin $ */ package org.codelutin.topia.persistence.flatfile; @@ -40,6 +40,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; @@ -122,26 +123,26 @@ * l'entity. Si body est présent seul cet attribut sera sauvé. * *
- *      topia.dao.flatfile.mapping.key=topiaId
- *      
- *      topia.dao.flatfile.mapping.fr.ifremer.isisfish.entities.Script.key=name
- *      topia.dao.flatfile.mapping.fr.ifremer.isisfish.entities.Script.body=script
+ *       topia.dao.flatfile.mapping.key=topiaId
+ *       
+ *       topia.dao.flatfile.mapping.fr.ifremer.isisfish.entities.Script.key=name
+ *       topia.dao.flatfile.mapping.fr.ifremer.isisfish.entities.Script.body=script
  * 
* *
- *  TODO: auto généré un id pour TopiaId si dans le mapping il n'y a pas de key
- *  TODO: Pour la version si presence d'un rep CVS on utilise la version
- *        du fichier a l'interieur de Entries comme valeur initial
- *  TODO: modifier le champs version lors d'un update
- *  TODO: permettre dans mapping.body de mettre une liste d'attribute dans ce cas
- *        on sauve toujours sous forme de propriétés mais que les champs demandés
- *  
- *  NOTE: autre idee 
- *  - si on a un body avec un champs unique sauver les autres propriétés
- *    dans une fichier <id>.properties
- *  - peut-etre ameliorer le mapping pour pouvoir mapper une entite sur plusieurs
- *    fichiers
- *  
+ *   TODO: auto généré un id pour TopiaId si dans le mapping il n'y a pas de key
+ *   TODO: Pour la version si presence d'un rep CVS on utilise la version
+ *         du fichier a l'interieur de Entries comme valeur initial
+ *   TODO: modifier le champs version lors d'un update
+ *   TODO: permettre dans mapping.body de mettre une liste d'attribute dans ce cas
+ *         on sauve toujours sous forme de propriétés mais que les champs demandés
+ *   
+ *   NOTE: autre idee 
+ *   - si on a un body avec un champs unique sauver les autres propriétés
+ *     dans une fichier <id>.properties
+ *   - peut-etre ameliorer le mapping pour pouvoir mapper une entite sur plusieurs
+ *     fichiers
+ *   
  * 
* * @author poussin @@ -242,29 +243,19 @@ public void rollbackTransaction() throws TopiaException { } - /* - * (non-Javadoc) - * - * @see org.codelutin.topia.persistence.TopiaDAOAbstract#create(java.lang.Object...) - */ - @Override - public Entity create(Object... properties) throws TopiaException { - // TODO Auto-generated method stub - Entity result = super.create(properties); - getContext().fireOnCreated(result); - return result; - } - /** * Sauve l'entity dans le fichier * * @see org.codelutin.topia.TopiaDAO#update() */ public Entity update(Entity e) throws TopiaException { + Serializable id = getId(e); + getContext().fireVetoableUpdate(entityClass, id); + // le topiaId contient le nom du fichier a partir duquel l'entity // a ete chargé try { - String oldId = e.getTopiaId(); + String oldId = (String)e.getTopiaId(); String newId = (String) PropertyUtils.getProperty(e, key); // Si l'identifiant a changé alors il faut aussi changer le nom @@ -306,7 +297,7 @@ } catch (Exception eee) { if (log.isWarnEnabled()) { log.trace("Unable to find field " + propName - + " on " + c.getName());//, eee); + + " on " + c.getName());// , eee); } } @@ -320,7 +311,7 @@ out.close(); } - getContext().fireOnUpdated(e); + getContext().fireOnUpdated(entityClass, id, e); return e; } catch (IllegalAccessException eee) { @@ -340,14 +331,16 @@ * @see org.codelutin.topia.TopiaDAO#delete() */ public void delete(Entity e) throws TopiaException { + Serializable id = getId(e); + getContext().fireVetoableDelete(entityClass, id); // le topiaId contient le nom du fichier a partir duquel l'entity // a ete chargé - String oldId = e.getTopiaId(); + String oldId = e.getTopiaId().toString(); File f = new File(directory, getFilename(oldId)); cache.remove(f); f.delete(); - getContext().fireOnDeleted(e); + getContext().fireOnDeleted(entityClass, id, e); } @@ -375,29 +368,31 @@ } protected Entity findByFile(File f) throws TopiaException { - try { - long lastModified = f.lastModified(); - Entity e = cache.get(f); - // si on a pas encore l'entity ou que le fichier est plus recent - // il faut relire l'entité + long lastModified = f.lastModified(); + Entity e = cache.get(f); + // si on a pas encore l'entity ou que le fichier est plus recent + // il faut relire l'entité + if (e == null) { + // en fait il ne faut pas recharger s'il est plus recent + // sur le disque car on est dans une transaction, + // si on veut la nouvelle version il faut ouvrire une + // nouvelle transaction + // || e.getTopiaCreateDate().getTime() < lastModified) { + String keyValue = FileUtil.basename(f, "." + ext); + getContext().fireVetoableLoad(entityClass, keyValue); + if (e == null) { - // en fait il ne faut pas recharger s'il est plus recent - // sur le disque car on est dans une transaction, - // si on veut la nouvelle version il faut ouvrire une - // nouvelle transaction - // || e.getTopiaCreateDate().getTime() < lastModified) { - if (e == null) { - e = instanciateNew(); - } - String keyValue = FileUtil.basename(f, "." + ext); - Properties prop = new Properties(); - // on met le topiaCreateDate a lastModified maintenant - // pour qu'il puisse etre ecrassé si on arrive a lire - // une meilleur information dans le fichier. - // FIXME: voir comment en Java recuperer la date de creation - // d'un fichier - prop.put("topiaCreateDate", new Date(lastModified)); + e = instanciateNew(); + } + Properties prop = new Properties(); + // on met le topiaCreateDate a lastModified maintenant + // pour qu'il puisse etre ecrassé si on arrive a lire + // une meilleur information dans le fichier. + // FIXME: voir comment en Java recuperer la date de creation + // d'un fichier + prop.put("topiaCreateDate", new Date(lastModified)); + try { InputStream in = new BufferedInputStream(new FileInputStream(f)); if (body == null) { prop.load(in); @@ -418,23 +413,25 @@ prop.put("topiaId", keyValue); BeanUtils.populate(e, prop); - // on le met en cache car on doit toujours retourner - // la meme instance au cours du temps - cache.put(f, e); + } catch (IOException eee) { + throw new TopiaException( + "Impossible de lire l'entity du fichier: " + f, eee); + } catch (IllegalAccessException eee) { + throw new TopiaException( + "Impossible de mettre le contenu du fichier dans l'entity: " + + f, eee); + } catch (InvocationTargetException eee) { + throw new TopiaException( + "Impossible de mettre le contenu du fichier dans l'entity: " + + f, eee); } - return e; - } catch (IOException eee) { - throw new TopiaException("Impossible de lire l'entity du fichier: " - + f, eee); - } catch (IllegalAccessException eee) { - throw new TopiaException( - "Impossible de mettre le contenu du fichier dans l'entity: " - + f, eee); - } catch (InvocationTargetException eee) { - throw new TopiaException( - "Impossible de mettre le contenu du fichier dans l'entity: " - + f, eee); + + // on le met en cache car on doit toujours retourner + // la meme instance au cours du temps + cache.put(f, e); + getContext().fireOnLoaded(entityClass, keyValue, e); } + return e; } /**