Author: glandais Date: 2007-12-06 18:36:39 +0000 (Thu, 06 Dec 2007) New Revision: 50 Modified: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/Database.java trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/DatabaseConstants.java trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/lucene/LuceneDatabase.java Log: Gestion des version et des fichiers attach?\195?\169s Modified: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/Database.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/Database.java 2007-12-06 18:33:44 UTC (rev 49) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/Database.java 2007-12-06 18:36:39 UTC (rev 50) @@ -1,48 +1,80 @@ package org.cemagref.simexplorer.si.storage.database; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.lucene.document.Document; +import org.cemagref.simexplorer.si.storage.database.lucene.LuceneHits; +import org.cemagref.simexplorer.si.storage.entities.FileEntity; import org.cemagref.simexplorer.si.storage.entities.LoggableElement; +import org.cemagref.simexplorer.si.storage.entities.Version; +import org.cemagref.simexplorer.si.storage.factories.LoggableElementFactory; public abstract class Database implements DatabaseConstants { - public Database() throws Exception { - super(); - init(); - } + public abstract void open() throws Exception; - protected abstract void init() throws Exception; + public abstract void close() throws Exception; // Create / Update - + public abstract void pushElement(LoggableElement element) throws Exception; + public abstract void storeData(FileEntity entity, String field, + InputStream is) throws Exception; + // Read - - public abstract LoggableElement findElement(String uuid, Integer majorVersion, - Integer minorVersion) throws Exception; - public abstract LoggableElement getElementLatestVersion(String uuid) + public abstract LoggableElement findElement(String uuid, Version version) throws Exception; + + public abstract List<Version> getVersions(String uuid) throws Exception; + + public LoggableElement getElementLatestVersion(String uuid) + throws Exception { + LoggableElement result = null; + + List<Version> versions = getVersions(uuid); + + Collections.sort(versions); + Collections.reverse(versions); + + if (versions.size() > 0) { + Version version = versions.get(0); + result = findElement(uuid, version); + } else { + result = null; + } + + return result; + } + + public abstract Set<LoggableElement> findElementsById(String uuid) throws Exception; - public abstract Set<LoggableElement> findElementsById(String uuid) throws Exception; - - public abstract Set<LoggableElement> findElementsByProperties(Map<String, String> properties) throws Exception; + public abstract Set<LoggableElement> findElementsByProperties( + Map<String, String> properties) throws Exception; - public abstract Set<LoggableElement> findElementsByProperties(Map<String, String> properties, Class entityClass) throws Exception; - + public abstract Set<LoggableElement> findElementsByProperties( + Map<String, String> properties, Class entityClass) throws Exception; + + public abstract InputStream retrieveData(FileEntity entity, String field) + throws Exception; + // Delete - + public void deleteElement(LoggableElement element) throws Exception { - deleteElement(element.getUuid(), element.getMajorVersion(), element - .getMinorVersion()); + deleteElement(element.getUuid(), element.getVersion()); } + public abstract void deleteData(FileEntity entity, String field) throws Exception; + public abstract void deleteElements(String uuid) throws Exception; - public abstract void deleteElement(String uuid, Integer majorVersion, - Integer minorVersion) throws Exception; + public abstract void deleteElement(String uuid, Version version) throws Exception; - } Modified: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/DatabaseConstants.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/DatabaseConstants.java 2007-12-06 18:33:44 UTC (rev 49) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/DatabaseConstants.java 2007-12-06 18:36:39 UTC (rev 50) @@ -7,8 +7,7 @@ public static final String KEY_NAME = "simexplorer.name"; public static final String KEY_HASH = "simexplorer.hash"; public static final String KEY_DESCRIPTION = "simexplorer.description"; - public static final String KEY_MAJORVERSION = "simexplorer.version.major"; - public static final String KEY_MINORVERSION = "simexplorer.version.minor"; + public static final String KEY_VERSION = "simexplorer.version"; public static final String KEY_TYPE = "simexplorer.type"; public static final String KEY_CREATIONDATE = "simexplorer.creationdate"; public static final String KEY_XML = "simexplorer.xml"; Modified: trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/lucene/LuceneDatabase.java =================================================================== --- trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/lucene/LuceneDatabase.java 2007-12-06 18:33:44 UTC (rev 49) +++ trunk/simexplorer-si-storage/src/java/org/cemagref/simexplorer/si/storage/database/lucene/LuceneDatabase.java 2007-12-06 18:36:39 UTC (rev 50) @@ -2,21 +2,16 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; -import java.io.StringWriter; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.PerFieldAnalyzerWrapper; import org.apache.lucene.analysis.SimpleAnalyzer; @@ -33,9 +28,12 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.cemagref.simexplorer.si.storage.database.Database; +import org.cemagref.simexplorer.si.storage.entities.FileEntity; import org.cemagref.simexplorer.si.storage.entities.LoggableElement; +import org.cemagref.simexplorer.si.storage.entities.Version; +import org.cemagref.simexplorer.si.storage.factories.EntityFactory; +import org.cemagref.simexplorer.si.storage.factories.FileEntityFactory; import org.cemagref.simexplorer.si.storage.factories.LoggableElementFactory; -import org.cemagref.simexplorer.si.storage.tools.Version; import org.w3c.dom.Element; public class LuceneDatabase extends Database { @@ -45,11 +43,8 @@ private IndexWriter writer; private boolean initok = false; - public LuceneDatabase() throws Exception { - super(); - } - - protected void init() throws Exception { + @Override + public void open() throws Exception { if (!initok) { analyser = new PerFieldAnalyzerWrapper(new SimpleAnalyzer()); // analyser.addAnalyzer("firstname", new KeywordAnalyzer()); @@ -70,36 +65,43 @@ } @Override + public void close() throws Exception { + writer.close(); + } + + @Override public void pushElement(LoggableElement element) throws Exception { Set<LoggableElement> children = element.getChildren(); for (LoggableElement loggableElement : children) { pushElement(loggableElement); } - + LoggableElementFactory elementFactory = (LoggableElementFactory) LoggableElementFactory .getFactory(element.getClass()); Document document = saveLuceneElement(elementFactory, element); LoggableElement oldElement = findElement(element.getUuid(), element - .getMajorVersion(), element.getMinorVersion()); + .getVersion()); if (oldElement != null) { // update deleteElement(element); } + InputStream is = new ByteArrayInputStream(document.get(KEY_XML) + .getBytes()); + elementFactory.getHandler().storeData(element, KEY_XML, is); + writer.addDocument(document); writer.flush(); } @Override - public LoggableElement findElement(String uuid, Integer majorVersion, - Integer minorVersion) throws Exception { + public LoggableElement findElement(String uuid, Version version) throws Exception { LoggableElement result = null; Map<String, String> properties = new HashMap<String, String>(); properties.put(KEY_UUID, uuid); - properties.put(KEY_MAJORVERSION, majorVersion.toString()); - properties.put(KEY_MINORVERSION, minorVersion.toString()); + properties.put(KEY_VERSION, version.toString()); LuceneHits hits = findHits(properties); if (hits.getHits().length() != 0) { @@ -111,38 +113,6 @@ } @Override - public LoggableElement getElementLatestVersion(String uuid) - throws Exception { - LoggableElement element = null; - - Map<String, String> properties = new HashMap<String, String>(); - properties.put(KEY_UUID, uuid); - LuceneHits hits = findHits(properties); - if (hits.getHits().length() > 0) { - List<Version> versions = new ArrayList<Version>(); - for (int i = 0; i < hits.getHits().length(); i++) { - Document doc = hits.getHits().doc(i); - Version version = new Version(); - version.setMajorVersion(new Integer(doc.get(KEY_MAJORVERSION))); - version.setMinorVersion(new Integer(doc.get(KEY_MINORVERSION))); - version.setVersionnedObject(doc); - versions.add(version); - } - Collections.sort(versions); - Collections.reverse(versions); - - Document latestDoc = (Document) versions.get(0) - .getVersionnedObject(); - LoggableElementFactory elementFactory = (LoggableElementFactory) LoggableElementFactory - .getFactory(latestDoc.get(KEY_CLASSNAME)); - element = loadLuceneElement(elementFactory, latestDoc); - } - hits.closeSearcher(); - - return element; - } - - @Override public Set<LoggableElement> findElementsById(String uuid) throws Exception { Map<String, String> properties = new HashMap<String, String>(); properties.put(KEY_UUID, uuid); @@ -165,16 +135,23 @@ } public void deleteElements(String uuid) throws Exception { + Set<LoggableElement> set = findElementsById(uuid); + for (Iterator iterator = set.iterator(); iterator.hasNext();) { + LoggableElement loggableElement = (LoggableElement) iterator.next(); + deleteData(loggableElement, KEY_XML); + } writer.deleteDocuments(new Term(KEY_UUID, uuid)); writer.flush(); } - public void deleteElement(String uuid, Integer majorVersion, - Integer minorVersion) throws Exception { + public void deleteElement(String uuid, Version version) throws Exception { + + LoggableElement loggableElement = findElement(uuid, version); + deleteData(loggableElement, KEY_XML); + Term[] terms = new Term[3]; terms[0] = new Term(KEY_UUID, uuid); - terms[1] = new Term(KEY_MAJORVERSION, uuid); - terms[2] = new Term(KEY_MINORVERSION, uuid); + terms[1] = new Term(KEY_VERSION, version.toString()); writer.deleteDocuments(terms); writer.flush(); } @@ -238,10 +215,8 @@ Field.Store.YES, Field.Index.UN_TOKENIZED)); document.add(new Field(KEY_CLASSNAME, element.getClass().getName(), Field.Store.YES, Field.Index.UN_TOKENIZED)); - document.add(new Field(KEY_MINORVERSION, element.getMinorVersion() + document.add(new Field(KEY_VERSION, element.getVersion().toString() .toString(), Field.Store.YES, Field.Index.UN_TOKENIZED)); - document.add(new Field(KEY_MAJORVERSION, element.getMajorVersion() - .toString(), Field.Store.YES, Field.Index.UN_TOKENIZED)); document.add(new Field(KEY_XML, factory.getElementXML(element), Field.Store.COMPRESS, Field.Index.NO)); @@ -249,8 +224,44 @@ return document; } - public void shutDown() throws Exception { - writer.close(); + @Override + public List<Version> getVersions(String uuid) throws Exception { + LoggableElement element = null; + + Map<String, String> properties = new HashMap<String, String>(); + properties.put(KEY_UUID, uuid); + LuceneHits hits = findHits(properties); + + List<Version> versions = new ArrayList<Version>(); + for (int i = 0; i < hits.getHits().length(); i++) { + Document doc = hits.getHits().doc(i); + versions.add(new Version(doc.get(KEY_VERSION))); + } + + return versions; } + @Override + public void deleteData(FileEntity entity, String field) throws Exception { + FileEntityFactory entityFactory = (FileEntityFactory) FileEntityFactory + .getFactory(entity.getClass()); + entityFactory.getHandler().deleteData(entity, field); + } + + @Override + public InputStream retrieveData(FileEntity entity, String field) + throws Exception { + FileEntityFactory entityFactory = (FileEntityFactory) FileEntityFactory + .getFactory(entity.getClass()); + return entityFactory.getHandler().retrieveData(entity, field); + } + + @Override + public void storeData(FileEntity entity, String field, InputStream is) + throws Exception { + FileEntityFactory entityFactory = (FileEntityFactory) FileEntityFactory + .getFactory(entity.getClass()); + entityFactory.getHandler().storeData(entity, field, is); + } + }