From d6d17c795a113873d087cd9e6ca6a312b1180cb4 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 9 Oct 2007 15:40:44 +0000
Subject: [PATCH] second approach

SVN: 2076
---
 .../cisd/bds/AbstractDataStructure.java       | 29 +++++--
 .../cisd/bds/DataStructureFactory.java        | 83 +++++++++++++++++++
 ...uctureV1_0.java => DataStructureV1_0.java} | 52 ++++++++----
 .../cisd/bds/ExperimentIdentifier.java        | 22 +++++
 .../cisd/bds/IDataStructureFactory.java       | 42 ----------
 .../java/ch/systemsx/cisd/bds/IDirectory.java |  4 +
 .../java/ch/systemsx/cisd/bds/INode.java      | 14 ++++
 ...ataStructureFactory.java => IStorage.java} | 17 ++--
 .../ch/systemsx/cisd/bds/ProcessingType.java  | 12 +++
 .../java/ch/systemsx/cisd/bds/Utilities.java  | 53 ++++++++++++
 .../java/ch/systemsx/cisd/bds/Version.java    | 56 ++++++++++++-
 .../cisd/bds/container/Container.java         | 37 ++++++---
 .../cisd/bds/fs/DataStructureV1_0.java        | 62 --------------
 .../ch/systemsx/cisd/bds/fs/Directory.java    | 19 +++++
 ...StructureFactory.java => FileStorage.java} | 28 +++----
 .../java/ch/systemsx/cisd/bds/fs/Link.java    |  9 ++
 .../ch/systemsx/cisd/bds/fs/StringFile.java   |  7 ++
 ...StructureFactory.java => HDF5Storage.java} | 26 +++---
 18 files changed, 394 insertions(+), 178 deletions(-)
 create mode 100644 bds/source/java/ch/systemsx/cisd/bds/DataStructureFactory.java
 rename bds/source/java/ch/systemsx/cisd/bds/{AbstractDataStructureV1_0.java => DataStructureV1_0.java} (53%)
 delete mode 100644 bds/source/java/ch/systemsx/cisd/bds/IDataStructureFactory.java
 rename bds/source/java/ch/systemsx/cisd/bds/{AbstractDataStructureFactory.java => IStorage.java} (63%)
 create mode 100644 bds/source/java/ch/systemsx/cisd/bds/Utilities.java
 delete mode 100644 bds/source/java/ch/systemsx/cisd/bds/fs/DataStructureV1_0.java
 rename bds/source/java/ch/systemsx/cisd/bds/fs/{FileDataStructureFactory.java => FileStorage.java} (51%)
 rename bds/source/java/ch/systemsx/cisd/bds/hdf5/{HDF5DataStructureFactory.java => HDF5Storage.java} (59%)

diff --git a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java b/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java
index b06ae5a928f..48a917329da 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java
@@ -16,24 +16,39 @@
 
 package ch.systemsx.cisd.bds;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractDataStructure implements IDataStructure
