From 1fd1b0cf6c17be4081017381c3adff417158c443 Mon Sep 17 00:00:00 2001 From: lehtonen Date: Thu, 16 Sep 2010 21:06:01 +0000 Subject: [PATCH] NEW - # 748: Project framework refactor https://www.simulationsite.net/trac/simantics/ticket/748 Changes for the project framework refactor related to the Simantics System Dynamics application. Simantics-related changes were committed in r17982. git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@17983 ac1ea38d-2e2b-0410-8846-a27921b304fc --- org.simantics.sysdyn.ontology/graph.tg | Bin 46261 -> 45348 bytes .../graph/Sysdyn.pgraph | 28 +-- .../graph/WorkModel.pgraph | 6 +- .../org/simantics/sysdyn/SysdynResource.java | 9 - org.simantics.sysdyn.ui/adapters.xml | 8 +- org.simantics.sysdyn.ui/plugin.xml | 18 ++ .../handlers/SysdynExperimentActivator.java | 30 +-- .../sysdyn/ui/project/SysdynProject.java | 209 +++++++++++++++- .../ui/project/SysdynProjectLifeCycle.java | 227 ------------------ 9 files changed, 238 insertions(+), 297 deletions(-) delete mode 100644 org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProjectLifeCycle.java diff --git a/org.simantics.sysdyn.ontology/graph.tg b/org.simantics.sysdyn.ontology/graph.tg index dfb98917edd66d2c2ac7429f219033823c6cb0a9..e05fd8b9c7a3de7d57978a764940a7dcb547f37c 100644 GIT binary patch literal 45348 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 diff --git a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph index f6b71a38..74588965 100644 --- a/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph +++ b/org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph @@ -15,30 +15,10 @@ SYSDYN = : L0.Ontology @L0.new L0.HasResourceClass "org.simantics.sysdyn.SysdynResource" -SYSDYN.SysdynProject : PROJ.Feature - @L0.tag PROJ.LifecycleFeature - L0.HasLabel "System Dynamics Project" - L0.HasDescription """System dynamics modelling project. Create system dynamics models and simulate them with OpenModelica.""" - PROJ.HasInstallableUnit "org.simantics.sysdyn.feature.group" - L0.PartOf SYSDYN - PROJ.IsFeatureIn PROJ.PublishedProjectFeatures - PROJ.RequiresFeature - ImportedOntologies : PROJ.OntologyRequirementValidationFeature - L0.HasDescription "Specifies the ontologies required by a Sysdyn project." - PROJ.RequiresNamespace - "http://www.simantics.org/Sysdyn-1.0" : L0.URI - WORKBENCH.Features.SymbolManager - PROJ.Features.ExperimentControl - SYSDYN.SysdynModelManager : PROJ.Feature - L0.HasLabel "Sysdyn Model Manager" - L0.HasDescription "Sysdyn Model Manager." - PROJ.RequiresFeature WORKBENCH.Features.SymbolManager - PROJ.RequiresFeature PROJ.Features.ExperimentControl - - -SYSDYN.SysdynModuleTestProject : PROJ.Project - PROJ.HasFeature SYSDYN.SysdynProject - // L0.PartOf L0.Projects +ImportedOntologies : PROJ.NamespaceRequirement + L0.HasDescription "Specifies the ontologies required by a Sysdyn project." + PROJ.RequiresNamespace + "http://www.simantics.org/Sysdyn-1.0" : L0.URI //##################################################################### // Model diff --git a/org.simantics.sysdyn.ontology/graph/WorkModel.pgraph b/org.simantics.sysdyn.ontology/graph/WorkModel.pgraph index e1d6faf9..be523fe4 100644 --- a/org.simantics.sysdyn.ontology/graph/WorkModel.pgraph +++ b/org.simantics.sysdyn.ontology/graph/WorkModel.pgraph @@ -13,14 +13,14 @@ PROJ = /* WM = : PROJ.Project - PROJ.HasFeature SYSDYN.SysdynProject + PROJ.HasFeature "org.simantics.sysdyn.feature/1.1.0" L0.PartOf */ WM = : PROJ.Project - PROJ.HasFeature SYSDYN.SysdynProject + PROJ.HasFeature "org.simantics.sysdyn.feature/1.1.0" L0.PartOf - + TAGS = WM.Tags : L0.Library diff --git a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java index cf3b6c06..2055e855 100644 --- a/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java +++ b/org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java @@ -220,9 +220,6 @@ public class SysdynResource { public final Resource SysdynConnectionType; public final Resource SysdynDiagramModelingRules; public final Resource SysdynModel; - public final Resource SysdynModelManager; - public final Resource SysdynModuleTestProject; - public final Resource SysdynProject; public final Resource SysdynTerminal; public final Resource Valve; public final Resource ValveSymbol; @@ -433,9 +430,6 @@ public class SysdynResource { public static final String SysdynConnectionType = "http://www.simantics.org/Sysdyn-1.0/SysdynConnectionType"; public static final String SysdynDiagramModelingRules = "http://www.simantics.org/Sysdyn-1.0/SysdynDiagramModelingRules"; public static final String SysdynModel = "http://www.simantics.org/Sysdyn-1.0/SysdynModel"; - public static final String SysdynModelManager = "http://www.simantics.org/Sysdyn-1.0/SysdynModelManager"; - public static final String SysdynModuleTestProject = "http://www.simantics.org/Sysdyn-1.0/SysdynModuleTestProject"; - public static final String SysdynProject = "http://www.simantics.org/Sysdyn-1.0/SysdynProject"; public static final String SysdynTerminal = "http://www.simantics.org/Sysdyn-1.0/SysdynTerminal"; public static final String Valve = "http://www.simantics.org/Sysdyn-1.0/Valve"; public static final String ValveSymbol = "http://www.simantics.org/Sysdyn-1.0/ValveSymbol"; @@ -656,9 +650,6 @@ public class SysdynResource { SysdynConnectionType = getResourceOrNull(graph, URIs.SysdynConnectionType); SysdynDiagramModelingRules = getResourceOrNull(graph, URIs.SysdynDiagramModelingRules); SysdynModel = getResourceOrNull(graph, URIs.SysdynModel); - SysdynModelManager = getResourceOrNull(graph, URIs.SysdynModelManager); - SysdynModuleTestProject = getResourceOrNull(graph, URIs.SysdynModuleTestProject); - SysdynProject = getResourceOrNull(graph, URIs.SysdynProject); SysdynTerminal = getResourceOrNull(graph, URIs.SysdynTerminal); Valve = getResourceOrNull(graph, URIs.Valve); ValveSymbol = getResourceOrNull(graph, URIs.ValveSymbol); diff --git a/org.simantics.sysdyn.ui/adapters.xml b/org.simantics.sysdyn.ui/adapters.xml index 69a7b08f..1344c36f 100644 --- a/org.simantics.sysdyn.ui/adapters.xml +++ b/org.simantics.sysdyn.ui/adapters.xml @@ -10,11 +10,5 @@ VTT Technical Research Centre of Finland - initial API and implementation --> - - - - none 0 fill 1 + none 0 fill 1 \ No newline at end of file diff --git a/org.simantics.sysdyn.ui/plugin.xml b/org.simantics.sysdyn.ui/plugin.xml index 9c1f08f3..65398d80 100644 --- a/org.simantics.sysdyn.ui/plugin.xml +++ b/org.simantics.sysdyn.ui/plugin.xml @@ -730,4 +730,22 @@ value="plugin_customization.ini"/> + + + + + + + + + diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/SysdynExperimentActivator.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/SysdynExperimentActivator.java index 85823f83..72445b7d 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/SysdynExperimentActivator.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/handlers/SysdynExperimentActivator.java @@ -14,12 +14,8 @@ import org.simantics.db.exception.DatabaseException; import org.simantics.db.request.Read; import org.simantics.layer0.utils.direct.GraphUtils; import org.simantics.message.MessageService; -import org.simantics.project.IExperimentDescriptor; -import org.simantics.project.IModelDescriptor; import org.simantics.project.IProject; -import org.simantics.project.IProjectElement; import org.simantics.project.ProjectKeys; -import org.simantics.project.exception.ProjectException; import org.simantics.simulation.experiment.IExperiment; import org.simantics.simulation.model.ExperimentLoadingFailed; import org.simantics.simulation.project.IExperimentActivationListener; @@ -46,7 +42,7 @@ public class SysdynExperimentActivator { IExperiment activeExperiment = experimentManager.getActiveExperiment(); if (experiment != null) activeExperiment.shutdown(); - */ + */ // Activate a new experiment scheduleActivation(jobName, project, experimentManager, experiment); } @@ -98,13 +94,13 @@ public class SysdynExperimentActivator { final Semaphore activated = new Semaphore(0); final DataContainer problem = new DataContainer(); manager.startExperiment(experimentResource, new IExperimentActivationListener() { - + @Override public void onExperimentActivated(final IExperiment experiment) { MessageService.defaultLog(new org.eclipse.core.runtime.Status(IStatus.INFO, "org.simantics.simulation.ui", 0, "Activated experiment " + experiment.getIdentifier() , null)); - - + + activated.release(); // Set the selected experiment into the the model descriptor. new Thread("Set Selected Experiment") { @@ -141,7 +137,7 @@ public class SysdynExperimentActivator { ExceptionUtils.logAndShowError(t); } } - + return Status.OK_STATUS; //return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Experiment activation failed, see exception for details.", problem.get()); } catch (InterruptedException e) { @@ -153,20 +149,6 @@ public class SysdynExperimentActivator { } private void setSelectedExperiment(IProject project, Resource experiment) { - try { - for (IProjectElement model : project.members()) { - if (model instanceof IModelDescriptor) { - for (IProjectElement member : ((IModelDescriptor) model).members()) { - if (member instanceof IExperimentDescriptor && experiment.equals(member.get())) { - model.setHint(ProjectKeys.KEY_SELECTED_EXPERIMENT, member); - project.setHint(ProjectKeys.KEY_SELECTED_UI_EXPERIMENT, member); - break; - } - } - } - } - } catch (ProjectException e) { - ErrorLogger.defaultLogError(e); - } + project.setHint(ProjectKeys.KEY_SELECTED_UI_EXPERIMENT, experiment); } } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java index 2617a0d9..d66c23ad 100644 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java +++ b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProject.java @@ -11,17 +11,37 @@ *******************************************************************************/ package org.simantics.sysdyn.ui.project; +import java.io.File; +import java.util.HashMap; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PartInitException; +import org.osgi.service.prefs.BackingStoreException; +import org.simantics.databoard.accessor.Accessor; import org.simantics.databoard.binding.java.StringBindingDefault; +import org.simantics.db.Builtins; +import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; +import org.simantics.db.VirtualGraph; import org.simantics.db.WriteGraph; +import org.simantics.db.common.procedure.single.SingleSetListener; +import org.simantics.db.common.request.ObjectsWithType; import org.simantics.db.common.request.Queries; +import org.simantics.db.common.request.WriteRequest; import org.simantics.db.common.utils.OrderedSetUtils; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.RuntimeValuations; +import org.simantics.db.layer0.adapter.TrendVariable; +import org.simantics.db.layer0.service.ActivationManager; +import org.simantics.db.layer0.util.Simantics; +import org.simantics.db.request.Read; import org.simantics.db.service.GraphChangeListenerSupport; import org.simantics.db.service.LifecycleSupport; +import org.simantics.db.service.VirtualGraphSupport; import org.simantics.diagram.DiagramConstants; import org.simantics.diagram.synchronization.graph.layer.GraphLayer; import org.simantics.diagram.synchronization.graph.layer.GraphLayerUtil; @@ -32,6 +52,7 @@ import org.simantics.modeling.ModelingUtils; import org.simantics.modeling.services.CaseInsensitiveComponentNamingStrategy2; import org.simantics.modeling.services.ComponentNamingStrategy; import org.simantics.modeling.ui.features.EditorNamingService2; +import org.simantics.project.IProject; import org.simantics.project.ProjectElementType; import org.simantics.project.ProjectElements; import org.simantics.project.ProjectKeys; @@ -40,16 +61,23 @@ import org.simantics.project.features.AbstractProjectFeature; import org.simantics.project.features.UIModelManager; import org.simantics.project.features.UIModelManagerBase; import org.simantics.project.features.UIModelManagerBase.WriteRunnable; +import org.simantics.simulation.experiment.IExperiment; +import org.simantics.simulation.ontology.SimulationResource; +import org.simantics.simulation.project.IExperimentManager; import org.simantics.sysdyn.SysdynResource; +import org.simantics.sysdyn.ui.Activator; import org.simantics.ui.SimanticsUI; import org.simantics.ui.workbench.IEditorNamingService; import org.simantics.ui.workbench.action.ChooseActionRequest; import org.simantics.utils.datastructures.Callback; +import org.simantics.utils.ui.ErrorLogger; import org.simantics.utils.ui.workbench.WorkbenchUtils; public class SysdynProject extends AbstractProjectFeature { private static final String DEFAULT_PERSPECTIVE = "org.simantics.sysdyn.ui.perspective"; + private static final String FIRST_SYSDYN_PROJECT = "firstSysdynProject"; + class ModelManager extends UIModelManagerBase { @Override public void create(ProjectElementType kind, Shell parentShell, Session session, Resource container, @@ -84,8 +112,8 @@ public class SysdynProject extends AbstractProjectFeature { @Override public void run(WriteGraph g, Resource library, Callback callback, Callback errorCallback) { try { - Layer0 l0 = Layer0.getInstance(g); - SysdynResource sr = SysdynResource.getInstance(g); + Layer0 l0 = Layer0.getInstance(g); + SysdynResource sr = SysdynResource.getInstance(g); ModelingResources mr = ModelingResources.getInstance(g); ModelingUtils mu = new ModelingUtils(g); @@ -135,6 +163,9 @@ public class SysdynProject extends AbstractProjectFeature { @Override public void configure() throws ProjectException { + final IProject project = getProject(); + final Session session = getSession(); + addToCollectionHint(ProjectKeys.PERSPECTIVES, DEFAULT_PERSPECTIVE); addToCollectionHint(ProjectKeys.OPEN_PERSPECTIVES, DEFAULT_PERSPECTIVE); getProjectElement().setHint(ProjectKeys.DEFAULT_PERSPECTIVE, DEFAULT_PERSPECTIVE); @@ -145,11 +176,120 @@ public class SysdynProject extends AbstractProjectFeature { getProjectElement().setHint(UIModelManager.KEY_MODEL_MANAGER, mm); // Install naming strategy for model components. - Session session = getProject().getSession(); GraphChangeListenerSupport changeSupport = session.peekService(GraphChangeListenerSupport.class); if (changeSupport != null) { getProjectElement().setHint(ComponentNamingStrategy.PROJECT_KEY, new CaseInsensitiveComponentNamingStrategy2(changeSupport, "%s%d")); } + + try { + + Resource projectResource = project.get(); + + session.registerService(RuntimeValuations.class, new RuntimeValuations() { + + @Override + public boolean supports(String valuation) { + + IExperimentManager expMan = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER); + IExperiment experiment = expMan.getExperiment(valuation); + + return experiment != null; + + } + + @Override + public Accessor getAccessor(String variableIdentityPrefix, String valuation, String suffix) { + return null; + } + + @Override + public TrendVariable getVariable(String variableIdentityPrefix, String valuation, String suffix) { + + return null; + + } + + }); + + + + final Layer0 l0 = Layer0.getInstance(session); + ActivationManager activationManager = session.getService(ActivationManager.class); + if (activationManager != null) { + activationManager.activate(session, projectResource); + } + + + VirtualGraphSupport support = session.getService(VirtualGraphSupport.class); + final VirtualGraph graph = session.getService(VirtualGraph.class); + + SimulationResource SIMU = SimulationResource.getInstance(session); + session.asyncRequest(new ObjectsWithType(projectResource, l0.ConsistsOf, SIMU.Model), new SingleSetListener() { + + @Override + public void add(final Resource model) { + // FIXME: + Simantics.async(new Runnable() { + + @Override + public void run() { + try { + // This creates experiment realizations + graph.register(new HistoryRealizationVirtualGraph(session, model)); + // This creates the BaseRealization + graph.register(new DefaultRealizationVirtualGraph(session, model)); + } catch (DatabaseException e) { + e.printStackTrace(); + } + } + + }); + } + + @Override + public void exception(Throwable t) { + t.printStackTrace(); + } + + @Override + public boolean isDisposed() { + return false; + } + + }); + + support.getWorkspacePersistent("experiments"); + + } catch (DatabaseException e) { + + throw new ProjectException(e); + + } + + + cleanProjectFolder(session, project.get()); + + + // Open cheatsheets view on the first time the user creates a sysdyn project + // for a particular workspace. + IEclipsePreferences prefs = new InstanceScope().getNode(Activator.PLUGIN_ID); + boolean firstSysdynProject = prefs.getBoolean(FIRST_SYSDYN_PROJECT, true); + if (firstSysdynProject) { + // This should not be here +// Display.getDefault().asyncExec(new Runnable() { +// @Override +// public void run() { +// new OpenCheatSheetAction(CHEATSHEET_ID).run(); +// }}); + + // Make a note that the user has created a sysdyn project. + try { + prefs.putBoolean(FIRST_SYSDYN_PROJECT, false); + prefs.flush(); + } catch (BackingStoreException e) { + ErrorLogger.defaultLogError(e); + } + } } @Override @@ -161,4 +301,67 @@ public class SysdynProject extends AbstractProjectFeature { getProjectElement().removeHint(ComponentNamingStrategy.PROJECT_KEY); } + public void cleanProjectFolder(Session session, final Resource projectResource) throws ProjectException { + String projectName = null; + final HashMap resultPaths = new HashMap(); + try { + projectName = session.syncRequest(new Read() { + + @Override + public String perform(ReadGraph graph) throws DatabaseException { + Layer0 l0 = Layer0.getInstance(graph); + SimulationResource SIMU = SimulationResource.getInstance(graph); + SysdynResource sr = SysdynResource.getInstance(graph); + for(Resource model : graph.getObjects(projectResource, l0.ConsistsOf)) { + if(graph.isInstanceOf(model, sr.SysdynModel)){ + for(Resource experiment : graph.getObjects(model, l0.ConsistsOf)) { + if(graph.isInstanceOf(experiment, SIMU.Experiment)) { + for(Resource result : graph.getObjects(experiment, sr.HasResult)) { + String resultFile = (String)graph.getPossibleRelatedValue(result, sr.HasResultFile); + if(result != null) resultPaths.put(resultFile, result); + } + } + } + } + } + return graph.getPossibleRelatedValue(projectResource, l0.HasName); + + } + }); + } catch (DatabaseException e) { + throw new ProjectException(e); + } + + if(projectName != null) { + File root = new File(Platform.getLocation().toOSString(), "www.simantics.org"); + if(!root.isDirectory()) return; + File projectRoot = new File(root, projectName); + if(!projectRoot.isDirectory()) return; + File[] files = projectRoot.listFiles(); + + for(File file : files) { + if(resultPaths.get(file.getAbsolutePath()) == null) { + file.delete(); + } else { + resultPaths.remove(file.getAbsolutePath()); + } + } + + if (!resultPaths.keySet().isEmpty()) { + session.asyncRequest(new WriteRequest() { + + @Override + public void perform(WriteGraph graph) throws DatabaseException { + Builtins b = graph.getBuiltins(); + for(String key : resultPaths.keySet()) { + Resource result = resultPaths.get(key); + graph.deny(result, b.PartOf); + graph.deny(result, graph.getInverse(SysdynResource.getInstance(graph).HasResult)); + } + } + }) ; + } + } + } + } diff --git a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProjectLifeCycle.java b/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProjectLifeCycle.java deleted file mode 100644 index 85899bf8..00000000 --- a/org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/project/SysdynProjectLifeCycle.java +++ /dev/null @@ -1,227 +0,0 @@ -package org.simantics.sysdyn.ui.project; - -import java.io.File; -import java.util.HashMap; - -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.preferences.IEclipsePreferences; -import org.eclipse.core.runtime.preferences.InstanceScope; -import org.osgi.service.prefs.BackingStoreException; -import org.simantics.databoard.accessor.Accessor; -import org.simantics.db.Builtins; -import org.simantics.db.ReadGraph; -import org.simantics.db.Resource; -import org.simantics.db.Session; -import org.simantics.db.VirtualGraph; -import org.simantics.db.WriteGraph; -import org.simantics.db.common.procedure.single.SingleSetListener; -import org.simantics.db.common.request.ObjectsWithType; -import org.simantics.db.common.request.WriteRequest; -import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.adapter.RuntimeValuations; -import org.simantics.db.layer0.adapter.TrendVariable; -import org.simantics.db.layer0.service.ActivationManager; -import org.simantics.db.layer0.util.Simantics; -import org.simantics.db.request.Read; -import org.simantics.db.service.VirtualGraphSupport; -import org.simantics.layer0.Layer0; -import org.simantics.project.IProject; -import org.simantics.project.IProjectLifecycle; -import org.simantics.project.exception.ProjectException; -import org.simantics.simulation.experiment.IExperiment; -import org.simantics.simulation.ontology.SimulationResource; -import org.simantics.simulation.project.IExperimentManager; -import org.simantics.sysdyn.SysdynResource; -import org.simantics.sysdyn.ui.Activator; -import org.simantics.utils.ui.ErrorLogger; - -public class SysdynProjectLifeCycle implements IProjectLifecycle { - - private static final String FIRST_SYSDYN_PROJECT = "firstSysdynProject"; - - @Override - public void onActivated(final Session session, final IProject project) throws ProjectException { - - try { - - Resource projectResource = project.get(); - - session.registerService(RuntimeValuations.class, new RuntimeValuations() { - - @Override - public boolean supports(String valuation) { - - IExperimentManager expMan = project.getHint(IExperimentManager.KEY_EXPERIMENT_MANAGER); - IExperiment experiment = expMan.getExperiment(valuation); - - return experiment != null; - - } - - @Override - public Accessor getAccessor(String variableIdentityPrefix, String valuation, String suffix) { - return null; - } - - @Override - public TrendVariable getVariable(String variableIdentityPrefix, String valuation, String suffix) { - - return null; - - } - - }); - - - - final Layer0 l0 = Layer0.getInstance(session); - ActivationManager activationManager = session.getService(ActivationManager.class); - if (activationManager != null) { - activationManager.activate(session, projectResource); - } - - - VirtualGraphSupport support = session.getService(VirtualGraphSupport.class); - final VirtualGraph graph = session.getService(VirtualGraph.class); - - SimulationResource SIMU = SimulationResource.getInstance(session); - session.asyncRequest(new ObjectsWithType(projectResource, l0.ConsistsOf, SIMU.Model), new SingleSetListener() { - - @Override - public void add(final Resource model) { - // FIXME: - Simantics.async(new Runnable() { - - @Override - public void run() { - try { - // This creates experiment realizations - graph.register(new HistoryRealizationVirtualGraph(session, model)); - // This creates the BaseRealization - graph.register(new DefaultRealizationVirtualGraph(session, model)); - } catch (DatabaseException e) { - e.printStackTrace(); - } - } - - }); - } - - @Override - public void exception(Throwable t) { - t.printStackTrace(); - } - - @Override - public boolean isDisposed() { - return false; - } - - }); - - support.getWorkspacePersistent("experiments"); - - } catch (DatabaseException e) { - - throw new ProjectException(e); - - } - - - cleanProjectFolder(session, project.get()); - - - // Open cheatsheets view on the first time the user creates a sysdyn project - // for a particular workspace. - IEclipsePreferences prefs = new InstanceScope().getNode(Activator.PLUGIN_ID); - boolean firstSysdynProject = prefs.getBoolean(FIRST_SYSDYN_PROJECT, true); - if (firstSysdynProject) { - // This should not be here -// Display.getDefault().asyncExec(new Runnable() { -// @Override -// public void run() { -// new OpenCheatSheetAction(CHEATSHEET_ID).run(); -// }}); - - // Make a note that the user has created a sysdyn project. - try { - prefs.putBoolean(FIRST_SYSDYN_PROJECT, false); - prefs.flush(); - } catch (BackingStoreException e) { - ErrorLogger.defaultLogError(e); - } - } - } - - @Override - public void onDeactivated(Session session, IProject project) { - } - - public void cleanProjectFolder(Session session, final Resource projectResource) throws ProjectException { - String projectName = null; - final HashMap resultPaths = new HashMap(); - try { - projectName = session.syncRequest(new Read() { - - @Override - public String perform(ReadGraph graph) throws DatabaseException { - Layer0 l0 = Layer0.getInstance(graph); - SimulationResource SIMU = SimulationResource.getInstance(graph); - SysdynResource sr = SysdynResource.getInstance(graph); - for(Resource model : graph.getObjects(projectResource, l0.ConsistsOf)) { - if(graph.isInstanceOf(model, sr.SysdynModel)){ - for(Resource experiment : graph.getObjects(model, l0.ConsistsOf)) { - if(graph.isInstanceOf(experiment, SIMU.Experiment)) { - for(Resource result : graph.getObjects(experiment, sr.HasResult)) { - String resultFile = (String)graph.getPossibleRelatedValue(result, sr.HasResultFile); - if(result != null) resultPaths.put(resultFile, result); - } - } - } - } - } - return graph.getPossibleRelatedValue(projectResource, l0.HasName); - - } - }); - } catch (DatabaseException e) { - throw new ProjectException(e); - } - - if(projectName != null) { - File root = new File(Platform.getLocation().toOSString(), "www.simantics.org"); - if(!root.isDirectory()) return; - File projectRoot = new File(root, projectName); - if(!projectRoot.isDirectory()) return; - File[] files = projectRoot.listFiles(); - - for(File file : files) { - if(resultPaths.get(file.getAbsolutePath()) == null) { - file.delete(); - } else { - resultPaths.remove(file.getAbsolutePath()); - } - } - - if (!resultPaths.keySet().isEmpty()) { - session.asyncRequest(new WriteRequest() { - - @Override - public void perform(WriteGraph graph) throws DatabaseException { - Builtins b = graph.getBuiltins(); - for(String key : resultPaths.keySet()) { - Resource result = resultPaths.get(key); - graph.deny(result, b.PartOf); - graph.deny(result, graph.getInverse(SysdynResource.getInstance(graph).HasResult)); - } - } - }) ; - - - } - - - - } - } -} -- 2.47.1