TCI - Fix potential IOException when trying to read after close

based on https://git.eclipse.org/r/#/c/77585/1

Change-Id: Ic9c7fe6a8930333c8e0cee86898420d1307b6dbf
Signed-off-by: Johannes Faltermeier <jfaltermeier@eclipsesource.com>
diff --git a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/AbstractOperationEmitter.java b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/AbstractOperationEmitter.java
index 0e07075..a8198a3 100644
--- a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/AbstractOperationEmitter.java
+++ b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/AbstractOperationEmitter.java
@@ -44,6 +44,7 @@
 	private final List<Long> backwardsOffsets = new ArrayList<Long>();
 	private int currentOpIndex;
 	private long startOffset;
+	private boolean isClosed;
 
 	/**
 	 * Constructor.
@@ -265,6 +266,7 @@
 	 * Closes the emitter.
 	 */
 	public void close() {
+		setClosed(true);
 		try {
 			reader.close();
 		} catch (final IOException ex) {
@@ -272,4 +274,15 @@
 		}
 	}
 
+	/**
+	 * @return <code>true</code> if emitter was closed, <code>false</code> otherwise
+	 */
+	protected boolean isClosed() {
+		return isClosed;
+	}
+
+	private void setClosed(boolean isClosed) {
+		this.isClosed = isClosed;
+	}
+
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/OperationEmitter.java b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/OperationEmitter.java
index 5acdf25..3ad61b2 100644
--- a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/OperationEmitter.java
+++ b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/OperationEmitter.java
@@ -73,6 +73,14 @@
 			}
 		}).start();
 
+		if (isClosed()) {
+			try {
+				return Optional.absent();
+			} finally {
+				pis.close();
+			}
+		}
+
 		try {
 			final EObject deserializedObject = deserialize(pis);
 			if (AbstractOperation.class.isInstance(deserializedObject)) {
diff --git a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/SerializedOperationEmitter.java b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/SerializedOperationEmitter.java
index 77486ba..11b915c 100644
--- a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/SerializedOperationEmitter.java
+++ b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/impl/persistent/SerializedOperationEmitter.java
@@ -64,6 +64,14 @@
 			}
 		}).start();
 
+		if (isClosed()) {
+			try {
+				return Optional.absent();
+			} finally {
+				pis.close();
+			}
+		}
+
 		try {
 			final String streamToString = convertStreamToString(pis);
 			if (XmlTags.XML_RESOURCE_WITH_EOBJECT.equals(streamToString)) {