X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.services%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fservices%2Factivation%2FActivationManager.java;h=3bd7cdf62ea6744d340be72e00b82cde46fbcaf4;hb=00854006c7f0f80ed597df3071d5f2cc704ab8c6;hp=6c80c8c2b76e2dfd93299208f72e3c1f431bb760;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git
diff --git a/bundles/org.simantics.db.services/src/org/simantics/db/services/activation/ActivationManager.java b/bundles/org.simantics.db.services/src/org/simantics/db/services/activation/ActivationManager.java
index 6c80c8c2b..3bd7cdf62 100644
--- a/bundles/org.simantics.db.services/src/org/simantics/db/services/activation/ActivationManager.java
+++ b/bundles/org.simantics.db.services/src/org/simantics/db/services/activation/ActivationManager.java
@@ -1,206 +1,206 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management
- * in Industry THTH ry.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * VTT Technical Research Centre of Finland - initial API and implementation
- *******************************************************************************/
-package org.simantics.db.services.activation;
-
-import org.simantics.db.Disposable;
-import org.simantics.db.ReadGraph;
-import org.simantics.db.Resource;
-import org.simantics.db.Session;
-import org.simantics.db.WriteGraph;
-import org.simantics.db.common.CommentMetadata;
-import org.simantics.db.common.request.WriteRequest;
-import org.simantics.db.common.utils.CommonDBUtils;
-import org.simantics.db.common.utils.Logger;
-import org.simantics.db.common.utils.NameUtils;
-import org.simantics.db.exception.DatabaseException;
-import org.simantics.layer0.utils.queries.QueryExecutor2;
-import org.simantics.layer0.utils.triggers.IActivation;
-import org.simantics.layer0.utils.triggers.IActivationManager;
-import org.simantics.layer0.utils.triggers.IModification;
-import org.simantics.layer0.utils.triggers.ITrigger;
-import org.simantics.operation.Layer0X;
-import org.simantics.utils.logging.TimeLogger;
-import org.simantics.utils.threads.logger.IThreadLogger;
-import org.simantics.utils.threads.logger.ThreadLogger;
-
-@SuppressWarnings("deprecation") // No replacement given so now way to fix this error.
-public class ActivationManager implements IActivationManager, Disposable {
-
- Session session;
- static IThreadLogger threadLogger = ThreadLogger.getInstance();
-
- class Activation extends QueryExecutor2 implements IActivation {
- final boolean DEBUG = false;
- final boolean BREAK_INFINITE_ACTIVATION_LOOPS = true;
-
- /**
- * After {@value InfiniteLoop} the activation will be forcibly
- * deactivated if {@link #BREAK_INFINITE_ACTIVATION_LOOPS} is
- * true
.
- */
- final int INFINITE_LOOP_COUNT = 100;
-
- Resource resource;
- int transactionCount = 0;
- boolean disposed = false;
- boolean runOnce = false;
-
- public Activation(Resource resource) {
- this.resource = resource;
- }
-
- public void runOnceAndDeactivate() {
- runOnce = true;
- }
-
- @Override
- public void run(ReadGraph g) throws DatabaseException {
-// ITask task = threadLogger.begin("Activation.perform");
- Layer0X L0X = Layer0X.getInstance(g);
- for(Resource r : g.getObjects(resource, L0X.HasTrigger))
- if(calcModification(g, r) != null)
- execute(g, r);
-// task.finish();
- }
-
- private IModification calcModification(ReadGraph g, Resource trigger) throws DatabaseException {
-// new Exception().printStackTrace();
- //ITask task = ThreadLogger.getInstance().begin("Activation.calcModification");
- IModification modi = g.syncRequest(g.adapt(trigger, ITrigger.class));
- //task.finish();
- return modi;
- }
-
- private WriteRequest getRequest(final Resource trigger) {
- return new WriteRequest() {
- @Override
- public void perform(WriteGraph g) throws DatabaseException {
- int count = 0;
- while (true) {
-
- CommonDBUtils.selectClusterSet(g, trigger);
-
- TimeLogger.log("ActivationManager: start calculating modification");
- IModification modification = calcModification(g, trigger);
- TimeLogger.log("ActivationManager: finished calculating modification");
- if (modification != null)
- ++count;
- else {
- if (count > 0) {
- CommentMetadata cm = g.getMetadata(CommentMetadata.class);
- String msg = "ActivationManager modification count=" + count;
- g.addMetadata(cm.add(msg));
- if (DEBUG)
- System.out.println("DEBUG: " + msg);
- }
- if(runOnce)
- deactivate();
- return;
- }
- if (BREAK_INFINITE_ACTIVATION_LOOPS) {
- if (count > INFINITE_LOOP_COUNT) {
- deactivate();
- String msg = "Possible dynamic activation loop. Forcing break."
- + "Loop count was " + count
- + ". Activated resource was "
- + NameUtils.getURIOrSafeNameInternal(g, resource) + ".";
- System.out.println("WARNING: " + msg);
- throw new DatabaseException(msg);
- }
- }
- try {
- modification.perform(g);
- TimeLogger.log("ActivationManager: performed modification");
- } catch (DatabaseException e) {
- deactivate();
- throw e;
- }
- }
- }
- };
- }
-
- private void executeOnce(WriteGraph graph, final Resource trigger) throws DatabaseException {
- getRequest(trigger).perform(graph);
-// graph.syncRequest(getRequest(trigger));
- }
-
- private void execute(final ReadGraph graph, final Resource trigger) {
- graph.asyncRequest(getRequest(trigger));
- }
-
- @Override
- public void deactivate() {
- disposed = true;
- }
-
- @Override
- public boolean isDisposed() {
- return disposed || session == null;
- }
-
- }
-
- public ActivationManager(Session session) {
- this.session = session;
- }
-
- @Override
- public IActivation activate(Resource r) {
- Session s = session;
- if (s == null)
- throw new IllegalStateException("ActivationManager is disposed");
- Activation activation = new Activation(r);
- try {
- activation.execute(session);
- } catch (DatabaseException e) {
- Logger.defaultLogError(e);
- }
- return activation;
- }
-
- @Override
- public IActivation activate(WriteGraph graph, Resource r) throws DatabaseException {
- Session s = session;
- if (s == null)
- throw new IllegalStateException("ActivationManager is disposed");
- Activation activation = new Activation(r);
- activation.execute(graph);
- return activation;
- }
-
- @Override
- public void activateOnce(Resource resource) {
- activate(resource).runOnceAndDeactivate();
- }
-
- @Override
- public void activateOnce(WriteGraph graph, Resource resource) throws DatabaseException {
-
- Session s = session;
- if (s == null)
- throw new IllegalStateException("ActivationManager is disposed");
-
- Layer0X L0X = Layer0X.getInstance(graph);
- for(Resource r : graph.getObjects(resource, L0X.HasTrigger)) {
- new Activation(resource).executeOnce(graph, r);
- }
-
-
- }
-
- @Override
- public void dispose() {
- session = null;
- }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.db.services.activation;
+
+import org.simantics.db.Disposable;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.CommentMetadata;
+import org.simantics.db.common.request.WriteRequest;
+import org.simantics.db.common.utils.CommonDBUtils;
+import org.simantics.db.common.utils.Logger;
+import org.simantics.db.common.utils.NameUtils;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.layer0.utils.queries.QueryExecutor2;
+import org.simantics.layer0.utils.triggers.IActivation;
+import org.simantics.layer0.utils.triggers.IActivationManager;
+import org.simantics.layer0.utils.triggers.IModification;
+import org.simantics.layer0.utils.triggers.ITrigger;
+import org.simantics.operation.Layer0X;
+import org.simantics.utils.logging.TimeLogger;
+import org.simantics.utils.threads.logger.IThreadLogger;
+import org.simantics.utils.threads.logger.ThreadLogger;
+
+@SuppressWarnings("deprecation") // No replacement given so now way to fix this error.
+public class ActivationManager implements IActivationManager, Disposable {
+
+ Session session;
+ static IThreadLogger threadLogger = ThreadLogger.getInstance();
+
+ class Activation extends QueryExecutor2 implements IActivation {
+ final boolean DEBUG = false;
+ final boolean BREAK_INFINITE_ACTIVATION_LOOPS = true;
+
+ /**
+ * After {@value InfiniteLoop} the activation will be forcibly
+ * deactivated if {@link #BREAK_INFINITE_ACTIVATION_LOOPS} is
+ * true
.
+ */
+ final int INFINITE_LOOP_COUNT = 100;
+
+ Resource resource;
+ int transactionCount = 0;
+ boolean disposed = false;
+ boolean runOnce = false;
+
+ public Activation(Resource resource) {
+ this.resource = resource;
+ }
+
+ public void runOnceAndDeactivate() {
+ runOnce = true;
+ }
+
+ @Override
+ public void run(ReadGraph g) throws DatabaseException {
+// ITask task = threadLogger.begin("Activation.perform");
+ Layer0X L0X = Layer0X.getInstance(g);
+ for(Resource r : g.getObjects(resource, L0X.HasTrigger))
+ if(calcModification(g, r) != null)
+ execute(g, r);
+// task.finish();
+ }
+
+ private IModification calcModification(ReadGraph g, Resource trigger) throws DatabaseException {
+// new Exception().printStackTrace();
+ //ITask task = ThreadLogger.getInstance().begin("Activation.calcModification");
+ IModification modi = g.syncRequest(g.adapt(trigger, ITrigger.class));
+ //task.finish();
+ return modi;
+ }
+
+ private WriteRequest getRequest(final Resource trigger) {
+ return new WriteRequest() {
+ @Override
+ public void perform(WriteGraph g) throws DatabaseException {
+ int count = 0;
+ while (true) {
+
+ CommonDBUtils.selectClusterSet(g, trigger);
+
+ TimeLogger.log("ActivationManager: start calculating modification");
+ IModification modification = calcModification(g, trigger);
+ TimeLogger.log("ActivationManager: finished calculating modification");
+ if (modification != null)
+ ++count;
+ else {
+ if (count > 0) {
+ CommentMetadata cm = g.getMetadata(CommentMetadata.class);
+ String msg = "ActivationManager modification count=" + count;
+ g.addMetadata(cm.add(msg));
+ if (DEBUG)
+ System.out.println("DEBUG: " + msg);
+ }
+ if(runOnce)
+ deactivate();
+ return;
+ }
+ if (BREAK_INFINITE_ACTIVATION_LOOPS) {
+ if (count > INFINITE_LOOP_COUNT) {
+ deactivate();
+ String msg = "Possible dynamic activation loop. Forcing break."
+ + "Loop count was " + count
+ + ". Activated resource was "
+ + NameUtils.getURIOrSafeNameInternal(g, resource) + ".";
+ System.out.println("WARNING: " + msg);
+ throw new DatabaseException(msg);
+ }
+ }
+ try {
+ modification.perform(g);
+ TimeLogger.log("ActivationManager: performed modification");
+ } catch (DatabaseException e) {
+ deactivate();
+ throw e;
+ }
+ }
+ }
+ };
+ }
+
+ private void executeOnce(WriteGraph graph, final Resource trigger) throws DatabaseException {
+ getRequest(trigger).perform(graph);
+// graph.syncRequest(getRequest(trigger));
+ }
+
+ private void execute(final ReadGraph graph, final Resource trigger) {
+ graph.asyncRequest(getRequest(trigger));
+ }
+
+ @Override
+ public void deactivate() {
+ disposed = true;
+ }
+
+ @Override
+ public boolean isDisposed() {
+ return disposed || session == null;
+ }
+
+ }
+
+ public ActivationManager(Session session) {
+ this.session = session;
+ }
+
+ @Override
+ public IActivation activate(Resource r) {
+ Session s = session;
+ if (s == null)
+ throw new IllegalStateException("ActivationManager is disposed");
+ Activation activation = new Activation(r);
+ try {
+ activation.execute(session);
+ } catch (DatabaseException e) {
+ Logger.defaultLogError(e);
+ }
+ return activation;
+ }
+
+ @Override
+ public IActivation activate(WriteGraph graph, Resource r) throws DatabaseException {
+ Session s = session;
+ if (s == null)
+ throw new IllegalStateException("ActivationManager is disposed");
+ Activation activation = new Activation(r);
+ activation.execute(graph);
+ return activation;
+ }
+
+ @Override
+ public void activateOnce(Resource resource) {
+ activate(resource).runOnceAndDeactivate();
+ }
+
+ @Override
+ public void activateOnce(WriteGraph graph, Resource resource) throws DatabaseException {
+
+ Session s = session;
+ if (s == null)
+ throw new IllegalStateException("ActivationManager is disposed");
+
+ Layer0X L0X = Layer0X.getInstance(graph);
+ for(Resource r : graph.getObjects(resource, L0X.HasTrigger)) {
+ new Activation(resource).executeOnce(graph, r);
+ }
+
+
+ }
+
+ @Override
+ public void dispose() {
+ session = null;
+ }
+
+}