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)) {