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 --- .../kernel/entity/transfer/TransferItem.java | 177 +++++++++++++++++++++ .../kernel/entity/transfer/TransferSet.java | 94 +++++++++++ .../kernel/entity/transfer/package-info.java | 36 +++++ 3 files changed, 307 insertions(+) create mode 100644 src/main/java/org/cristalise/kernel/entity/transfer/TransferItem.java create mode 100644 src/main/java/org/cristalise/kernel/entity/transfer/TransferSet.java create mode 100644 src/main/java/org/cristalise/kernel/entity/transfer/package-info.java (limited to 'src/main/java/org/cristalise/kernel/entity/transfer') diff --git a/src/main/java/org/cristalise/kernel/entity/transfer/TransferItem.java b/src/main/java/org/cristalise/kernel/entity/transfer/TransferItem.java new file mode 100644 index 0000000..6b6901f --- /dev/null +++ b/src/main/java/org/cristalise/kernel/entity/transfer/TransferItem.java @@ -0,0 +1,177 @@ +/** + * 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.kernel.entity.transfer; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; + +import org.cristalise.kernel.collection.Collection; +import org.cristalise.kernel.collection.CollectionArrayList; +import org.cristalise.kernel.common.ObjectNotFoundException; +import org.cristalise.kernel.entity.C2KLocalObject; +import org.cristalise.kernel.entity.TraceableEntity; +import org.cristalise.kernel.lifecycle.instance.Workflow; +import org.cristalise.kernel.lookup.AgentPath; +import org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.lookup.InvalidItemPathException; +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.persistency.ClusterStorage; +import org.cristalise.kernel.persistency.outcome.Outcome; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.property.Property; +import org.cristalise.kernel.property.PropertyArrayList; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Logger; + + +public class TransferItem { + private ArrayList domainPaths; + protected ItemPath itemPath; + static AgentPath importAgentId; + + public TransferItem() throws Exception { + try { + importAgentId = Gateway.getLookup().getAgentPath("system"); + } catch (ObjectNotFoundException e) { + Logger.error("TransferItem - System user not found!"); + throw e; + } + } + + public TransferItem(ItemPath itemPath) throws Exception { + this.itemPath = itemPath; + domainPaths = new ArrayList(); + Iterator paths = Gateway.getLookup().searchAliases(itemPath); + while (paths.hasNext()) { + DomainPath thisPath = (DomainPath)paths.next(); + domainPaths.add(thisPath.toString()); + } + } + + public ArrayList getDomainPaths() { + return domainPaths; + } + + public void setDomainPaths(ArrayList domainPaths) { + this.domainPaths = domainPaths; + } + + public void setUUID( String uuid ) throws InvalidItemPathException + { + itemPath = new ItemPath(uuid); + } + + public String getUUID() { + return itemPath.getUUID().toString(); + } + + public void exportItem(File dir, String path) throws Exception { + Logger.msg("Path " + path + " in " + itemPath); + String[] contents = Gateway.getStorage().getClusterContents(itemPath, path); + if (contents.length > 0) { + FileStringUtility.createNewDir(dir.getCanonicalPath()); + for (String content : contents) { + exportItem(new File(dir, content), path + "/" + content); + } + } else { //no children, try to dump object + try { + C2KLocalObject obj = Gateway.getStorage().get(itemPath, path, null); + Logger.msg("Dumping object " + path + " in " + itemPath); + File dumpPath = new File(dir.getCanonicalPath() + ".xml"); + FileStringUtility.string2File(dumpPath, Gateway.getMarshaller().marshall(obj)); + return; + } catch (ObjectNotFoundException ex) { + } // not an object + } + } + + public void importItem(File dir) throws Exception { + // check if already exists + try { + Property name = (Property)Gateway.getStorage().get(itemPath, ClusterStorage.PROPERTY + "/Name", null); + throw new Exception("Entity " + itemPath + " already in use as " + name.getValue()); + } catch (Exception ex) { + } + + // retrieve objects + ArrayList objectFiles = FileStringUtility.listDir(dir.getCanonicalPath(), false, true); + ArrayList objects = new ArrayList(); + for (String element : objectFiles) { + String xmlFile = FileStringUtility.file2String(element); + C2KLocalObject newObj; + String choppedPath = element.substring(dir.getCanonicalPath().length()+1, element.length()-4); + Logger.msg(choppedPath); + if (choppedPath.startsWith(ClusterStorage.OUTCOME)) + newObj = new Outcome(choppedPath, xmlFile); + else + newObj = (C2KLocalObject)Gateway.getMarshaller().unmarshall(xmlFile); + + objects.add(newObj); + } + + // create item + TraceableEntity newItem = Gateway.getCorbaServer().createItem(itemPath); + Gateway.getLookupManager().add(itemPath); + + PropertyArrayList props = new PropertyArrayList(); + CollectionArrayList colls = new CollectionArrayList(); + Workflow wf = null; + // put objects + for (C2KLocalObject obj : objects) { + if (obj instanceof Property) + props.list.add((Property)obj); + else if (obj instanceof Collection) + colls.list.add((Collection)obj); + else if (obj instanceof Workflow) + wf = (Workflow)obj; + } + + if (wf == null) + throw new Exception("No workflow found in import for "+itemPath); + + // init item + newItem.initialise(importAgentId.getSystemKey(), + Gateway.getMarshaller().marshall(props), + Gateway.getMarshaller().marshall(wf.search("workflow/domain")), + Gateway.getMarshaller().marshall(colls)); + + // store objects + importByType(ClusterStorage.HISTORY, objects); + importByType(ClusterStorage.OUTCOME, objects); + importByType(ClusterStorage.VIEWPOINT, objects); + Gateway.getStorage().commit(this); + // add domPaths + for (String element : domainPaths) { + DomainPath newPath = new DomainPath(element, itemPath); + Gateway.getLookupManager().add(newPath); + } + } + + private void importByType(String type, ArrayList objects) throws Exception { + for (C2KLocalObject element : objects) { + if (element.getClusterType().equals(type)) + Gateway.getStorage().put(itemPath, element, this); + } + + } +} \ No newline at end of file diff --git a/src/main/java/org/cristalise/kernel/entity/transfer/TransferSet.java b/src/main/java/org/cristalise/kernel/entity/transfer/TransferSet.java new file mode 100644 index 0000000..c4a578a --- /dev/null +++ b/src/main/java/org/cristalise/kernel/entity/transfer/TransferSet.java @@ -0,0 +1,94 @@ +/** + * 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.kernel.entity.transfer; + +import java.io.File; +import java.util.ArrayList; + +import org.cristalise.kernel.lookup.ItemPath; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.FileStringUtility; +import org.cristalise.kernel.utils.Logger; + + +/************************************************************************** + * + * $Revision: 1.5 $ + * $Date: 2005/04/26 06:48:13 $ + * + * Copyright (C) 2003 CERN - European Organization for Nuclear Research + * All rights reserved. + **************************************************************************/ + +public class TransferSet { + + public ArrayList items; + + public TransferSet() { + } + + public TransferSet(ItemPath[] itemPaths) { + items = new ArrayList(); + for (ItemPath item : itemPaths) { + try { + items.add(new TransferItem(item)); + } catch (Exception ex) { + Logger.error("Could not add item "+item); + Logger.error(ex); + } + } + } + + public void exportPackage(File dir) throws Exception { + if (items==null || items.size() == 0) + throw new Exception("Nothing to dump"); + FileStringUtility.createNewDir(dir.getAbsolutePath()); + for (TransferItem element : items) { + try { + element.exportItem(new File(dir, element.itemPath.getUUID().toString()), "/"); + } catch (Exception ex) { + Logger.error("Error dumping item "+element.itemPath); + Logger.error(ex); + } + } + + try { + String self = Gateway.getMarshaller().marshall(this); + FileStringUtility.string2File(new File(dir, "transferSet.xml"), self); + } catch (Exception ex) { + Logger.error("Error writing header file"); + Logger.error(ex); + } + } + + public void importPackage(File rootDir) { + for (TransferItem element : items) { + Logger.msg(5, "Importing "+element.itemPath); + try { + element.importItem(new File(rootDir, element.itemPath.getUUID().toString())); + } catch (Exception ex) { + Logger.error("Import of item "+element.itemPath+" failed. Rolling back"); + Logger.error(ex); + Gateway.getStorage().abort(element); + } + } + } +} diff --git a/src/main/java/org/cristalise/kernel/entity/transfer/package-info.java b/src/main/java/org/cristalise/kernel/entity/transfer/package-info.java new file mode 100644 index 0000000..bfd8317 --- /dev/null +++ b/src/main/java/org/cristalise/kernel/entity/transfer/package-info.java @@ -0,0 +1,36 @@ +/** + * 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 + */ +/** + * Export and Import of Items. + * + *

{@link TransferItem} provides a mechanism for marshalling all of the + * C2KLocalObjects in an Item to XML and exporting them to disk, and then + * importing that Item on another server. {@link TransferSet} can export many + * Items at a time and preserve their domain paths. + * + *

This package is not currently used, as with the previous system key + * integer sequence it was not possible to import collections onto other servers + * but now Items are identified using UUIDs, this may now converge with the + * module mechanism. + * + */ + +package org.cristalise.kernel.entity.transfer; \ No newline at end of file -- cgit v1.2.3