migration changes
diff --git a/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/ESWorkspaceProviderImpl.java b/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/ESWorkspaceProviderImpl.java
index 4bf44e8..f50509f 100644
--- a/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/ESWorkspaceProviderImpl.java
+++ b/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/ESWorkspaceProviderImpl.java
@@ -207,7 +207,9 @@
 			// hrefs are persisted differently in 1.1+ in comparison to 1.0

 			// migrate, if needed, before loading

 			if (resourceSetProvider instanceof ClientXMIResourceSetProvider) {

-				new ClientHrefMigrator().migrate();

+				if (!new ClientHrefMigrator().migrate()) {

+					throw new RuntimeException("Migration failed");

+				}

 			}

 

 			// file exists, load it,

diff --git a/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/startup/ClientHrefMigrator.java b/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/startup/ClientHrefMigrator.java
index 9195e1a..3f6cd98 100644
--- a/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/startup/ClientHrefMigrator.java
+++ b/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/startup/ClientHrefMigrator.java
@@ -20,7 +20,6 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.apache.commons.io.FileUtils;
 import org.eclipse.emf.emfstore.internal.client.model.Configuration;
 import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
 import org.eclipse.emf.emfstore.internal.server.startup.ServerHrefMigrator;
@@ -42,42 +41,46 @@
  */
 public class ClientHrefMigrator extends ServerHrefMigrator {
 
+	private File backup;
+
 	/**
 	 * Performs the migration, if needed. Creates a backup beforehand.
+	 * 
+	 * @return <code>true</code> if migration was successful, <code>false</code> if an error occurred and the client
+	 *         startup should be canceled.
 	 */
 	@Override
-	public void migrate() {
+	public boolean migrate() {
 
 		final String sEMFStoreClient = Configuration.getFileInfo().getWorkspaceDirectory();
 
 		// check if migration is needed
 		if (isMigrationNeeded(sEMFStoreClient + "workspace.ucw")) { //$NON-NLS-1$
 
-			// create backup
-			File backup = null;
+			if (backup != null) {
+				return false;
+			}
+
 			try {
 				backup = createBackup(Configuration.getFileInfo().getWorkspaceDirectory(),
 					Configuration.getFileInfo().getWorkspaceDirectory() + "../backup" + System.currentTimeMillis()); //$NON-NLS-1$
 			} catch (final IOException ex) {
 				ModelUtil.logException(
 					"Error during the backup creation.", ex);
+				return false;
 			}
 
 			// perform migration
 			try {
 				doMigrate(sEMFStoreClient);
-				if (backup != null) {
-					FileUtils.deleteDirectory(backup);
-				}
-				return;
+				return true;
 			} catch (final InvocationTargetException ex) {
 				ModelUtil.logException(
 					"Error during the migration process.", ex);
-			} catch (final IOException ex) {
-				ModelUtil.logException(
-					"Deleting the backup failed", ex);
+				return false;
 			}
 		}
+		return true;
 	}
 
 	private boolean isMigrationNeeded(String pathToFile) {
@@ -98,13 +101,14 @@
 				"Cannot determine whether migration is needed. Migration will be skipped, backup will be created.", ex);
 		}
 		try {
-			createBackup(Configuration.getFileInfo().getWorkspaceDirectory(),
+			backup = createBackup(Configuration.getFileInfo().getWorkspaceDirectory(),
 				Configuration.getFileInfo().getWorkspaceDirectory() + "../backup" + System.currentTimeMillis()); //$NON-NLS-1$
 		} catch (final IOException ex) {
+			backup = new File(""); //$NON-NLS-1$
 			ModelUtil.logException(
 				"Creating the backup failed.", ex);
 		}
-		return false;
+		return true;
 	}
 
 	private void doMigrate(String sEMFStoreClient) throws InvocationTargetException {
diff --git a/bundles/org.eclipse.emf.emfstore.server/META-INF/MANIFEST.MF b/bundles/org.eclipse.emf.emfstore.server/META-INF/MANIFEST.MF
index 65e6a87..ef92865 100644
--- a/bundles/org.eclipse.emf.emfstore.server/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.emf.emfstore.server/META-INF/MANIFEST.MF
@@ -50,7 +50,7 @@
    org.eclipse.emf.emfstore.example.merging",
  org.eclipse.emf.emfstore.internal.server.filetransfer;version="1.0.4";x-friends:="org.eclipse.emf.emfstore.client,org.eclipse.emf.emfstore.client.test",
  org.eclipse.emf.emfstore.internal.server.impl.api;version="1.0.4";x-friends:="org.eclipse.emf.emfstore.client,org.eclipse.emf.emfstore.client.ui",
- org.eclipse.emf.emfstore.internal.server.startup;version="1.0.4";x-internal:=true,
+ org.eclipse.emf.emfstore.internal.server.startup;version="1.0.4";x-friends:="org.eclipse.emf.emfstore.client",
  org.eclipse.emf.emfstore.internal.server.storage;version="1.0.4";x-internal:=true,
  org.eclipse.emf.emfstore.server;version="1.0.4",
  org.eclipse.emf.emfstore.server.exceptions;version="1.0.4",
diff --git a/bundles/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/internal/server/EMFStoreController.java b/bundles/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/internal/server/EMFStoreController.java
index c34562e..c02c2d1 100644
--- a/bundles/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/internal/server/EMFStoreController.java
+++ b/bundles/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/internal/server/EMFStoreController.java
@@ -338,7 +338,10 @@
 			// hrefs are persisted differently in 1.1+ in comparison to 1.0

 			// migrate, if needed, before loading

 			if (resourceSetProvider instanceof ServerXMIResourceSetProvider) {

-				new ServerHrefMigrator().migrate();

+				if (!new ServerHrefMigrator().migrate()) {

+					throw new FatalESException("Error during migration");

+				}

+

 			}

 			resource = resourceSet.createResource(serverspaceURI);

 		}

diff --git a/bundles/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/internal/server/startup/ServerHrefMigrator.java b/bundles/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/internal/server/startup/ServerHrefMigrator.java
index e56a6da..23b60f9 100644
--- a/bundles/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/internal/server/startup/ServerHrefMigrator.java
+++ b/bundles/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/internal/server/startup/ServerHrefMigrator.java
@@ -27,7 +27,6 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-import org.apache.commons.io.FileUtils;
 import org.eclipse.emf.emfstore.internal.common.model.util.FileUtil;
 import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
 import org.eclipse.emf.emfstore.internal.server.ServerConfiguration;
@@ -50,41 +49,45 @@
  */
 public class ServerHrefMigrator {
 
+	private File backup;
+
 	/**
 	 * Performs the migration, if needed. Creates a backup beforehand.
+	 * 
+	 * @return <code>true</code> if migration was successful, <code>false</code> if an error occurred and the server
+	 *         startup should be canceled.
 	 */
-	public void migrate() {
+	public boolean migrate() {
 
 		final String sEMFStoreServer = ServerConfiguration.getServerHome();
 
 		// check if migration is needed
 		if (isMigrationNeeded(sEMFStoreServer + "storage.uss")) { //$NON-NLS-1$
 
-			// create backup
-			File backup = null;
+			if (backup != null) {
+				return false;
+			}
+
 			try {
 				backup = createBackup(ServerConfiguration.getServerHome(),
 					ServerConfiguration.getServerHome() + "../backup" + System.currentTimeMillis()); //$NON-NLS-1$
 			} catch (final IOException ex) {
 				ModelUtil.logException(
 					"Error during the backup creation.", ex);
+				return false;
 			}
 
 			// perform migration
 			try {
 				doMigrate(sEMFStoreServer);
-				if (backup != null) {
-					FileUtils.deleteDirectory(backup);
-				}
-				return;
+				return true;
 			} catch (final InvocationTargetException ex) {
 				ModelUtil.logException(
 					"Error during the migration process.", ex);
-			} catch (final IOException ex) {
-				ModelUtil.logException(
-					"Deleting the backup failed", ex);
+				return false;
 			}
 		}
+		return true;
 	}
 
 	private boolean isMigrationNeeded(String pathToServerSpace) {
@@ -105,13 +108,14 @@
 				"Cannot determine whether migration is needed. Migration will be skipped, backup will be created.", ex);
 		}
 		try {
-			createBackup(ServerConfiguration.getServerHome(),
+			backup = createBackup(ServerConfiguration.getServerHome(),
 				ServerConfiguration.getServerHome() + "../backup" + System.currentTimeMillis()); //$NON-NLS-1$
 		} catch (final IOException ex) {
+			backup = new File(""); //$NON-NLS-1$
 			ModelUtil.logException(
 				"Creating the backup failed.", ex);
 		}
-		return false;
+		return true;
 	}
 
 	/**