From 0ed2c1124cf1b9e49a2ec1fa0126a8df09f9e758 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Tue, 7 Oct 2014 09:18:11 +0200 Subject: Repackage to org.cristalise --- .../org/cristalise/storage/XMLClusterStorage.java | 178 +++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 src/main/java/org/cristalise/storage/XMLClusterStorage.java (limited to 'src/main/java/org/cristalise/storage/XMLClusterStorage.java') diff --git a/src/main/java/org/cristalise/storage/XMLClusterStorage.java b/src/main/java/org/cristalise/storage/XMLClusterStorage.java new file mode 100644 index 0000000..3ac864e --- /dev/null +++ b/src/main/java/org/cristalise/storage/XMLClusterStorage.java @@ -0,0 +1,178 @@ +/** + * This file is part of the CRISTAL-iSE kernel. + * Copyright (c) 2001-2014 The CRISTAL Consortium. All rights reserved. + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * http://www.fsf.org/licensing/licenses/lgpl.html + */ +package org.cristalise.storage; +import java.io.File; +import java.util.ArrayList; + +import org.cristalise.kernel.common.PersistencyException; +import org.cristalise.kernel.entity.C2KLocalObject; +import org.cristalise.kernel.lookup.InvalidItemPathException; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.persistency.outcome.Outcome; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.process.auth.Authenticator; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Logger; + + +public class XMLClusterStorage extends ClusterStorage { + String rootDir=null; + + public XMLClusterStorage() { + } + + @Override + public void open(Authenticator auth) throws PersistencyException { + String rootProp = Gateway.getProperties().getString("XMLStorage.root"); + if (rootProp == null) + throw new PersistencyException("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 PersistencyException("XMLClusterStorage.open() - Could not create dir "+ rootDir +". Cannot continue."); + } + } + + @Override + public void close() { + rootDir = null; + } + + // introspection + @Override + public short queryClusterSupport(String clusterType) { + return ClusterStorage.READWRITE; + } + + @Override + public String getName() { + return "XML File Cluster Storage"; + } + + @Override + public String getId() { + return "XML"; + } + + /* object manipulation */ + + // retrieve object by path + @Override + public C2KLocalObject get(ItemPath itemPath, String path) throws PersistencyException { + try { + String type = ClusterStorage.getClusterType(path); + String filePath = getFilePath(itemPath, path)+".xml"; + String objString = FileStringUtility.file2String(filePath); + if (objString.length() == 0) return null; + Logger.debug(9, objString); + if (type.equals("Outcome")) + return new Outcome(path, objString); + else { + C2KLocalObject obj = (C2KLocalObject)Gateway.getMarshaller().unmarshall(objString); + return obj; + } + + } catch (Exception e) { + Logger.msg(3,"XMLClusterStorage.get() - The path "+path+" from "+itemPath+" does not exist.: "+e.getMessage()); + } + return null; + } + + // store object by path + @Override + public void put(ItemPath itemPath, C2KLocalObject obj) throws PersistencyException { + try { + String filePath = getFilePath(itemPath, getPath(obj)+".xml"); + Logger.msg(7, "Writing "+filePath); + String data = Gateway.getMarshaller().marshall(obj); + + String dir = filePath.substring(0, filePath.lastIndexOf('/')); + if( !FileStringUtility.checkDir( dir ) ) { + boolean success = FileStringUtility.createNewDir(dir); + if (!success) throw new PersistencyException("XMLClusterStorage.put() - Could not create dir "+ dir +". Cannot continue."); + } + FileStringUtility.string2File(filePath, data); + } catch (Exception e) { + Logger.error(e); + throw new PersistencyException("XMLClusterStorage.put() - Could not write "+getPath(obj)+" to "+itemPath); + } + } + + // delete cluster + @Override + public void delete(ItemPath itemPath, String path) throws PersistencyException { + try { + String filePath = getFilePath(itemPath, path+".xml"); + boolean success = FileStringUtility.deleteDir(filePath, true, true); + if (success) return; + filePath = getFilePath(itemPath, path); + success = FileStringUtility.deleteDir(filePath, true, true); + if (success) return; + } catch(Exception e) { } + throw new PersistencyException("XMLClusterStorage.delete() - Failure deleting path "+path+" in "+itemPath); + } + + /* navigation */ + + // directory listing + @Override + public String[] getClusterContents(ItemPath itemPath, String path) throws PersistencyException { + String[] result = new String[0]; + try { + String filePath = getFilePath(itemPath, 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 -1) next = next.substring(next.lastIndexOf('/')+1); + contents.add(next); + } + + result = contents.toArray(result); + return result; + } catch (Exception e) { + Logger.error(e); + throw new PersistencyException("XMLClusterStorage.getClusterContents() - Could not get contents of "+path+" from "+itemPath+": "+e.getMessage()); + } + } + + protected String getFilePath(ItemPath itemPath, String path) throws InvalidItemPathException { + if (path.length() == 0 || path.charAt(0) != '/') path = "/"+path; + String filePath = rootDir+itemPath.toString()+path; + Logger.msg(8, "XMLClusterStorage.getFilePath() - "+filePath); + return filePath; + } +} -- cgit v1.2.3