imported dnet-objectstore-rmi, dnet-modular-objectstore-service, dnet-fs-objectstore in dnet-data-services
This commit is contained in:
parent
337b42e945
commit
7e202d3d79
|
@ -28,6 +28,10 @@
|
||||||
<artifactId>commons-beanutils</artifactId>
|
<artifactId>commons-beanutils</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.groovy</groupId>
|
<groupId>org.codehaus.groovy</groupId>
|
||||||
<artifactId>groovy</artifactId>
|
<artifactId>groovy</artifactId>
|
||||||
|
|
|
@ -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<DBObject> 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<DBObject> 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<ObjectStoreRecord> 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<MetadataObjectRecord> records, final boolean incremental) throws ObjectStoreServiceException {
|
||||||
|
Iterable<ObjectStoreRecord> 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<String, Long> 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<String> 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<DBObject> 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<DBObject> 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<String> listObjectStores() {
|
||||||
|
MongoCollection<DBObject> metadata = getDb().getCollection(OBJECTSTORE_METADATA_NAME_FIELD, DBObject.class);
|
||||||
|
return MappedCollection.listMap(metadata.find(), new UnaryFunction<String, DBObject>() {
|
||||||
|
|
||||||
|
@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<DBObject> 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<DBObject> 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<DBObject> 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<DBObject> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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 <code>addFileSystemObjectStoreResultSetListener<code> 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<String> records;
|
||||||
|
|
||||||
|
/** The object store id. */
|
||||||
|
private String objectStoreID;
|
||||||
|
|
||||||
|
|
||||||
|
/** The mongo collection. */
|
||||||
|
private MongoCollection<DBObject> 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<DBObject> currentCursor;
|
||||||
|
|
||||||
|
/** The cursor position. */
|
||||||
|
private long cursorPosition;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
* @see eu.dnetlib.enabling.resultset.TypedResultSetListener#getResult(int, int)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<String> 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<String> 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<DBObject> 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<DBObject> 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<String> getRecords() {
|
||||||
|
return records;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the records.
|
||||||
|
*
|
||||||
|
* @param records the records to set
|
||||||
|
*/
|
||||||
|
public void setRecords(final List<String> 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<DBObject> getCurrentCursor() {
|
||||||
|
return currentCursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the current cursor.
|
||||||
|
*
|
||||||
|
* @param currentCursor the currentCursor to set
|
||||||
|
*/
|
||||||
|
public void setCurrentCursor(final MongoCursor<DBObject> 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<DBObject> getMongoCollection() {
|
||||||
|
return mongoCollection;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the mongo collection.
|
||||||
|
*
|
||||||
|
* @param mongoCollection the new mongo collection
|
||||||
|
*/
|
||||||
|
public void setMongoCollection(final MongoCollection<DBObject> mongoCollection) {
|
||||||
|
this.mongoCollection = mongoCollection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBasePath() {
|
||||||
|
return basePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBasePath(final String basePath) {
|
||||||
|
this.basePath = basePath;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<String, Long> 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<String, Long>(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<Path>() {
|
||||||
|
@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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<DBObject> 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<DBObject> metadata = db.getCollection(OBJECTSTORE_METADATA_NAME_FIELD, DBObject.class);
|
||||||
|
metadata.createIndex(new BasicDBObject(OBJECTSTORE_ID_FIELD, 1), bg);
|
||||||
|
|
||||||
|
log.info("objectStore indexes integrity completed");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<MongoClientOptions> {
|
||||||
|
|
||||||
|
private int connectionsPerHost;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MongoClientOptions getObject() throws BeansException {
|
||||||
|
return MongoClientOptions.builder().connectionsPerHost(connectionsPerHost).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<MongoClientOptions> getObjectType() {
|
||||||
|
return MongoClientOptions.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSingleton() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getConnectionsPerHost() {
|
||||||
|
return connectionsPerHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConnectionsPerHost(final int connectionsPerHost) {
|
||||||
|
this.connectionsPerHost = connectionsPerHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<String, DBObject> asJSON(final String baseURI, final String objectStoreID, final String basePath) {
|
||||||
|
return input -> build(input, baseURI, objectStoreID, basePath).toJSON();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<ObjectStoreActions> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<String> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<String> records = resultSetClientFactory.getClient(rsEpr);
|
||||||
|
Iterable<MetadataObjectRecord> 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<String> records = resultSetClientFactory.getClient(rsEpr);
|
||||||
|
ObjectBroker objectBroker = new ObjectBroker(protocol, login, password, mime);
|
||||||
|
Iterable<ObjectStoreRecord> 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<ObjectStoreRecord> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<String> 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();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<String, ObjectStoreRecord> {
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
|
@ -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<String> profiles = listProfileIds();
|
||||||
|
Set<String> objectStore = listObjectStoreIds();
|
||||||
|
Set<String> objectStoreNotInProfile = Sets.newHashSet(objectStore);
|
||||||
|
objectStoreNotInProfile.removeAll(profiles);
|
||||||
|
Set<String> 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<String> listObjectStoreIds() {
|
||||||
|
return Sets.newHashSet(
|
||||||
|
Lists.transform(objectStoreDao.listObjectStores(), new Function<String, String>() {
|
||||||
|
@Override
|
||||||
|
public String apply(String input) {
|
||||||
|
return StringUtils.substringBefore(input, "_");
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Set<String> 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<String> resultList = lookupService.quickSearchProfile(query);
|
||||||
|
|
||||||
|
|
||||||
|
return Sets.newHashSet(Lists.transform(resultList, new Function<String, String>() {
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<String> objectStoreWithoutProfile;
|
||||||
|
|
||||||
|
private Set<String> profileWithoutObjectStore;
|
||||||
|
|
||||||
|
|
||||||
|
public Set<String> getObjectStoreWithoutProfile() {
|
||||||
|
return objectStoreWithoutProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setObjectStoreWithoutProfile(Set<String> objectStoreWithoutProfile) {
|
||||||
|
this.objectStoreWithoutProfile = objectStoreWithoutProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getProfileWithoutObjectStore() {
|
||||||
|
return profileWithoutObjectStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProfileWithoutObjectStore(Set<String> profileWithoutObjectStore) {
|
||||||
|
this.profileWithoutObjectStore = profileWithoutObjectStore;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<Endpoint> 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<Endpoint> getEprBuilder() {
|
||||||
|
return eprBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the epr builder.
|
||||||
|
*
|
||||||
|
* @param eprBuilder the new epr builder
|
||||||
|
*/
|
||||||
|
@Required
|
||||||
|
public void setEprBuilder(final EndpointReferenceBuilder<Endpoint> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<ObjectStoreRecord> 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<MetadataObjectRecord> 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<String> 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;
|
||||||
|
|
||||||
|
}
|
|
@ -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.
|
||||||
|
* <p>
|
||||||
|
* If an Object Store with the given identifier does not exist, a new one is created.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @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<String> listObjectStores();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an Object Store with the given identifier.
|
||||||
|
* <p>
|
||||||
|
* If an Object Store with the given identifier already exists this method does nothing.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
* <p>
|
||||||
|
* If an Object Store with the given identifier does not exist, a new one is created.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @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;
|
||||||
|
|
||||||
|
}
|
|
@ -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<String> objectStores = objectStoreDao.listObjectStores();
|
||||||
|
model.addAttribute("objectstores", MappedCollection.listMap(objectStores, new UnaryFunction<ObjectStoreDescription, String>() {
|
||||||
|
|
||||||
|
@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<String> 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<ObjectStoreFile, String>() {
|
||||||
|
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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 <a href="mailto:sandro.labruzzo at isti.cnr.it">Sandro La Bruzzo</a>
|
||||||
|
* @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.
|
||||||
|
* <p>
|
||||||
|
* Please check service implementations for details on the expected format of the records in the result set epr.
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* This method could be used for a bulk deliver of all objects in the store
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
* <p>
|
||||||
|
* Please check service implementations for details on the expected format of the records in the result set epr.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @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<String> 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;
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package eu.dnetlib.data.objectstore.rmi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Enum Protocols.
|
||||||
|
*/
|
||||||
|
public enum Protocols {
|
||||||
|
None,
|
||||||
|
HTTP,
|
||||||
|
HTTPS,
|
||||||
|
FTP,
|
||||||
|
File_System,
|
||||||
|
FTPS
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
|
||||||
|
xmlns:sec="http://cxf.apache.org/configuration/security" xmlns:wsa="http://cxf.apache.org/ws/addressing"
|
||||||
|
xmlns:p="http://www.springframework.org/schema/p" xmlns:http="http://cxf.apache.org/transports/http/configuration"
|
||||||
|
xmlns:t="http://dnetlib.eu/springbeans/t" xmlns:template="http://dnetlib.eu/springbeans/template"
|
||||||
|
xmlns:util="http://www.springframework.org/schema/util"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||||
|
http://cxf.apache.org/ws/addressing http://cxf.apache.org/schemas/ws-addr-conf.xsd
|
||||||
|
http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd
|
||||||
|
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
|
||||||
|
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
|
||||||
|
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
|
||||||
|
http://dnetlib.eu/springbeans/template http://dnetlib.eu/springbeans/template.xsd">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</beans>
|
|
@ -0,0 +1,2 @@
|
||||||
|
services.objectstore.dao=gridFSObjectstoreDao
|
||||||
|
services.objectstore.rsfactory.pagesize=20
|
|
@ -0,0 +1,111 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:jaxws="http://cxf.apache.org/jaxws"
|
||||||
|
xmlns:p="http://www.springframework.org/schema/p"
|
||||||
|
xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:t="http://dnetlib.eu/springbeans/t"
|
||||||
|
xmlns:template="http://dnetlib.eu/springbeans/template"
|
||||||
|
xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||||
|
|
||||||
|
|
||||||
|
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
|
||||||
|
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
|
||||||
|
|
||||||
|
http://dnetlib.eu/springbeans/template http://dnetlib.eu/springbeans/template.xsd">
|
||||||
|
|
||||||
|
|
||||||
|
<bean id="objectStoreService"
|
||||||
|
class="eu.dnetlib.data.objectstore.modular.ModularObjectStoreService"
|
||||||
|
init-method="start" destroy-method="stop"
|
||||||
|
p:feeder-ref="objectstoreFeeder"
|
||||||
|
p:objectStoreDeliver-ref="objectstoreDeliver"
|
||||||
|
p:notificationHandler-ref="objectstoreNotificationHandler"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<bean id="objectstoreFeeder"
|
||||||
|
class="eu.dnetlib.data.objectstore.modular.ModularObjectStoreFeeder"
|
||||||
|
p:dao-ref="${services.objectstore.dao}"
|
||||||
|
p:resultSetClientFactory-ref="objectstoreResultSetClientFactory"
|
||||||
|
p:serviceLocator-ref="uniqueServiceLocator"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<bean id="objectstoreDeliver"
|
||||||
|
class="eu.dnetlib.data.objectstore.modular.ModularObjectStoreDeliver"
|
||||||
|
p:dao-ref="${services.objectstore.dao}"
|
||||||
|
p:resultSetClientFactory-ref="objectstoreResultSetClientFactory"
|
||||||
|
|
||||||
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
<bean id="objectstoreResultSetClientFactory" parent="resultSetClientFactory"
|
||||||
|
p:pageSize="${services.objectstore.rsfactory.pagesize}"/>
|
||||||
|
|
||||||
|
|
||||||
|
<bean id="objectstoreProfileCreator" class="eu.dnetlib.data.objectstore.modular.ObjectStoreProfileCreator"
|
||||||
|
p:serviceLocator-ref="uniqueServiceLocator" p:objectstoreDsTemplate-ref="objectstoreDsTemplate"
|
||||||
|
p:endpoint-ref="objectStoreServiceEndpoint" p:eprBuilder-ref="jaxwsEndpointReferenceBuilder"/>
|
||||||
|
|
||||||
|
<bean id="objectstoreNotificationHandler"
|
||||||
|
class="eu.dnetlib.enabling.tools.blackboard.BlackboardServerExecutorNotificationHandler"
|
||||||
|
p:blackboardExecutor-ref="objectstoreBlackboardExecutor"/>
|
||||||
|
|
||||||
|
<bean id="objectstoreBlackboardExecutor"
|
||||||
|
class="eu.dnetlib.enabling.tools.blackboard.BlackboardServerActionExecutor"
|
||||||
|
p:blackboardHandler-ref="blackboardHandler"
|
||||||
|
p:actionType="eu.dnetlib.data.objectstore.modular.ObjectStoreActions"
|
||||||
|
p:incomplete="false">
|
||||||
|
<property name="actionMap">
|
||||||
|
<map>
|
||||||
|
<entry key="CREATE">
|
||||||
|
<bean class="eu.dnetlib.data.objectstore.modular.CreateObjectStoreAction"
|
||||||
|
p:profileCreator-ref="objectstoreProfileCreator" p:dao-ref="${services.objectstore.dao}"/>
|
||||||
|
</entry>
|
||||||
|
<entry key="DELETE">
|
||||||
|
<bean class="eu.dnetlib.data.objectstore.modular.DeleteObjectStoreAction"
|
||||||
|
p:profileCreator-ref="objectstoreProfileCreator" p:dao-ref="${services.objectstore.dao}"/>
|
||||||
|
</entry>
|
||||||
|
<entry key="DROP_CONTENT">
|
||||||
|
<bean class="eu.dnetlib.data.objectstore.modular.DropContentObjectStoreAction"
|
||||||
|
p:dao-ref="${services.objectstore.dao}"/>
|
||||||
|
</entry>
|
||||||
|
|
||||||
|
<entry key="FEED">
|
||||||
|
<bean class="eu.dnetlib.data.objectstore.modular.FeedObjectStoreAction"
|
||||||
|
p:profileCreator-ref="objectstoreProfileCreator"
|
||||||
|
p:storeFeeder-ref="objectstoreFeeder"
|
||||||
|
p:dao-ref="${services.objectstore.dao}"/>
|
||||||
|
</entry>
|
||||||
|
|
||||||
|
<entry key="FEEDOBJECT">
|
||||||
|
<bean class="eu.dnetlib.data.objectstore.modular.FeedCompleteObjectAction"
|
||||||
|
p:storeFeeder-ref="objectstoreFeeder"
|
||||||
|
p:dao-ref="${services.objectstore.dao}"/>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
|
||||||
|
<bean id="objectStoreLocator" class="eu.dnetlib.enabling.tools.StaticServiceLocator"
|
||||||
|
p:service-ref="objectStoreService"/>
|
||||||
|
|
||||||
|
|
||||||
|
<bean id="objectstoreDsTemplate"
|
||||||
|
class="eu.dnetlib.springutils.stringtemplate.StringTemplateFactory"
|
||||||
|
p:template="classpath:/eu/dnetlib/data/objectstore/objectstoreds-template.xml"
|
||||||
|
scope="prototype"/>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- endpoints -->
|
||||||
|
<jaxws:endpoint id="objectStoreServiceEndpoint"
|
||||||
|
implementor="#objectStoreService" implementorClass="eu.dnetlib.data.objectstore.rmi.ObjectStoreService"
|
||||||
|
address="/objectStore"/>
|
||||||
|
|
||||||
|
<template:instance name="serviceRegistrationManager"
|
||||||
|
t:serviceRegistrationManagerClass="eu.dnetlib.enabling.tools.registration.ValidatingServiceRegistrationManagerImpl"
|
||||||
|
t:name="objectStoreServiceRegistrationManager" t:service="objectStoreService"
|
||||||
|
t:endpoint="objectStoreServiceEndpoint" t:jobScheduler="jobScheduler"
|
||||||
|
t:serviceRegistrator="blackboardServiceRegistrator"/>
|
||||||
|
|
||||||
|
|
||||||
|
</beans>
|
|
@ -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
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:p="http://www.springframework.org/schema/p" xmlns:t="http://dnetlib.eu/springbeans/t"
|
||||||
|
xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||||
|
|
||||||
|
<bean id="fSObjectstoreDao"
|
||||||
|
class="eu.dnetlib.data.objectstore.filesystem.FileSystemObjectStoreDao"
|
||||||
|
p:db-ref="objectstoreMongoDB" p:objectStoreRESTURI-ref="restURIString"
|
||||||
|
p:upsert="${services.objectStore.mongodb.upsert}"/>
|
||||||
|
|
||||||
|
<bean id="restURIString" class="java.lang.String">
|
||||||
|
<constructor-arg value="${services.objectStore.RESTURI}"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="objectStoreFileSystemUtility" class="eu.dnetlib.data.objectstore.filesystem.FileSystemUtility"/>
|
||||||
|
|
||||||
|
<bean id="objectStoreMongoClient" class="com.mongodb.MongoClient">
|
||||||
|
<constructor-arg index="0" type="com.mongodb.ServerAddress">
|
||||||
|
<bean class="com.mongodb.ServerAddress">
|
||||||
|
<constructor-arg index="0" value="${services.objectStore.mongodb.host}"/>
|
||||||
|
<constructor-arg index="1" value="${services.objectStore.mongodb.port}"/>
|
||||||
|
</bean>
|
||||||
|
</constructor-arg>
|
||||||
|
<constructor-arg index="1" type="com.mongodb.MongoClientOptions">
|
||||||
|
<bean class="eu.dnetlib.data.objectstore.filesystem.MongoFSOptionsFactory"
|
||||||
|
p:connectionsPerHost="${services.objectStore.mongodb.connectionsPerHost}"/>
|
||||||
|
</constructor-arg>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="objectstoreMongoDB" factory-bean="objectStoreMongoClient" factory-method="getDatabase">
|
||||||
|
<constructor-arg index="0" type="java.lang.String" value="${services.objectStore.mongodb.db}"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="objectStoreIntegrityChecker" class="eu.dnetlib.data.objectstore.filesystem.IndexIntegrityChecker"/>
|
||||||
|
|
||||||
|
<bean t:id="objectStoreJobSchedulerAccessor"
|
||||||
|
class="org.springframework.scheduling.quartz.SchedulerAccessorBean"
|
||||||
|
p:scheduler-ref="jobScheduler">
|
||||||
|
<property name="triggers">
|
||||||
|
<list>
|
||||||
|
<bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
|
||||||
|
<property name="jobDetail">
|
||||||
|
<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
|
||||||
|
p:targetObject-ref="objectStoreIntegrityChecker" p:targetMethod="check"/>
|
||||||
|
</property>
|
||||||
|
<property name="cronExpression" value="${services.objectstore.mongodb.integritycheck.cron}"/>
|
||||||
|
</bean>
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
</beans>
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
|
||||||
|
xmlns:util="http://www.springframework.org/schema/util"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
|
||||||
|
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
|
||||||
|
|
||||||
|
<bean id="objectstoreInspectorGroup"
|
||||||
|
class="eu.dnetlib.enabling.inspector.StaticEntryPointDescriptorGroup"
|
||||||
|
p:name="objectstore">
|
||||||
|
<property name="descriptors">
|
||||||
|
<list>
|
||||||
|
<bean class="eu.dnetlib.enabling.inspector.StaticEntryPointDescriptor"
|
||||||
|
p:name="objectstores" p:relativeUrl="objectstores.do" />
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
</beans>
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<RESOURCE_PROFILE>
|
||||||
|
<HEADER>
|
||||||
|
<RESOURCE_IDENTIFIER value=""/>
|
||||||
|
<RESOURCE_TYPE value="ObjectStoreDSResourceType"/>
|
||||||
|
<RESOURCE_KIND value="ObjectStoreDSResources"/>
|
||||||
|
<RESOURCE_URI value="$serviceUri$?wsdl"/>
|
||||||
|
<DATE_OF_CREATION value=""/>
|
||||||
|
</HEADER>
|
||||||
|
<BODY>
|
||||||
|
<CONFIGURATION>
|
||||||
|
<OBJECTSTORE_INTERPRETATION>$interpretation$</OBJECTSTORE_INTERPRETATION>
|
||||||
|
</CONFIGURATION>
|
||||||
|
<STATUS>
|
||||||
|
<PENULTIMATE_STORAGE_DATE></PENULTIMATE_STORAGE_DATE>
|
||||||
|
<LAST_STORAGE_DATE></LAST_STORAGE_DATE>
|
||||||
|
<FETCHING_FREQUENCY/>
|
||||||
|
<COUNT_STORE>0</COUNT_STORE>
|
||||||
|
<STORE_SIZE>0</STORE_SIZE>
|
||||||
|
<STATISTICS_FIELDS/>
|
||||||
|
</STATUS>
|
||||||
|
<SECURITY_PARAMETERS></SECURITY_PARAMETERS>
|
||||||
|
</BODY>
|
||||||
|
</RESOURCE_PROFILE>
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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<ObjectStoreRecord>, Iterator<ObjectStoreRecord> {
|
||||||
|
|
||||||
|
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<ObjectStoreRecord> iterator() {
|
||||||
|
counter =0;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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<String> 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<String> data = rs.getResult(from, to);
|
||||||
|
|
||||||
|
for (String s: data) {
|
||||||
|
System.out.println(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
i= to ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Binary file not shown.
Loading…
Reference in New Issue