+public abstract class AbstractDataStructure implements IHasVersion
 {
-    private final String name;
+    protected final IStorage storage;
+    protected final IDirectory root;
 
-    public AbstractDataStructure(String name)
+    AbstractDataStructure(IStorage storage)
     {
-        assert name != null && name.length() > 0: "Unspecified name";
-        this.name = name;
+        assert storage != null: "Unspecified storage.";
+        this.storage = storage;
+        root = storage.getRoot();
     }
 
-    public String getName()
+    public void load()
     {
-        return name;
+        storage.load();
+        Version loadedVersion = Version.loadFrom(root);
+        if (getVersion().isBackwardsCompatibleWith(loadedVersion) == false)
+        {
+            throw new UserFailureException("Version of loaded data structure is " + loadedVersion
+                    + " which is not backward compatible with " + getVersion());
+        }
     }
     
+    public void save()
+    {
+        getVersion().saveTo(root);
+        storage.save();
+    }
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/DataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/DataStructureFactory.java
new file mode 100644
index 00000000000..b039165e2e4
--- /dev/null
+++ b/bds/source/java/ch/systemsx/cisd/bds/DataStructureFactory.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2007 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.bds;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class DataStructureFactory
+{
+    private static final Map<Version, Class<? extends AbstractDataStructure>> repository =
+            new HashMap<Version, Class<? extends AbstractDataStructure>>();
+    
+    void register(Version version, Class<? extends AbstractDataStructure> clazz)
+    {
+        repository.put(version, clazz);
+    }
+    
+    public static Class<? extends AbstractDataStructure> getDataStructureClassFor(Version version)
+    {
+        Class<? extends AbstractDataStructure> clazz = null;
+        for (Version v = version; v.getMinor() >= 0 && clazz == null; v = v.getPreviousMinorVersion())
+        {
+            clazz = repository.get(v);
+        }
+        if (clazz == null)
+        {
+            throw new UserFailureException("No data structure class found for version " + version);
+        }
+        return clazz;
+    }
+    
+    public static AbstractDataStructure createDataStructure(IStorage storage, Version version)
+    {
+        Class<? extends AbstractDataStructure> clazz = getDataStructureClassFor(version);
+        Constructor<? extends AbstractDataStructure> constructor;
+        try
+        {
+            constructor = clazz.getConstructor(new Class[] {IStorage.class});
+        } catch (Exception ex1)
+        {
+            throw new EnvironmentFailureException(clazz + " has no constructor with argument of type "
+                    + IStorage.class.getCanonicalName());
+        }
+        try
+        {
+            return constructor.newInstance(new Object[] {storage});
+        } catch (InvocationTargetException ex)
+        {
+            throw new UserFailureException("Couldn't create data structure for version " + version, ex.getCause());
+        } catch (Exception ex)
+        {
+            throw new UserFailureException("Couldn't create data structure for version " + version, ex);
+        }
+    }
+
+    private DataStructureFactory()
+    {
+    }
+}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureV1_0.java b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
similarity index 53%
rename from bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureV1_0.java
rename to bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
index 8d46c817464..0d3d4e64671 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureV1_0.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
@@ -16,23 +16,20 @@
 
 package ch.systemsx.cisd.bds;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractDataStructureV1_0 extends AbstractDataStructure implements IDataStructureV1_0
+public class DataStructureV1_0 extends AbstractDataStructure
 {
     private static final Version VERSION = new Version(1, 0);
     
-    
-    private ExperimentIdentifier experimentIdentifier;
-    
-    private ProcessingType processingType;
-    
-    public AbstractDataStructureV1_0(String name)
+    public DataStructureV1_0(IStorage storage)
     {
-        super(name);
+        super(storage);
     }
 
     public Version getVersion()
@@ -40,25 +37,46 @@ public abstract class AbstractDataStructureV1_0 extends AbstractDataStructure im
         return VERSION;
     }
 
-    public ExperimentIdentifier getExperimentIdentifier()
+    public IDirectory getOriginalData()
     {
-        return experimentIdentifier;
+        return Utilities.getSubDirectory(getDataDirectory(), "original");
     }
 
+    public IFormatedData getFormatedData()
+    {
+        return null;
+    }
+    
+    public ExperimentIdentifier getExperimentIdentifier()
+    {
+        return ExperimentIdentifier.loadFrom(getMetaDataDirectory());
+    }
+    
     public void setExperimentIdentifier(ExperimentIdentifier id)
     {
-        experimentIdentifier = id;
+        id.saveTo(getMetaDataDirectory());
     }
-
+    
     public ProcessingType getProcessingType()
     {
-        return processingType;
+        return ProcessingType.loadFrom(getMetaDataDirectory());
     }
-
+    
     public void setProcessingType(ProcessingType type)
     {
-        processingType = type;
+        type.saveTo(getMetaDataDirectory());
+    }
+    
+    private IDirectory getDataDirectory()
+    {
+        IDirectory subDirectory = Utilities.getSubDirectory(root, "data");
+        return subDirectory;
+    }
+    
+    private IDirectory getMetaDataDirectory()
+    {
+        IDirectory subDirectory = Utilities.getSubDirectory(root, "metadata");
+        return subDirectory;
     }
-
-
 }
