Author: glandais Date: 2008-01-22 14:12:45 +0000 (Tue, 22 Jan 2008) New Revision: 415 Added: trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineImpl.java trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineSecuImpl.java Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceImpl.java Log: StorageEngine interface Modified: trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceImpl.java =================================================================== --- trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceImpl.java 2008-01-22 14:11:10 UTC (rev 414) +++ trunk/simexplorer-is-service/src/java/fr/cemagref/simexplorer/is/service/StorageServiceImpl.java 2008-01-22 14:12:45 UTC (rev 415) @@ -31,21 +31,22 @@ import fr.cemagref.simexplorer.is.factories.MetaDataEntityFactory; import fr.cemagref.simexplorer.is.factories.XmlConstants; import fr.cemagref.simexplorer.is.storage.engine.StorageEngine; +import fr.cemagref.simexplorer.is.storage.engine.StorageEngineImpl; @Stateless(name = "StorageService") @Remote(StorageService.class) @RemoteBinding(jndiBinding = "StorageService") public class StorageServiceImpl implements StorageService, XmlConstants { - private StorageEngine storageEngine = null; + private StorageEngine storageEngineImpl = null; private static final String KEY_XML = "_xml"; public StorageServiceImpl() { super(); - storageEngine = new StorageEngine(); + storageEngineImpl = new StorageEngineImpl(); try { - storageEngine.open(); + storageEngineImpl.open(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -53,15 +54,15 @@ } public void open() throws Exception { - storageEngine.open(); + storageEngineImpl.open(); } public void close() throws Exception { - storageEngine.close(); + storageEngineImpl.close(); } public void commit() throws Exception { - storageEngine.commit(); + storageEngineImpl.commit(); } public MetaDataEntity saveElement(RemoteInputStream zipRemoteStream) @@ -84,33 +85,33 @@ } public MetaDataEntity getMetadata(String uuid) throws Exception { - return storageEngine.getMetadata(uuid); + return storageEngineImpl.getMetadata(uuid); } public MetaDataEntity getMetadata(String uuid, String version) throws Exception { - return storageEngine.getMetadata(uuid, new Version(version)); + return storageEngineImpl.getMetadata(uuid, new Version(version)); } public MetaDataEntity[] findFullText(String query, boolean onlyLatest, int indexStart, int count, int dateOrder) throws Exception { - return storageEngine.findFullText(query, onlyLatest, indexStart, count, + return storageEngineImpl.findFullText(query, onlyLatest, indexStart, count, dateOrder); } public int findFullTextCount(String query, boolean onlyLatest) throws Exception { - return storageEngine.findFullTextCount(query, onlyLatest); + return storageEngineImpl.findFullTextCount(query, onlyLatest); } public int findApplicationsCount(boolean onlyLatest) throws Exception { - return storageEngine.findElementsByTypeCount(VALUE_METADATA_TYPE_EA, + return storageEngineImpl.findElementsByTypeCount(VALUE_METADATA_TYPE_EA, onlyLatest); } public MetaDataEntity[] findApplications(boolean onlyLatest, int start, int count, int dateOrder) throws Exception { - return storageEngine.findElementsByType(VALUE_METADATA_TYPE_EA, + return storageEngineImpl.findElementsByType(VALUE_METADATA_TYPE_EA, onlyLatest, start, count, dateOrder); } @@ -120,7 +121,7 @@ LoggableElement le = (LoggableElement) BaseEntityFactory.getFactory( LoggableElement.class.getPackage().getName() + "." + mde.getType()) - .loadElement(storageEngine.retrieveData(mde, KEY_XML)); + .loadElement(storageEngineImpl.retrieveData(mde, KEY_XML)); return le; } @@ -136,12 +137,12 @@ if (!entry.isDirectory()) { String entryName = entry.getName(); if (entryName.equals(FILE_XML)) { - xmlFile = storageEngine.storeTempData(zis); + xmlFile = storageEngineImpl.storeTempData(zis); } else { if (entryName.startsWith(FILE_DATA_PREFIX)) { String fileName = entryName.replace(FILE_DATA_PREFIX + "/", ""); - String idFile = storageEngine.storeTempData(zis); + String idFile = storageEngineImpl.storeTempData(zis); attachments.put(fileName, idFile); } } @@ -154,10 +155,10 @@ public MetaDataEntity saveElement(InputStream xmlFile, Map<String, InputStream> attachments) throws Exception { // Store temporary data - String idxml = storageEngine.storeTempData(xmlFile); + String idxml = storageEngineImpl.storeTempData(xmlFile); Map<String, String> idsattachment = new HashMap<String, String>(); for (Map.Entry<String, InputStream> entry : attachments.entrySet()) { - String idattachment = storageEngine.storeTempData(entry.getValue()); + String idattachment = storageEngineImpl.storeTempData(entry.getValue()); idsattachment.put(entry.getKey(), idattachment); } return saveElement(idxml, idsattachment); @@ -166,7 +167,7 @@ public void exportElement(RemoteOutputStream xmlOutputStream, String uuid, String version) throws Exception { MetaDataEntity mde = getMetadata(uuid, version); - InputStream xmlStream = storageEngine.retrieveData(mde, KEY_XML); + InputStream xmlStream = storageEngineImpl.retrieveData(mde, KEY_XML); OutputStream os = RemoteOutputStreamClient.wrap(xmlOutputStream); // Buffer copy stream to stream @@ -196,7 +197,7 @@ MetaDataEntityFactory mdeFactory = (MetaDataEntityFactory) BaseEntityFactory .getFactory(MetaDataEntity.class); MetaDataEntity metaData = mdeFactory - .loadElementFromParentXML(storageEngine.retrieveTempData(idxml)); + .loadElementFromParentXML(storageEngineImpl.retrieveTempData(idxml)); if (metaData.getType() != null && VALUE_METADATA_TYPE_EA.equals(metaData.getType())) { @@ -243,16 +244,16 @@ // Prepare saving Map<String, InputStream> attachments = new HashMap<String, InputStream>(); - attachments.put(KEY_XML, storageEngine.retrieveTempData(idxml)); + attachments.put(KEY_XML, storageEngineImpl.retrieveTempData(idxml)); if (metaData.getType() != null && !VALUE_METADATA_TYPE_EA.equals(metaData.getType())) { for (Map.Entry<String, String> entry : idsattachment.entrySet()) { - attachments.put(entry.getKey(), storageEngine + attachments.put(entry.getKey(), storageEngineImpl .retrieveTempData(entry.getValue())); } } - storageEngine.saveElement(metaData, attachments); - storageEngine.commit(); + storageEngineImpl.saveElement(metaData, attachments); + storageEngineImpl.commit(); return metaData; } @@ -260,7 +261,7 @@ private void processVersionRules(MetaDataEntity metaData) throws Exception { // Check existing version in storage - MetaDataEntity previousVersion = storageEngine.getMetadata(metaData + MetaDataEntity previousVersion = storageEngineImpl.getMetadata(metaData .getUuid(), metaData.getVersion()); /* * MetaDataEntity parentData = storageEngine.getElementVersion(metaData @@ -287,7 +288,7 @@ .getFactory(MetaDataEntity.class); Document document = BaseEntityFactory.getXMLBuilder().parse( - storageEngine.retrieveTempData(idxml)); + storageEngineImpl.retrieveTempData(idxml)); Element rootElement = (Element) document.getFirstChild(); @@ -298,7 +299,7 @@ .getXMLElementsByTagName(componentsElement, KEY_EXPLORATIONAPPLICATION_COMPONENT_NODE); for (Element element : componentElements) { - components.add(storageEngine.storeTempData(elementFactory + components.add(storageEngineImpl.storeTempData(elementFactory .serializeElement(element))); } @@ -322,7 +323,7 @@ } else { explorationDataArray = new String[1]; } - explorationDataArray[0] = storageEngine + explorationDataArray[0] = storageEngineImpl .storeTempData(elementFactory.serializeElement(elementAD)); explorationDatas.add(explorationDataArray); Copied: trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineImpl.java (from rev 288, trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngine.java) =================================================================== --- trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineImpl.java (rev 0) +++ trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineImpl.java 2008-01-22 14:12:45 UTC (rev 415) @@ -0,0 +1,248 @@ +package fr.cemagref.simexplorer.is.storage.engine; + +import java.io.InputStream; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import fr.cemagref.simexplorer.is.contenttype.ContentType; +import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; +import fr.cemagref.simexplorer.is.entities.metadata.Version; +import fr.cemagref.simexplorer.is.storage.attachment.AttachmentHandler; +import fr.cemagref.simexplorer.is.storage.attachment.FileSystemAttachmentHandler; +import fr.cemagref.simexplorer.is.storage.database.Database; +import fr.cemagref.simexplorer.is.storage.database.lucene.LuceneDatabase; + +/** + * Handle data storage and indexing + * + * @author landais + * + */ +public class StorageEngineImpl implements StorageEngine { + + /** + * Indexing + */ + protected Database database; + + /** + * Storage + */ + protected AttachmentHandler attachmentHandler; + + /** + * Metadata handling temporary data + */ + private MetaDataEntity mdTmp; + + /** + * Default constructor with default implementations of storage and indexing + */ + public StorageEngineImpl() { + super(); + // Indexing + database = new LuceneDatabase(); + // Storage + attachmentHandler = new FileSystemAttachmentHandler(); + // Storing tmp data + mdTmp = new MetaDataEntity(); + mdTmp.setUuid(UUID.randomUUID().toString()); + mdTmp.setVersion("0"); + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#open() + */ + public void open() throws Exception { + database.open(); + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#close() + */ + public void close() throws Exception { + database.close(); + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#commit() + */ + public void commit() throws Exception { + database.commit(); + } + + // Create / update + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#saveElement(fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity, java.util.Map) + */ + public void saveElement(MetaDataEntity element, + Map<String, InputStream> attachments) throws Exception { + + // Save all attachments in system + for (Map.Entry<String, InputStream> entry : attachments.entrySet()) { + attachmentHandler.storeData(element, entry.getKey(), entry + .getValue()); + } + + // Parse all attachments for indexing + List<Reader> readers = new ArrayList<Reader>(); + for (Map.Entry<String, InputStream> entry : attachments.entrySet()) { + String field = entry.getKey(); + InputStream content = attachmentHandler + .retrieveData(element, field); + if (element.getAttachments() != null) { + ContentType contentType = element.getAttachments().get(field); + if (contentType != null) { + // Transform stream into indexable text + Reader reader = contentType.renderToText(content); + readers.add(reader); + } + } + } + + if (element.getName() != null) { + Reader reader = new StringReader(element.getName()); + readers.add(reader); + } + if (element.getDescription() != null) { + Reader reader = new StringReader(element.getDescription()); + readers.add(reader); + } + + // Insert element in database + database.insertElement(element, readers); + } + + // Read + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#getMetadata(java.lang.String) + */ + public MetaDataEntity getMetadata(String uuid) throws Exception { + MetaDataEntity mde = null; + Set<MetaDataEntity> set = database.findElementsById(uuid, true); + if (!set.isEmpty()) { + mde = set.iterator().next(); + } + return mde; + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#getVersions(java.lang.String) + */ + public List<Version> getVersions(String uuid) throws Exception { + return database.getVersions(uuid); + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#getMetadata(java.lang.String, fr.cemagref.simexplorer.is.entities.metadata.Version) + */ + public MetaDataEntity getMetadata(String uuid, Version version) + throws Exception { + MetaDataEntity mde = database.getElement(uuid, version); + return mde; + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#retrieveData(fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity, java.lang.String) + */ + public InputStream retrieveData(MetaDataEntity entity, String field) + throws Exception { + InputStream result = attachmentHandler.retrieveData(entity, field); + return result; + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#findFullTextCount(java.lang.String, boolean) + */ + public int findFullTextCount(String query, boolean onlyLatest) + throws Exception { + return database.findElementsByContentSearchCount(query, onlyLatest); + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#findFullText(java.lang.String, boolean, int, int, int) + */ + public MetaDataEntity[] findFullText(String query, boolean onlyLatest, + int indexStart, int count, int dateOrder) throws Exception { + MetaDataEntity[] result = database.findElementsByContentSearch(query, + onlyLatest, indexStart, count, dateOrder).toArray( + new MetaDataEntity[0]); + return result; + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#findElementsByType(java.lang.String, boolean, int, int, int) + */ + public MetaDataEntity[] findElementsByType(String type, boolean onlyLatest, + int start, int count, int dateOrder) throws Exception { + MetaDataEntity[] result = database.findElementsByType(type, onlyLatest, + start, count, dateOrder).toArray(new MetaDataEntity[0]); + return result; + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#findElementsByTypeCount(java.lang.String, boolean) + */ + public int findElementsByTypeCount(String type, boolean onlyLatest) + throws Exception { + return database.findElementsByTypeCount(type, onlyLatest); + } + + // Delete + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#deleteElements(java.lang.String) + */ + public void deleteElements(String uuid) throws Exception { + List<Version> versions = getVersions(uuid); + for (Version version : versions) { + deleteElement(uuid, version); + } + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#deleteElement(java.lang.String, fr.cemagref.simexplorer.is.entities.metadata.Version) + */ + public void deleteElement(String uuid, Version version) throws Exception { + MetaDataEntity element = getMetadata(uuid, version); + Map<String, ContentType> attachments = element.getAttachments(); + for (Map.Entry<String, ContentType> entry : attachments.entrySet()) { + attachmentHandler.deleteData(element, entry.getKey()); + } + database.deleteElement(element); + } + + // Tools + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#storeTempData(java.io.InputStream) + */ + public String storeTempData(InputStream stream) throws Exception { + String id = UUID.randomUUID().toString(); + attachmentHandler.storeData(mdTmp, id, stream); + return id; + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#retrieveTempData(java.lang.String) + */ + public InputStream retrieveTempData(String id) throws Exception { + InputStream is = attachmentHandler.retrieveData(mdTmp, id); + return is; + } + + /* (non-Javadoc) + * @see fr.cemagref.simexplorer.is.storage.engine.StorageEngine#deleteTempData(java.lang.String) + */ + public void deleteTempData(String id) throws Exception { + attachmentHandler.deleteData(mdTmp, id); + } + +} Added: trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineSecuImpl.java =================================================================== --- trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineSecuImpl.java (rev 0) +++ trunk/simexplorer-is-storage/src/java/fr/cemagref/simexplorer/is/storage/engine/StorageEngineSecuImpl.java 2008-01-22 14:12:45 UTC (rev 415) @@ -0,0 +1,105 @@ +package fr.cemagref.simexplorer.is.storage.engine; + +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +import fr.cemagref.simexplorer.is.entities.metadata.MetaDataEntity; +import fr.cemagref.simexplorer.is.entities.metadata.Version; + +public class StorageEngineSecuImpl extends StorageEngineImpl { + + @Override + public void deleteElement(String uuid, Version version) throws Exception { + // TODO Auto-generated method stub + super.deleteElement(uuid, version); + } + + @Override + public void deleteElements(String uuid) throws Exception { + // TODO Auto-generated method stub + super.deleteElements(uuid); + } + + @Override + public void deleteTempData(String id) throws Exception { + // TODO Auto-generated method stub + super.deleteTempData(id); + } + + @Override + public MetaDataEntity[] findElementsByType(String type, boolean onlyLatest, + int start, int count, int dateOrder) throws Exception { + // TODO Auto-generated method stub + return super.findElementsByType(type, onlyLatest, start, count, + dateOrder); + } + + @Override + public int findElementsByTypeCount(String type, boolean onlyLatest) + throws Exception { + // TODO Auto-generated method stub + return super.findElementsByTypeCount(type, onlyLatest); + } + + @Override + public MetaDataEntity[] findFullText(String query, boolean onlyLatest, + int indexStart, int count, int dateOrder) throws Exception { + // TODO Auto-generated method stub + return super.findFullText(query, onlyLatest, indexStart, count, + dateOrder); + } + + @Override + public int findFullTextCount(String query, boolean onlyLatest) + throws Exception { + // TODO Auto-generated method stub + return super.findFullTextCount(query, onlyLatest); + } + + @Override + public MetaDataEntity getMetadata(String uuid, Version version) + throws Exception { + // TODO Auto-generated method stub + return super.getMetadata(uuid, version); + } + + @Override + public MetaDataEntity getMetadata(String uuid) throws Exception { + // TODO Auto-generated method stub + return super.getMetadata(uuid); + } + + @Override + public List<Version> getVersions(String uuid) throws Exception { + // TODO Auto-generated method stub + return super.getVersions(uuid); + } + + @Override + public InputStream retrieveData(MetaDataEntity entity, String field) + throws Exception { + // TODO Auto-generated method stub + return super.retrieveData(entity, field); + } + + @Override + public InputStream retrieveTempData(String id) throws Exception { + // TODO Auto-generated method stub + return super.retrieveTempData(id); + } + + @Override + public void saveElement(MetaDataEntity element, + Map<String, InputStream> attachments) throws Exception { + // TODO Auto-generated method stub + super.saveElement(element, attachments); + } + + @Override + public String storeTempData(InputStream stream) throws Exception { + // TODO Auto-generated method stub + return super.storeTempData(stream); + } + +}