/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package org.fcrepo.server.storage.lowlevel;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.fcrepo.common.FaultException;
import org.fcrepo.server.errors.LowlevelStorageException;
import org.fcrepo.server.storage.lowlevel.defaultstore.Store;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Bill Niebel
*/
public class DefaultLowlevelStorage
implements ILowlevelStorage, IListable, ISizable, ICheckable {
private static final Logger logger =
LoggerFactory.getLogger(DefaultLowlevelStorage.class);
public static final String REGISTRY_NAME = "registryName";
public static final String OBJECT_REGISTRY_TABLE = "objectPaths";
public static final String DATASTREAM_REGISTRY_TABLE = "datastreamPaths";
public static final String OBJECT_STORE_BASE = "object_store_base";
public static final String DATASTREAM_STORE_BASE = "datastream_store_base";
public static final String FILESYSTEM = "file_system";
public static final String PATH_ALGORITHM = "path_algorithm";
public static final String PATH_REGISTRY = "path_registry";
private final Store objectStore;
private final Store datastreamStore;
public DefaultLowlevelStorage(Map<String, Object> configuration)
throws LowlevelStorageException {
String objectStoreBase = (String) configuration.get(OBJECT_STORE_BASE);
String datastreamStoreBase =
(String) configuration.get(DATASTREAM_STORE_BASE);
Map<String, Object> objConfig = new HashMap<String, Object>();
objConfig.putAll(configuration);
objConfig.put(REGISTRY_NAME, OBJECT_REGISTRY_TABLE);
objConfig.put("storeBase", objectStoreBase);
objConfig.put("storeBases", new String[] {objectStoreBase});
objectStore = new Store(objConfig);
Map<String, Object> dsConfig = new HashMap<String, Object>();
dsConfig.putAll(configuration);
dsConfig.put(REGISTRY_NAME, DATASTREAM_REGISTRY_TABLE);
dsConfig.put("storeBase", datastreamStoreBase);
dsConfig.put("storeBases", new String[] {datastreamStoreBase});
datastreamStore = new Store(dsConfig);
}
@Override
public void addObject(String pid, InputStream content, Map<String, String> hints)
throws LowlevelStorageException {
objectStore.add(pid, content);
}
@Override
public void replaceObject(String pid, InputStream content, Map<String, String> hints)
throws LowlevelStorageException {
objectStore.replace(pid, content);
}
@Override
public InputStream retrieveObject(String pid)
throws LowlevelStorageException {
return objectStore.retrieve(pid);
}
@Override
public void removeObject(String pid) throws LowlevelStorageException {
objectStore.remove(pid);
}
@Override
public void rebuildObject() throws LowlevelStorageException {
objectStore.rebuild();
}
@Override
public void auditObject() throws LowlevelStorageException {
objectStore.audit();
}
@Override
public long addDatastream(String pid, InputStream content, Map<String, String> hints)
throws LowlevelStorageException {
return datastreamStore.add(pid, content);
}
@Override
public long replaceDatastream(String pid, InputStream content, Map<String, String>hints)
throws LowlevelStorageException {
return datastreamStore.replace(pid, content);
}
@Override
public InputStream retrieveDatastream(String pid)
throws LowlevelStorageException {
return datastreamStore.retrieve(pid);
}
@Override
public void removeDatastream(String pid) throws LowlevelStorageException {
datastreamStore.remove(pid);
}
@Override
public void rebuildDatastream() throws LowlevelStorageException {
datastreamStore.rebuild();
}
@Override
public void auditDatastream() throws LowlevelStorageException {
datastreamStore.audit();
}
//IListable methods
@Override
public Iterator<String> listObjects() {
return objectStore.list();
}
@Override
public Iterator<String> listDatastreams() {
return datastreamStore.list();
}
//ISizable methods
@Override
public long getDatastreamSize(String dsKey) throws LowlevelStorageException {
return datastreamStore.getSize(dsKey);
}
// ICheckable methods
@Override
public boolean objectExists(String objectKey) {
try {
return objectStore.exists(objectKey);
} catch (LowlevelStorageException e) {
logger.error(e.toString(),e);
throw new FaultException(
"System error determining existence of blob", e);
}
}
}