+
diff --git a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
index 2020b0cb468..73c4353f586 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
@@ -24,6 +24,20 @@ package ch.systemsx.cisd.bds;
  */
 public class ExperimentIdentifier
 {
+    private static final String FOLDER = "experiment_identifier";
+    private static final String GROUP_CODE = "group_code";
+    private static final String PROJECT_CODE = "project_code";
+    private static final String EXPERIMENT_CODE = "experiment_code";
+    
+    public static ExperimentIdentifier loadFrom(IDirectory directory)
+    {
+        IDirectory idFolder = Utilities.getSubDirectory(directory, FOLDER);
+        String groupCode = Utilities.getString(idFolder, GROUP_CODE);
+        String projectCode = Utilities.getString(idFolder, PROJECT_CODE);
+        String experimentCode = Utilities.getString(idFolder, EXPERIMENT_CODE);
+        return new ExperimentIdentifier(groupCode, projectCode, experimentCode);
+    }
+    
     private final String groupCode;
     private final String projectCode;
     private final String experimentCode;
@@ -68,6 +82,14 @@ public class ExperimentIdentifier
     {
         return experimentCode;
     }
+    
+    public void saveTo(IDirectory directory)
+    {
+        IDirectory folder = directory.appendDirectory(FOLDER);
+        folder.appendKeyValuePair(GROUP_CODE, groupCode);
+        folder.appendKeyValuePair(PROJECT_CODE, projectCode);
+        folder.appendKeyValuePair(EXPERIMENT_CODE, experimentCode);
+    }
 
     @Override
     public boolean equals(Object obj)
diff --git a/bds/source/java/ch/systemsx/cisd/bds/IDataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/IDataStructureFactory.java
deleted file mode 100644
index 9ba3ce97725..00000000000
--- a/bds/source/java/ch/systemsx/cisd/bds/IDataStructureFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2007 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.bds;
-
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
-
-/**
- * Factory of {@link IDataStructure}. 
- *
- * @author Franz-Josef Elmer
- */
-public interface IDataStructureFactory
-{
-    /**
-     * Returns the subinterface of {@link IDataStructure} for the specified version. 
-     * 
-     * @throws UserFailureException if this factory can not create a data structure for the specified version.
-     */
-    public Class<? extends IDataStructure> getDataStructureInterfaceFor(Version version) throws UserFailureException;
-    
-    /**
-     * Creates a new data structure of specified name and version. The return object implements the interface
-     * returned by {@link #getDataStructureInterfaceFor(Version)} for the same value of <code>version</code>.
-     * 
-     * @throws UserFailureException if this factory can not create a data structure for the specified version.
-     */
-    public IDataStructure createDataStructure(String name, Version version) throws UserFailureException;
-}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/IDirectory.java b/bds/source/java/ch/systemsx/cisd/bds/IDirectory.java
index 0b515a5c112..dc9c18da657 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/IDirectory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/IDirectory.java
@@ -25,6 +25,10 @@ import java.io.File;
  */
 public interface IDirectory extends INode, Iterable<INode>
 {
+    public INode getNode(String name);
+    
+    public IDirectory appendDirectory(String name);
+    
     public void appendNode(INode node);
     
     public void appendRealFile(File file);
diff --git a/bds/source/java/ch/systemsx/cisd/bds/INode.java b/bds/source/java/ch/systemsx/cisd/bds/INode.java
index 47d50b1354b..4361171ded5 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/INode.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/INode.java
@@ -16,6 +16,11 @@
 
 package ch.systemsx.cisd.bds;
 
+import java.io.File;
+
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
 /**
  * Role of a node in the data structure.
  *
@@ -32,4 +37,13 @@ public interface INode
      * Returns the parent directory of this node or <code>null</code> if it is the root node.
      */
     public IDirectory tryToGetParent();
+    
+    /**
+     * Extracts this node to the specified directory of the file system. All descendants are also extracted.
+     * 
+     * @throws UserFailureException if this or a descended node is a link referring to a node which is not this
+     *      node or a descended node. 
+     * @throws EnvironmentFailureException if extraction causes an IOException.
+     */
+    public void extractTo(File directory) throws UserFailureException, EnvironmentFailureException;
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/IStorage.java
similarity index 63%
rename from bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureFactory.java
rename to bds/source/java/ch/systemsx/cisd/bds/IStorage.java
index bc9f10dfbf2..8441062e229 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructureFactory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/IStorage.java
@@ -16,21 +16,16 @@
 
 package ch.systemsx.cisd.bds;
 
-import java.io.File;
-
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractDataStructureFactory implements IDataStructureFactory
+public interface IStorage
 {
-    protected final File baseDir;
-
-    public AbstractDataStructureFactory(File baseDir)
-    {
-        assert baseDir != null : "Unspecified base directory.";
-        assert baseDir.isDirectory() : "Is not a directory : " + baseDir.getAbsolutePath();
-        this.baseDir = baseDir;
-    }
+    public void load();
+    
+    public IDirectory getRoot();
+    
+    public void save();
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/ProcessingType.java b/bds/source/java/ch/systemsx/cisd/bds/ProcessingType.java
index d4031ad8a37..6717aff94fa 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/ProcessingType.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/ProcessingType.java
@@ -26,6 +26,8 @@ public enum ProcessingType
 {
     OTHER, RAW_DATA, COMPUTED_DATA;
     
+    private static final String PROCESSING_TYPE = "processing_type";
+    
     /**
      * Resolves the specified string representation of a processing type.
      * 
@@ -36,4 +38,14 @@ public enum ProcessingType
         ProcessingType type = valueOf(processingTypeString);
         return type == null ? OTHER : type;
     }
+    
+    public static ProcessingType loadFrom(IDirectory directory)
+    {
+        return resolve(Utilities.getString(directory, PROCESSING_TYPE));
+    }
+    
+    public void saveTo(IDirectory directory)
+    {
+        directory.appendKeyValuePair(PROCESSING_TYPE, toString());
+    }
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/Utilities.java b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java
new file mode 100644
index 00000000000..a352ebc55ad
--- /dev/null
+++ b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2007 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.bds;
+
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class Utilities
+{
+    public static IDirectory getSubDirectory(IDirectory directory, String name)
+    {
+        INode node = directory.getNode(name);
+        if (node instanceof IDirectory == false)
+        {
+            throw new UserFailureException("Is not a directory: " + node);
+        }
+        return (IDirectory) node;
+    }
+    
+    public static String getString(IDirectory directory, String name)
+    {
+        INode node = directory.getNode(name);
+        if (node == null)
+        {
+            throw new UserFailureException("File '" + name + "' missing in " + directory);
+        }
+        if (node instanceof IFile<?> == false)
+        {
+            throw new UserFailureException(node + " is not a file.");
+        }
+        IFile<?> file = (IFile<?>) node;
+        return file.getValue().toString();
+    }
+    
+}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/Version.java b/bds/source/java/ch/systemsx/cisd/bds/Version.java
index 8dbdc15d640..4bc6052125e 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/Version.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/Version.java
@@ -16,13 +16,37 @@
 
 package ch.systemsx.cisd.bds;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
 /**
- * Immutable value object for the version of something.
+ * Immutable value object for the version of something.        
  *
  * @author Franz-Josef Elmer
  */
 public final class Version
 {
+    private static final String VERSION = "version";
+    private static final String MAJOR = "major";
+    private static final String MINOR = "minor";
+    
+    public static Version loadFrom(IDirectory directory)
+    {
+        IDirectory versionFolder = Utilities.getSubDirectory(directory, VERSION);
+        return new Version(getNumber(versionFolder, MAJOR), getNumber(versionFolder, MINOR));
+    }
+    
+    private static int getNumber(IDirectory versionFolder, String name)
+    {
+        String value = Utilities.getString(versionFolder, name);
+        try
+        {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException ex)
+        {
+            throw new UserFailureException("Value of " + name + " version file is not a number: " + value);
+        }
+    }
+    
     private final int major;
     private final int minor;
 
@@ -55,6 +79,36 @@ public final class Version
     {
         return minor;
     }
+    
+    /**
+     * Returns true if this version is backwards compatible to the specified version. That is,
+     * if <code>version.getMajor() == this.getMajor()</code> and <code>version.getMinor() &lt;= this.getMinor()</code>.
+     */
+    public boolean isBackwardsCompatibleWith(Version version)
+    {
+        return version.major == major && version.minor <= minor;
+    }
+    
+    /**
+     * Returns the previous minor version.
+     * 
+     * @throws UserFailureException if minor version is 0.
+     */
+    public Version getPreviousMinorVersion()
+    {
+        if (minor == 0)
+        {
+            throw new UserFailureException("There is no previous minor version of " + this);
+        }
+        return new Version(major, minor - 1);
+    }
+    
+    public void saveTo(IDirectory directory)
+    {
+        IDirectory versionFolder = directory.appendDirectory(VERSION);
+        versionFolder.appendKeyValuePair(MAJOR, Integer.toString(major));
+        versionFolder.appendKeyValuePair(MINOR, Integer.toString(minor));
+    }
 
     @Override
     public boolean equals(Object obj)
diff --git a/bds/source/java/ch/systemsx/cisd/bds/container/Container.java b/bds/source/java/ch/systemsx/cisd/bds/container/Container.java
index 0a95d6e76e1..e5437cb0cdd 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/container/Container.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/container/Container.java
@@ -18,10 +18,14 @@ package ch.systemsx.cisd.bds.container;
 
 import java.io.File;
 
+import ch.systemsx.cisd.bds.AbstractDataStructure;
+import ch.systemsx.cisd.bds.DataStructureFactory;
 import ch.systemsx.cisd.bds.IDataStructure;
-import ch.systemsx.cisd.bds.IDataStructureFactory;
-import ch.systemsx.cisd.bds.fs.FileDataStructureFactory;
-import ch.systemsx.cisd.bds.hdf5.HDF5DataStructureFactory;
+import ch.systemsx.cisd.bds.IStorage;
+import ch.systemsx.cisd.bds.Utilities;
+import ch.systemsx.cisd.bds.Version;
+import ch.systemsx.cisd.bds.fs.FileStorage;
+import ch.systemsx.cisd.bds.hdf5.HDF5Storage;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 
 /**
@@ -40,25 +44,32 @@ public class Container
         this.baseDir = baseDir;
     }
     
-    public IDataStructure load(String name)
+    public AbstractDataStructure load(String name)
+    {
+        IStorage storage = createStorage(name);
+        storage.load();
+        Version version = Version.loadFrom(storage.getRoot());
+        return DataStructureFactory.createDataStructure(storage, version);
+    }
+    
+    private IStorage createStorage(String name)
     {
         File file = new File(baseDir, name);
         if (file.exists() == false)
         {
             throw new UserFailureException("No container name '" + name + "' exists in " + baseDir.getAbsolutePath());
         }
-        IDataStructureFactory dataStructureFactory;
         if (file.isDirectory())
         {
-            dataStructureFactory = new FileDataStructureFactory(baseDir);
-        } else if (new File(baseDir, name + ".hdf5").exists())
-        {
-            dataStructureFactory = new HDF5DataStructureFactory(baseDir);
-        } else
+            return new FileStorage(file);
+        }
+        File hdf5File = new File(baseDir, name + ".hdf5");
+        if (hdf5File.exists())
         {
-            throw new UserFailureException("Couldn't found appropriate container named '" + name + "' in "
-                    + baseDir.getAbsolutePath());
+            return new HDF5Storage(hdf5File);
         }
-        return dataStructureFactory.createDataStructure(name, null);
+        throw new UserFailureException("Couldn't found appropriate container named '" + name + "' in "
+                + baseDir.getAbsolutePath());
+        
     }
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/DataStructureV1_0.java b/bds/source/java/ch/systemsx/cisd/bds/fs/DataStructureV1_0.java
deleted file mode 100644
index 9cdbc3e726d..00000000000
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/DataStructureV1_0.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2007 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.bds.fs;
-
-import java.io.File;
-
-import ch.systemsx.cisd.bds.AbstractDataStructureV1_0;
-import ch.systemsx.cisd.bds.IDirectory;
-import ch.systemsx.cisd.bds.IFormatedData;
-import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
-
-/**
- * 
- *
- * @author Franz-Josef Elmer
- */
-class DataStructureV1_0 extends AbstractDataStructureV1_0
-{
-    private final File baseDir;
-
-    public DataStructureV1_0(String name, File baseDir)
-    {
-        super(name);
-        assert baseDir != null : "Unspecified base directory.";
-        assert baseDir.isDirectory() : "Is not a directory: " + baseDir.getAbsolutePath();
-        this.baseDir = baseDir;
-    }
-    
-    public IFormatedData getFormatedData()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public IDirectory getOriginalData()
-    {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public void save() throws EnvironmentFailureException
-    {
-        // TODO Auto-generated method stub
-        System.out.println(baseDir);
-        
-    }
-    
-}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/Directory.java b/bds/source/java/ch/systemsx/cisd/bds/fs/Directory.java
index 56b3061f354..b7ecbc8c262 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/Directory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/fs/Directory.java
@@ -24,6 +24,7 @@ import java.util.Iterator;
 import ch.systemsx.cisd.bds.IDirectory;
 import ch.systemsx.cisd.bds.INode;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 
 /**
  * 
@@ -38,6 +39,18 @@ class Directory extends AbstractNode implements IDirectory
         assert directory.isDirectory() : "Not a directory: " + directory.getAbsolutePath();
     }
     
+    public INode getNode(String name)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public IDirectory appendDirectory(String name)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
     public void appendKeyValuePair(String key, String value)
     {
         File file = new File(fileNode, key);
@@ -81,4 +94,10 @@ class Directory extends AbstractNode implements IDirectory
         return null;
     }
 
+    public void extractTo(File directory) throws UserFailureException, EnvironmentFailureException
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/FileDataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/fs/FileStorage.java
similarity index 51%
rename from bds/source/java/ch/systemsx/cisd/bds/fs/FileDataStructureFactory.java
rename to bds/source/java/ch/systemsx/cisd/bds/fs/FileStorage.java
index 8d04d284e3a..aefe534501b 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/FileDataStructureFactory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/fs/FileStorage.java
@@ -18,34 +18,34 @@ package ch.systemsx.cisd.bds.fs;
 
 import java.io.File;
 
-import ch.systemsx.cisd.bds.AbstractDataStructureFactory;
-import ch.systemsx.cisd.bds.IDataStructure;
-import ch.systemsx.cisd.bds.Version;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.bds.IDirectory;
+import ch.systemsx.cisd.bds.IStorage;
 
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public class FileDataStructureFactory extends AbstractDataStructureFactory
+public class FileStorage implements IStorage
 {
+    private Directory root;
 
-    public FileDataStructureFactory(File baseDir)
+    public FileStorage(File folder)
     {
-        super(baseDir);
+        root = new Directory(folder);
+    }
+    
+    public IDirectory getRoot()
+    {
+        return root;
     }
 
-    public Class<? extends IDataStructure> getDataStructureInterfaceFor(Version version) throws UserFailureException
+    public void load()
     {
-        // TODO Auto-generated method stub
-        return null;
     }
 
-    public IDataStructure createDataStructure(String name, Version version) throws UserFailureException
+    public void save()
     {
-        // TODO Auto-generated method stub
-        return null;
     }
-    
+
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/Link.java b/bds/source/java/ch/systemsx/cisd/bds/fs/Link.java
index a1ddf4a6425..09dc58b4e50 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/Link.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/fs/Link.java
@@ -16,9 +16,13 @@
 
 package ch.systemsx.cisd.bds.fs;
 
+import java.io.File;
+
 import ch.systemsx.cisd.bds.IDirectory;
 import ch.systemsx.cisd.bds.ILink;
 import ch.systemsx.cisd.bds.INode;
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 
 /**
  * 
@@ -58,4 +62,9 @@ class Link implements ILink
         return reference;
     }
 
+    public void extractTo(File directory) throws UserFailureException, EnvironmentFailureException
+    {
+        // TODO Auto-generated method stub
+    }
+
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/fs/StringFile.java b/bds/source/java/ch/systemsx/cisd/bds/fs/StringFile.java
index 5e651af966d..1061b43852b 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/fs/StringFile.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/fs/StringFile.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.bds.fs;
 import java.io.File;
 
 import ch.systemsx.cisd.bds.IFile;
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.utilities.FileUtilities;
 
 /**
@@ -39,4 +41,9 @@ class StringFile extends AbstractNode implements IFile<String>
         return FileUtilities.loadToString(fileNode);
     }
 
+    public void extractTo(File directory) throws UserFailureException, EnvironmentFailureException
+    {
+        // TODO Auto-generated method stub
+    }
+
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5DataStructureFactory.java b/bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5Storage.java
similarity index 59%
rename from bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5DataStructureFactory.java
rename to bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5Storage.java
index 76ef69f2610..04c04c6c3bc 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5DataStructureFactory.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/hdf5/HDF5Storage.java
@@ -18,33 +18,37 @@ package ch.systemsx.cisd.bds.hdf5;
 
 import java.io.File;
 
-import ch.systemsx.cisd.bds.AbstractDataStructureFactory;
-import ch.systemsx.cisd.bds.IDataStructure;
-import ch.systemsx.cisd.bds.Version;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.bds.IDirectory;
+import ch.systemsx.cisd.bds.IStorage;
 
 /**
  * 
  *
  * @author Franz-Josef Elmer
  */
-public class HDF5DataStructureFactory extends AbstractDataStructureFactory
+public class HDF5Storage implements IStorage
 {
-    public HDF5DataStructureFactory(File baseDir)
+    public HDF5Storage(File hdf5File)
     {
-        super(baseDir);
+        assert hdf5File != null : "Unspecified HDF5 file.";
     }
-
-    public IDataStructure createDataStructure(String name, Version version) throws UserFailureException
+    
+    public IDirectory getRoot()
     {
         // TODO Auto-generated method stub
         return null;
     }
 
-    public Class<? extends IDataStructure> getDataStructureInterfaceFor(Version version) throws UserFailureException
+    public void load()
     {
         // TODO Auto-generated method stub
-        return null;
+
+    }
+
+    public void save()
+    {
+        // TODO Auto-generated method stub
+
     }
 
 }
-- 
GitLab