summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/persistency/XMLClusterStorage.java
diff options
context:
space:
mode:
Diffstat (limited to 'source/com/c2kernel/persistency/XMLClusterStorage.java')
-rwxr-xr-xsource/com/c2kernel/persistency/XMLClusterStorage.java145
1 files changed, 145 insertions, 0 deletions
diff --git a/source/com/c2kernel/persistency/XMLClusterStorage.java b/source/com/c2kernel/persistency/XMLClusterStorage.java
new file mode 100755
index 0000000..6e3cd72
--- /dev/null
+++ b/source/com/c2kernel/persistency/XMLClusterStorage.java
@@ -0,0 +1,145 @@
+package com.c2kernel.persistency;
+import java.io.File;
+import java.util.ArrayList;
+
+import com.c2kernel.entity.C2KLocalObject;
+import com.c2kernel.lookup.EntityPath;
+import com.c2kernel.lookup.InvalidEntityPathException;
+import com.c2kernel.persistency.outcome.Outcome;
+import com.c2kernel.process.Gateway;
+import com.c2kernel.utils.CastorXMLUtility;
+import com.c2kernel.utils.FileStringUtility;
+import com.c2kernel.utils.Logger;
+
+public class XMLClusterStorage extends ClusterStorage {
+ String rootDir=null;
+
+ public XMLClusterStorage() {
+ }
+
+ public void open() throws ClusterStorageException {
+ String rootProp = Gateway.getProperty("XMLStorage.root");
+ if (rootProp == null)
+ throw new ClusterStorageException("XMLClusterStorage.open() - Root path not given in config file.");
+
+ rootDir = new File(rootProp).getAbsolutePath();
+
+ if( !FileStringUtility.checkDir( rootDir ) ) {
+ Logger.error("XMLClusterStorage.open() - Path " + rootDir + "' does not exist. Attempting to create.");
+ boolean success = FileStringUtility.createNewDir(rootDir);
+ if (!success) throw new ClusterStorageException("XMLClusterStorage.open() - Could not create dir "+ rootDir +". Cannot continue.");
+ }
+ }
+
+ public void close() {
+ rootDir = null;
+ }
+
+ // introspection
+ public short queryClusterSupport(String clusterType) {
+ return ClusterStorage.READWRITE;
+ }
+
+ public String getName() {
+ return "XML File Cluster Storage";
+ }
+
+ public String getId() {
+ return "XML";
+ }
+
+ /* object manipulation */
+
+ // retrieve object by path
+ public C2KLocalObject get(Integer sysKey, String path) throws ClusterStorageException {
+ try {
+ String type = ClusterStorage.getClusterType(path);
+ String filePath = getFilePath(sysKey, path)+".xml";
+ String objString = FileStringUtility.file2String(filePath);
+ if (objString.length() == 0) return null;
+
+ if (type.equals("Outcome"))
+ return new Outcome(path, objString);
+ else
+ return (C2KLocalObject)CastorXMLUtility.unmarshall(objString);
+
+ } catch (Exception e) {
+ Logger.msg(3,"XMLClusterStorage.get() - The path "+path+" from "+sysKey+" does not exist.: "+e.getMessage());
+ }
+ return null;
+ }
+
+ // store object by path
+ public void put(Integer sysKey, C2KLocalObject obj) throws ClusterStorageException {
+ try {
+ String filePath = getFilePath(sysKey, getPath(obj)+".xml");
+ Logger.msg(7, "Writing "+filePath);
+ String data = CastorXMLUtility.marshall(obj);
+
+ String dir = filePath.substring(0, filePath.lastIndexOf('/'));
+ if( !FileStringUtility.checkDir( dir ) ) {
+ boolean success = FileStringUtility.createNewDir(dir);
+ if (!success) throw new ClusterStorageException("XMLClusterStorage.put() - Could not create dir "+ dir +". Cannot continue.");
+ }
+ FileStringUtility.string2File(filePath, data);
+ } catch (Exception e) {
+ Logger.error(e);
+ throw new ClusterStorageException("XMLClusterStorage.put() - Could not write "+getPath(obj)+" to "+sysKey);
+ }
+ }
+
+ // delete cluster
+ public void delete(Integer sysKey, String path) throws ClusterStorageException {
+ try {
+ String filePath = getFilePath(sysKey, path+".xml");
+ boolean success = FileStringUtility.deleteDir(filePath, true, true);
+ if (success) return;
+ filePath = getFilePath(sysKey, path);
+ success = FileStringUtility.deleteDir(filePath, true, true);
+ if (success) return;
+ } catch(Exception e) { }
+ throw new ClusterStorageException("XMLClusterStorage.delete() - Failure deleting path "+path+" in "+sysKey);
+ }
+
+ /* navigation */
+
+ // directory listing
+ public String[] getClusterContents(Integer sysKey, String path) throws ClusterStorageException {
+ String[] result = new String[0];
+ try {
+ String filePath = getFilePath(sysKey, path);
+ ArrayList paths = FileStringUtility.listDir( filePath, true, false );
+ if (paths == null) return result; // dir doesn't exist yet
+ ArrayList contents = new ArrayList();
+ String previous = null;
+ for (int i=0; i<paths.size(); i++) {
+ String next = (String)paths.get(i);
+
+ // trim off the xml from the end if it's there
+ if (next.endsWith(".xml")) next = next.substring(0, next.length()-4);
+
+ // avoid duplicates (xml and dir)
+ if (next.equals(previous)) continue;
+ previous = next;
+
+ // only keep the last bit of the path
+ if (next.indexOf('/') > -1) next = next.substring(next.lastIndexOf('/')+1);
+ contents.add(next);
+ }
+
+ result = (String[])contents.toArray(result);
+ return result;
+ } catch (Exception e) {
+ Logger.error(e);
+ throw new ClusterStorageException("XMLClusterStorage.getClusterContents() - Could not get contents of "+path+" from "+sysKey+": "+e.getMessage());
+ }
+ }
+
+ protected String getFilePath(Integer sysKey, String path) throws InvalidEntityPathException {
+ EntityPath thisEntity = new EntityPath(sysKey.intValue());
+ if (path.length() == 0 || path.charAt(0) != '/') path = "/"+path;
+ String filePath = rootDir+thisEntity.toString()+path;
+ Logger.msg(8, "XMLClusterStorage.getFilePath() - "+filePath);
+ return filePath;
+ }
+}