]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/synchronization/graph/ModificationProcessRequest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / synchronization / graph / ModificationProcessRequest.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.synchronization.graph;\r
13 \r
14 import org.simantics.db.WriteGraph;\r
15 import org.simantics.db.common.request.WriteRequest;\r
16 import org.simantics.db.exception.DatabaseException;\r
17 import org.simantics.db.request.Write;\r
18 import org.simantics.diagram.internal.DebugPolicy;\r
19 import org.simantics.diagram.internal.timing.GTask;\r
20 import org.simantics.diagram.internal.timing.Timing;\r
21 import org.simantics.diagram.synchronization.ErrorHandler;\r
22 import org.simantics.diagram.synchronization.IModification;\r
23 import org.simantics.utils.logging.TimeLogger;\r
24 \r
25 /**\r
26  * A graph database write request that composes several {@link IModification}\r
27  * instances into a single {@link Write} request.\r
28  * \r
29  * @author Tuukka Lehtonen\r
30  * \r
31  * @see IModification\r
32  */\r
33 public class ModificationProcessRequest extends WriteRequest {\r
34 \r
35     ErrorHandler    errorHandler;\r
36     IModification[] modifications;\r
37 \r
38     public ModificationProcessRequest(ErrorHandler errorHandler, IModification[] modifications) {\r
39         this.errorHandler = errorHandler;\r
40         this.modifications = modifications;\r
41     }\r
42 \r
43     @Override\r
44     public void perform(final WriteGraph g) throws DatabaseException {\r
45         g.markUndoPoint();\r
46         if (DebugPolicy.DEBUG_GRAPH_WRITEBACK)\r
47             System.out.println(Thread.currentThread() + " Performing " + modifications.length + " modifications");\r
48         Timing.timed("" + modifications.length + " MODIFICATIONS", new GTask() {\r
49             @Override\r
50             public void run() throws DatabaseException {\r
51                 for (IModification m : modifications) {\r
52                     if (m != null) {\r
53                         modification(g, m);\r
54                     }\r
55                 }\r
56             }\r
57         });\r
58     }\r
59 \r
60     public void modification(final WriteGraph g, final IModification m) throws DatabaseException {\r
61         Timing.timed(m.toString(), new GTask() {\r
62             @Override\r
63             public void run() throws DatabaseException {\r
64                 synchronized (m) {\r
65                     try {\r
66                         if (DebugPolicy.DEBUG_GRAPH_WRITEBACK_MODIFICATION)\r
67                             System.out.println(Thread.currentThread() + "  Performing modification: " + m);\r
68                         m.perform(g);\r
69                     } catch (Exception e) {\r
70                         m.setException(e);\r
71                         errorHandler.error(e.getMessage(), e);\r
72                     } catch (Error e) {\r
73                         m.setException(e);\r
74                         errorHandler.error(e.getMessage(), e);\r
75                     } finally {\r
76                         m.markComplete();\r
77                         m.notifyAll();\r
78                     }\r
79                 }\r
80             }\r
81         });\r
82     }\r
83 \r
84 }