From f9f16ae7672cbfb7e3da527e6b96e8d7fdd5d9c9 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 30 Jul 2012 16:55:44 +0200
Subject: [PATCH] OO-320: add a giant lock on load/save operation in
 ScoDocument

---
 .../server/servermodels/ScoDocument.java      | 27 +++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/olat/modules/scorm/server/servermodels/ScoDocument.java b/src/main/java/org/olat/modules/scorm/server/servermodels/ScoDocument.java
index 4a3c88d2d96..005866f83ad 100644
--- a/src/main/java/org/olat/modules/scorm/server/servermodels/ScoDocument.java
+++ b/src/main/java/org/olat/modules/scorm/server/servermodels/ScoDocument.java
@@ -34,6 +34,8 @@ import java.util.Vector;
 import org.jdom.Document;
 import org.jdom.Element;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
 import org.olat.modules.scorm.ISettingsHandler;
 
 import uk.ac.reload.jdom.XMLDocument;
@@ -47,6 +49,8 @@ import uk.ac.reload.jdom.XMLDocument;
  * @author Paul Sharples
  */
 public class ScoDocument extends XMLDocument {
+	private OLog log = Tracing.createLoggerFor(ScoDocument.class);
+	
 	// var used to flag if the sco was "failed"
 	private boolean isFailed = false;
 
@@ -120,8 +124,10 @@ public class ScoDocument extends XMLDocument {
 		// Make sure its there
 		if (pathToNavFile.exists()) {
 			try {
-				super.loadDocument(pathToNavFile);
-
+				synchronized(ScoDocument.class) {
+					super.loadDocument(pathToNavFile);
+				}
+				
 				Element root = getDocument().getRootElement();
 
 				// set these now, so they are easy to get to when we need them later.
@@ -146,12 +152,29 @@ public class ScoDocument extends XMLDocument {
 					isFailed = false;
 				}
 			} catch (Exception ex) {
+				log.info("Error loading: " + pathToNavFile + " :: " + this);
 				throw new OLATRuntimeException(this.getClass(), "error: could not load sco model for " + scoID, ex);
 			}
 		} else {
 			throw new OLATRuntimeException(this.getClass(), "error: could not find sco model for " + scoID, null);
 		}
 	}
+	
+	
+
+	@Override
+	public void saveAsDocument(File file) throws IOException {
+		synchronized(ScoDocument.class) {
+			super.saveAsDocument(file);
+		}
+	}
+
+	@Override
+	public void saveDocument() throws IOException {
+		synchronized(ScoDocument.class) {
+			super.saveDocument();
+		}
+	}
 
 	/**
 	 * getScoModel() - This method searches the CMI xml file that was created when
-- 
GitLab