From 7e202d3d79684c55131266ed24df169ee5d38fe2 Mon Sep 17 00:00:00 2001 From: Claudio Atzori Date: Thu, 13 Jun 2019 18:13:20 +0200 Subject: [PATCH] imported dnet-objectstore-rmi, dnet-modular-objectstore-service, dnet-fs-objectstore in dnet-data-services --- dnet-data-services/pom.xml | 4 + .../filesystem/FileSystemObjectStore.java | 383 ++++++++++++++++++ .../filesystem/FileSystemObjectStoreDao.java | 212 ++++++++++ ...ileSystemObjectStoreResultSetListener.java | 350 ++++++++++++++++ .../filesystem/FileSystemUtility.java | 78 ++++ .../filesystem/IndexIntegrityChecker.java | 55 +++ .../ModularObjectStoreRESTService.java | 79 ++++ .../filesystem/MongoFSOptionsFactory.java | 34 ++ .../filesystem/ObjectStoreFileUtility.java | 57 +++ .../modular/AbstractObjectStoreAction.java | 77 ++++ .../modular/CreateObjectStoreAction.java | 62 +++ .../modular/DeleteObjectStoreAction.java | 55 +++ .../modular/DropContentObjectStoreAction.java | 25 ++ .../modular/FeedCompleteObjectAction.java | 50 +++ .../modular/FeedObjectStoreAction.java | 92 +++++ .../modular/ModularObjectStoreDeliver.java | 128 ++++++ .../modular/ModularObjectStoreFeeder.java | 234 +++++++++++ .../modular/ModularObjectStoreService.java | 265 ++++++++++++ .../objectstore/modular/ObjectBroker.java | 240 +++++++++++ .../modular/ObjectStoreActions.java | 22 + .../modular/ObjectStoreConsistency.java | 102 +++++ .../modular/ObjectStoreIntegrityInfo.java | 30 ++ .../modular/ObjectStoreProfileCreator.java | 127 ++++++ .../modular/ObjectStoreRecord.java | 55 +++ .../modular/connector/ObjectStore.java | 131 ++++++ .../modular/connector/ObjectStoreDao.java | 72 ++++ .../inspector/ObjectStoreInspector.java | 199 +++++++++ .../objectstore/rmi/MetadataObjectRecord.java | 61 +++ .../data/objectstore/rmi/ObjectStoreFile.java | 258 ++++++++++++ .../rmi/ObjectStoreFileNotFoundException.java | 22 + .../objectstore/rmi/ObjectStoreService.java | 109 +++++ .../rmi/ObjectStoreServiceException.java | 45 ++ .../data/objectstore/rmi/Protocols.java | 13 + ...pplicationContext-dnet-objectstore-rmi.xml | 19 + ...net-modular-objectstore-service.properties | 2 + ...ntext-dnet-modular-objectstore-service.xml | 111 +++++ ...nContext-filesystem-objectstore.properties | 8 + ...licationContext-filesystem-objectstore.xml | 53 +++ .../webContext-objectstore-inspector.xml | 20 + .../objectstore/objectstoreds-template.xml | 24 ++ .../filesystem/ConfigurationTestConfig.java | 51 +++ .../objectstore/filesystem/InputIterator.java | 80 ++++ .../filesystem/ObjectStoreServiceDAOTest.java | 117 ++++++ .../src/test/resources/test.pdf | Bin 0 -> 298906 bytes 44 files changed, 4211 insertions(+) create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStore.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStoreDao.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStoreResultSetListener.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemUtility.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/IndexIntegrityChecker.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/ModularObjectStoreRESTService.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/MongoFSOptionsFactory.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/ObjectStoreFileUtility.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/AbstractObjectStoreAction.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/CreateObjectStoreAction.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/DeleteObjectStoreAction.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/DropContentObjectStoreAction.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/FeedCompleteObjectAction.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/FeedObjectStoreAction.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreDeliver.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreFeeder.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreService.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectBroker.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreActions.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreConsistency.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreIntegrityInfo.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreProfileCreator.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreRecord.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/connector/ObjectStore.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/connector/ObjectStoreDao.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/inspector/ObjectStoreInspector.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/MetadataObjectRecord.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreFile.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreFileNotFoundException.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreService.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreServiceException.java create mode 100644 dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/Protocols.java create mode 100644 dnet-data-services/src/main/resources/eu/dnetlib/applicationContext-dnet-objectstore-rmi.xml create mode 100644 dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/applicationContext-dnet-modular-objectstore-service.properties create mode 100644 dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/applicationContext-dnet-modular-objectstore-service.xml create mode 100644 dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/filesystem/applicationContext-filesystem-objectstore.properties create mode 100644 dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/filesystem/applicationContext-filesystem-objectstore.xml create mode 100644 dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/inspector/webContext-objectstore-inspector.xml create mode 100644 dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/objectstoreds-template.xml create mode 100644 dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/ConfigurationTestConfig.java create mode 100644 dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/InputIterator.java create mode 100644 dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/ObjectStoreServiceDAOTest.java create mode 100644 dnet-data-services/src/test/resources/test.pdf diff --git a/dnet-data-services/pom.xml b/dnet-data-services/pom.xml index 405b776..cd8d0e2 100644 --- a/dnet-data-services/pom.xml +++ b/dnet-data-services/pom.xml @@ -28,6 +28,10 @@ commons-beanutils + + javax.servlet + javax.servlet-api + org.codehaus.groovy groovy diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStore.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStore.java new file mode 100644 index 0000000..be95c0e --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStore.java @@ -0,0 +1,383 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.regex.Pattern; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.Filters; +import com.mongodb.client.result.DeleteResult; +import eu.dnetlib.data.objectstore.modular.ObjectStoreRecord; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStore; +import eu.dnetlib.data.objectstore.rmi.MetadataObjectRecord; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFileNotFoundException; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.resultset.ResultSetListener; +import eu.dnetlib.miscutils.collections.Pair; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.bson.conversions.Bson; + +/** + * The Class FileSystemObjectStore. + * + * @author sandro + */ +public class FileSystemObjectStore implements ObjectStore { + + /** + * + */ + private static final String URI_FIELD = "uri"; + + /** + * + */ + private static final String FS_PATH_FIELD = "fsPath"; + + /** The Constant log. */ + private static final Log log = LogFactory.getLog(FileSystemObjectStore.class); // NOPMD by marko on 11/24/08 5:02 PM + + /** The id. */ + private final String id; + + /** The interpretation. */ + private final String interpretation; + + /** The base path. */ + private final String basePath; + + /** The base uri. */ + private final String baseURI; + + /** The mongo metadata. */ + private final MongoCollection mongoMetadata; + + /** + * Instantiates a new file system object store. + * + * @param identifier + * the identifier + * @param interpretation + * the interpretation + * @param basePath + * the base path + * @param mongoMetadata + * the mongo metadata + * @param baseURI + * the base uri + */ + public FileSystemObjectStore(final String identifier, final String interpretation, final String basePath, final MongoCollection mongoMetadata, + final String baseURI) { + this.id = identifier; + this.basePath = basePath; + this.interpretation = interpretation; + this.mongoMetadata = mongoMetadata; + this.baseURI = baseURI; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#getId() + */ + @Override + public String getId() { + return this.id; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#getInterpretation() + */ + @Override + public String getInterpretation() { + return this.interpretation; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#feed(java.lang.Iterable, boolean) + */ + @Override + public int feed(final Iterable records, final boolean incremental) throws ObjectStoreServiceException { + if (records == null) + return 0; + + Path baseDirPath = FileSystems.getDefault().getPath(getBasePath()).resolve(getId()); + if (!Files.exists(baseDirPath)) + throw new ObjectStoreServiceException("Error can't feed objects because the folder " + baseDirPath + " does not exist"); + + int addedCounter = 0; + int nulls = 0; + for (ObjectStoreRecord record : records) { + String url = feedObject(record); + if (StringUtils.isNotBlank(url)) { + addedCounter++; + } else { + nulls++; + } + } + if (nulls > 0) { + log.warn(String.format("Found %s null records", nulls)); + } + return addedCounter; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#feedMetadataRecord(java.lang.Iterable, boolean) + * + * This method handles the case of web crawl files and other cases when the metadata in mdstores are also the objects to put into the objectstores. + */ + @Override + public int feedMetadataRecord(final Iterable records, final boolean incremental) throws ObjectStoreServiceException { + Iterable it = Iterables.transform(records, mor -> { + ObjectStoreRecord r = new ObjectStoreRecord(); + r.setInputStream(new ByteArrayInputStream(mor.getRecord().getBytes())); + ObjectStoreFile fileMetadata = new ObjectStoreFile(); + fileMetadata.setObjectID(mor.getId()); + fileMetadata.setMimeType(mor.getMime()); + r.setFileMetadata(fileMetadata); + return r; + }); + return feed(it, incremental); + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#feedObjectRecord(eu.dnetlib.data.objectstore.modular.ObjectStoreRecord) + */ + @Override + public String feedObjectRecord(final ObjectStoreRecord record) throws ObjectStoreServiceException { + return feedObject(record); + } + + private String feedObject(final ObjectStoreRecord record) { + if (record != null) { + String objectIdentifier = record.getFileMetadata().getObjectID(); + if (StringUtils.isNotBlank(objectIdentifier)) { + final Path objResolvedPath = FileSystemUtility.objectStoreFilePath(basePath, id, objectIdentifier); + + if (Files.notExists(objResolvedPath)) { + try { + log.debug("Creation of folder " + objResolvedPath.getParent()); + Files.createDirectories(objResolvedPath.getParent()); + log.debug("Folder " + objResolvedPath.getParent() + " created"); + String md5Sum = null; + Long size = new Long(0); + if (record.getInputStream() != null) { + Pair infos = FileSystemUtility.saveAndGenerateMD5(record.getInputStream(), objResolvedPath); + md5Sum = infos.getKey(); + size = infos.getValue(); + } + final String url = + ModularObjectStoreRESTService.retrieveURL(getBaseURI(), getBasePath(), getId(), record.getFileMetadata().getObjectID()); + if (StringUtils.isNotBlank(md5Sum)) { + double timestamp = System.currentTimeMillis(); + BasicDBObject metadata = new BasicDBObject(); + metadata.put("id", record.getFileMetadata().getObjectID()); + metadata.put("mime", record.getFileMetadata().getMimeType()); + metadata.put("originalObject", record.getFileMetadata().toJSON()); + metadata.put("timestamp", timestamp); + metadata.put("md5Sum", md5Sum); + metadata.put("size", size); + metadata.put(FS_PATH_FIELD, objResolvedPath.toAbsolutePath().toString()); + metadata.put(URI_FIELD, url); + log.debug("saving metadata object to the collection: " + metadata.toString()); + mongoMetadata.insertOne(metadata); + } + return url; + } catch (Exception e) { + log.error("Something bad happen on inserting Record", e); + log.error("Record: " + new Gson().toJson(record.getFileMetadata())); + } finally { + if (record.getInputStream() != null) { + try { + record.getInputStream().close(); + } catch (Exception e) { + log.error("Error on close inputStream", e); + } + } + } + } else { + log.debug("The File in the path" + objResolvedPath.getParent() + "exists "); + } + } + } + return null; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#deliver(java.lang.Long, java.lang.Long) + */ + @Override + public ResultSetListener deliver(final Long from, final Long until) throws ObjectStoreServiceException { + FileSystemObjectStoreResultSetListener resultSet = new FileSystemObjectStoreResultSetListener(); + resultSet.setBaseURI(getBaseURI()); + resultSet.setMongoCollection(mongoMetadata); + resultSet.setObjectStoreID(getId()); + resultSet.setFromDate(from); + resultSet.setUntilDate(until); + resultSet.setBasePath(getBasePath()); + return resultSet; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#deliverIds(java.lang.Iterable) + */ + @Override + public ResultSetListener deliverIds(final Iterable ids) throws ObjectStoreServiceException { + FileSystemObjectStoreResultSetListener resultSet = new FileSystemObjectStoreResultSetListener(); + resultSet.setBaseURI(getBaseURI()); + resultSet.setMongoCollection(mongoMetadata); + resultSet.setObjectStoreID(getId()); + resultSet.setRecords(Lists.newArrayList(ids)); + resultSet.setBasePath(basePath); + return resultSet; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#deliverObject(java.lang.String) + */ + @Override + public ObjectStoreFile deliverObject(final String objectId) throws ObjectStoreServiceException { + Bson query = Filters.eq("id", objectId); + DBObject resultQuery = mongoMetadata.find(query).first(); + checkAndGetFsPathField(resultQuery, objectId); + return ObjectStoreFileUtility.build(resultQuery, getBaseURI(), getId(), basePath); + } + + private String checkAndGetFsPathField(final DBObject resultQuery, final String objectId) throws ObjectStoreServiceException { + if (resultQuery == null || !resultQuery.containsField(FS_PATH_FIELD)) + throw new ObjectStoreFileNotFoundException("Object with identifier :" + objectId + " not found or missing " + FS_PATH_FIELD + " field"); + String pathStr = (String) resultQuery.get(FS_PATH_FIELD); + if (StringUtils.isBlank(pathStr)) + throw new ObjectStoreFileNotFoundException("Object with identifier :" + objectId + " with blank " + FS_PATH_FIELD); + return pathStr; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#getSize() + */ + @Override + public int getSize() throws ObjectStoreServiceException { + return (int) mongoMetadata.count(); + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#deleteObject(java.lang.String) + */ + @Override + public void deleteObject(final String objectId) throws ObjectStoreServiceException { + Bson query = Filters.eq("id", objectId); + DBObject response = mongoMetadata.find(query).first(); + String pathStr = checkAndGetFsPathField(response, objectId); + Path path = FileSystems.getDefault().getPath(pathStr); + if (Files.notExists(path)) + throw new ObjectStoreFileNotFoundException("Object with identifier :" + objectId + " not found in the assigned path " + path); + try { + Files.delete(path); + } catch (IOException e) { + throw new ObjectStoreServiceException("An error occurs on delete file ", e); + } + mongoMetadata.deleteOne(query); + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#getObject(java.lang.String) + */ + @Override + public String getObject(final String recordId) throws ObjectStoreServiceException { + Bson query = Filters.eq("id", recordId); + DBObject response = mongoMetadata.find(query).first(); + if (response == null || !response.containsField(URI_FIELD)) + return null; + return (String) response.get(URI_FIELD); + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStore#existIDStartsWith(java.lang.String) + */ + @Override + public boolean existIDStartsWith(final String startId) throws ObjectStoreServiceException { + Bson query = Filters.regex("id", Pattern.compile(startId)); + return mongoMetadata.count(query) > 0; + } + + @Override + public boolean dropContent() throws ObjectStoreServiceException { + if (getBasePath() == null) { + throw new ObjectStoreServiceException("Error on dropping object store base_path required"); + } + final Path baseDirPath = FileSystems.getDefault().getPath(getBasePath()).resolve(getId()); + try { + FileSystemUtility.deleteFolderRecursive(baseDirPath); + } catch (IOException e) { + throw new ObjectStoreServiceException("Error on dropping store ", e); + } + log.info("Deleted folder" + baseDirPath.toString()); + if (!Files.exists(baseDirPath)) { + log.info("Recreating folder " + baseDirPath); + try { + Files.createDirectory(baseDirPath); + } catch (IOException e) { + throw new ObjectStoreServiceException("Error on dropping store ", e); + } + } + final DeleteResult deleteResult = this.mongoMetadata.deleteMany(new BasicDBObject()); + log.info("Dropped content for object store " + id + ". " + deleteResult.getDeletedCount() + " object(s) deleted."); + return true; + } + + @Override + public String toString() { + return "FileSystemObjectStore{" + + "id='" + getId() + '\'' + + ", interpretation='" + getInterpretation() + '\'' + + ", basePath='" + getBasePath() + '\'' + + ", baseURI='" + getBaseURI() + '\'' + + '}'; + } + + /** + * Gets the base uri. + * + * @return the baseURI + */ + public String getBaseURI() { + return baseURI; + } + + public String getBasePath() { + return basePath; + } +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStoreDao.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStoreDao.java new file mode 100644 index 0000000..c40fd87 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStoreDao.java @@ -0,0 +1,212 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import javax.annotation.Resource; + +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.Filters; +import com.mongodb.client.result.UpdateResult; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStore; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFileNotFoundException; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.miscutils.collections.MappedCollection; +import eu.dnetlib.miscutils.functional.UnaryFunction; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.bson.conversions.Bson; + +/** + * @author sandro + * + */ +public class FileSystemObjectStoreDao implements ObjectStoreDao { + + public static final String INTERPRETATION_FIELD = "interpretation"; + public final static String OBJECTSTORE_METADATA_NAME_FIELD = "metadataObjectStore"; + public final static String OBJECTSTORE_ID_FIELD = "obsId"; + public final static String BASE_PATH_FIELD = "basePath"; + private static final Log log = LogFactory.getLog(FileSystemObjectStoreDao.class); // NOPMD by marko on 11/24/08 5:02 PM + private static final String OBJECTSTORE_PROFILE_SUFFIX = "_T2JqZWN0U3RvcmVEU1Jlc291cmNlcy9PYmplY3RTdG9yZURTUmVzb3VyY2VUeXBl"; + @Resource(name="objectstoreMongoDB") + private MongoDatabase db; + + private boolean upsert; + + private String objectStoreRESTURI; + + /** + * {@inheritDoc} + * @throws ObjectStoreServiceException + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao#getObjectStore(java.lang.String) + */ + @Override + public ObjectStore getObjectStore(final String obsId) throws ObjectStoreServiceException { + String currentId = obsId.substring(0, 36); + String find_id = obsId; + if (find_id.length() == 36) { + find_id += OBJECTSTORE_PROFILE_SUFFIX; + } + + MongoCollection metadataObjectStore = getDb().getCollection(OBJECTSTORE_METADATA_NAME_FIELD, DBObject.class); + Bson query = Filters.eq(OBJECTSTORE_ID_FIELD, find_id); + log.debug("QUERY :" + query.toString()); + DBObject resultQuery = metadataObjectStore.find(query).first(); + log.debug("result " + resultQuery); + if ((resultQuery == null)) throw new ObjectStoreFileNotFoundException("the objectStore with identifier: "+obsId+" was not found"); + + final String basePath = resultQuery.get(BASE_PATH_FIELD).toString(); + final String interpretation = resultQuery.get("interpretation").toString(); + + if (!resultQuery.containsField(BASE_PATH_FIELD) || StringUtils.isBlank(basePath)) + throw new ObjectStoreServiceException("Can't Get Objectstore, the metadata doesn't contain info about the basepath"); + + final MongoCollection collection = getDb().getCollection(currentId, DBObject.class); + return new FileSystemObjectStore(currentId, interpretation, basePath, collection, objectStoreRESTURI); + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao#listObjectStores() + */ + @Override + public List listObjectStores() { + MongoCollection metadata = getDb().getCollection(OBJECTSTORE_METADATA_NAME_FIELD, DBObject.class); + return MappedCollection.listMap(metadata.find(), new UnaryFunction() { + + @Override + public String evaluate(final DBObject object) { + return (String) object.get(OBJECTSTORE_ID_FIELD); + } + }); + } + + /** + * {@inheritDoc} + * + * @throws ObjectStoreServiceException + */ + @Override + public boolean createObjectStore(final String obsId, final String interpretation, final String basePath) throws ObjectStoreServiceException { + + log.debug(String.format("Create object Store method\n\t Id:%s Interpretation:%s BasePath : %s", obsId, interpretation, basePath) ); + + if (StringUtils.isBlank(basePath)) throw new ObjectStoreServiceException("Can't create the object store: the base path cannot be blank"); + Path path = FileSystems.getDefault().getPath(basePath); + if (!Files.exists(path) || !Files.isDirectory(path)) + throw new ObjectStoreServiceException("Can't create the object store: base path: '" + basePath + "' doesn't exist or it is not a folder"); + try { + String currentObsId = obsId.substring(0, 36); + log.debug("Cleaned objectStore Id " + currentObsId); + if (Files.exists(path.resolve(currentObsId))) + throw new ObjectStoreServiceException("Can't create the object store: base path: '" + path.resolve(currentObsId) + "' already exists"); + Files.createDirectory(path.resolve(currentObsId)); + MongoCollection coll = getDb().getCollection(OBJECTSTORE_METADATA_NAME_FIELD, DBObject.class); + final BasicDBObject obj = new BasicDBObject(); + obj.put(OBJECTSTORE_ID_FIELD, obsId); + obj.put(INTERPRETATION_FIELD, interpretation); + obj.put(BASE_PATH_FIELD, basePath); + coll.insertOne(obj); + MongoCollection objectStore = getDb().getCollection(currentObsId, DBObject.class); + objectStore.createIndex(new BasicDBObject("id", 1)); + objectStore.createIndex(new BasicDBObject("timestamp", 1)); + return true; + } catch (Throwable e) { + throw new ObjectStoreServiceException("Can't Create the object Store id: '" + obsId, e); + } + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao#updateObjectStore(java.lang.String, java.lang.String) + */ + @Override + public boolean updateObjectStore(final String obsId, final String interpretation) { + MongoCollection coll = getDb().getCollection(OBJECTSTORE_METADATA_NAME_FIELD, DBObject.class); + final BasicDBObject obj = new BasicDBObject(); + obj.put("$set", new BasicDBObject(INTERPRETATION_FIELD, interpretation)); + + final UpdateResult updateResult = coll.updateOne(Filters.eq(OBJECTSTORE_ID_FIELD, obsId), obj); + if (updateResult.isModifiedCountAvailable()) { + log.debug("Matched / Modified " + updateResult.getMatchedCount() + " / " + updateResult.getModifiedCount()); + } + return true; + } + + /** + * {@inheritDoc} + * + * @throws ObjectStoreServiceException + * @see eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao#deleteObjectStore(java.lang.String) + */ + @Override + public boolean deleteObjectStore(final String obsId) throws ObjectStoreServiceException { + MongoCollection coll = getDb().getCollection(OBJECTSTORE_METADATA_NAME_FIELD, DBObject.class); + Bson query = Filters.eq(OBJECTSTORE_ID_FIELD, obsId); + DBObject resultQuery = coll.find(query).first(); + String basePath = checkAndGetFsPathField(resultQuery, obsId); + String currentObsId = obsId.substring(0, 36); + Path basePathFS = FileSystems.getDefault().getPath(basePath, currentObsId); + if (!Files.exists(basePathFS)) + throw new ObjectStoreServiceException("Can't Delete ObjectStore " + obsId + ": the base path does not exist :" + basePathFS); + try { + FileSystemUtility.deleteFolderRecursive(basePathFS); + } catch (IOException e) { + throw new ObjectStoreServiceException("Can't Delete ObjectStore " + obsId, e); + } + coll.deleteOne(Filters.eq(OBJECTSTORE_ID_FIELD, obsId)); + getDb().getCollection(obsId).drop(); + return true; + } + + @Override + public boolean dropContent(final String obsId) throws ObjectStoreServiceException { + return getObjectStore(obsId).dropContent(); + } + + private String checkAndGetFsPathField(final DBObject resultQuery, final String objectStoreID) throws ObjectStoreServiceException { + if (resultQuery == null || !resultQuery.containsField(BASE_PATH_FIELD)) + throw new ObjectStoreServiceException("ObjectStore with identifier :" + objectStoreID + " not found or missing " + BASE_PATH_FIELD + " field"); + String pathStr = (String) resultQuery.get(BASE_PATH_FIELD); + if (StringUtils.isBlank(pathStr)) + throw new ObjectStoreServiceException("ObjectStore with identifier :" + objectStoreID + " with blank " + BASE_PATH_FIELD); + return pathStr; + } + + + public boolean isUpsert() { + return upsert; + } + + public void setUpsert(final boolean upsert) { + this.upsert = upsert; + } + + public String getObjectStoreRESTURI() { + return objectStoreRESTURI; + } + + public void setObjectStoreRESTURI(final String objectStoreRESTURI) { + this.objectStoreRESTURI = objectStoreRESTURI; + } + + public MongoDatabase getDb() { + return db; + } + + public void setDb(final MongoDatabase db) { + this.db = db; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStoreResultSetListener.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStoreResultSetListener.java new file mode 100644 index 0000000..25ae111 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemObjectStoreResultSetListener.java @@ -0,0 +1,350 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import java.util.List; + +import com.google.common.collect.Lists; +import com.mongodb.DBObject; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.Sorts; +import eu.dnetlib.enabling.resultset.ResultSet; +import eu.dnetlib.enabling.resultset.ResultSetAware; +import eu.dnetlib.enabling.resultset.ResultSetListener; +import eu.dnetlib.miscutils.collections.MappedCollection; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.bson.conversions.Bson; + +/** + * The listener interface for receiving fileSystemObjectStoreResultSet events. + * The class that is interested in processing a fileSystemObjectStoreResultSet + * event implements this interface, and the object created + * with that class is registered with a component using the + * component's addFileSystemObjectStoreResultSetListener method. When + * the fileSystemObjectStoreResultSet event occurs, that object's appropriate + * method is invoked. + * + * @author sandro + */ +public class FileSystemObjectStoreResultSetListener implements ResultSetListener, ResultSetAware { + + + /** The Constant log. */ + private static final Log log = LogFactory.getLog(FileSystemObjectStoreResultSetListener.class); // NOPMD by marko on 11/24/08 5:02 PM + + + /** The from date. */ + private Long fromDate; + + /** The until date. */ + private Long untilDate; + + /** The records. */ + private List records; + + /** The object store id. */ + private String objectStoreID; + + + /** The mongo collection. */ + private MongoCollection mongoCollection; + + /** The base uri. */ + private String baseURI; + + /** + * The base path + */ + private String basePath; + + /** The current size. */ + private int currentSize = -1; + + /** The current cursor. */ + private MongoCursor currentCursor; + + /** The cursor position. */ + private long cursorPosition; + + /** + * {@inheritDoc} + * @see eu.dnetlib.enabling.resultset.TypedResultSetListener#getResult(int, int) + */ + @Override + public List getResult(final int from, final int to) { + if (log.isDebugEnabled()) { + log.debug(String.format("ObjectStoreId :%s, from: %d, to: %d", objectStoreID, from, to)); + } + if (records != null) { + List ids = Lists.newArrayList(); + for (int i = from-1; i < Math.min(records.size(),to); i++) { + ids.add(records.get(i)); + } + Bson q = Filters.in("id", ids); + FindIterable res = getMongoCollection().find(q); + return MappedCollection.listMap(res, ObjectStoreFileUtility.asJSON(getBaseURI(), getObjectStoreID(), getBasePath())); + } else if ((fromDate != null) && (untilDate != null)) { + if ((currentCursor == null) || (cursorPosition > from)) { + createCurrentCursor(); + } + while (cursorPosition < from) { + currentCursor.next(); + cursorPosition++; + } + List result = Lists.newArrayList(); + for (int i = from; i <= to; i++) { + if (currentCursor.hasNext()) { + result.add(currentCursor.next()); + cursorPosition++; + } + } + return MappedCollection.listMap(result, ObjectStoreFileUtility.asJSON(getBaseURI(), getObjectStoreID(), getBasePath())); + } + + throw new IllegalArgumentException("Missing parameters on Delivery must provide either from, to, or ObjectStoreIDs"); + } + + /** + * Creates the current cursor. + */ + private void createCurrentCursor() { + Bson timestampQuery = Filters.and(Filters.gt("timestamp", fromDate.doubleValue()), Filters.lt("timestamp", untilDate.doubleValue())); + if (currentCursor != null) { + currentCursor.close(); + } + currentCursor = getMongoCollection().find(timestampQuery).sort(Sorts.orderBy(Filters.eq("_id", 1))).iterator(); + cursorPosition = 1; + + } + + /** + * {@inheritDoc} + * @see eu.dnetlib.enabling.resultset.TypedResultSetListener#getSize() + */ + @Override + public int getSize() { + if (currentSize == -1) { + currentSize = calculateSize(); + } + return Math.max(0, currentSize - 1); + } + + /** + * Calculate size. + * + * @return the int + */ + private int calculateSize() { + if (records != null) { + Bson query = Filters.in("id", records); + return (int) getMongoCollection().count(query); + } else if ((fromDate != null) && (untilDate != null)) { + Bson timestampQuery = Filters.and(Filters.gt("timestamp", fromDate.doubleValue()), Filters.lt("timestamp", untilDate.doubleValue())); + return (int) getMongoCollection().count(timestampQuery); + } + return 0; + } + + + /** + * {@inheritDoc} + * @see eu.dnetlib.enabling.resultset.ResultSetAware#setResultSet(eu.dnetlib.enabling.resultset.ResultSet) + */ + @Override + public void setResultSet(final ResultSet resultSet) { + resultSet.close(); + } + + + /** + * Gets the from date. + * + * @return the fromDate + */ + public Long getFromDate() { + return fromDate; + } + + + /** + * Sets the from date. + * + * @param fromDate the fromDate to set + */ + public FileSystemObjectStoreResultSetListener setFromDate(final Long fromDate) { + this.fromDate = fromDate; + return this; + } + + + /** + * Gets the until date. + * + * @return the untilDate + */ + public Long getUntilDate() { + return untilDate; + } + + + /** + * Sets the until date. + * + * @param untilDate the untilDate to set + */ + public FileSystemObjectStoreResultSetListener setUntilDate(final Long untilDate) { + this.untilDate = untilDate; + return this; + } + + + /** + * Gets the records. + * + * @return the records + */ + public List getRecords() { + return records; + } + + + /** + * Sets the records. + * + * @param records the records to set + */ + public void setRecords(final List records) { + this.records = records; + } + + + /** + * Gets the object store id. + * + * @return the objectStoreID + */ + public String getObjectStoreID() { + return objectStoreID; + } + + + /** + * Sets the object store id. + * + * @param objectStoreID the objectStoreID to set + */ + public void setObjectStoreID(final String objectStoreID) { + this.objectStoreID = objectStoreID; + } + + + + + + /** + * Gets the base uri. + * + * @return the baseURI + */ + public String getBaseURI() { + return baseURI; + } + + + /** + * Sets the base uri. + * + * @param baseURI the baseURI to set + */ + public void setBaseURI(final String baseURI) { + this.baseURI = baseURI; + } + + + /** + * Gets the current size. + * + * @return the currentSize + */ + public int getCurrentSize() { + return currentSize; + } + + + /** + * Sets the current size. + * + * @param currentSize the currentSize to set + */ + public void setCurrentSize(final int currentSize) { + this.currentSize = currentSize; + } + + + /** + * Gets the current cursor. + * + * @return the currentCursor + */ + public MongoCursor getCurrentCursor() { + return currentCursor; + } + + + /** + * Sets the current cursor. + * + * @param currentCursor the currentCursor to set + */ + public void setCurrentCursor(final MongoCursor currentCursor) { + this.currentCursor = currentCursor; + } + + + /** + * Gets the cursor position. + * + * @return the cursorPosition + */ + public long getCursorPosition() { + return cursorPosition; + } + + + /** + * Sets the cursor position. + * + * @param cursorPosition the cursorPosition to set + */ + public void setCursorPosition(final long cursorPosition) { + this.cursorPosition = cursorPosition; + } + + /** + * Gets the mongo collection. + * + * @return the mongo collection + */ + public MongoCollection getMongoCollection() { + return mongoCollection; + } + + /** + * Sets the mongo collection. + * + * @param mongoCollection the new mongo collection + */ + public void setMongoCollection(final MongoCollection mongoCollection) { + this.mongoCollection = mongoCollection; + } + + public String getBasePath() { + return basePath; + } + + public void setBasePath(final String basePath) { + this.basePath = basePath; + } +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemUtility.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemUtility.java new file mode 100644 index 0000000..0b3000a --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/FileSystemUtility.java @@ -0,0 +1,78 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; + +import eu.dnetlib.miscutils.collections.Pair; +import eu.dnetlib.miscutils.functional.xml.DnetXsltFunctions; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * The Class FileSystemUtility. + * + * @author sandro + */ +public class FileSystemUtility { + + private static final Log log = LogFactory.getLog(FileSystemUtility.class); // NOPMD by marko on 11/24/08 5:02 PM + + public static Pair saveAndGenerateMD5(final InputStream inputStream, final Path filePath) { + if(inputStream==null) return null; + + String md5 = null; + long size = 0; + try { + Files.copy(inputStream, filePath); + + FileInputStream fis = new FileInputStream(filePath.toFile()); + md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis); + fis.close(); + size = Files.size(filePath); + + } catch (IOException e1) { + log.error(e1); + } + + return new Pair(md5, size); + } + + /** + * Delete folder recursive. + * + * @param path the path + * @return true, if successful + * @throws IOException Signals that an I/O exception has occurred. + */ + public static boolean deleteFolderRecursive(final Path path) throws IOException { + + Files.walkFileTree(path, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + return true; + } + + public static Path objectStoreFilePath(final String basePath, final String objectStoreId, final String objectIdentifier) { + final Path baseDirPath = FileSystems.getDefault().getPath(basePath).resolve(objectStoreId); + final String md5id = DnetXsltFunctions.md5(objectIdentifier); + final String firstLevel = StringUtils.substring(md5id, 0, 2); + final String secondLevel = StringUtils.substring(md5id, 2, 4); + final String fileName = StringUtils.substring(md5id, 4) + ".obj"; + return baseDirPath.resolve(firstLevel).resolve(secondLevel).resolve(fileName); + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/IndexIntegrityChecker.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/IndexIntegrityChecker.java new file mode 100644 index 0000000..1f9a272 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/IndexIntegrityChecker.java @@ -0,0 +1,55 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.IndexOptions; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import static eu.dnetlib.data.objectstore.filesystem.FileSystemObjectStoreDao.OBJECTSTORE_ID_FIELD; +import static eu.dnetlib.data.objectstore.filesystem.FileSystemObjectStoreDao.OBJECTSTORE_METADATA_NAME_FIELD; + +/** + * Created by claudio on 15/09/16. + */ +public class IndexIntegrityChecker { + + private static final Log log = LogFactory.getLog(IndexIntegrityChecker.class); + + @Autowired + private ObjectStoreDao dao; + + public void check() { + checkIndexes(); + } + + private void checkIndexes() { + log.info("objectStore indexes integrity start"); + + final MongoDatabase db = ((FileSystemObjectStoreDao) dao).getDb(); + final IndexOptions bg = new IndexOptions().background(true); + + for (String objectStoreId : dao.listObjectStores()) { + final String id = StringUtils.substringBefore(objectStoreId, "_"); + final MongoCollection objectStore = db.getCollection(id, DBObject.class); + if (log.isDebugEnabled()) { + log.debug(String.format("creating index (id, timestamp) on objectStore %s", id)); + } + objectStore.createIndex(new BasicDBObject("id", 1), bg); + objectStore.createIndex(new BasicDBObject("timestamp", 1), bg); + } + if (log.isDebugEnabled()) { + log.debug(String.format("creating index (%s) on %s", OBJECTSTORE_ID_FIELD, OBJECTSTORE_METADATA_NAME_FIELD)); + } + final MongoCollection metadata = db.getCollection(OBJECTSTORE_METADATA_NAME_FIELD, DBObject.class); + metadata.createIndex(new BasicDBObject(OBJECTSTORE_ID_FIELD, 1), bg); + + log.info("objectStore indexes integrity completed"); + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/ModularObjectStoreRESTService.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/ModularObjectStoreRESTService.java new file mode 100644 index 0000000..3b13bc4 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/ModularObjectStoreRESTService.java @@ -0,0 +1,79 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import java.io.*; +import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Path; +import javax.servlet.http.HttpServletResponse; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.miscutils.datetime.HumanTime; +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * The Class ModularObjectStoreRESTService implement the controller REST of the object Store. + */ +@Controller +public class ModularObjectStoreRESTService { + + private static final Log log = LogFactory.getLog(ModularObjectStoreRESTService.class); // NOPMD by marko on 11/24/08 5:02 PM + + public static String retrieveURL(final String baseURI, final String basePath, final String objectStoreId, final String objectId) + throws UnsupportedEncodingException { + final StringBuilder sb = new StringBuilder(baseURI) + .append("?objectStore=" + encode(objectStoreId)) + .append("&objectId=" + encode(objectId)) + .append("&basePath=" + encode(basePath)); + return sb.toString(); + } + + private static String encode(final String s) throws UnsupportedEncodingException { + return URLEncoder.encode(s, "UTF-8"); + } + + /** + * + * @param res + * @param basePath + * @param objectStoreId + * @param objectId + * @throws IOException + * @throws ObjectStoreServiceException + */ + @RequestMapping(value = "/**/objectStore/retrieve.do") + public void retrieve(final HttpServletResponse res, + @RequestParam(value = "basePath", required = true) final String basePath, + @RequestParam(value = "objectStore", required = true) final String objectStoreId, + @RequestParam(value = "objectId", required = true) final String objectId) throws IOException, ObjectStoreServiceException { + + final long start = System.currentTimeMillis(); + final Path path = FileSystemUtility.objectStoreFilePath(basePath, objectStoreId, objectId); + + if (!Files.exists(path) || !Files.isReadable(path)) { + final String msg = String.format("Object with identifier: %s not found the in %s", objectId, path); + res.sendError(HttpServletResponse.SC_NOT_FOUND, msg); + log.warn(msg); + } else { + try (final InputStream is = new BufferedInputStream(new FileInputStream(path.toFile()))) { + + final long size = Files.size(path); + + res.setHeader("Content-Length", String.valueOf(size)); + IOUtils.copyLarge(is, res.getOutputStream()); + + if (log.isDebugEnabled()) { + log.debug(String.format("retrive.do completed in %s, objId: %s", HumanTime.exactly(System.currentTimeMillis() - start), objectId)); + } + } catch (IOException e) { + final String msg = "unable to close input Stream"; + res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg); + log.error(msg, e); + } + } + } +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/MongoFSOptionsFactory.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/MongoFSOptionsFactory.java new file mode 100644 index 0000000..1855627 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/MongoFSOptionsFactory.java @@ -0,0 +1,34 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import com.mongodb.MongoClientOptions; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.FactoryBean; + +public class MongoFSOptionsFactory implements FactoryBean { + + private int connectionsPerHost; + + @Override + public MongoClientOptions getObject() throws BeansException { + return MongoClientOptions.builder().connectionsPerHost(connectionsPerHost).build(); + } + + @Override + public Class getObjectType() { + return MongoClientOptions.class; + } + + @Override + public boolean isSingleton() { + return false; + } + + public int getConnectionsPerHost() { + return connectionsPerHost; + } + + public void setConnectionsPerHost(final int connectionsPerHost) { + this.connectionsPerHost = connectionsPerHost; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/ObjectStoreFileUtility.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/ObjectStoreFileUtility.java new file mode 100644 index 0000000..2316a66 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/filesystem/ObjectStoreFileUtility.java @@ -0,0 +1,57 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import java.io.UnsupportedEncodingException; + +import com.mongodb.DBObject; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.Protocols; +import eu.dnetlib.miscutils.functional.UnaryFunction; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * The Class ObjectStoreFileBuilder generates an objectStoreFile bean + * + */ +public class ObjectStoreFileUtility { + + private static final int KB_SIZE = 1024; + + /** The Constant log. */ + private static final Log log = LogFactory.getLog(ObjectStoreFileUtility.class); + + public static ObjectStoreFile build(final DBObject metadata, final String baseURI, final String objectStoreID, final String basePath) { + + String originalFile = (String) metadata.get("originalObject"); + ObjectStoreFile original = ObjectStoreFile.createObject(originalFile); + ObjectStoreFile newFile = new ObjectStoreFile(); + newFile.setObjectID((String) metadata.get("id")); + newFile.setAccessProtocol(Protocols.HTTP); + newFile.setMimeType((String) metadata.get("mime")); + newFile.setMd5Sum((String) metadata.get("md5Sum")); + try { + newFile.setFileSizeKB(Long.parseLong(metadata.get("size").toString()) / KB_SIZE); + } catch (Throwable e) { + log.error("Error on getting file size", e); + } + if (originalFile != null) { + newFile.setMetadataRelatedID(original.getMetadataRelatedID()); + if (StringUtils.isBlank(original.getDownloadedURL())) { + newFile.setDownloadedURL(original.getURI()); + } else { + newFile.setDownloadedURL(original.getDownloadedURL()); + } + } + try { + newFile.setURI(ModularObjectStoreRESTService.retrieveURL(baseURI, basePath, objectStoreID, newFile.getObjectID())); + } catch (UnsupportedEncodingException e) { + log.error("Error on Build objectStoreFile ", e); + } + return newFile; + } + + public static UnaryFunction asJSON(final String baseURI, final String objectStoreID, final String basePath) { + return input -> build(input, baseURI, objectStoreID, basePath).toJSON(); + } +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/AbstractObjectStoreAction.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/AbstractObjectStoreAction.java new file mode 100644 index 0000000..b1d0e1b --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/AbstractObjectStoreAction.java @@ -0,0 +1,77 @@ +package eu.dnetlib.data.objectstore.modular; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +import eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.tools.blackboard.BlackboardJob; +import eu.dnetlib.enabling.tools.blackboard.BlackboardServerAction; +import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * The Class AbstractObjectStoreAction. + */ +public abstract class AbstractObjectStoreAction implements BlackboardServerAction { + + /** + * Logger + */ + private static final Log log = LogFactory.getLog(AbstractObjectStoreAction.class); + private final Executor executor = Executors.newCachedThreadPool(); + /** The object store dao. */ + private ObjectStoreDao dao; + + protected abstract void executeAsync(final BlackboardServerHandler handler, final BlackboardJob job) throws ObjectStoreServiceException; + + @Override + public void execute(final BlackboardServerHandler handler, final BlackboardJob job) { + executor.execute(new Runnable() { + + @Override + public void run() { + try { + handler.ongoing(job); + executeAsync(handler, job); + } catch (ObjectStoreServiceException e) { + handler.failed(job, e); + } + } + }); + } + + protected void completeWithSuccess(final BlackboardServerHandler handler, final BlackboardJob job) { + // Don't change this synchronization rule + synchronized (this) { + handler.done(job); + } + } + + protected void completeWithFail(final BlackboardServerHandler handler, final BlackboardJob job, final Throwable e) { + // Don't change this synchronization rule + synchronized (this) { + handler.failed(job, e); + } + } + + /** + * Gets the dao. + * + * @return the dao + */ + public ObjectStoreDao getDao() { + return dao; + } + + /** + * Sets the dao. + * + * @param dao the new dao + */ + public void setDao(ObjectStoreDao dao) { + this.dao = dao; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/CreateObjectStoreAction.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/CreateObjectStoreAction.java new file mode 100644 index 0000000..6a3c25d --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/CreateObjectStoreAction.java @@ -0,0 +1,62 @@ +package eu.dnetlib.data.objectstore.modular; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.tools.blackboard.BlackboardJob; +import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * The Class CreateObjectStoreAction is responsible to execute the blacboard action of type CREATE. + */ +public class CreateObjectStoreAction extends AbstractObjectStoreAction { + + private static final Log log = LogFactory.getLog(CreateObjectStoreAction.class); + + /** The profile creator. */ + private ObjectStoreProfileCreator profileCreator; + + /** + * Gets the profile creator. + * + * @return the profile creator + */ + public ObjectStoreProfileCreator getProfileCreator() { + return profileCreator; + } + + /** + * Sets the profile creator. + * + * @param profileCreator the new profile creator + */ + public void setProfileCreator(final ObjectStoreProfileCreator profileCreator) { + this.profileCreator = profileCreator; + } + + @Override + protected void executeAsync(final BlackboardServerHandler handler, final BlackboardJob job) { + try { + final String interpretation = job.getParameters().get("interpretation"); +// final String basePath = job.getParameters().get("basePath"); +// if (StringUtils.isBlank(basePath)) { +// throw new ObjectStoreServiceException("missing basePath param"); +// } + + final String objID = profileCreator.registerProfile(interpretation); + try { + getDao().createObjectStore(objID, interpretation, null); + } catch (Throwable e) { + log.warn("cannot created objectStore, deleting profile"); + profileCreator.deleteProfile(objID); + throw new ObjectStoreServiceException(e); + } + job.getParameters().put("objectStoreId", objID); + completeWithSuccess(handler, job); + } catch (Exception e) { + completeWithFail(handler, job, e); + } + + } +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/DeleteObjectStoreAction.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/DeleteObjectStoreAction.java new file mode 100644 index 0000000..3bec3cc --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/DeleteObjectStoreAction.java @@ -0,0 +1,55 @@ +package eu.dnetlib.data.objectstore.modular; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService; +import eu.dnetlib.enabling.locators.UniqueServiceLocator; +import eu.dnetlib.enabling.tools.blackboard.BlackboardJob; +import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * The Class DeleteObjectStoreAction is responsible to execute the blacboard action of type DELETE. + */ +public class DeleteObjectStoreAction extends AbstractObjectStoreAction { + + /** + * The profile creator. + */ + + private ObjectStoreProfileCreator profileCreator; + + @Autowired + private UniqueServiceLocator serviceLocator; + + @Override + protected void executeAsync(final BlackboardServerHandler handler, final BlackboardJob job) throws ObjectStoreServiceException { + try { + final String objID = job.getParameters().get("obsID"); + serviceLocator.getService(ISRegistryService.class).deleteProfile(objID); + getDao().deleteObjectStore(objID); + completeWithSuccess(handler, job); + + } catch (Exception e) { + completeWithFail(handler, job, e); + } + } + + /** + * Gets the profile creator. + * + * @return the profile creator + */ + public ObjectStoreProfileCreator getProfileCreator() { + return profileCreator; + } + + /** + * Sets the profile creator. + * + * @param profileCreator the new profile creator + */ + public void setProfileCreator(ObjectStoreProfileCreator profileCreator) { + this.profileCreator = profileCreator; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/DropContentObjectStoreAction.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/DropContentObjectStoreAction.java new file mode 100644 index 0000000..0ded74a --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/DropContentObjectStoreAction.java @@ -0,0 +1,25 @@ +package eu.dnetlib.data.objectstore.modular; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.tools.blackboard.BlackboardJob; +import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler; + +/** + * Created by sandro on 2/26/16. + */ +public class DropContentObjectStoreAction extends AbstractObjectStoreAction { + + @Override + protected void executeAsync(final BlackboardServerHandler handler, final BlackboardJob job) throws ObjectStoreServiceException { + try { + final String objID = job.getParameters().get("obsID"); + + final boolean status = getDao().dropContent(objID); + job.getParameters().put("dropStatus", "" + status); + completeWithSuccess(handler, job); + } catch (Exception e) { + completeWithFail(handler, job, e); + } + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/FeedCompleteObjectAction.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/FeedCompleteObjectAction.java new file mode 100644 index 0000000..5d3e579 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/FeedCompleteObjectAction.java @@ -0,0 +1,50 @@ +package eu.dnetlib.data.objectstore.modular; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.tools.blackboard.BlackboardJob; +import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler; +import org.springframework.beans.factory.annotation.Required; + +// TODO: Auto-generated Javadoc +/** + * The Class FeedCompleteObjectAction is responsible to execute the blacboard action of type FEED OBJECT which is Metadata created for WOS case of openaire. + */ +public class FeedCompleteObjectAction extends AbstractObjectStoreAction { + + /** The store feeder. */ + private ModularObjectStoreFeeder storeFeeder; + + @Override + protected void executeAsync(final BlackboardServerHandler handler, final BlackboardJob job) throws ObjectStoreServiceException { + try { + final String objStoreID = job.getParameters().get("obsID"); + final String eprRs = job.getParameters().get("epr"); + final String mime = job.getParameters().get("mime"); + int count = storeFeeder.feedMetadataObjectRecord(objStoreID, eprRs, mime); + job.getParameters().put("total", "" + count); + completeWithSuccess(handler, job); + } catch (Exception e) { + completeWithFail(handler, job, e); + } + } + + /** + * Gets the store feeder. + * + * @return the store feeder + */ + public ModularObjectStoreFeeder getStoreFeeder() { + return storeFeeder; + } + + /** + * Sets the store feeder. + * + * @param storeFeeder the new store feeder + */ + @Required + public void setStoreFeeder(final ModularObjectStoreFeeder storeFeeder) { + this.storeFeeder = storeFeeder; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/FeedObjectStoreAction.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/FeedObjectStoreAction.java new file mode 100644 index 0000000..51be588 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/FeedObjectStoreAction.java @@ -0,0 +1,92 @@ +package eu.dnetlib.data.objectstore.modular; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.data.objectstore.rmi.Protocols; +import eu.dnetlib.enabling.tools.blackboard.BlackboardJob; +import eu.dnetlib.enabling.tools.blackboard.BlackboardServerHandler; +import org.springframework.beans.factory.annotation.Required; + + +/** + * The Class FeedObjectStoreAction to execute the blacboard action of type FEED. + */ +public class FeedObjectStoreAction extends AbstractObjectStoreAction { + + /** The profile creator. */ + private ObjectStoreProfileCreator profileCreator; + + /** The store feeder. */ + private ModularObjectStoreFeeder storeFeeder; + + @Override + protected void executeAsync(final BlackboardServerHandler handler, final BlackboardJob job) throws ObjectStoreServiceException { + try { + final String objStoreID = job.getParameters().get("obsID"); + final String objID = job.getParameters().get("objID"); + final String URI = job.getParameters().get("URI"); + final String eprRs = job.getParameters().get("epr"); + final String protocolString = job.getParameters().get("protocol"); + + final Protocols protocol; + if (protocolString == null) + protocol = Protocols.None; + else + protocol = Protocols.valueOf(job.getParameters().get("protocol")); + final String mime = job.getParameters().get("mime"); + final String login = job.getParameters().get("login"); + final String password = job.getParameters().get("password"); + + if (URI != null && URI.length() > 0) { + storeFeeder.feedObject(objStoreID, objID, URI, protocol, login, + password, mime); + } else if (eprRs != null && eprRs.length() > 0) { + storeFeeder + .feed(objStoreID, eprRs, protocol, login, password, mime); + } + completeWithSuccess(handler, job); + } catch (Exception e) { + completeWithFail(handler, job, e); + } + } + + + + /** + * Gets the profile creator. + * + * @return the profile creator + */ + public ObjectStoreProfileCreator getProfileCreator() { + return profileCreator; + } + + /** + * Sets the profile creator. + * + * @param profileCreator the new profile creator + */ + @Required + public void setProfileCreator(ObjectStoreProfileCreator profileCreator) { + this.profileCreator = profileCreator; + } + + /** + * Gets the store feeder. + * + * @return the store feeder + */ + public ModularObjectStoreFeeder getStoreFeeder() { + return storeFeeder; + } + + /** + * Sets the store feeder. + * + * @param storeFeeder the new store feeder + */ + @Required + public void setStoreFeeder(ModularObjectStoreFeeder storeFeeder) { + this.storeFeeder = storeFeeder; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreDeliver.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreDeliver.java new file mode 100644 index 0000000..ccbe1e4 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreDeliver.java @@ -0,0 +1,128 @@ +package eu.dnetlib.data.objectstore.modular; + +import javax.annotation.Resource; +import javax.xml.ws.wsaddressing.W3CEndpointReference; + +import eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.resultset.ResultSetFactory; +import eu.dnetlib.enabling.resultset.client.ResultSetClientFactory; +import org.springframework.beans.factory.annotation.Required; + +/** + * The Class ModularObjectStoreDeliver is responsible of delivering data from the object Store. + */ +public class ModularObjectStoreDeliver { + + /** The dao. */ + private ObjectStoreDao dao; + + /** The result set factory. */ + @Resource + private ResultSetFactory resultSetFactory; + + /** The result set client factory. */ + private ResultSetClientFactory resultSetClientFactory; + + /** + * Gets the dao. + * + * @return the dao + */ + public ObjectStoreDao getDao() { + return dao; + } + + /** + * Sets the dao. + * + * @param dao + * the new dao + */ + @Required + public void setDao(final ObjectStoreDao dao) { + this.dao = dao; + } + + /** + * Deliver. + * + * @param objectStoreID + * the object store id + * @param from + * the from + * @param until + * the until + * @return the w3 c endpoint reference + * @throws ObjectStoreServiceException + */ + public W3CEndpointReference deliver(final String objectStoreID, final Long from, final Long until) throws ObjectStoreServiceException { + return resultSetFactory.createResultSet(dao.getObjectStore(objectStoreID).deliver(from, until)); + } + + /** + * Deliver ids. + * + * @param objectStoreID + * the object store id + * @param eprId + * the epr id + * @return the w3 c endpoint reference + * @throws ObjectStoreServiceException + */ + public W3CEndpointReference deliverIds(final String objectStoreID, final W3CEndpointReference eprId) throws ObjectStoreServiceException { + + Iterable ids = resultSetClientFactory.getClient(eprId); + return resultSetFactory.createResultSet(dao.getObjectStore(objectStoreID).deliverIds(ids)); + } + + /** + * Exist id starts with. + * + * @param obsId + * the obs id + * @param startId + * the start id + * @return true, if successful + * @throws ObjectStoreServiceException + */ + public boolean existIDStartsWith(final String obsId, final String startId) throws ObjectStoreServiceException { + return dao.getObjectStore(obsId).existIDStartsWith(startId); + } + + /** + * Deliver object. + * + * @param objectStoreID + * the object store id + * @param objectId + * the object id + * @return the object store file + * @throws ObjectStoreServiceException + */ + public ObjectStoreFile deliverObject(final String objectStoreID, final String objectId) throws ObjectStoreServiceException { + return dao.getObjectStore(objectStoreID).deliverObject(objectId); + } + + /** + * Gets the result set client factory. + * + * @return the result set client factory + */ + public ResultSetClientFactory getResultSetClientFactory() { + return resultSetClientFactory; + } + + /** + * Sets the result set client factory. + * + * @param resultSetClientFactory + * the new result set client factory + */ + @Required + public void setResultSetClientFactory(final ResultSetClientFactory resultSetClientFactory) { + this.resultSetClientFactory = resultSetClientFactory; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreFeeder.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreFeeder.java new file mode 100644 index 0000000..b172e85 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreFeeder.java @@ -0,0 +1,234 @@ +package eu.dnetlib.data.objectstore.modular; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStore; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao; +import eu.dnetlib.data.objectstore.rmi.MetadataObjectRecord; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.data.objectstore.rmi.Protocols; +import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService; +import eu.dnetlib.enabling.locators.UniqueServiceLocator; +import eu.dnetlib.enabling.resultset.client.ResultSetClientFactory; +import eu.dnetlib.miscutils.datetime.DateUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Required; + +/** + * The Class ModularObjectStoreFeeder, responsible to feed data into the object Store + */ +public class ModularObjectStoreFeeder { + + private static final Log log = LogFactory.getLog(ModularObjectStoreFeeder.class); + + /** The dao of the objectStore. */ + private ObjectStoreDao dao; + + /** The result set client factory. */ + private ResultSetClientFactory resultSetClientFactory; + + /** The service locator. */ + private UniqueServiceLocator serviceLocator; + + /** + * Gets the dao. + * + * @return the dao + */ + public ObjectStoreDao getDao() { + return dao; + } + + /** + * Sets the dao. + * + * @param dao + * the new dao + */ + @Required + public void setDao(final ObjectStoreDao dao) { + this.dao = dao; + } + + /** + * Gets the result set client factory. + * + * @return the result set client factory + */ + public ResultSetClientFactory getResultSetClientFactory() { + return resultSetClientFactory; + } + + /** + * Sets the result set client factory. + * + * @param resultSetClientFactory + * the new result set client factory + */ + + @Required + public void setResultSetClientFactory(final ResultSetClientFactory resultSetClientFactory) { + this.resultSetClientFactory = resultSetClientFactory; + } + + /** + * Feed metadata object record. + * + * @param objectStoreID + * the object store id + * @param rsEpr + * the rs epr + * @param mime + * the mime + * @throws ObjectStoreServiceException + */ + public int feedMetadataObjectRecord(final String objectStoreID, final String rsEpr, final String mime) throws ObjectStoreServiceException { + + final Iterable records = resultSetClientFactory.getClient(rsEpr); + Iterable toIngest = Iterables.transform(records, input -> { + MetadataObjectRecord record = MetadataObjectRecord.initFromJson(input); + if (record != null) { + record.setMime(mime); + } else { + log.error("An input record is null :" + input); + } + return record; + }); + ObjectStore store = dao.getObjectStore(objectStoreID); + int size = store.feedMetadataRecord(toIngest, true); + touch(objectStoreID, size); + return size; + } + + /** + * Feed object in the object store starting from an EPR of objectMetadata + * + * @param obsId + * the objectStore id + * @param rsEpr + * the result set Endpoint-reference + * @param protocol + * the protocol + * @param login + * the login + * @param password + * the password + * @param mime + * the mime type + * @throws ObjectStoreServiceException + */ + public void feed(final String obsId, final String rsEpr, final Protocols protocol, final String login, final String password, final String mime) + throws ObjectStoreServiceException { + final Iterable records = resultSetClientFactory.getClient(rsEpr); + ObjectBroker objectBroker = new ObjectBroker(protocol, login, password, mime); + Iterable toIngest = Iterables.transform(records, objectBroker); + ObjectStore store = dao.getObjectStore(obsId); + int size = store.feed(toIngest, true); + touch(obsId, size); + } + + /** + * Feed a single object in the object Stroe. + * + * @param objectStoreID + * the object store id + * @param objectID + * the object id + * @param URIObject + * the URI of object + * @param protocol + * the protocol + * @param login + * the login + * @param password + * the password + * @param mime + * the mime type + * @throws ObjectStoreServiceException + */ + public void feedObject(final String objectStoreID, + final String objectID, + final String URIObject, + final Protocols protocol, + final String login, + final String password, + final String mime) throws ObjectStoreServiceException { + ObjectStoreFile inputFile = new ObjectStoreFile(); + inputFile.setURI(URIObject); + inputFile.setObjectID(objectID); + ObjectBroker objectBroker = new ObjectBroker(protocol, login, password, mime); + Iterable toIngest = Iterables.transform(Lists.newArrayList(inputFile.toJSON()), objectBroker); + ObjectStore store = dao.getObjectStore(objectStoreID); + int size = store.feed(toIngest, true); + touch(objectStoreID, size); + } + + /** + * Feed object record. + * + * @param objectStoreID + * the object store id + * @param record + * the record + * @return the string + * @throws ObjectStoreServiceException + */ + public String feedObjectRecord(final String objectStoreID, final ObjectStoreRecord record) throws ObjectStoreServiceException { + ObjectStore store = dao.getObjectStore(objectStoreID); + return store.feedObjectRecord(record); + } + + /** + * Sets the last modified date in the profile. + * + * @param obsId + * the obs id + * @param size + * the size + */ + public void touch(final String obsId, final int size) { + try { + final String now = DateUtils.now_ISO8601(); + + final String mdstoreXUpdate = "for $x in //RESOURCE_PROFILE[.//RESOURCE_IDENTIFIER/@value = '" + obsId + "']" + + "return update value $x//LAST_STORAGE_DATE with '" + now + "'"; + + serviceLocator.getService(ISRegistryService.class, true).executeXUpdate(mdstoreXUpdate); + + touchSize(obsId, size); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } + + /** + * Touch size. + * + * @param obsId + * the obs id + * @param size + * the size + */ + public void touchSize(final String obsId, final int size) { + try { + final String mdstoreNumberXUpdate = "for $x in //RESOURCE_PROFILE[.//RESOURCE_IDENTIFIER/@value = '" + obsId + "']" + + "return update value $x//COUNT_STORE with '" + size + "'"; + + serviceLocator.getService(ISRegistryService.class, true).executeXUpdate(mdstoreNumberXUpdate); + } catch (final Exception e) { + throw new IllegalStateException(e); + } + } + + public UniqueServiceLocator getServiceLocator() { + return serviceLocator; + } + + @Required + public void setServiceLocator(final UniqueServiceLocator serviceLocator) { + this.serviceLocator = serviceLocator; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreService.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreService.java new file mode 100644 index 0000000..2690df4 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ModularObjectStoreService.java @@ -0,0 +1,265 @@ +package eu.dnetlib.data.objectstore.modular; + +import java.util.List; + +import javax.xml.ws.wsaddressing.W3CEndpointReference; + +import org.springframework.beans.factory.annotation.Required; + +import com.google.gson.Gson; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreService; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.tools.AbstractBaseService; +import eu.dnetlib.enabling.tools.blackboard.NotificationHandler; + +// TODO: Auto-generated Javadoc +/** + * The Class ModularObjectStoreService is the implementation of the ObjectStoreService interface. + */ +public class ModularObjectStoreService extends AbstractBaseService implements ObjectStoreService { + + /** The feeder. */ + private ModularObjectStoreFeeder feeder; + + /** The object store deliver. */ + private ModularObjectStoreDeliver objectStoreDeliver; + + /** The notification handler. */ + private NotificationHandler notificationHandler; + + /* + * (non-Javadoc) + * + * @see eu.dnetlib.data.objectstore.rmi.ObjectStoreService#deliverObjects(java.lang.String, java.lang.Double, java.lang.Double) + */ + /** + * Deliver objects. + * + * @param obsId + * the obs id + * @param from + * the from + * @param until + * the until + * @return the w3 c endpoint reference + * @throws ObjectStoreServiceException + * the object store service exception + */ + @Override + public W3CEndpointReference deliverObjects(final String obsId, final Long from, final Long until) throws ObjectStoreServiceException { + + return objectStoreDeliver.deliver(obsId, from, until); + } + + /* + * (non-Javadoc) + * + * @see eu.dnetlib.data.objectstore.rmi.ObjectStoreService#deliverObjectsByIds(java.lang.String, + * javax.xml.ws.wsaddressing.W3CEndpointReference) + */ + /** + * Deliver objects by ids. + * + * @param obsId + * the obs id + * @param eprId + * the epr id + * @return the w3 c endpoint reference + * @throws ObjectStoreServiceException + * the object store service exception + */ + @Override + public W3CEndpointReference deliverObjectsByIds(final String obsId, final W3CEndpointReference eprId) throws ObjectStoreServiceException { + return objectStoreDeliver.deliverIds(obsId, eprId); + } + + /* + * (non-Javadoc) + * + * @see eu.dnetlib.data.objectstore.rmi.ObjectStoreService#deliverRecord(java.lang.String, java.lang.String) + */ + /** + * Deliver record. + * + * @param obsId + * the obs id + * @param objectId + * the object id + * @return the string + * @throws ObjectStoreServiceException + * the object store service exception + */ + @Override + public String deliverRecord(final String obsId, final String objectId) throws ObjectStoreServiceException { + return objectStoreDeliver.deliverObject(obsId, objectId).toJSON(); + } + + /* + * (non-Javadoc) + * + * @see eu.dnetlib.data.objectstore.rmi.ObjectStoreService#getListOfObjectStores() + */ + /** + * Gets the list of object stores. + * + * @return the list of object stores + */ + @Override + public List getListOfObjectStores() { + return objectStoreDeliver.getDao().listObjectStores(); + } + + /** + * Gets the feeder. + * + * @return the feeder + */ + public ModularObjectStoreFeeder getFeeder() { + return feeder; + } + + /** + * Sets the feeder. + * + * @param feeder + * the new feeder + */ + @Required + public void setFeeder(final ModularObjectStoreFeeder feeder) { + this.feeder = feeder; + } + + /** + * Gets the notification handler. + * + * @return the notification handler + */ + public NotificationHandler getNotificationHandler() { + return notificationHandler; + } + + /** + * Sets the notification handler. + * + * @param notificationHandler + * the new notification handler + */ + @Required + public void setNotificationHandler(final NotificationHandler notificationHandler) { + this.notificationHandler = notificationHandler; + } + + /** + * {@inheritDoc} + * + * @see eu.dnetlib.enabling.tools.AbstractBaseService#notify(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public void notify(final String subscriptionId, final String topic, final String isId, final String message) { + getNotificationHandler().notified(subscriptionId, topic, isId, message); + } + + /** + * Gets the object store deliver. + * + * @return the object store deliver + */ + public ModularObjectStoreDeliver getObjectStoreDeliver() { + return objectStoreDeliver; + } + + /** + * Sets the object store deliver. + * + * @param objectStoreDeliver + * the new object store deliver + */ + @Required + public void setObjectStoreDeliver(final ModularObjectStoreDeliver objectStoreDeliver) { + this.objectStoreDeliver = objectStoreDeliver; + } + + /* + * (non-Javadoc) + * + * @see eu.dnetlib.data.objectstore.rmi.ObjectStoreService#feedObject(java.lang.String, java.lang.String) + */ + /** + * Feed object. + * + * @param obsId + * the obs id + * @param objectMetadata + * the object metadata + * @throws ObjectStoreServiceException + * the object store service exception + */ + @Override + public void feedObject(final String obsId, final String objectMetadata) throws ObjectStoreServiceException { + Gson g = new Gson(); + try { + ObjectStoreFile file = g.fromJson(objectMetadata, ObjectStoreFile.class); + feeder.feedObject(obsId, file.getObjectID(), file.getURI(), file.getAccessProtocol(), file.getUsernameAuth(), file.getPasswordAuth(), + file.getMimeType()); + + } catch (Exception e) { + throw new ObjectStoreServiceException(e.getMessage()); + } + + } + + /** + * Exist id starts with. + * + * @param obsId + * the obs id + * @param startId + * the start id + * @return true, if successful + * @throws ObjectStoreServiceException + * the object store service exception + */ + public boolean existIDStartsWith(final String obsId, final String startId) throws ObjectStoreServiceException { + return objectStoreDeliver.existIDStartsWith(obsId, startId); + } + + /** + * Feed object. + * + * @param obsId + * the obs id + * @param record + * the record + * @return the string + * @throws ObjectStoreServiceException + * the object store service exception + */ + public String feedObject(final String obsId, final ObjectStoreRecord record) throws ObjectStoreServiceException { + + try { + + return feeder.feedObjectRecord(obsId, record); + + } catch (Exception e) { + throw new ObjectStoreServiceException(e.getMessage()); + } + + } + + /** + * Gets the size. + * + * @param obsId + * the obs id + * @return the size + * @throws ObjectStoreServiceException + * the object store service exception + */ + @Override + public int getSize(final String obsId) throws ObjectStoreServiceException { + return objectStoreDeliver.getDao().getObjectStore(obsId).getSize(); + + } +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectBroker.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectBroker.java new file mode 100644 index 0000000..aa26ff2 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectBroker.java @@ -0,0 +1,240 @@ +package eu.dnetlib.data.objectstore.modular; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.SocketException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.net.ftp.FTPClient; + +import com.google.common.base.Function; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.Protocols; + + + +/** + * The Class ObjectBroker is responsible to retrieve content from URL. + */ +public class ObjectBroker implements Function { + private static final Log log = LogFactory.getLog(ObjectBroker.class); + + /** The protocol. */ + private Protocols protocol; + + /** The login. */ + private String login; + + /** The password. */ + private String password; + + /** The mime. */ + private String mime; + + /** + * Instantiates a new object broker. + * + * @param protocol + * the protocol + * @param login + * the login + * @param password + * the password + * @param mime + * the mime + */ + public ObjectBroker(final Protocols protocol, final String login, final String password, final String mime) { + this.protocol = protocol; + this.login = login; + this.password = password; + this.mime = mime; + } + + /** + * Gets the protocol. + * + * @return the protocol + */ + public Protocols getProtocol() { + return protocol; + } + + /** + * Sets the protocol. + * + * @param protocol + * the new protocol + */ + public void setProtocol(final Protocols protocol) { + this.protocol = protocol; + } + + /** + * Gets the login. + * + * @return the login + */ + public String getLogin() { + return login; + } + + /** + * Sets the login. + * + * @param login + * the new login + */ + public void setLogin(final String login) { + this.login = login; + } + + /** + * Gets the password. + * + * @return the password + */ + public String getPassword() { + return password; + } + + /** + * Sets the password. + * + * @param password + * the new password + */ + public void setPassword(final String password) { + this.password = password; + } + + /** + * Gets the mime. + * + * @return the mime + */ + public String getMime() { + return mime; + } + + /** + * Sets the mime. + * + * @param mime + * the new mime + */ + public void setMime(final String mime) { + this.mime = mime; + } + + /* + * (non-Javadoc) + * + * @see com.google.common.base.Function#apply(java.lang.Object) + */ + @Override + public ObjectStoreRecord apply(final String jsonInput) { + if (jsonInput == null) return null; + ObjectStoreRecord objectStorerecord = new ObjectStoreRecord(); + + objectStorerecord.setFileMetadata(ObjectStoreFile.createObject(jsonInput)); + Protocols currentProtocol = (objectStorerecord.getFileMetadata().getAccessProtocol() == Protocols.None) ? protocol : objectStorerecord + .getFileMetadata().getAccessProtocol(); + objectStorerecord.getFileMetadata().setAccessProtocol(currentProtocol); + if ((objectStorerecord.getFileMetadata().getMimeType() == null) || (objectStorerecord.getFileMetadata().getMimeType().length() == 0)) { + objectStorerecord.getFileMetadata().setMimeType(mime); + } + + switch (currentProtocol) { + case FTP: + FTPClient client = new FTPClient(); + try { + URI uri = new URI(objectStorerecord.getFileMetadata().getURI()); + client.connect(uri.getHost()); + if ((objectStorerecord.getFileMetadata().getUsernameAuth() != null) && (objectStorerecord.getFileMetadata().getUsernameAuth().length() > 0)) { + client.login(objectStorerecord.getFileMetadata().getUsernameAuth(), objectStorerecord.getFileMetadata().getPasswordAuth()); + } else { + client.login("ftp", "a@a"); + + } + + final InputStream stream = client.retrieveFileStream(uri.getPath()); + objectStorerecord.setInputStream(stream); + return objectStorerecord; + + } catch (URISyntaxException e2) { + log.error(e2); + return null; + } catch (SocketException e) { + log.error(e); + } catch (IOException e) { + log.error(e); + return null; + } + + case HTTP: + try { + HttpURLConnection conn = (HttpURLConnection) new URL(objectStorerecord.getFileMetadata().getURI()).openConnection(); + InputStream in; + int http_status; + try { + + http_status = conn.getResponseCode(); + + if ((http_status / 100) == 3) { + String newURL = conn.getHeaderField("Location"); + conn.disconnect(); + conn = (HttpURLConnection) new URL(newURL).openConnection(); + http_status = conn.getResponseCode(); + if ((http_status / 100) != 2) return null; + } + in = conn.getInputStream(); + objectStorerecord.setInputStream(in); + return objectStorerecord; + } catch (Exception e) { + log.error(e); + return null; + } + } catch (MalformedURLException e1) { + log.error(e1); + return null; + } catch (IOException e1) { + log.error(e1); + return null; + } + + case File_System: + File f = new File(objectStorerecord.getFileMetadata().getURI()); + try { + InputStream myiInputStream = new FileInputStream(f); + objectStorerecord.setInputStream(myiInputStream); + return objectStorerecord; + } catch (FileNotFoundException e) { + try { + Thread.sleep(5000); + InputStream myiInputStream = new FileInputStream(f); + objectStorerecord.setInputStream(myiInputStream); + return objectStorerecord; + } catch (Exception e1) { + log.error(e1); + return null; + } + } + default: + break; + } + + return null; + + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreActions.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreActions.java new file mode 100644 index 0000000..7a201e4 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreActions.java @@ -0,0 +1,22 @@ +package eu.dnetlib.data.objectstore.modular; + +/** + * The Enumeration of the blacboard action of the ObjectStore. + */ +public enum ObjectStoreActions { + + /** The create. */ + CREATE, + /** + * The delete. + */ + DELETE, + /** + * The feed. + */ + FEED, + /** + * The feedobject. + */ + FEEDOBJECT, DROP_CONTENT +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreConsistency.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreConsistency.java new file mode 100644 index 0000000..1e8e2a7 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreConsistency.java @@ -0,0 +1,102 @@ +package eu.dnetlib.data.objectstore.modular; + +import java.util.List; +import java.util.Set; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import eu.dnetlib.enabling.locators.UniqueServiceLocator; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + + +@Controller +public class ObjectStoreConsistency { + + private static final Log log = LogFactory.getLog(ObjectStoreConsistency.class); + + @Autowired + private ObjectStoreDao objectStoreDao; + + @Autowired + private UniqueServiceLocator serviceLocator; + + private ObjectStoreIntegrityInfo integrityInfo; + + + @RequestMapping(value = "/ui/objectStore/infoConsistency.do") + @ResponseBody + public ObjectStoreIntegrityInfo getConsistencyInfo(final ModelMap map) { + return getIntegrityInfo(); + } + + public void refreshConsistency() { + try { + Set profiles = listProfileIds(); + Set objectStore = listObjectStoreIds(); + Set objectStoreNotInProfile = Sets.newHashSet(objectStore); + objectStoreNotInProfile.removeAll(profiles); + Set profilesNotInObjectStore = Sets.newHashSet(profiles); + profilesNotInObjectStore.removeAll(objectStore); + ObjectStoreIntegrityInfo info = new ObjectStoreIntegrityInfo(); + info.setObjectStoreWithoutProfile(objectStoreNotInProfile); + info.setProfileWithoutObjectStore(profilesNotInObjectStore); + this.integrityInfo = info; + } catch (ISLookUpException e) { + log.error("Error on refreshing consistency of objectStore ", e); + } + + + } + + + private Set listObjectStoreIds() { + return Sets.newHashSet( + Lists.transform(objectStoreDao.listObjectStores(), new Function() { + @Override + public String apply(String input) { + return StringUtils.substringBefore(input, "_"); + } + })); + } + + + private Set listProfileIds() throws ISLookUpException { + + final ISLookUpService lookupService = serviceLocator.getService(ISLookUpService.class); + final String query = "for $x in collection('/db/DRIVER/ObjectStoreDSResources/ObjectStoreDSResourceType') return $x//RESOURCE_IDENTIFIER/@value/string()"; + + List resultList = lookupService.quickSearchProfile(query); + + + return Sets.newHashSet(Lists.transform(resultList, new Function() { + @Override + public String apply(String input) { + return StringUtils.substringBefore(input, "_"); + } + })); + + } + + + public ObjectStoreIntegrityInfo getIntegrityInfo() { + if (integrityInfo == null) { + refreshConsistency(); + } + return integrityInfo; + } + + public void setIntegrityInfo(ObjectStoreIntegrityInfo integrityInfo) { + this.integrityInfo = integrityInfo; + } +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreIntegrityInfo.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreIntegrityInfo.java new file mode 100644 index 0000000..2998520 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreIntegrityInfo.java @@ -0,0 +1,30 @@ +package eu.dnetlib.data.objectstore.modular; + +import java.util.Set; + +/** + * Created by Sandro La Bruzzo on 10/16/15. + */ +public class ObjectStoreIntegrityInfo { + + private Set objectStoreWithoutProfile; + + private Set profileWithoutObjectStore; + + + public Set getObjectStoreWithoutProfile() { + return objectStoreWithoutProfile; + } + + public void setObjectStoreWithoutProfile(Set objectStoreWithoutProfile) { + this.objectStoreWithoutProfile = objectStoreWithoutProfile; + } + + public Set getProfileWithoutObjectStore() { + return profileWithoutObjectStore; + } + + public void setProfileWithoutObjectStore(Set profileWithoutObjectStore) { + this.profileWithoutObjectStore = profileWithoutObjectStore; + } +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreProfileCreator.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreProfileCreator.java new file mode 100644 index 0000000..1f3dffd --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreProfileCreator.java @@ -0,0 +1,127 @@ +package eu.dnetlib.data.objectstore.modular; + +import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException; +import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService; +import eu.dnetlib.enabling.locators.UniqueServiceLocator; +import eu.dnetlib.soap.EndpointReferenceBuilder; +import org.antlr.stringtemplate.StringTemplate; +import org.springframework.beans.factory.annotation.Required; + +import javax.xml.ws.Endpoint; + +// TODO: Auto-generated Javadoc + +/** + * The Class ObjectStoreProfileCreator is responsible of creating profile of the ObjectStore + */ +public class ObjectStoreProfileCreator { + + /** + * service locator. + */ + private UniqueServiceLocator serviceLocator; + + /** + * objectstore ds template. + */ + private StringTemplate objectstoreDsTemplate; + + /** + * service endpoint. + */ + private Endpoint endpoint; + + /** + * endpoint builder. + */ + private EndpointReferenceBuilder eprBuilder; + + /** + * Register profile. + * + * @param interpretation the interpretation + * @return the string + * @throws ISRegistryException the IS registry exception + */ + public String registerProfile(final String interpretation) + throws ISRegistryException { + // XXX: mini hack + StringTemplate template = new StringTemplate( + objectstoreDsTemplate.getTemplate()); + template.setAttribute("serviceUri", eprBuilder.getAddress(endpoint)); + template.setAttribute("interpretation", interpretation); + + return serviceLocator.getService(ISRegistryService.class, true).registerProfile(template.toString()); + } + + public void deleteProfile(final String profileId) throws ISRegistryException { + serviceLocator.getService(ISRegistryService.class).deleteProfile(profileId); + } + + /** + * Gets the endpoint. + * + * @return the endpoint + */ + public Endpoint getEndpoint() { + return endpoint; + } + + /** + * Sets the endpoint. + * + * @param endpoint the new endpoint + */ + @Required + public void setEndpoint(final Endpoint endpoint) { + this.endpoint = endpoint; + } + + /** + * Gets the epr builder. + * + * @return the epr builder + */ + public EndpointReferenceBuilder getEprBuilder() { + return eprBuilder; + } + + /** + * Sets the epr builder. + * + * @param eprBuilder the new epr builder + */ + @Required + public void setEprBuilder(final EndpointReferenceBuilder eprBuilder) { + this.eprBuilder = eprBuilder; + } + + /** + * Gets the objectstore ds template. + * + * @return the objectstore ds template + */ + public StringTemplate getObjectstoreDsTemplate() { + return objectstoreDsTemplate; + } + + /** + * Sets the objectstore ds template. + * + * @param objectstoreDsTemplate the new objectstore ds template + */ + @Required + public void setObjectstoreDsTemplate(final StringTemplate objectstoreDsTemplate) { + this.objectstoreDsTemplate = objectstoreDsTemplate; + } + + public UniqueServiceLocator getServiceLocator() { + return serviceLocator; + } + + @Required + public void setServiceLocator(final UniqueServiceLocator serviceLocator) { + this.serviceLocator = serviceLocator; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreRecord.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreRecord.java new file mode 100644 index 0000000..08beadb --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/ObjectStoreRecord.java @@ -0,0 +1,55 @@ +package eu.dnetlib.data.objectstore.modular; + +import java.io.InputStream; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; + +/** + * The Class ObjectStoreRecord is a serialization of the object to be ingested in the objectStore + * metadata + inputstream of the data. + */ +public class ObjectStoreRecord { + + /** The file metadata. */ + private ObjectStoreFile fileMetadata; + + /** The input stream. */ + private InputStream inputStream; + + /** + * Gets the input stream. + * + * @return the input stream + */ + public InputStream getInputStream() { + return inputStream; + } + + /** + * Sets the input stream. + * + * @param inputStream the new input stream + */ + public void setInputStream(final InputStream inputStream) { + this.inputStream = inputStream; + } + + /** + * Gets the file metadata. + * + * @return the file metadata + */ + public ObjectStoreFile getFileMetadata() { + return fileMetadata; + } + + /** + * Sets the file metadata. + * + * @param fileMetadata the new file metadata + */ + public void setFileMetadata(final ObjectStoreFile fileMetadata) { + this.fileMetadata = fileMetadata; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/connector/ObjectStore.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/connector/ObjectStore.java new file mode 100644 index 0000000..339bbc5 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/connector/ObjectStore.java @@ -0,0 +1,131 @@ +package eu.dnetlib.data.objectstore.modular.connector; + +import eu.dnetlib.data.objectstore.modular.ObjectStoreRecord; +import eu.dnetlib.data.objectstore.rmi.MetadataObjectRecord; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.resultset.ResultSetListener; + +/** + * The Interface ObjectStore. + */ +public interface ObjectStore { + + /** + * Gets the id of the objectStore. + * + * @return the id + */ + String getId(); + + /** + * Gets the interpretation the objectStore. + * + * @return the interpretation + */ + String getInterpretation(); + + /** + * Feed record into the objectstore. + * + * @param records + * the records + * @param incremental + * the incremental + * @return the int + */ + int feed(Iterable records, boolean incremental) throws ObjectStoreServiceException; + + /** + * Feed metadata record into the objectStore. + * + * @param records + * the records + * @param incremental + * the incremental + * @return the int + */ + int feedMetadataRecord(Iterable records, boolean incremental) throws ObjectStoreServiceException; + + /** + * Feed a single object record into the objectStore. + * + * @param record + * the record + * @return the string + */ + String feedObjectRecord(ObjectStoreRecord record) throws ObjectStoreServiceException; + + /** + * Deliver Object from the objectStore. + * + * @param from + * : start date which you want to filter + * @param until + * : end date which you want to filter + * @return the result set listener + */ + ResultSetListener deliver(Long from, Long until) throws ObjectStoreServiceException; + + /** + * Deliver ids. + * + * @param ids + * the ids + * @return the result set listener + */ + ResultSetListener deliverIds(Iterable ids) throws ObjectStoreServiceException; + + /** + * Deliver object. + * + * @param objectId + * the object id + * @return the object store file + * @throws ObjectStoreServiceException + */ + ObjectStoreFile deliverObject(String objectId) throws ObjectStoreServiceException; + + /** + * Gets the size. + * + * @return the size + */ + int getSize() throws ObjectStoreServiceException; + + /** + * Delete object. + * + * @param objectId + * the object id + */ + void deleteObject(String objectId) throws ObjectStoreServiceException; + + /** + * Gets the object. + * + * @param recordId + * the record id + * @return the object + */ + String getObject(String recordId) throws ObjectStoreServiceException; + + /** + * Find if exist an ID startingwith the string startId. + * + * @param startId + * the start id + * @return if exist or less an id + */ + boolean existIDStartsWith(String startId) throws ObjectStoreServiceException; + + /** + * drop the content of the ObjectStore + * THIS METHOD DELETE ALL THE CONTENT INSIDE THE OBJECTSTORE PAY ATTENTION WHEN YOU CALL IT + * + * @return if the content has been refreshed + * @throws ObjectStoreServiceException + */ + boolean dropContent() throws ObjectStoreServiceException; + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/connector/ObjectStoreDao.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/connector/ObjectStoreDao.java new file mode 100644 index 0000000..3027541 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/connector/ObjectStoreDao.java @@ -0,0 +1,72 @@ +package eu.dnetlib.data.objectstore.modular.connector; + +import java.util.List; + +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; + +/** + * The Interface ObjectStoreDao. + */ +public interface ObjectStoreDao { + + /** + * Gets an Object Store with the given identifier. + *

+ * If an Object Store with the given identifier does not exist, a new one is created. + *

+ * + * @param obsId + * the object store identifier + * @return the object store + * @throws ObjectStoreServiceException + */ + ObjectStore getObjectStore(String obsId) throws ObjectStoreServiceException; + + /** + * List all the Object stores. + * + * @return the list of object store ids + */ + List listObjectStores(); + + /** + * Creates an Object Store with the given identifier. + *

+ * If an Object Store with the given identifier already exists this method does nothing. + *

+ * + * @param obsId the object store identifier + * @param interpretation the interpretation of the store + * @param basePath the base path to store the object Store in case of file system implementation + * @return true, if successful + * @throws ObjectStoreServiceException + */ + boolean createObjectStore(String obsId, String interpretation, String basePath) throws ObjectStoreServiceException; + + /** + * Upddate an Object Store metadata with the given identifier. + *

+ * If an Object Store with the given identifier does not exist, a new one is created. + *

+ * + * @param obsId + * the object store identifier + * @param interpretation + * the interpretation of the store + * @return true, if successful + */ + boolean updateObjectStore(String obsId, String interpretation); + + /** + * Delete object store. + * + * @param obsId + * the object store identifier + * @return true, if successful + * @throws ObjectStoreServiceException + */ + boolean deleteObjectStore(String obsId) throws ObjectStoreServiceException; + + boolean dropContent(String obsId) throws ObjectStoreServiceException; + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/inspector/ObjectStoreInspector.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/inspector/ObjectStoreInspector.java new file mode 100644 index 0000000..d0a2c5d --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/modular/inspector/ObjectStoreInspector.java @@ -0,0 +1,199 @@ +package eu.dnetlib.data.objectstore.modular.inspector; + +import static eu.dnetlib.miscutils.collections.MappedCollection.listMap; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import com.google.gson.Gson; + +import eu.dnetlib.data.objectstore.modular.connector.ObjectStore; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStoreDao; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.inspector.AbstractInspectorController; +import eu.dnetlib.enabling.resultset.ResultSetListener; +import eu.dnetlib.miscutils.collections.MappedCollection; +import eu.dnetlib.miscutils.functional.UnaryFunction; + +/** + * The Class ObjectStoreInspector is the inspector controller of the objectStore. + */ +@Controller +public class ObjectStoreInspector extends AbstractInspectorController { + + // private static final Log log = LogFactory.getLog(ObjectStoreInspector.class); + + /** The object store dao. */ + @Autowired + private ObjectStoreDao objectStoreDao; + + /** + * The Class ObjectStoreDescription. + */ + class ObjectStoreDescription { + + /** The id. */ + private String id; + + /** The size. */ + private int size; + + /** + * Instantiates a new object store description. + * + * @param id + * the id + * @param size + * the size + */ + public ObjectStoreDescription(final String id, final int size) { + + this.id = id; + this.size = size; + } + + /** + * Gets the interpretation. + * + * @return the interpretation + * @throws ObjectStoreServiceException + */ + public String getInterpretation() throws ObjectStoreServiceException { + + ObjectStore objectStore = objectStoreDao.getObjectStore(id); + return objectStore.getInterpretation(); + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(final String id) { + this.id = id; + } + + /** + * Gets the size. + * + * @return the size + */ + public int getSize() { + return size; + } + + /** + * Sets the size. + * + * @param size + * the new size + */ + public void setSize(final int size) { + this.size = size; + } + } + + /** + * Object stores. + * + * @param model + * the model + */ + @RequestMapping(value = "/inspector/objectstores.do") + public void objectStores(final Model model) { + List objectStores = objectStoreDao.listObjectStores(); + model.addAttribute("objectstores", MappedCollection.listMap(objectStores, new UnaryFunction() { + + @Override + public ObjectStoreDescription evaluate(final String id) { + try { + ObjectStore objStore = objectStoreDao.getObjectStore(id); + return new ObjectStoreDescription(id, objStore.getSize()); + } catch (ObjectStoreServiceException e) { + return null; + } + } + })); + } + + /** + * Object store. + * + * @param model + * the model + * @param id + * the id + * @param startParam + * the start param + * @param regex + * the regex + * @throws ObjectStoreServiceException + */ + @RequestMapping(value = "/inspector/objectstore.do", method = RequestMethod.GET) + public void objectStore(final Model model, + @RequestParam("id") final String id, + @RequestParam(value = "start", required = false) final Integer startParam, + @RequestParam(value = "regex", required = false) final String regex) throws ObjectStoreServiceException { + int pageSize = 10; + int start = 0; + + if (startParam != null) { + start = startParam; + } + ObjectStore objctStore = objectStoreDao.getObjectStore(id); + ResultSetListener rs = objctStore.deliver((long) 0, System.currentTimeMillis()); + List page = rs.getResult((1 + start), (start + pageSize)); + final Gson g = new Gson(); + model.addAttribute("id", id); + model.addAttribute("start", start); + model.addAttribute("regex", regex); + model.addAttribute("nextPage", start + pageSize); + model.addAttribute("prevPage", Math.max(0, start - pageSize)); + model.addAttribute("size", rs.getSize()); + model.addAttribute("page", listMap(page, new UnaryFunction() { + + @Override + public ObjectStoreFile evaluate(final String json) { + return g.fromJson(json, ObjectStoreFile.class); + } + })); + + } + + /** + * Gets the object store dao. + * + * @return the object store dao + */ + public ObjectStoreDao getObjectStoreDao() { + return objectStoreDao; + } + + /** + * Sets the object store dao. + * + * @param objectStoreDao + * the new object store dao + */ + public void setObjectStoreDao(final ObjectStoreDao objectStoreDao) { + this.objectStoreDao = objectStoreDao; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/MetadataObjectRecord.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/MetadataObjectRecord.java new file mode 100644 index 0000000..3fa3615 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/MetadataObjectRecord.java @@ -0,0 +1,61 @@ +package eu.dnetlib.data.objectstore.rmi; + +import java.io.Serializable; + +import com.google.gson.Gson; + +public class MetadataObjectRecord implements Serializable { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -5640196854633924754L; + + public static MetadataObjectRecord initFromJson(final String input) { + return new Gson().fromJson(input, MetadataObjectRecord.class); + } + + public MetadataObjectRecord() { + + } + + public MetadataObjectRecord(final String id, final String record, final String mime) { + super(); + this.id = id; + this.record = record; + this.mime = mime; + } + + private String id; + + private String record; + + private String mime; + + public String getId() { + return id; + } + + public String getRecord() { + return record; + } + + public void setId(final String id) { + this.id = id; + } + + public void setRecord(final String record) { + this.record = record; + } + + public String toJSON() { + return new Gson().toJson(this); + } + + public String getMime() { + return mime; + } + + public void setMime(final String mime) { + this.mime = mime; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreFile.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreFile.java new file mode 100644 index 0000000..df0ca16 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreFile.java @@ -0,0 +1,258 @@ +package eu.dnetlib.data.objectstore.rmi; + +import java.io.Serializable; + +import com.google.gson.Gson; + +/** + * The Class ObjectStoreFile. + */ +public class ObjectStoreFile implements Serializable { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -6501291693572693712L; + + /** The metadata related id. */ + private String metadataRelatedID; + + /** The object id. */ + private String objectID; + + /** The mime type. */ + private String mimeType; + + /** The access protocol. */ + private Protocols accessProtocol; + + /** The object uri . */ + private String URI; + + /** The username auth. */ + private String usernameAuth; + + /** The password auth. */ + private String passwordAuth; + + /** The downloaded url. */ + private String downloadedURL; + + /** The md5 sum of the file. */ + private String md5Sum; + + /** The file size. */ + private long fileSizeKB; + + /** + * Gets the downloaded url. + * + * @return the downloaded url + */ + public String getDownloadedURL() { + return downloadedURL; + } + + /** + * Sets the downloaded url. + * + * @param downloadedURL + * the new downloaded url + */ + public void setDownloadedURL(final String downloadedURL) { + this.downloadedURL = downloadedURL.replace("\\u003d", "=").replace("\\u0026", "&");; + } + + /** + * Instantiates a new object store file. + */ + public ObjectStoreFile() { + this.accessProtocol = Protocols.None; + + } + + /** + * Return a new instance of the object from a json String. + * + * @param jsonObject + * the json object + * @return the object store file + */ + public static ObjectStoreFile createObject(final String jsonObject) { + Gson g = new Gson(); + return g.fromJson(jsonObject, ObjectStoreFile.class); + } + + /** + * Gets the object id. + * + * @return the object id + */ + public String getObjectID() { + return objectID; + } + + /** + * Sets the object id. + * + * @param objectID + * the new object id + */ + public void setObjectID(final String objectID) { + this.objectID = objectID; + } + + /** + * Gets the mime type. + * + * @return the mime type + */ + public String getMimeType() { + return mimeType; + } + + /** + * Sets the mime type. + * + * @param mimeType + * the new mime type + */ + public void setMimeType(final String mimeType) { + this.mimeType = mimeType; + } + + /** + * Gets the access protocol. + * + * @return the access protocol + */ + public Protocols getAccessProtocol() { + return accessProtocol; + } + + /** + * Sets the access protocol. + * + * @param accessProtocol + * the new access protocol + */ + public void setAccessProtocol(final Protocols accessProtocol) { + this.accessProtocol = accessProtocol; + } + + /** + * Gets the username auth. + * + * @return the username auth + */ + public String getUsernameAuth() { + return usernameAuth; + } + + /** + * Sets the username auth. + * + * @param usernameAuth + * the new username auth + */ + public void setUsernameAuth(final String usernameAuth) { + this.usernameAuth = usernameAuth; + } + + /** + * Gets the password auth. + * + * @return the password auth + */ + public String getPasswordAuth() { + return passwordAuth; + } + + /** + * Sets the password auth. + * + * @param passwordAuth + * the new password auth + */ + public void setPasswordAuth(final String passwordAuth) { + this.passwordAuth = passwordAuth; + } + + /** + * Gets the uri. + * + * @return the uri + */ + public String getURI() { + return URI != null ? URI.replace("\\u003d", "=").replace("\\u0026", "&") : ""; + } + + /** + * Sets the uri. + * + * @param uri + * the new uri + */ + public void setURI(final String uri) { + if (uri != null) { + URI = uri.replace("\\u003d", "=").replace("\\u0026", "&"); + } + } + + /** + * Convert the object into a json String. + * + * @return the string + */ + public String toJSON() { + Gson g = new Gson(); + return g.toJson(this).replace("\\u003d", "=").replace("\\u0026", "&"); + } + + /** + * Gets the related metadata id. + * + * @return the related metadata id. + */ + public String getMetadataRelatedID() { + return metadataRelatedID; + } + + /** + * Sets the related metadata id. + * + * @param metadataRelatedID + * the related metadata id. + */ + public void setMetadataRelatedID(final String metadataRelatedID) { + this.metadataRelatedID = metadataRelatedID; + } + + /** + * @return the md5Sum + */ + public String getMd5Sum() { + return md5Sum; + } + + /** + * @param md5Sum + * the md5Sum to set + */ + public void setMd5Sum(final String md5Sum) { + this.md5Sum = md5Sum; + } + + /** + * @return the fileSizeKB + */ + public long getFileSizeKB() { + return fileSizeKB; + } + + /** + * @param fileSizeKB the fileSizeKB to set + */ + public void setFileSizeKB(long fileSizeKB) { + this.fileSizeKB = fileSizeKB; + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreFileNotFoundException.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreFileNotFoundException.java new file mode 100644 index 0000000..699da54 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreFileNotFoundException.java @@ -0,0 +1,22 @@ +package eu.dnetlib.data.objectstore.rmi; + +/** + * The Class ObjectStoreFileNotFoundException. + */ +public class ObjectStoreFileNotFoundException extends ObjectStoreServiceException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -5418923557898374219L; + + /** + * Instantiates a new object store file not found exception. + * + * @param string + * the string + */ + public ObjectStoreFileNotFoundException(final String string) { + super(string); + + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreService.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreService.java new file mode 100644 index 0000000..2aada19 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreService.java @@ -0,0 +1,109 @@ +package eu.dnetlib.data.objectstore.rmi; + +import java.util.List; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebService; +import javax.xml.ws.wsaddressing.W3CEndpointReference; + +import eu.dnetlib.common.rmi.BaseService; + +/** + * Main ObjectStore Service interface. + * + * @author Sandro La Bruzzo + * @version 0.0.1 + */ +@WebService(targetNamespace = "http://services.dnetlib.eu/") +public interface ObjectStoreService extends BaseService { + + /** + * Returns ResultSet EPR for delivered ObjectStore records in a particular range date. + *

+ * Please check service implementations for details on the expected format of the records in the result set epr. + *

+ *

+ * This method could be used for a bulk deliver of all objects in the store + *

+ * + * @param obsId + * identifier of the ObjectStore + * @param from + * the minimum date of the object + * @param until + * the maximum date of the object + * @return a ResultSet EPR. Each element of the result set contains the objIdentifier of a record and its URL for retrieve the + * inputstream of the file. + * @throws ObjectStoreServiceException + * the object store service exception + */ + @WebMethod(operationName = "deliverObjects", action = "deliverObjects") + public W3CEndpointReference deliverObjects(@WebParam(name = "obsId") String obsId, @WebParam(name = "from") Long from, @WebParam(name = "until") Long until) + throws ObjectStoreServiceException; + + /** + * Returns ResultSet EPR for delivered ObjectStore records. + *

+ * Please check service implementations for details on the expected format of the records in the result set epr. + *

+ * + * @param obsId + * identifier of the ObjectStore + * @param eprId + * id of a ResultSet EPR with the identifiers of the interesting objects. Each element of the result set contains the + * objIdentifier of a record + * @return a ResultSet EPR. Each element of the result set contains the objIdentifier of a record and its URL for retrieve the + * inputstream of the file. + * @throws ObjectStoreServiceException + * the object store service exception + */ + @WebMethod(operationName = "deliverObjectsByIds", action = "deliverObjectsByIds") + public W3CEndpointReference deliverObjectsByIds(@WebParam(name = "obsId") String obsId, @WebParam(name = "eprId") W3CEndpointReference eprId) + throws ObjectStoreServiceException; + + /** + * Returns an URL to retrieve the ObjectStore record. + * + * @param obsId + * identifier of the ObjectStore + * @param objectId + * the id of the object + * @return the URL for retrieve the record + * @throws ObjectStoreServiceException + * the object store service exception + */ + @WebMethod(operationName = "deliverObject", action = "deliverObject") + public String deliverRecord(@WebParam(name = "obsId") String obsId, @WebParam(name = "objectId") String objectId) throws ObjectStoreServiceException; + + /** + * Feed the object in the objectStore + * + * @param obsId + * identifier of the ObjectStore + * @param objectMetadata + * the String serialized of the JSON object ObjectStoreFile + * @throws ObjectStoreServiceException + */ + + @WebMethod(operationName = "feedObject", action = "feedObject") + public void feedObject(@WebParam(name = "obsId") String obsId, @WebParam(name = "objectMetadata") String objectMetadata) throws ObjectStoreServiceException; + + /** + * Returns list of all stored indices. + * + * @return list of all stored indices + */ + @WebMethod(operationName = "getListOfObjectStores", action = "getListOfObjectStores") + public List getListOfObjectStores(); + + /** + * Gets the size of the objectStore ID. + * + * @param obsId + * the obs id + * @return the size + */ + @WebMethod(operationName = "getSize", action = "getSize") + public int getSize(@WebParam(name = "obsId") String obsId) throws ObjectStoreServiceException; +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreServiceException.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreServiceException.java new file mode 100644 index 0000000..97ed419 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/ObjectStoreServiceException.java @@ -0,0 +1,45 @@ +package eu.dnetlib.data.objectstore.rmi; + +import eu.dnetlib.common.rmi.RMIException; + +/** + * The Class ObjectStoreServiceException. + */ +public class ObjectStoreServiceException extends RMIException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -7073846285219543315L; + + /** + * Instantiates a new object store service exception. + * + * @param string + * the string + */ + public ObjectStoreServiceException(final String string) { + super(string); + } + + /** + * Instantiates a new object store service exception. + * + * @param string + * the string + * @param exception + * the exception + */ + public ObjectStoreServiceException(final String string, final Throwable exception) { + super(string, exception); + } + + /** + * Instantiates a new object store service exception. + * + * @param exception + * the exception + */ + public ObjectStoreServiceException(final Throwable exception) { + super(exception); + } + +} diff --git a/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/Protocols.java b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/Protocols.java new file mode 100644 index 0000000..66a3911 --- /dev/null +++ b/dnet-data-services/src/main/java/eu/dnetlib/data/objectstore/rmi/Protocols.java @@ -0,0 +1,13 @@ +package eu.dnetlib.data.objectstore.rmi; + +/** + * The Enum Protocols. + */ + public enum Protocols { + None, + HTTP, + HTTPS, + FTP, + File_System, + FTPS +} diff --git a/dnet-data-services/src/main/resources/eu/dnetlib/applicationContext-dnet-objectstore-rmi.xml b/dnet-data-services/src/main/resources/eu/dnetlib/applicationContext-dnet-objectstore-rmi.xml new file mode 100644 index 0000000..44b5322 --- /dev/null +++ b/dnet-data-services/src/main/resources/eu/dnetlib/applicationContext-dnet-objectstore-rmi.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/applicationContext-dnet-modular-objectstore-service.properties b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/applicationContext-dnet-modular-objectstore-service.properties new file mode 100644 index 0000000..0b43727 --- /dev/null +++ b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/applicationContext-dnet-modular-objectstore-service.properties @@ -0,0 +1,2 @@ +services.objectstore.dao=gridFSObjectstoreDao +services.objectstore.rsfactory.pagesize=20 \ No newline at end of file diff --git a/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/applicationContext-dnet-modular-objectstore-service.xml b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/applicationContext-dnet-modular-objectstore-service.xml new file mode 100644 index 0000000..e8b2ade --- /dev/null +++ b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/applicationContext-dnet-modular-objectstore-service.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/filesystem/applicationContext-filesystem-objectstore.properties b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/filesystem/applicationContext-filesystem-objectstore.properties new file mode 100644 index 0000000..b51c409 --- /dev/null +++ b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/filesystem/applicationContext-filesystem-objectstore.properties @@ -0,0 +1,8 @@ +services.objectStore.mongodb.host=localhost +services.objectStore.mongodb.port=27017 +services.objectStore.mongodb.db=objectStore +services.objectStore.mongodb.connectionsPerHost=20 +services.objectStore.mongodb.upsert=true +services.objectstore.mongodb.integritycheck.cron=0 0 2 1/1 * ? * +services.objectStore.RESTURI=http://${container.hostname}:${container.port}/${container.context}/mvc/objectStore/retrieve.do +services.objectstore.dao=fSObjectstoreDao diff --git a/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/filesystem/applicationContext-filesystem-objectstore.xml b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/filesystem/applicationContext-filesystem-objectstore.xml new file mode 100644 index 0000000..c0fce46 --- /dev/null +++ b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/filesystem/applicationContext-filesystem-objectstore.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/inspector/webContext-objectstore-inspector.xml b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/inspector/webContext-objectstore-inspector.xml new file mode 100644 index 0000000..344de29 --- /dev/null +++ b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/inspector/webContext-objectstore-inspector.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/objectstoreds-template.xml b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/objectstoreds-template.xml new file mode 100644 index 0000000..e11d5aa --- /dev/null +++ b/dnet-data-services/src/main/resources/eu/dnetlib/data/objectstore/objectstoreds-template.xml @@ -0,0 +1,24 @@ + + +
+ + + + + +
+ + + $interpretation$ + + + + + + 0 + 0 + + + + +
\ No newline at end of file diff --git a/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/ConfigurationTestConfig.java b/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/ConfigurationTestConfig.java new file mode 100644 index 0000000..f0469e3 --- /dev/null +++ b/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/ConfigurationTestConfig.java @@ -0,0 +1,51 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import java.net.UnknownHostException; + +import com.mongodb.MongoClient; +import com.mongodb.client.MongoDatabase; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +// TODO: Auto-generated Javadoc +/** + * The Class ConfigurationTestConfig. + */ +@Configuration +public class ConfigurationTestConfig { + + /** + * Mongo db. + * + * @return the db + * @throws UnknownHostException the unknown host exception + */ + @Bean + public MongoDatabase objectstoreMongoDB() throws UnknownHostException { + MongoClient mongoClient = new MongoClient("localhost"); + return mongoClient.getDatabase("objectStoreTest"); + + } + + + @Bean + public FileSystemObjectStoreDao fsObjectStoreDAO() { + FileSystemObjectStoreDao fileSystemObjectStoreDao = new FileSystemObjectStoreDao(); + + fileSystemObjectStoreDao.setObjectStoreRESTURI("http://www.objectstore.com"); + return fileSystemObjectStoreDao; + + } + + /** + * Fs utility. + * + * @return the file system utility + */ + @Bean + public FileSystemUtility fsUtility () { + return new FileSystemUtility(); + } + + +} diff --git a/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/InputIterator.java b/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/InputIterator.java new file mode 100644 index 0000000..12588ab --- /dev/null +++ b/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/InputIterator.java @@ -0,0 +1,80 @@ +/** + * + */ +package eu.dnetlib.data.objectstore.filesystem; + +import java.io.IOException; +import java.util.Iterator; + +import eu.dnetlib.data.objectstore.modular.ObjectStoreRecord; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.Protocols; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +/** + * @author sandro + * + */ +public class InputIterator implements Iterable, Iterator { + + private int counter = 0; + private String pdfResourcePath = "test.pdf"; + private Resource testPDF = new ClassPathResource(pdfResourcePath); + + /** + * {@inheritDoc} + * @see java.util.Iterator#hasNext() + */ + @Override + public boolean hasNext() { + + return counter<100; + } + + /** + * {@inheritDoc} + * @see java.util.Iterator#next() + */ + @Override + public ObjectStoreRecord next() { + try { + counter ++; + ObjectStoreRecord record = new ObjectStoreRecord(); + ObjectStoreFile fileMetadata = new ObjectStoreFile(); + fileMetadata.setAccessProtocol(Protocols.File_System); + + fileMetadata.setDownloadedURL("file://" + pdfResourcePath); + fileMetadata.setURI("file://" + pdfResourcePath); + fileMetadata.setObjectID("Oggetto_"+counter); + fileMetadata.setMimeType("application/pdf"); + System.out.println("Aggiungo Elemento "+counter); + record.setInputStream(testPDF.getInputStream()); + record.setFileMetadata(fileMetadata ); + return record; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * {@inheritDoc} + * @see java.util.Iterator#remove() + */ + @Override + public void remove() { + // TODO Auto-generated method stub + + } + + /** + * {@inheritDoc} + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + counter =0; + return this; + } + +} diff --git a/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/ObjectStoreServiceDAOTest.java b/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/ObjectStoreServiceDAOTest.java new file mode 100644 index 0000000..fbd6178 --- /dev/null +++ b/dnet-data-services/src/test/java/eu/dnetlib/data/objectstore/filesystem/ObjectStoreServiceDAOTest.java @@ -0,0 +1,117 @@ +package eu.dnetlib.data.objectstore.filesystem; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import com.mongodb.client.MongoDatabase; +import eu.dnetlib.data.objectstore.modular.connector.ObjectStore; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreFile; +import eu.dnetlib.data.objectstore.rmi.ObjectStoreServiceException; +import eu.dnetlib.enabling.resultset.ResultSetListener; +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * TODO: Test class set to ignored because it requires a mongo server running on localhost. Tests with mocks should be prepared. + * @author sandro + * + */ +@Ignore +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = ConfigurationTestConfig.class) +public class ObjectStoreServiceDAOTest { + private static final Log log = LogFactory.getLog(ObjectStoreServiceDAOTest.class); // NOPMD by marko on 11/24/08 5:02 PM + + @Autowired + private FileSystemObjectStoreDao objectStoreDAO; + + @Autowired + private MongoDatabase objectstoreMongoDB; + + private String interpretation = "interp"; + private String basePath = "/tmp/basePath"; + //must be 36 chars + private String obsID = "test56789111315171921232527293133350"; + private String pdfPath = "./test.pdf"; + + @Before + public void setup() throws IOException, ObjectStoreServiceException { + Path baseDirPath = FileSystems.getDefault().getPath(basePath); + if (!Files.exists(baseDirPath)) { + Files.createDirectory(baseDirPath); + } + objectStoreDAO.createObjectStore(obsID + "_T2JqZWN0U3RvcmVEU1Jlc291cmNlcy9PYmplY3RTdG9yZURTUmVzb3VyY2VUeXBl", interpretation, basePath); + } + + @After + public void tearDown() throws IOException, ObjectStoreServiceException { + objectstoreMongoDB.drop(); + FileUtils.deleteDirectory(new File(basePath)); + } + + @Test + public void testList() { + final List objectStores = this.objectStoreDAO.listObjectStores(); + for (String o : objectStores) + System.out.println(o); + assertTrue(objectStores.contains(obsID + "_T2JqZWN0U3RvcmVEU1Jlc291cmNlcy9PYmplY3RTdG9yZURTUmVzb3VyY2VUeXBl")); + } + + @Test + public void testGet() throws ObjectStoreServiceException { + ObjectStore o = objectStoreDAO.getObjectStore(obsID); + System.out.println(o.toString()); + assertNotNull(o); + } + + @Test + public void testFeed() throws ObjectStoreServiceException, FileNotFoundException { + objectStoreDAO.getObjectStore(obsID).feed(new InputIterator(),true); + } + + @Test + public void testDeliverObject() throws ObjectStoreServiceException { + objectStoreDAO.getObjectStore(obsID).feed(new InputIterator(), true); + final ObjectStoreFile obj2 = objectStoreDAO.getObjectStore(obsID).deliverObject("Oggetto_2"); + System.out.println(obj2.toJSON()); + assertNotNull(obj2); + } + + @Test + public void testGetStream() throws Exception { + objectStoreDAO.getObjectStore(obsID).feed(new InputIterator(), true); + ResultSetListener rs = objectStoreDAO.getObjectStore(obsID).deliver(0L, System.currentTimeMillis()); + for (int i=1; i< (rs.getSize()/10); ) { + + int from = i; + int to = Math.max(rs.getSize(), i*10); + + List data = rs.getResult(from, to); + + for (String s: data) { + System.out.println(s); + } + + i= to ; + } + } + + +} diff --git a/dnet-data-services/src/test/resources/test.pdf b/dnet-data-services/src/test/resources/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..948e79a01b1bb06d1862325eabb4adefc2c6a320 GIT binary patch literal 298906 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

=0ys{)+*>26>Q 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]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%0A)^c!vdpL7hi2n=mc_AJOCL?(PK15Pl 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 C3%`;8 literal 0 HcmV?d00001