--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.diagram.synchronization.graph;\r
+\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.request.Write;\r
+import org.simantics.diagram.internal.DebugPolicy;\r
+import org.simantics.diagram.internal.timing.GTask;\r
+import org.simantics.diagram.internal.timing.Timing;\r
+import org.simantics.diagram.synchronization.ErrorHandler;\r
+import org.simantics.diagram.synchronization.IModification;\r
+import org.simantics.utils.logging.TimeLogger;\r
+\r
+/**\r
+ * A graph database write request that composes several {@link IModification}\r
+ * instances into a single {@link Write} request.\r
+ * \r
+ * @author Tuukka Lehtonen\r
+ * \r
+ * @see IModification\r
+ */\r
+public class ModificationProcessRequest extends WriteRequest {\r
+\r
+ ErrorHandler errorHandler;\r
+ IModification[] modifications;\r
+\r
+ public ModificationProcessRequest(ErrorHandler errorHandler, IModification[] modifications) {\r
+ this.errorHandler = errorHandler;\r
+ this.modifications = modifications;\r
+ }\r
+\r
+ @Override\r
+ public void perform(final WriteGraph g) throws DatabaseException {\r
+ g.markUndoPoint();\r
+ if (DebugPolicy.DEBUG_GRAPH_WRITEBACK)\r
+ System.out.println(Thread.currentThread() + " Performing " + modifications.length + " modifications");\r
+ Timing.timed("" + modifications.length + " MODIFICATIONS", new GTask() {\r
+ @Override\r
+ public void run() throws DatabaseException {\r
+ for (IModification m : modifications) {\r
+ if (m != null) {\r
+ modification(g, m);\r
+ }\r
+ }\r
+ }\r
+ });\r
+ }\r
+\r
+ public void modification(final WriteGraph g, final IModification m) throws DatabaseException {\r
+ Timing.timed(m.toString(), new GTask() {\r
+ @Override\r
+ public void run() throws DatabaseException {\r
+ synchronized (m) {\r
+ try {\r
+ if (DebugPolicy.DEBUG_GRAPH_WRITEBACK_MODIFICATION)\r
+ System.out.println(Thread.currentThread() + " Performing modification: " + m);\r
+ m.perform(g);\r
+ } catch (Exception e) {\r
+ m.setException(e);\r
+ errorHandler.error(e.getMessage(), e);\r
+ } catch (Error e) {\r
+ m.setException(e);\r
+ errorHandler.error(e.getMessage(), e);\r
+ } finally {\r
+ m.markComplete();\r
+ m.notifyAll();\r
+ }\r
+ }\r
+ }\r
+ });\r
+ }\r
+\r
+}
\ No newline at end of file