Index: topia/src/java/org/codelutin/topia/persistence/topia/TopiaStorageSerialization.java diff -u topia/src/java/org/codelutin/topia/persistence/topia/TopiaStorageSerialization.java:1.3 topia/src/java/org/codelutin/topia/persistence/topia/TopiaStorageSerialization.java:1.4 --- topia/src/java/org/codelutin/topia/persistence/topia/TopiaStorageSerialization.java:1.3 Tue Jul 19 13:15:13 2005 +++ topia/src/java/org/codelutin/topia/persistence/topia/TopiaStorageSerialization.java Wed Jul 20 12:49:53 2005 @@ -23,14 +23,14 @@ * Created: 22 juin 2005 12:30:39 CEST * * @author Benjamin POUSSIN - * @version $Revision: 1.3 $ + * @version $Revision: 1.4 $ * - * Last update: $Date: 2005/07/19 13:15:13 $ + * Last update: $Date: 2005/07/20 12:49:53 $ * by : $Author: bpoussin $ */ package org.codelutin.topia.persistence.topia; - +/* import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; @@ -50,358 +50,358 @@ import java.util.Set; import org.codelutin.generator.models.object.ObjectModel; import org.codelutin.topia.TopiaException; +*/ +public class TopiaStorageSerialization /*implements TopiaStorage*/ { // TopiaStorageSerialization -public class TopiaStorageSerialization implements TopiaStorage { // TopiaStorageSerialization - - /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Logger log = Logger.getLogger("org.codelutin.topia.persistence.topia.TopiaStorageSerialization"); + // /** to use log facility, just put in your code: log.info(\"...\"); */ + // static private Logger log = Logger.getLogger("org.codelutin.topia.persistence.topia.TopiaStorageSerialization"); - enum State { - ALL { String getPattern(){return "(STORED|REMOVED)";}}, - STORED { String getPattern(){return "STORED";}}, - REMOVED { String getPattern(){return "REMOVED";}}; - - abstract String getPattern(); - } - - enum FilenameComponent { - DATE { String get(String filename){return filename.split("=")[0];}}, - STATE { String get(String filename){return filename.split("=")[1];}}, - ID { String get(String filename){return filename.split("=")[2];}}, - SCHEMA_VERSION { String get(String filename){return filename.split("=")[3];}}; - - abstract String get(String filename); - } - - class PatternFilenameFilter implements FilenameFilter { - protected long lastDate = 0; - protected Pattern pattern = null; - - public PatternFilenameFilter(Pattern pattern){ - this(pattern, 0); - } - /** - * Recherche tous les fichier correspondant au pattern, et dont la - * date est inferieur ou egal a lastDate. - * @param pattern le pattern que doit respecter le fichier - * @param lastDate la date a ne pas depasser, si date == 0 alors - * on ne verifie pas la date, tous les fichiers correspondant - * au pattern conviennent. - */ - public PatternFilenameFilter(Pattern pattern, long lastDate){ - this.pattern = pattern; - this.lastDate = lastDate; - } + // enum State { + // ALL { String getPattern(){return "(STORED|REMOVED)";}}, + // STORED { String getPattern(){return "STORED";}}, + // REMOVED { String getPattern(){return "REMOVED";}}; + + // abstract String getPattern(); + // } + + // enum FilenameComponent { + // DATE { String get(String filename){return filename.split("=")[0];}}, + // STATE { String get(String filename){return filename.split("=")[1];}}, + // ID { String get(String filename){return filename.split("=")[2];}}, + // SCHEMA_VERSION { String get(String filename){return filename.split("=")[3];}}; + + // abstract String get(String filename); + // } + + // class PatternFilenameFilter implements FilenameFilter { + // protected long lastDate = 0; + // protected Pattern pattern = null; + + // public PatternFilenameFilter(Pattern pattern){ + // this(pattern, 0); + // } + // /** + // * Recherche tous les fichier correspondant au pattern, et dont la + // * date est inferieur ou egal a lastDate. + // * @param pattern le pattern que doit respecter le fichier + // * @param lastDate la date a ne pas depasser, si date == 0 alors + // * on ne verifie pas la date, tous les fichiers correspondant + // * au pattern conviennent. + // */ + // public PatternFilenameFilter(Pattern pattern, long lastDate){ + // this.pattern = pattern; + // this.lastDate = lastDate; + // } - public boolean accept(File dir, String name){ + // public boolean accept(File dir, String name){ // System.out.println("name = " + name + " pattern: " + pattern + " lastDate: " + lastDate); - boolean result = false; - if(pattern.matcher(name).matches()){ - if(lastDate != 0){ - String date = FilenameComponent.DATE.get(name); - result = Long.parseLong(date) <= lastDate; - } else { - result = true; - } - } - return result; - } - } - - protected String getFilename(TopiaPersistenceObject e){ - return getFilePatternString(e.getDate(), - e.isRemoved()?State.REMOVED:State.STORED, - e.getId(), - e.getSchemaVersion()); - } - - /** - * Permet de creer un pattern pour recherche plus facilement un fichier - * @param date si -1 alors recherche toutes les transactions, si 1 recherche - * tous les objets commité, si 0 recherche tous les objets - * autrement recherche la valeur exacte de date - * @param state l'etat dans lequel doit etre l'objet recherché - * @param id si null alors recherche tous les id, sinon recherche l'id exacte - * @param version la version de schema que l'objet doit avoir, si null toutes - * les versions, sinon recherche une version specifique - */ - static protected String getFilePatternString(long date, State state, String id, String version){ - String result = ""; - if(date == -1){ + // boolean result = false; + // if(pattern.matcher(name).matches()){ + // if(lastDate != 0){ + // String date = FilenameComponent.DATE.get(name); + // result = Long.parseLong(date) <= lastDate; + // } else { + // result = true; + // } + // } + // return result; + // } + // } + + // protected String getFilename(TopiaPersistenceObject e){ + // return getFilePatternString(e.getDate(), + // e.isRemoved()?State.REMOVED:State.STORED, + // e.getId(), + // e.getSchemaVersion()); + // } + + // /** + // * Permet de creer un pattern pour recherche plus facilement un fichier + // * @param date si -1 alors recherche toutes les transactions, si 1 recherche + // * tous les objets commité, si 0 recherche tous les objets + // * autrement recherche la valeur exacte de date + // * @param state l'etat dans lequel doit etre l'objet recherché + // * @param id si null alors recherche tous les id, sinon recherche l'id exacte + // * @param version la version de schema que l'objet doit avoir, si null toutes + // * les versions, sinon recherche une version specifique + // */ + // static protected String getFilePatternString(long date, State state, String id, String version){ + // String result = ""; + // if(date == -1){ // -1 indique qu'on recherche une transaction - result += "-[0-9]+="; - } else if(date == 1){ + // result += "-[0-9]+="; + // } else if(date == 1){ // 1 indique qu'on recherche n'import quel objet pas dans une transaction - result += "[0-9]+="; - } else if(date == 0){ - result += "-?[0-9]+="; - } else { + // result += "[0-9]+="; + // } else if(date == 0){ + // result += "-?[0-9]+="; + // } else { // sinon c une vrai date a rechercher exactement - result += dateFormat.format(date) + "="; - } + // result += dateFormat.format(date) + "="; + // } - result += state.getPattern() + "="; + // result += state.getPattern() + "="; - if(id == null){ - result += ".*?="; - } else { - result += id + "="; - } - - if(version == null){ - result += ".*?"; - } else { - result += version; - } - - return result; - } - - static protected Pattern getFilePattern(long date, State state, String id, String version){ - return Pattern.compile("^" + getFilePatternString(date, state, id, version) + "$"); - } - - protected File directory = null; - static protected DecimalFormat dateFormat = new DecimalFormat("00000000000000000000"); - protected TopiaPersistenceHelper tph = null; - - /** - * @param directory le répertoire on les objets sont conservés - */ - public TopiaStorageSerialization(TopiaPersistenceHelper tph){ - this.tph = tph; - this.directory = new File(tph.getProperties().getProperty("TopiaStorageSerialization.directory")); - this.directory.mkdirs(); - } - - /** - * lors de la sauvegarde tous les champs sont sauvé, il faut donc - * que tous les champs soit chargé lorsque l'on fait un restore - */ - public void store(TopiaPersistenceObject e) throws TopiaException { + // if(id == null){ + // result += ".*?="; + // } else { + // result += id + "="; + // } + + // if(version == null){ + // result += ".*?"; + // } else { + // result += version; + // } + + // return result; + // } + + // static protected Pattern getFilePattern(long date, State state, String id, String version){ + // return Pattern.compile("^" + getFilePatternString(date, state, id, version) + "$"); + // } + + // protected File directory = null; + // static protected DecimalFormat dateFormat = new DecimalFormat("00000000000000000000"); + // protected TopiaPersistenceHelper tph = null; + + // /** + // * @param directory le répertoire on les objets sont conservés + // */ + // public TopiaStorageSerialization(TopiaPersistenceHelper tph){ + // this.tph = tph; + // this.directory = new File(tph.getProperties().getProperty("TopiaStorageSerialization.directory")); + // this.directory.mkdirs(); + // } + + // /** + // * lors de la sauvegarde tous les champs sont sauvé, il faut donc + // * que tous les champs soit chargé lorsque l'on fait un restore + // */ + // public void store(TopiaPersistenceObject e) throws TopiaException { // On verifie qu'il faut le sauver - if(e.getDate() < 0 && !TopiaTransaction.isValidTransaction(e.getDate())){ - throw new TopiaException("Tentative de sauvegarde d'un objet de transaction, dont la transaction(" + e.getDate() + ") est terminée: " + e.getId()); - } + // if(e.getDate() < 0 && !TopiaTransaction.isValidTransaction(e.getDate())){ + // throw new TopiaException("Tentative de sauvegarde d'un objet de transaction, dont la transaction(" + e.getDate() + ") est terminée: " + e.getId()); + // } // si c une suppression et qu'aucun champs n'a ete modifié on renome // juste le fichier - if(e.isRemoved() && e.getModifiedFields().size() == 0){ + // if(e.isRemoved() && e.getModifiedFields().size() == 0){ - } else { + // } else { // si l'objet n'est pas encore chargé il faut le faire pour que la // sauvegarde se passe bien - restore(e); - } + // restore(e); + // } // normalement le block suivant ne sert plus a rien car // la date est maintenant toujours unique - File f = new File(directory, getFilename(e)); - while(e.getDate() > 0 && f.exists()){ - e.setDate(e.getDate() + 1); - f = new File(directory, getFilename(e)); - } - - try{ - FileOutputStream fout = new FileOutputStream(f); - ObjectOutputStream out = new ObjectOutputStream(fout); - out.writeObject(e); - fout.close(); + // File f = new File(directory, getFilename(e)); + // while(e.getDate() > 0 && f.exists()){ + // e.setDate(e.getDate() + 1); + // f = new File(directory, getFilename(e)); + // } + + // try{ + // FileOutputStream fout = new FileOutputStream(f); + // ObjectOutputStream out = new ObjectOutputStream(fout); + // out.writeObject(e); + // fout.close(); // on a reussi a l'ecrire on change sont etat - e.setState(TopiaPersistenceObject.State.STORED); - }catch(IOException eee){ - throw new TopiaException("Erreur durant la sauvegarde de l'objet: " + e.getId(), eee); - } - } - - /** - * Si l'objet n'existe pas pour la date demandée, alors on recherche - * la version ayant la date la plus récente. - */ - public void restore(final TopiaPersistenceObject e) throws TopiaException { - if(e.isNew() || e.isStored()){ + // e.setState(TopiaPersistenceObject.State.STORED); + // }catch(IOException eee){ + // throw new TopiaException("Erreur durant la sauvegarde de l'objet: " + e.getId(), eee); + // } + // } + + // /** + // * Si l'objet n'existe pas pour la date demandée, alors on recherche + // * la version ayant la date la plus récente. + // */ + // public void restore(final TopiaPersistenceObject e) throws TopiaException { + // if(e.isNew() || e.isStored()){ // si l'objet est nouveau alors on ne pourra pas le lire car // il n'existe pas // si l'objet est stored alors c que la lecture a deja ete faite // donc ont ne le refait pas - return ; - } + // return ; + // } - File f = new File(directory, getFilename(e)); - if(!f.exists()){ - long last = e.getDate(); - if(last < 0){ - last = - last; - } + // File f = new File(directory, getFilename(e)); + // if(!f.exists()){ + // long last = e.getDate(); + // if(last < 0){ + // last = - last; + // } // recherche de l'objet le plus récent par rapport a last // mais n'appatenant pas a une transaction - String [] files = directory.list(new PatternFilenameFilter( - getFilePattern(1, State.ALL, e.getId(), null), last)); + // String [] files = directory.list(new PatternFilenameFilter( + // getFilePattern(1, State.ALL, e.getId(), null), last)); - if(files != null && files.length > 0){ - Arrays.sort(files); + // if(files != null && files.length > 0){ + // Arrays.sort(files); // le dernier est le plus recent - f = new File(directory, files[files.length-1]); - } - } + // f = new File(directory, files[files.length-1]); + // } + // } // si le fichier n'existe pas ou qu'il est marqué supprimé - if(!f.exists() || "REMOVED".equals(FilenameComponent.STATE.get(f.getName()))){ - throw new TopiaException("Object not found: " + e.getId()); - } - try{ - FileInputStream fin = new FileInputStream(f); - ObjectInputStream in = new ObjectInputStream(fin); - TopiaPersistenceObject o = (TopiaPersistenceObject)in.readObject(); - fin.close(); + // if(!f.exists() || "REMOVED".equals(FilenameComponent.STATE.get(f.getName()))){ + // throw new TopiaException("Object not found: " + e.getId()); + // } + // try{ + // FileInputStream fin = new FileInputStream(f); + // ObjectInputStream in = new ObjectInputStream(fin); + // TopiaPersistenceObject o = (TopiaPersistenceObject)in.readObject(); + // fin.close(); // on met a jour les champs de l'objet si besoin - o = tph.convert(o); + // o = tph.convert(o); // on fusionne les 2 objets // on ecrase les champs de l'objet chargé, par ceux que l'utilisateur // a modifié - o.getAllFields().putAll(e.getAllFields()); - e.setAllFields(o.getAllFields()); + // o.getAllFields().putAll(e.getAllFields()); + // e.setAllFields(o.getAllFields()); // on indique que tout est chargé - e.askedFields.clear(); + // e.askedFields.clear(); // on met a jour la date si besoin - if(e.getDate() == 0){ - String date = FilenameComponent.DATE.get(f.getName()); - e.setDate(Long.parseLong(date)); - } + // if(e.getDate() == 0){ + // String date = FilenameComponent.DATE.get(f.getName()); + // e.setDate(Long.parseLong(date)); + // } // on met a jour la version de l'objet si besoin - if(e.getVersion() == null){ - e.setVersion(o.getVersion()); - } + // if(e.getVersion() == null){ + // e.setVersion(o.getVersion()); + // } // on met a jour l'etat on vient de le // lire, sont etat doit etre STORED - e.setState(TopiaPersistenceObject.State.STORED); + // e.setState(TopiaPersistenceObject.State.STORED); - }catch(IOException eee){ - throw new TopiaException("Erreur durant la restoration de l'objet: " + e.getId(), eee); - }catch(ClassNotFoundException eee){ - throw new TopiaException("Erreur durant la restoration de l'objet: " + e.getId(), eee); - } - } + // }catch(IOException eee){ + // throw new TopiaException("Erreur durant la restoration de l'objet: " + e.getId(), eee); + // }catch(ClassNotFoundException eee){ + // throw new TopiaException("Erreur durant la restoration de l'objet: " + e.getId(), eee); + // } + // } - public long commit(final long transactionId) throws TopiaException{ + // public long commit(final long transactionId) throws TopiaException{ // Il faut que tous les objets soit sauvé arrivé ici // Pour l'instant tout est synchrone donc tout doit etre sauvé - long date = TopiaTransaction.getNextId(); + // long date = TopiaTransaction.getNextId(); // pour commiter une transaction il suffit de renommer les fichiers // de la transaction. - File [] files = directory.listFiles(new PatternFilenameFilter( - getFilePattern(transactionId, State.ALL, null, null))); + // File [] files = directory.listFiles(new PatternFilenameFilter( + // getFilePattern(transactionId, State.ALL, null, null))); - for(File f: files){ - String name = f.getName().replaceFirst("-[0-9]+", dateFormat.format(date)); - File to = new File(directory, name); - f.renameTo(to); - } + // for(File f: files){ + // String name = f.getName().replaceFirst("-[0-9]+", dateFormat.format(date)); + // File to = new File(directory, name); + // f.renameTo(to); + // } - return date; - } + // return date; + // } - public void rollback(long transactionId) throws TopiaException{ + // public void rollback(long transactionId) throws TopiaException{ // Pour un rollback il suffit de supprimer tous les fichiers de la // transaction. - File [] files = directory.listFiles(new PatternFilenameFilter( - getFilePattern(transactionId, State.ALL, null, null))); + // File [] files = directory.listFiles(new PatternFilenameFilter( + // getFilePattern(transactionId, State.ALL, null, null))); - for(File f: files){ - f.delete(); - } - } - - /** - * Retourne tous les objets jusqu'a une certaine date - * @param date si 0 alors tous les objets commité, si negatif - * alors tous les objets visible pour la transaction, si position - * alors tous les objets visible jusqu'a la date comprise - */ - public Set getAllId(long date) throws TopiaException{ - HashSet result = new HashSet(); - - long last = date; - if(date == 0){ - last = TopiaTransaction.getNextId(); - } else if(date < 0){ - last = - date; - } + // for(File f: files){ + // f.delete(); + // } + // } + + // /** + // * Retourne tous les objets jusqu'a une certaine date + // * @param date si 0 alors tous les objets commité, si negatif + // * alors tous les objets visible pour la transaction, si position + // * alors tous les objets visible jusqu'a la date comprise + // */ + // public Set getAllId(long date) throws TopiaException{ + // HashSet result = new HashSet(); + + // long last = date; + // if(date == 0){ + // last = TopiaTransaction.getNextId(); + // } else if(date < 0){ + // last = - date; + // } // on recherche tous les objets qui exist jusqu'a last - String [] files = directory.list(new PatternFilenameFilter( - getFilePattern(1, State.ALL, null, null), last)); + // String [] files = directory.list(new PatternFilenameFilter( + // getFilePattern(1, State.ALL, null, null), last)); // System.out.println("files: " + Arrays.toString(files)); - Arrays.sort(files); - for(String name: files){ - String id = FilenameComponent.ID.get(name); - if("STORED".equals(FilenameComponent.STATE.get(name))){ - result.add(id); - } else { - result.remove(id); - } - } + // Arrays.sort(files); + // for(String name: files){ + // String id = FilenameComponent.ID.get(name); + // if("STORED".equals(FilenameComponent.STATE.get(name))){ + // result.add(id); + // } else { + // result.remove(id); + // } + // } // si date est un id de transaction on ajoute les nouveaux objet // et on supprime les objets supprimé - if(date < 0){ + // if(date < 0){ // on recherche tous les objets de la transaction - files = directory.list(new PatternFilenameFilter( - getFilePattern(date, State.ALL, null, null))); + // files = directory.list(new PatternFilenameFilter( + // getFilePattern(date, State.ALL, null, null))); - for(String name: files){ - String id = name.substring(name.lastIndexOf('=') + 1); - if("STORED".equals(FilenameComponent.STATE.get(name))){ - result.add(id); - } else { - result.remove(id); - } - } - } + // for(String name: files){ + // String id = name.substring(name.lastIndexOf('=') + 1); + // if("STORED".equals(FilenameComponent.STATE.get(name))){ + // result.add(id); + // } else { + // result.remove(id); + // } + // } + // } // System.out.println("List des id disponibles: " + result); - return result; - } + // return result; + // } - public void remove(TopiaPersistenceObject e) throws TopiaException{ - File f = new File(directory, getFilename(e)); - if(f.exists()){ - f.delete(); - } - } - - public void cleanHistory(int depth){ - if(depth >= 0){ - Map count = new HashMap(); + // public void remove(TopiaPersistenceObject e) throws TopiaException{ + // File f = new File(directory, getFilename(e)); + // if(f.exists()){ + // f.delete(); + // } + // } + + // public void cleanHistory(int depth){ + // if(depth >= 0){ + // Map count = new HashMap(); // on recherche tous les objets qui exist jusqu'a last - String [] files = directory.list(new PatternFilenameFilter( - getFilePattern(1, State.ALL, null, null))); + // String [] files = directory.list(new PatternFilenameFilter( + // getFilePattern(1, State.ALL, null, null))); - Arrays.sort(files); - for(int i=files.length-1; i>=0; i--){ - String id = FilenameComponent.ID.get(files[i]); - Long c = count.get(id); - if(c == null){ - c = 0L; - } else { - c++; - } - count.put(id, c); - if(c > depth){ - File f = new File(directory, files[i]); - f.delete(); - } - } - } - } + // Arrays.sort(files); + // for(int i=files.length-1; i>=0; i--){ + // String id = FilenameComponent.ID.get(files[i]); + // Long c = count.get(id); + // if(c == null){ + // c = 0L; + // } else { + // c++; + // } + // count.put(id, c); + // if(c > depth){ + // File f = new File(directory, files[i]); + // f.delete(); + // } + // } + // } + // } } // TopiaStorageSerialization