-/*******************************************************************************\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.modeling.utils;\r
-\r
-import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.eclipse.core.runtime.IStatus;\r
-import org.eclipse.core.runtime.Status;\r
-import org.eclipse.core.runtime.SubMonitor;\r
-import org.eclipse.core.runtime.jobs.Job;\r
-import org.simantics.DatabaseJob;\r
-import org.simantics.Simantics;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.common.procedure.adapter.ListenerAdapter;\r
-import org.simantics.db.common.request.ParametrizedRead;\r
-import org.simantics.db.common.request.UnaryRead;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.request.Read;\r
-import org.simantics.simulation.experiment.ExperimentState;\r
-import org.simantics.simulation.experiment.IExperiment;\r
-import org.simantics.simulation.experiment.IExperimentListener;\r
-import org.simantics.ui.workbench.editor.input.InputValidationCombinators;\r
-import org.simantics.utils.ui.ExceptionUtils;\r
-\r
-/**\r
- * @author Tuukka Lehtonen\r
- */\r
-public class ExperimentExistenceWatchdog {\r
-\r
- public static ExperimentExistenceWatchdog activate(IExperiment experiment, Resource experimentResource) {\r
- ExperimentExistenceWatchdog validator = new ExperimentExistenceWatchdog(experiment, experimentResource,\r
- InputValidationCombinators.hasURI());\r
- validator.attachExperimentListener();\r
- validator.activateValidation();\r
- return validator;\r
- }\r
-\r
- private Session session;\r
- private final Resource experimentResource;\r
- private IExperiment experiment;\r
- private final ParametrizedRead<Resource, Boolean> inputValidator;\r
- private InputListener inputListener;\r
-\r
- private ExperimentExistenceWatchdog(IExperiment experiment, Resource experimentResource, ParametrizedRead<Resource, Boolean> inputValidator) {\r
- this.session = Simantics.getSession();\r
- this.experiment = experiment;\r
- this.experimentResource = experimentResource;\r
- this.inputValidator = inputValidator;\r
- }\r
-\r
- private void attachExperimentListener() {\r
- experiment.addListener(new IExperimentListener() {\r
- @Override\r
- public void stateChanged(ExperimentState state) {\r
- if (state == ExperimentState.DISPOSED) {\r
- if (!isDisposed())\r
- dispose();\r
- }\r
- }\r
- });\r
- }\r
-\r
- public void dispose() {\r
- deactivateValidation();\r
- experiment = null;\r
- session = null;\r
- }\r
-\r
- protected boolean isDisposed() {\r
- return session == null || experimentResource == null || experiment == null;\r
- }\r
-\r
- public synchronized void activateValidation() {\r
- if (isDisposed())\r
- throw new IllegalStateException(this + " is disposed");\r
- if (inputListener != null)\r
- return;\r
-\r
- inputListener = new InputListener();\r
- session.asyncRequest(validationRequest(), inputListener);\r
- }\r
-\r
- public synchronized void deactivateValidation() {\r
- if (isDisposed())\r
- throw new IllegalStateException(this + " is disposed");\r
- if (inputListener == null)\r
- return;\r
- inputListener.dispose();\r
- inputListener = null;\r
- }\r
-\r
- /**\r
- * @param input\r
- * @return a read request that returns <code>true</code> for valid inputs\r
- * and <code>false</code> for non-existent or invalid inputs.\r
- */\r
- private Read<Boolean> validationRequest() {\r
- return new UnaryRead<Resource, Boolean>(experimentResource) {\r
- @Override\r
- public Boolean perform(ReadGraph graph) throws DatabaseException {\r
- return graph.syncRequest(inputValidator.get(experimentResource));\r
- }\r
- };\r
- }\r
-\r
- private class InputListener extends ListenerAdapter<Boolean> {\r
-\r
- private boolean disposed = false;\r
-\r
- public void dispose() {\r
- disposed = true;\r
- }\r
-\r
- @Override\r
- public void execute(Boolean evaluation) {\r
- if (!Boolean.TRUE.equals(evaluation)) {\r
- scheduleExperimentShutdown(experiment);\r
- }\r
- }\r
-\r
- @Override\r
- public void exception(Throwable t) {\r
- ExceptionUtils.logError("ResourceEditorSupport.InputListener received an unexpected exception.", t);\r
- }\r
-\r
- @Override\r
- public boolean isDisposed() {\r
- return disposed || ExperimentExistenceWatchdog.this.isDisposed();\r
- }\r
- }\r
-\r
- private static void scheduleExperimentShutdown(final IExperiment experiment) {\r
- Job job = new DatabaseJob("Experiment Shutdown Watchdog") {\r
- @Override\r
- protected IStatus run(IProgressMonitor monitor) {\r
- SubMonitor mon = SubMonitor.convert(monitor, "Shutdown", 100000);\r
- try {\r
- experiment.shutdown(mon.newChild(100000));\r
- return Status.OK_STATUS;\r
- } finally {\r
- monitor.done();\r
- }\r
- }\r
- };\r
- job.schedule();\r
- }\r
-\r
-}\r
+/*******************************************************************************
+ * 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.modeling.utils;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.simantics.DatabaseJob;
+import org.simantics.Simantics;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.common.procedure.adapter.ListenerAdapter;
+import org.simantics.db.common.request.ParametrizedRead;
+import org.simantics.db.common.request.UnaryRead;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.request.Read;
+import org.simantics.simulation.experiment.ExperimentState;
+import org.simantics.simulation.experiment.IExperiment;
+import org.simantics.simulation.experiment.IExperimentListener;
+import org.simantics.ui.workbench.editor.input.InputValidationCombinators;
+import org.simantics.utils.ui.ExceptionUtils;
+
+/**
+ * @author Tuukka Lehtonen
+ */
+public class ExperimentExistenceWatchdog {
+
+ public static ExperimentExistenceWatchdog activate(IExperiment experiment, Resource experimentResource) {
+ ExperimentExistenceWatchdog validator = new ExperimentExistenceWatchdog(experiment, experimentResource,
+ InputValidationCombinators.hasURI());
+ validator.attachExperimentListener();
+ validator.activateValidation();
+ return validator;
+ }
+
+ private Session session;
+ private final Resource experimentResource;
+ private IExperiment experiment;
+ private final ParametrizedRead<Resource, Boolean> inputValidator;
+ private InputListener inputListener;
+
+ private ExperimentExistenceWatchdog(IExperiment experiment, Resource experimentResource, ParametrizedRead<Resource, Boolean> inputValidator) {
+ this.session = Simantics.getSession();
+ this.experiment = experiment;
+ this.experimentResource = experimentResource;
+ this.inputValidator = inputValidator;
+ }
+
+ private void attachExperimentListener() {
+ experiment.addListener(new IExperimentListener() {
+ @Override
+ public void stateChanged(ExperimentState state) {
+ if (state == ExperimentState.DISPOSED) {
+ if (!isDisposed())
+ dispose();
+ }
+ }
+ });
+ }
+
+ public void dispose() {
+ deactivateValidation();
+ experiment = null;
+ session = null;
+ }
+
+ protected boolean isDisposed() {
+ return session == null || experimentResource == null || experiment == null;
+ }
+
+ public synchronized void activateValidation() {
+ if (isDisposed())
+ throw new IllegalStateException(this + " is disposed");
+ if (inputListener != null)
+ return;
+
+ inputListener = new InputListener();
+ session.asyncRequest(validationRequest(), inputListener);
+ }
+
+ public synchronized void deactivateValidation() {
+ if (isDisposed())
+ throw new IllegalStateException(this + " is disposed");
+ if (inputListener == null)
+ return;
+ inputListener.dispose();
+ inputListener = null;
+ }
+
+ /**
+ * @param input
+ * @return a read request that returns <code>true</code> for valid inputs
+ * and <code>false</code> for non-existent or invalid inputs.
+ */
+ private Read<Boolean> validationRequest() {
+ return new UnaryRead<Resource, Boolean>(experimentResource) {
+ @Override
+ public Boolean perform(ReadGraph graph) throws DatabaseException {
+ return graph.syncRequest(inputValidator.get(experimentResource));
+ }
+ };
+ }
+
+ private class InputListener extends ListenerAdapter<Boolean> {
+
+ private boolean disposed = false;
+
+ public void dispose() {
+ disposed = true;
+ }
+
+ @Override
+ public void execute(Boolean evaluation) {
+ if (!Boolean.TRUE.equals(evaluation)) {
+ scheduleExperimentShutdown(experiment);
+ }
+ }
+
+ @Override
+ public void exception(Throwable t) {
+ ExceptionUtils.logError("ResourceEditorSupport.InputListener received an unexpected exception.", t);
+ }
+
+ @Override
+ public boolean isDisposed() {
+ return disposed || ExperimentExistenceWatchdog.this.isDisposed();
+ }
+ }
+
+ private static void scheduleExperimentShutdown(final IExperiment experiment) {
+ Job job = new DatabaseJob("Experiment Shutdown Watchdog") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ SubMonitor mon = SubMonitor.convert(monitor, "Shutdown", 100000);
+ try {
+ experiment.shutdown(mon.newChild(100000));
+ return Status.OK_STATUS;
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ job.schedule();
+ }
+
+}