/** * 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 com.c2kernel.persistency; import java.io.File; import java.util.ArrayList; import com.c2kernel.common.PersistencyException; import com.c2kernel.entity.C2KLocalObject; import com.c2kernel.lookup.InvalidItemPathException; import com.c2kernel.lookup.ItemPath; import com.c2kernel.persistency.outcome.Outcome; import com.c2kernel.process.Gateway; import com.c2kernel.process.auth.Authenticator; import com.c2kernel.utils.FileStringUtility; import com.c2kernel.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; } }