From 277ddb17bc33a7c0b5c352f80bbc2605acaee50d Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Thu, 20 Apr 2017 13:54:20 +0300 Subject: [PATCH] Removed jsonValues since there already is Data/Json A more generic possibleFromDynamic. Alternative method modelling. Combined multiple Antti's commits Get rid of uses of gnu.trove2 refs #7156 instantiateUnder function property for types refs #7157 SCLDropAction refs #7158 Empty RVI literal in L0 refs #7159 possibleFromDynamic coersion function in Simantics/DB refs #7160 jsonValues parsing function into Simantics/DB refs #7161 Generic instantiation action based on instantiateUnder refs #7162 ModelBrowser.handleDrop action should be run in SWT thread refs #7163 RVI support in Simantics/Variables refs #7164 Variables change Change-Id: If21b623c27b660a9b6bc150c905f0360b15d08a0 --- .../browsing/ui/swt/widgets/ModelBrowser.java | 21 +++--- .../org/simantics/db/layer0/function/All.java | 66 +++++++++++++++++ .../request/UnescapedMethodMapOfResource.java | 51 +++++++++++++ .../db/layer0/variable/Variables.java | 12 ++- bundles/org.simantics.layer0/graph.tg | Bin 54229 -> 55689 bytes .../org.simantics.layer0/graph/Layer0.pgraph | 14 ++++ .../graph/Layer0Literals.pgraph | 2 + .../graph/Layer0SCL.pgraph | 5 ++ .../src/org/simantics/layer0/Layer0.java | 33 +++++++++ .../org.simantics.modeling.ontology/graph.tg | Bin 83163 -> 84951 bytes .../graph/ModelingViewpoint.pgraph | 17 +++++ .../simantics/modeling/ModelingResources.java | 21 ++++++ bundles/org.simantics.modeling/adapters.xml | 10 ++- .../scl/Simantics/Action.scl | 10 +++ .../scl/Simantics/All.scl | 1 + .../org/simantics/modeling/SCLDropAction.java | 69 ++++++++++++++++++ .../org.simantics.scl.db/META-INF/MANIFEST.MF | 3 +- .../org.simantics.scl.db/scl/Simantics/DB.scl | 3 + .../scl/Simantics/Variables.scl | 20 ++++- .../org/simantics/scl/db/SCLFunctions.java | 33 +++++++++ 20 files changed, 378 insertions(+), 13 deletions(-) create mode 100644 bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/UnescapedMethodMapOfResource.java create mode 100644 bundles/org.simantics.modeling/scl/Simantics/Action.scl create mode 100644 bundles/org.simantics.modeling/src/org/simantics/modeling/SCLDropAction.java diff --git a/bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/widgets/ModelBrowser.java b/bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/widgets/ModelBrowser.java index eb48bdd3c..c8744f263 100644 --- a/bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/widgets/ModelBrowser.java +++ b/bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/widgets/ModelBrowser.java @@ -19,7 +19,9 @@ import java.util.Map; import java.util.Set; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchSite; +import org.simantics.Simantics; import org.simantics.browsing.ui.NodeContext; import org.simantics.browsing.ui.common.ErrorLogger; import org.simantics.browsing.ui.model.InvalidContribution; @@ -33,7 +35,6 @@ import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.ResourceNotFoundException; import org.simantics.db.procedure.Procedure; import org.simantics.db.request.Read; -import org.simantics.ui.SimanticsUI; import org.simantics.utils.ui.ExceptionUtils; public class ModelBrowser extends GraphExplorerComposite { @@ -62,10 +63,10 @@ public class ModelBrowser extends GraphExplorerComposite { protected static Set loadBrowseContexts(final Set browseContexts) { try { - return SimanticsUI.getSession().syncRequest(new Read>() { + return Simantics.getSession().syncRequest(new Read>() { @Override public Set perform(ReadGraph graph) throws DatabaseException { - Collection browseContextResources = new ArrayList(browseContexts.size()); + Collection browseContextResources = new ArrayList<>(browseContexts.size()); for (String browseContext : browseContexts) { try { browseContextResources.add(graph.getResource(browseContext)); @@ -77,7 +78,7 @@ public class ModelBrowser extends GraphExplorerComposite { } } Collection allBrowseContextResources = BrowseContext.findSubcontexts(graph, browseContextResources); - Set result = new HashSet(); + Set result = new HashSet<>(); for (Resource r : allBrowseContextResources) result.add(graph.getURI(r)); return result; @@ -99,10 +100,10 @@ public class ModelBrowser extends GraphExplorerComposite { this.hideComparatorSelector = true; this.hideViewpointSelector = true; - SimanticsUI.getSession().asyncRequest(new ReadRequest() { + Simantics.getSession().asyncRequest(new ReadRequest() { @Override public void run(ReadGraph graph) throws DatabaseException { - ArrayList browseContexts = new ArrayList(); + ArrayList browseContexts = new ArrayList<>(); for (String uri : _browseContexts) { Resource browseContext = graph.getPossibleResource(uri); if (browseContext != null) @@ -122,7 +123,7 @@ public class ModelBrowser extends GraphExplorerComposite { if (target == null) return; - SimanticsUI.getSession().asyncRequest(new Read() { + Simantics.getSession().asyncRequest(new Read() { @Override public Runnable perform(ReadGraph graph) throws DatabaseException { if (dndBrowseContext == null) @@ -132,8 +133,10 @@ public class ModelBrowser extends GraphExplorerComposite { }, new Procedure() { @Override public void execute(Runnable result) { - if (result != null) - result.run(); + Display.getDefault().asyncExec(() -> { + if (!Display.getCurrent().isDisposed() && result != null) + result.run(); + }); } @Override diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java index 6a1441652..08ed3edf2 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/function/All.java @@ -3,6 +3,7 @@ package org.simantics.db.layer0.function; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -41,6 +42,7 @@ import org.simantics.db.common.validation.L0Validations; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.DoesNotContainValueException; import org.simantics.db.exception.NoSingleResultException; +import org.simantics.db.exception.RuntimeDatabaseException; import org.simantics.db.layer0.exception.MissingVariableValueException; import org.simantics.db.layer0.exception.PendingVariableException; import org.simantics.db.layer0.exception.VariableException; @@ -48,6 +50,7 @@ import org.simantics.db.layer0.request.PossibleURI; import org.simantics.db.layer0.request.PropertyInfo; import org.simantics.db.layer0.request.PropertyInfoRequest; import org.simantics.db.layer0.request.UnescapedAssertedPropertyMapOfResource; +import org.simantics.db.layer0.request.UnescapedMethodMapOfResource; import org.simantics.db.layer0.request.UnescapedPropertyMapOfResource; import org.simantics.db.layer0.scl.CompileResourceValueRequest; import org.simantics.db.layer0.scl.CompileValueRequest; @@ -78,8 +81,10 @@ import org.simantics.db.service.UndoRedoSupport; import org.simantics.issues.ontology.IssueResource; import org.simantics.layer0.Layer0; import org.simantics.scl.reflection.annotations.SCLValue; +import org.simantics.scl.runtime.SCLContext; import org.simantics.scl.runtime.function.Function4; import org.simantics.scl.runtime.function.FunctionImpl1; +import org.simantics.scl.runtime.function.FunctionImpl2; import org.simantics.simulator.variable.exceptions.NodeManagerException; import org.simantics.utils.Development; import org.simantics.utils.datastructures.Pair; @@ -596,6 +601,43 @@ public class All { }; + @SCLValue(type = "VariableMap") + public static VariableMap methodsPropertyDomainProperties = new VariableMapImpl() { + + @Override + public Variable getVariable(ReadGraph graph, Variable context, String name) throws DatabaseException { + Variable parent = context.getParent(graph); + Resource container = parent.getPossibleRepresents(graph); + Map methods = graph.syncRequest(new UnescapedMethodMapOfResource(container)); + Resource predicate = methods.get(name); + if(predicate != null) { + Layer0 L0 = Layer0.getInstance(graph); + PropertyInfo info = graph.syncRequest(new PropertyInfoRequest(L0.Entity_method)); + Resource value = graph.getSingleObject(container, predicate); + return new StandardGraphPropertyVariable(context, null, container, info, value); + } + return null; + } + + @Override + public Map getVariables(ReadGraph graph, Variable context, Map map) throws DatabaseException { + Variable parent = context.getParent(graph); + Resource container = parent.getPossibleRepresents(graph); + Map methods = graph.syncRequest(new UnescapedMethodMapOfResource(container)); + for(Map.Entry entry : methods.entrySet()) { + String name = entry.getKey(); + Resource predicate = entry.getValue(); + Layer0 L0 = Layer0.getInstance(graph); + PropertyInfo info = graph.syncRequest(new PropertyInfoRequest(L0.Entity_method)); + Resource value = graph.getSingleObject(container, predicate); + if(map == null) map = new HashMap<>(); + map.put(name, new StandardGraphPropertyVariable(context, null, container, info, value)); + } + return map; + } + + }; + public static Variable getStandardPropertyDomainPropertyVariableFromValue(ReadGraph graph, Variable context, String name) throws DatabaseException { if(context instanceof StandardGraphPropertyVariable) { @@ -1581,4 +1623,28 @@ public class All { return parent.node.support.manager.getPropertyURI(parent.node.node, node); } + + @SCLValue(type = "ReadGraph -> Resource -> Variable -> a") + public static Object defaultInstantiateUnder(ReadGraph graph, Resource converter, Variable context) throws DatabaseException { + return new FunctionImpl2() { + public Resource apply(Resource container, Resource type) { + try { + WriteGraph graph = (WriteGraph)SCLContext.getCurrent().get("graph"); + + Layer0 L0 = Layer0.getInstance(graph); + CommonDBUtils.selectClusterSet(graph, container); + Resource result = graph.newResource(); + String name = NameUtils.findFreshInstanceName(graph, type, container); + graph.claim(result, L0.InstanceOf, type); + graph.addLiteral(result, L0.HasName, L0.NameOf, name, Bindings.STRING); + graph.claim(container, L0.ConsistsOf, L0.PartOf, result); + + return result; + } catch (DatabaseException e) { + throw new RuntimeDatabaseException(e); + } + } + }; + } + } \ No newline at end of file diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/UnescapedMethodMapOfResource.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/UnescapedMethodMapOfResource.java new file mode 100644 index 000000000..31cacdc6f --- /dev/null +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/request/UnescapedMethodMapOfResource.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * 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.layer0.request; + +import java.util.Collection; +import java.util.Map; + +import org.simantics.databoard.Bindings; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.layer0.Layer0; + +import gnu.trove.map.hash.THashMap; + +public class UnescapedMethodMapOfResource extends ResourceRead> { + + public UnescapedMethodMapOfResource(Resource resource) { + super(resource); + } + + @Override + public Map perform(ReadGraph graph) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + Collection predicates = graph.getPredicates(resource); + THashMap result = new THashMap(predicates.size()); + for(Resource predicate : predicates) { + if(graph.isSubrelationOf(predicate, L0.HasMethod)) { + String name = graph.getPossibleRelatedValue(predicate, L0.HasName, Bindings.STRING); + if(name != null) { + if (result.put(name, predicate) != null) + System.err.println(this + ": The database resource $" + resource.getResourceId() + " contains siblings with the same name " + name + " (resource=$" + predicate.getResourceId() +")."); + } + } + } + return result; + + } + +} diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/Variables.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/Variables.java index 06050adf7..5fb0636a0 100644 --- a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/Variables.java +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/Variables.java @@ -18,6 +18,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.simantics.databoard.Databoard; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.mutable.Variant; import org.simantics.databoard.type.Datatype; @@ -26,6 +27,7 @@ import org.simantics.databoard.util.URIStringUtils; import org.simantics.db.ReadGraph; import org.simantics.db.RequestProcessor; import org.simantics.db.Resource; +import org.simantics.db.WriteGraph; import org.simantics.db.common.request.PossibleIndexRoot; import org.simantics.db.common.request.TernaryRead; import org.simantics.db.common.utils.Logger; @@ -803,5 +805,13 @@ final public class Variables { return new SCLValueAccessor(getValue1, getValue2, setValue2, setValue3, getDatatype); } - + public static void setRVIProperty(WriteGraph graph, Variable variable, RVI rvi) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + Binding rviBinding = graph.getService(Databoard.class).getBindingUnchecked( RVI.class ); + Resource predicate = variable.getPredicateResource(graph); + Resource subject = variable.getParent(graph).getRepresents(graph); + graph.deny(subject, predicate); + graph.claimLiteral(subject, predicate, L0.RVI, rvi, rviBinding); + } + } diff --git a/bundles/org.simantics.layer0/graph.tg b/bundles/org.simantics.layer0/graph.tg index c072a1509ea33d52a41a360843a67308acb38783..053b27ddf0ce810a043ef0ef3a2a70e024891bc6 100644 GIT binary patch literal 55689 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
$iDbpTftoFVf@K-!rd+Z}E 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 LPKZvGyP5w3*R|*) literal 54229 zcmeI52Y6&v`Ty^o^klPrK}29^vXl)=5fKF^+XGp4NwN#l!z4zXG@4ZVEP((yfii$t~-|u_RJNKQ#F3o-Z&tsnC@i6yu-tT$Ox$miWlJ&NX zR-%cqAP7RFppE}=KP}yrxLTg9jKs^!lcidQ*`4vWT3o6Y%B5-txt0H!#s72`@^PtF zs1@RBJK1{5w5zAYNj~0GC_!2-by4bmnwtm8tmiE31V1?QICNH$SCPb{+s$1wEs>q@n9u{=t5 zHRhj}siEh?yLnwRH$N%HuG;8;o7@cVJ#Yt>RWVc28p6NQTuJp| z(&ko7?4gJQ?zI$Tnu{2faDSXoN8kAPWGzZY?x19~54e#Bb-U!W*2nA~!fpKp41uT! z!EMagWA-YH>>7eo$Vatu1zCTP{5i>_u!ft(FxQO{Ymp(k$6VJ9*7AEP)6KDAv)>`v z^Ds#IN)wZ|`tYALy(5i9aBJeCzg!x%E-qwtrW-CeU27E#Q%EUlP*HF5G=;pU+Vr$CSl#x^d-8wUE&wST1f__X=qO3`-? zZ0y5r*05bblyr6*Mn^PRL`J3?qHr)R6`Ure<{~)jhR=;hYU$#U+(gHgw8JyAS$d-> z{cLaEqYn-f$n$FT$o$$|I@+@p+R4OiS06@K7<&9Z9;(7L>Jc`yAaN zd#hSRR)y{JbX~D!7Kyh#wX)@7gt z%{Y=}JltK%@4aJXdfVZ_qMN;igTU6br{pgfi>ib5K1z-^Xq+rI+jm#z%Zm}3y{RxF z+aia5qn6;J^*GFJg4c)i|#=t6t_LX7wW3y(1%tpsaIm z6mvJ%RJ(R}NcMtFZtV6>OcY(aQQ12am&3_6=?{WnJJy4n`pm^+%mlFa4yiFD6j zE(JRKs{Mu1=434i|HQoIW;%W&5y?WWvra^r`P|}8E!4*PYxFA}G7v8asT^j9?-#|vq>$Vd+pX;V#hq8@=Z+#;7xD4#1CvvqS{$wMo5&96#+ z2bXPa^amxYnOP7#Q;3JO<>hgn8!;?yXWlc@y2E4_YuA+ol4GS$@bgdu;)ybY>0K;t6E`joEkM1RGEE%8G^Z|6$(W(xwCt zO4+^A11Jc+{p z7G>-5v1EG*<@EbtJ5|nCa^LgZf|;y-&ZX@5$Cz8XMs8^qxpZjNLpjEG&XIevhTv*?$uzUuaPd~s)otk`!doN*2WvbdlqY#oc$4I` z;65uH({C1RK3TTm;2ES$^Xd(KD{vuazRcXg<^BGM_&as??B-i^qy>kIpZPk*qoRfp z#Uw(RS$&)%vdBsJ*Gh?w-f9)k4#~*=e3Hc@j!w4&B&(?uZ-t{P1^CFJ4+MzneayVl zL^Tps_ZBYp=~9`QkL)l?b-_@g8!FeLqP82Zu8{2Zw1%Krayt8PLW{7{Nb5f%d9&O( zQd_%1ayya(esvvZYpZ1O6r&5YY$RyQb+oja2E9h4UCC+JxeQN{Ogt*Fe)cta?YV-5WOnYzBT z`rv0$uu0Cb!A$}S%z?PK)*naJ8XnJs^TpWNFf}h=-uWGfu|9}|GH)(0HJmEt_-L7& zYEhy|vgY%cIviEwwNWV=)hB*Fs0K|O^7!A_@^T(G65hznxyI?fqMEyIaCKpDYJ9ki z-QMkNa=d8b1NlZgHDj8^d46jUUe6Mf<|n%b64mhwe;>X?&cz}>0> zzikL_V8$HdM~*#Gq0EUgnJWXWtCZ=wUup2G@#m0p)XM>RaU{h#NM7d59Em^)1H2d5lm2X zV0*s2wZun9v|Wx{6Q%(rk+hB$%ftK*B9y)^8G$UL8981io9q&)xMdX|tKoi&;2hl# z`trKgCu=vqNGzb{45vW2&N$vp3L-?$)R9T6<-tyg~crfi5$<(Tx0aq>`rO+n$S)8qt|%{d7m&Q1+vX z(;9;(inOOHw~!kBC|jzzF+CrkU82+JpO% z5oC7b;wW2Cea^Z=v>Y4nZ^fM0RM-Zo4BQ8rxh$hxz|#LP?qt?Ikf~vT%g8DAU&bh3 z0zKd+XeMOYe;V`M(v*2=3$VlEJ3($#`-`c?Eka>(gh;+=t)J?CESfg=MFt9S=L|A! z$$5&Kr>r3Trp67TSb#36&-wayDuFEInOUZ@j)XtiCK__N_gyEBtad4K$0fJDcbH#f zjj$J&OAa3;-QaOw+$B>x!}|)&Lt=Qg=x68UJJMynUY0m zLw3)h!~*0oosM)ac)rK;Jf7?E9FJ#v-0kr!kNNu&TYsm={H2Vw^H(vJ+YIBGHpAbo zsGZzmnD^K0F=L{7+WAWp%lsvhWuWEoKOX;|$N%>DL686C@jpHOhsO_ie80!{d3>+O zfA{!r9^d2f-5&qdhUce z|K8)94YU56472_lJ-)%?>pi~CH|Cx3R^wxs^1^>pQrlp6vtLiyXyCW{bxqc0}|Ql$*SK2_MaL(<4?AFvg&t- z{U=7x_>--ktojA8|Jdm1pKSGH)h~kmM@CQoWUD8ueje;UGzn|*ElN?(;?W*Va{$8pV|75EttG*lh@22{&$FbGZuKK00f5+&TIJSD) zRew0_-%jf(F z0oL;H>qgK1AzM9J^|!}~c+x-F>dC6d+zY>8^lU%b>dC6dTnayL^z=`* zda~*25lU0wo5q`$#uW@Ykw5uL-BmA_{(?8kj$*RZP z2tQ@?^iQ^Wvg$Dx!cQ7K{gbVpta{9i@DoN)|75Ets~%%J{J7E6KiTTZs>j$4KW6mw zPquop>M>Tsj~YGwldYbtdW_ZZBSugEWUD8u9%C>3u+h^$+3Lxv$Jh%$Wc2h;wtBMa zF_yv)8a@4!t)8s<&%*uzqo;qe)st0^u@S!C=;@zq^<>p!Y=rMKdip0@Jz4dig#Eon z{|?7iPrK@I9lpot*&edhlU0wg6u#T&*&edhlU0wg5x&dl*&edhlU2|5ywm8}9 z_!gsQd&pK#Rz2JEW}|0&$W~8QJ;qY_CZlJ2$W~8QJ;qY_M(_aA1|+tJZ1rT-vpw6v zs%Lx1R!>$v#!`qgP+iaVkgcAqdW?$v`Z~PY=+RbTtEXM{h*kJHqetDsR!_U?aWCO(!58E6UVL8f_##}t5a}w%TK-b- zYdk$!^;bH()x$?ae8_5F3q4ue^GYy$)csxNSoN&`)yBTav9-U-*m+-MYeyY*|7dqe zw)R(mb$m_1PF6eHOV;*22mErQXaAF}o~-(8?AI_zX?f03~t2|L-^uQ2unu#>I*aDXldb(i zu#PW|7qZ$pzR24D`+=ViwtBMFlU1LE{sK==wtBMa_lEv_Pfxabvg)4%{qw-Kf5{q; zdCsooIX<83>B*{}>+DvKIo05wtok|7ldT?ev_Vf+{cPyTR=>?K)~;}?;r+o|4AVYo znD&}s+A&A#{%Nlmru{s_v`-kOy=<8Fl407%4bxsUO#5cTw4ZC3_JU#B#|+axYMAy- zhTFlh$9XX3y?o!y@lQT7N&GHacriY2L4q&g9PG>R-K^S=LH=z>@GW-jpTof;&?>Y3 zVUHuQt)Hy*&xf9@^~0BN4tcC!?OH#4i(Ttu{pUcd%=(}0@!4QoKUwSN_$O=q=Qz$G zkM*lv>xXaAYkjQ$ENGQk|Ct`20k-v%wSLYgvepk@!a3xzezj};@GW+&kM(0uXsG{L z9-jub^^>*!IVexo`r%7BhdkD=cC8=2#cu28TBFSS-w0O!oX_MO68$Nwp6#by{lk~A zZSMxyRZssz9uI=GzHZpbIV9GntmRoB?OGpv3ETPxU{^isI|Z!%xqp#!Nc69)ditkb z{lk~A^}il=)zkkvu=?+EoI@V{E32OVsaOB-C2akl4EyED_uC<^nSybT(e8kLj&}Bb zeBO!l1EjUc*ZSB#*aDv0Zbn+;SnE3!d=l*1{!YhEAFw>_IV9eX+SNbfPrLeC2tE<4 z{yH36f3)Y2=uhp|AMMs(ANVTxxgV*9M7|QA_aRjsYxyg{xJUWtNQ@8LOU@yoKDMoa z(e?&r9H~D9iE~-?%BojZy~h9hD6<-6ZM@0aKE{iz_jf3G6AWBiWt%5!X~o$WgUtnFXu zSjS(BV{I>di9Uxi9N%h3o8|n2a$;Bi9G^?Q`jFR9e-BveYlfb@2%k6OlkFqtkXWDE z)&G#Q+x9PkR{b@>PPYEYIVAd1yY)xA^>-N9&UbPS3FYZKw2Zb2>-wd3WwrN1cPG+! zoL>36V9Z&KPssacS=T;c%*h5u-!w4BOanhTWr^p3DT_byHK^wSBxu6}QoHE)Pg(S2 z)k7QZm)b?YZ_1)4s~*}g3)Xn^{`N^(^kmgT8}6Oj#s6L@i=M1{Xu~I^cG2&dvgpaG zhciH6e4U@#ML#cP@lRGgv?0#S>QD4@QWiZ~_0Wd1J$tvuvphx{>+|Jkl<)NH9Ufy0 z1Umk|4LzAY*CDZd8$NYDVr~fQ`3*My&a=UeH7UTkFSrc0Zz5U#mSgpgwJ5}z(hv`< z3Bh9I-;&tm56yJEay`w!Zr2mC`eT2PRX+p{Jw4g#$yN_+@K3gSve5_s0h{&+8@;gA z|DUHPTRqw8{|$EQS3sL()@_)#(!k8HcE*OR^>J)GX!vT6?{b{O=Q1Rgr9Ov5W_v8N zJ%*({mYHFh?fDmy?ib27p0wwXP+vyvHa@iL_(cB)|3p%MtdDH{k#k7&r*`X)cI)pS zVD*Q~fNcGdb4c`u53yT+v|E2z=j;7Rn`PE*nfFG{A;G`+wyb)!tKRnS{V1n=HLfkQ zf5|x{`ls*vkhJ|=3+_d7<4?}+mRCD_4xcDrw=4VhHBRrI_ry2-Y5TC=NM1jDaew|E z`0q%{-*BvYmi-%&>mT{sJMtowz1eBWIV84^-&kvKL%_4U&J+8%d`DILelc|_d~<<_X8v?|9OwU;Mn^6KJu);?-{1Q?;2)(-!V)( z&TRGiKJD>m9NYT7g*;o|Hx1Jt*H~@;Cq4d@W9#qh$g}>wW|;oIilqKN?(ruaTYv0h z>yKkVnf|_nr2anY@y8rnf9yjo&-k$qlyLeA{V~SM^v6C>W_^sAGVP41*7qKd-|O-F9NYRCGxbORjHxpHGY0DaogTl- z<99o@{uxvCNB@k0GW|0~>i=yXzun_^IJW*jfIRg_|L-?U|L-$QJ7ePX@~p#{X?f~- z589sX9>3A!H#xTLVNBE?>toDpeY^*|pOJG&%dlqs6Q5+=FUgF7`eXYTBg=0EpM`V? z(wmUTY9Df}^&JX+3zG96yxFnU({AYWZ!Pf)2{8I{!K_4A2MU;^nBh8 z7-KEp;y8y-#6z^SD>Igs*_VdH4v#xMW;?9D+vC|D&+&Mk$BcvZhd4Fx?jG;q@tz*D zf33fLJl@yi{XIU=W$=d%59qV}ghvOVR(SM<`_V3}& zuH)lq@EefS&iQf;lGdke>!V%k5nymgf9?3Z*`cu35V}HR^s!_>bVN#jWyS^Y6yFEdR2OOaGh8`6i3frYfwm!1f z$5>ltUsz^)E%W}!?)yNwz69KlwsZV{3D;z;kK^%TByBIp138Dp@p7+Y9bd{izUYg3 zz5j){exYHmR~I3<@?sTeKvw5vase}Tsrf>nP$uE|zU&LPo1%U+12^(*W8 za}aFLN7DP}c)1|e^LK{AIefxjomJ0xQGX0Y>t}nXkhFjP=2+vS_8jurezj})A*Z+P-G)3{KRJiQ_OdRr-j8xWd~YFGb^Kkc^tHL&`-8`os@$Muk$ zL!v*mTYt1$e^s#B*WkK>r2hZvSpBO#hkW{1yOw8rS>F0T53KQ|%`)3!nfFT0A;G`+ zvaEWwt6sm~qn1hIf1qRSAFjU>NP2&FIoA8*c%nUr#QRgby+7LR{guILXZaG6`eVGv zR!`RY|KjX9e6l`e^~ZQpzZAAx@yWWzkrsn*L3)Z~)t}>7>)Qw}B56E0|Hv9IUNdR= z&A4V#J=c$Ok-^Y-&Jnx@*YG?hMJbUbM-s2IEhr!yOL0psjaqpauzw!9D z9{;2FdeQ12x zS7dD;`(p!=mZyz%sGhMSYdkrgSw`0bma~j@H89&@?Tn>i`P)mf*2h?owLab-c|Fo) zh%e)5`9&VT*s+eUpLzUqkALCuFFpR1$G-*-AZh#<8?yEX+eTi1#C~RfkdJhUu|5S! z%X2*N-qenJ6xQ+_Z?x-qiP!6p)Xwp9GLrST7Oeflx-D~TkTu?H3)#k-tnp@hEME>r zY=b54-<$KAN$;OpvbL|+aSoqcAMbRm^|S5NyZaaWNnm?FCmLRZ>pr9Zv*R2->0epP zbG%Z23~V_6gp5B~+qV$c^ocgedUTD)Z}9k9$FuOse&G3FHIl85tnr|4vaOG-_j`x4 z=kUq)E2E8aFTD3vNUCpj?CO)>mD8^NIo?(xU4`=ZBNZKAiR=52Haph#UIFG9bN*%R zCu{#~a(3%~Ir8-WI&n?TA+h~`a;$p#qFvihJ9PE-794AP*k2qo+8)};+MY4T)_)Fp zIv#n=WZOqpJ$;eYKil$5B-OV&&fya_`TvffUCVR4koA6U$Mp$F+J2Tl9?AM6+wx>B z|3|0K;gj_#t3Sqr`lYb({J^@Nfu!U0YaV~yu^pdJN1pm)`;J4>_R$yFwvVjs`-8LR z@X7Wmt3S4ndTk%;dK!}2S>Lf9KhWF>YwA2?EK1@A?J`7FODHHVkEI+UyyBmWF*ltc5H*T zk7p;c#)tRYgQWLylw%!VY%lG$ePs2|dn0Q+c+F(nvjnW=H&Sct=ivGzCXR9TgXMn5@FBiWa;*K;>3BUpFN5Y{k1z4~Qt*?Jv_0*( zJ`hRkZ}ph*xAqCgIeg-NkK==OJKmlM*7?Brl65|m9cy{Uk1^8zq%U#~3H8bEmMq_lJj-m4 zWsYadw|dO=+S>o%SmSdv_z6fFzw;fdon?17_6raLswLZq5?CO(ef-dlSq|4xc3ZIsrp`=}Scj#4wfA_u)Z^nkKHlSJdYtokxyP#;S^n)F ztjevd!kSjQ9B&o(42&$8UZb-rBZIEPQv6)J1IUghjMAGEyA z2d*Dnb98*Z#N(Gb*7mUd9Ai4)c+I5#Io`?YpXaeAq#TmQ!ZPQYWv&I5xwcrI>oM0p zYoG5i*B@)=dTMzekN0(q7)vY}d+Ig*j8z6Hhs67#%`)%Zvae^~Sv&i~GUIERaktF1 z(K6#~nf+-Q{nEhP53HTz%QDX%mU+IgyqCxOdwhV$2YSr$Vf|s8Ht-=HbNpESVID8> znCqL>AMP>NJ8S1WvV4@sM|*sX$6POMc|M<8=K5)w>xbo>$6PoNB@+di%vmIpi@^mxeQ4IXdw_*9Qi^Z0a+&-C~#kI(UV*yB-;3m%{A z@n(;U9*=u`p2u4}-sUmS8#cZ?Z&*Ix;|o2$$m5GWzQp58J-*E2%RRor;}?7UQjcHm z@s%E5dwh+@*Lu9&<9B=fL61M;@y9*>jK`n%_)8vt)#Gn?{B4ha;4#m8 zw*PtkH`0VjAw*~_C46h z@^8yb`{nz0%iex0|Mtz=z5QAKp3&O9{Yd_8uC;snhx}V)Yd_X&ueYDbzrD8l<2}8% zAIQIrw|Z|skpJ%iYd_iZ=dJJIDW2V1&*lFs!}{~qXF1+Q~U2+FACM_}Ipdm6J3-o8--`c+pDo%BS=tf8kah0QG0) zWwIIx1iJBcxD79pmD4|^^N>1%dR&>+6iBRjIWI^9O_m?|*PJ_f=`1_1@ujmtC-X9V zMZofhz6Nr(7(476o90Va<10IYR>^F9U(y`O^WVrbH}Qz->Mz5YC0Xff41zYv*zs$B zn#H!$chz-?*}kXX2;5$~sw26=zJR<1WYTMo+uy zIry89>}(>>a(dQ_r}HGF%IMQ^ksC(irm)N@Le@D zD-A<4tZ%azwdc)@zQ-~8xC!!ypG`cB=nHctm;ZT;!zo$T+-swfwdzqUhApy-@9;&| z$$H!Ezki(rfxGR)?Z#~VM8k+l&axeNM_lqA!Pc@YZP1lxhR@>|K6V%G3hL2h*VIq4 z9YGpz^oagEu5s0HTz%AQR5A?x<7#p`Zg_WNGSCO2H)ct zd>S-I7eIZ(Bmy!$s*PGB-AW*rw;*KlJFB28$0|VhyKmlc&cX}of(DX zC!HJeZAIgupO0kx;V*)A^`ZX}&h^P^;f;tLJsUsVxqjzo_gT0jp4}hI!zSe6xeeot z2O@njcUYJiV!L8d(Rd=-$WxbaW zXYp#}Y;CMi%}!Lx^0IUMvO0{VaQhj_OVrOo&WPkJsk3wVESWfNYND=wmuk+{lt z*}_?zm2W5LXjqDM%Ug`ox5$U*_>CKnCfK;BSj;BxEzORM6^i*vTw*p|CU57Z&u2^F zE_r9`a1k&1oKMmy2;! zf_%u&81OUJ`x$E`1AQMpU9N`kc2;?JdlhkvY8VN+S7k>cgtt_j$_~d_ymY>>sel{U zI)Vs=v{8XZRuN>H9E1vkm-$ML3K>5V8`o0^ETwPtOB5nJE)rF|lv#q=)5(Fm zsZgob(qTIhRbWT|uxHtf6-Lmc zY7zjbhm(7&#<)8(S?aYidPhq14$?W1U2;O!UO(ehyvse7mo}e}U3@SKER_Nr(1+Kr zo-9{8n??tS)l8%P{EV!hvA3V`B+0N-_lZf4SrnfjIo?XN+m139?kIEqjxy&;=0jG@ zX30LTH#-1gOwHQlh z@W-SXi~Gx^(Zl#31UmGG6-b%o~K1hD}cL^AFNWYR8H8VP(p9@`?>CJ8^6|ew|rz5y8&$)qxw31!C zVW96|_RP7Hn1WGuvQ)sk$+K8OlWh{+mSk~>(PCB1NKDW%NDgEFjZ3#i*^<6%y(c?J zK>@E`=Zu`n7R%+$*?p-_S;0EZ#RQ%> z&VD4}nY|IKCl<%_-Rj?${BD<@Y=Mw}w;_8)c@mpCvcDzSvz&TWu^iQq`*q3fa=ETQ zz9N}gVILOO(YONf7aPROrfT&2xdw54s|`La`K|S4eKO&Cdp;)Iq7C`5ppJ+S2;r6H zTJ`%9v#ax6i8-z84U*A$hOT@#Vg;|4yk`u=_?EOPTSJ6?#n3@VAqQQ>%~GcOcr+y& zNQ9}56YYwmUF&-5xze=c?4%VO@7y0&KXu_e9v8EiMH6V=aPmNa zy#rC#gLIHQ2<3Rp8%h7pBsmBo0D9v|BuZ2DyMZm<7Rk{T=T3(1Y-!@-@`PP%yv#)^ z@pOiGI(A1Lo(3_ySld=TSkAG9;UCgL`e)IT3DO9~k73m3teTe~MIkIs;LU z5FcpbVlg?CVugyT*x#gsar=xapLMk3k`umr7U53j)L3$~j+6gC)Nzv3aUgG<)h1_r zuWe|(Ht9s%dU8BDK?=4Haj(az1G&kwUuSw8L0P@CYv-Z5nziIk)fGxIwtxpzrMmtX%b?T6VKpi`ib3)3=IU?l&JQG#&%B(o-sKlG_n2YtNxmKBEJTp6M zS|^Y4m|}Qfl&>J|{bZWCV46aSmjRrch~*1hk`L+IUb6WIgi<_Vyo$1eM(VzV7G=Dxc)1T9# zKbw;74BkJ}pVOj0^`CpaXQn@=MSto;%iCxAb6WJLTW*85&GhHA=+BvMoEF`PY5B^T zuACNKX}_MHZhvIo)y`iGRPbkQyvwf6`fr?)Z|3Fj*DBwD@8GNY`aksA!5`V*J~Q~I z-Qdr3@t326h0$gBb+SC?&B9-HHs)Xy?Kji))1vG7&1u*+5!JXrWY36}Jg0Zb>Caxe z>C_WPMu~|(_&p~=-n-aD*lcSz5COd-klb` z+pv~D!aw@@$xNS5i$3T70|tM7IMbigqCe%2r?peRH`A%pr&IOsGQTs^sne%Z^^Y^Z YIn$}rr&IMWG`}{}sne%Z<$H|(2YgK@?*IS* diff --git a/bundles/org.simantics.layer0/graph/Layer0.pgraph b/bundles/org.simantics.layer0/graph/Layer0.pgraph index 482f606fc..ec2048acb 100644 --- a/bundles/org.simantics.layer0/graph/Layer0.pgraph +++ b/bundles/org.simantics.layer0/graph/Layer0.pgraph @@ -35,6 +35,15 @@ L0.Entity : L0.Type @L0.property L0.HasNext >-- L0.Entity.published --> L0.Boolean -- L0.Entity.methods + @L0.assert L0.Entity.methods + _ : L0.Value + +L0.Entity.methods --> L0.Value -- L0.Asserts --> L0.Assertion -- L0.Type.instantiateUnder ==> "Resource -> Resource -> Resource" -- L0.HasPredicate --> L0.Relation "Resource -> Resource -> ()" Resource -> Resource" diff --git a/bundles/org.simantics.layer0/src/org/simantics/layer0/Layer0.java b/bundles/org.simantics.layer0/src/org/simantics/layer0/Layer0.java index 2ea58b89c..5467995bb 100644 --- a/bundles/org.simantics.layer0/src/org/simantics/layer0/Layer0.java +++ b/bundles/org.simantics.layer0/src/org/simantics/layer0/Layer0.java @@ -55,12 +55,17 @@ public class Layer0 { public final Resource DomainOf; public final Resource Double; public final Resource DoubleArray; + public final Resource EmptyRVI; public final Resource Entity; public final Resource Entity_ClusterConstraint; public final Resource Entity_PropertyConstraint; public final Resource Entity_RelationConstraint; public final Resource Entity_URIConstraint; public final Resource Entity_ValueConstraint; + public final Resource Entity_method; + public final Resource Entity_method_Inverse; + public final Resource Entity_methods; + public final Resource Entity_methods_Inverse; public final Resource Entity_published; public final Resource Entity_published_Inverse; public final Resource Enumeration; @@ -77,10 +82,12 @@ public class Layer0 { public final Resource Functions_clusterValidator; public final Resource Functions_composedPropertyValue; public final Resource Functions_computeExpression; + public final Resource Functions_defaultInstantiateUnder; public final Resource Functions_entityLabel; public final Resource Functions_functionApplication; public final Resource Functions_hasStandardResource; public final Resource Functions_listResources; + public final Resource Functions_methodsPropertyDomainProperties; public final Resource Functions_numberInputValidator; public final Resource Functions_propertyValidator; public final Resource Functions_relationValidator; @@ -116,6 +123,7 @@ public class Layer0 { @Deprecated public final Resource HasElement; public final Resource HasLabel; public final Resource HasLabel_Inverse; + public final Resource HasMethod; public final Resource HasName; public final Resource HasNext; public final Resource HasObject; @@ -170,6 +178,7 @@ public class Layer0 { public final Resource Literal_LongValidator; public final Resource Long; public final Resource LongArray; + public final Resource MethodOf; public final Resource Migration; public final Resource MigrationSequence; public final Resource MigrationStep; @@ -256,6 +265,8 @@ public class Layer0 { public final Resource True; public final Resource Type; public final Resource TypeWithIdentifier; + public final Resource Type_instantiateUnder; + public final Resource Type_instantiateUnder_Inverse; public final Resource URI; public final Resource Value; public final Resource Variant; @@ -348,12 +359,17 @@ public class Layer0 { public static final String DomainOf = "http://www.simantics.org/Layer0-1.1/DomainOf"; public static final String Double = "http://www.simantics.org/Layer0-1.1/Double"; public static final String DoubleArray = "http://www.simantics.org/Layer0-1.1/DoubleArray"; + public static final String EmptyRVI = "http://www.simantics.org/Layer0-1.1/EmptyRVI"; public static final String Entity = "http://www.simantics.org/Layer0-1.1/Entity"; public static final String Entity_ClusterConstraint = "http://www.simantics.org/Layer0-1.1/Entity/ClusterConstraint"; public static final String Entity_PropertyConstraint = "http://www.simantics.org/Layer0-1.1/Entity/PropertyConstraint"; public static final String Entity_RelationConstraint = "http://www.simantics.org/Layer0-1.1/Entity/RelationConstraint"; public static final String Entity_URIConstraint = "http://www.simantics.org/Layer0-1.1/Entity/URIConstraint"; public static final String Entity_ValueConstraint = "http://www.simantics.org/Layer0-1.1/Entity/ValueConstraint"; + public static final String Entity_method = "http://www.simantics.org/Layer0-1.1/Entity/method"; + public static final String Entity_method_Inverse = "http://www.simantics.org/Layer0-1.1/Entity/method/Inverse"; + public static final String Entity_methods = "http://www.simantics.org/Layer0-1.1/Entity/methods"; + public static final String Entity_methods_Inverse = "http://www.simantics.org/Layer0-1.1/Entity/methods/Inverse"; public static final String Entity_published = "http://www.simantics.org/Layer0-1.1/Entity/published"; public static final String Entity_published_Inverse = "http://www.simantics.org/Layer0-1.1/Entity/published/Inverse"; public static final String Enumeration = "http://www.simantics.org/Layer0-1.1/Enumeration"; @@ -370,10 +386,12 @@ public class Layer0 { public static final String Functions_clusterValidator = "http://www.simantics.org/Layer0-1.1/Functions/clusterValidator"; public static final String Functions_composedPropertyValue = "http://www.simantics.org/Layer0-1.1/Functions/composedPropertyValue"; public static final String Functions_computeExpression = "http://www.simantics.org/Layer0-1.1/Functions/computeExpression"; + public static final String Functions_defaultInstantiateUnder = "http://www.simantics.org/Layer0-1.1/Functions/defaultInstantiateUnder"; public static final String Functions_entityLabel = "http://www.simantics.org/Layer0-1.1/Functions/entityLabel"; public static final String Functions_functionApplication = "http://www.simantics.org/Layer0-1.1/Functions/functionApplication"; public static final String Functions_hasStandardResource = "http://www.simantics.org/Layer0-1.1/Functions/hasStandardResource"; public static final String Functions_listResources = "http://www.simantics.org/Layer0-1.1/Functions/listResources"; + public static final String Functions_methodsPropertyDomainProperties = "http://www.simantics.org/Layer0-1.1/Functions/methodsPropertyDomainProperties"; public static final String Functions_numberInputValidator = "http://www.simantics.org/Layer0-1.1/Functions/numberInputValidator"; public static final String Functions_propertyValidator = "http://www.simantics.org/Layer0-1.1/Functions/propertyValidator"; public static final String Functions_relationValidator = "http://www.simantics.org/Layer0-1.1/Functions/relationValidator"; @@ -409,6 +427,7 @@ public class Layer0 { @Deprecated public static final String HasElement = "http://www.simantics.org/Layer0-1.1/HasElement"; public static final String HasLabel = "http://www.simantics.org/Layer0-1.1/HasLabel"; public static final String HasLabel_Inverse = "http://www.simantics.org/Layer0-1.1/HasLabel/Inverse"; + public static final String HasMethod = "http://www.simantics.org/Layer0-1.1/HasMethod"; public static final String HasName = "http://www.simantics.org/Layer0-1.1/HasName"; public static final String HasNext = "http://www.simantics.org/Layer0-1.1/HasNext"; public static final String HasObject = "http://www.simantics.org/Layer0-1.1/HasObject"; @@ -463,6 +482,7 @@ public class Layer0 { public static final String Literal_LongValidator = "http://www.simantics.org/Layer0-1.1/Literal/LongValidator"; public static final String Long = "http://www.simantics.org/Layer0-1.1/Long"; public static final String LongArray = "http://www.simantics.org/Layer0-1.1/LongArray"; + public static final String MethodOf = "http://www.simantics.org/Layer0-1.1/MethodOf"; public static final String Migration = "http://www.simantics.org/Layer0-1.1/Migration"; public static final String MigrationSequence = "http://www.simantics.org/Layer0-1.1/MigrationSequence"; public static final String MigrationStep = "http://www.simantics.org/Layer0-1.1/MigrationStep"; @@ -549,6 +569,8 @@ public class Layer0 { public static final String True = "http://www.simantics.org/Layer0-1.1/True"; public static final String Type = "http://www.simantics.org/Layer0-1.1/Type"; public static final String TypeWithIdentifier = "http://www.simantics.org/Layer0-1.1/TypeWithIdentifier"; + public static final String Type_instantiateUnder = "http://www.simantics.org/Layer0-1.1/Type/instantiateUnder"; + public static final String Type_instantiateUnder_Inverse = "http://www.simantics.org/Layer0-1.1/Type/instantiateUnder/Inverse"; public static final String URI = "http://www.simantics.org/Layer0-1.1/URI"; public static final String Value = "http://www.simantics.org/Layer0-1.1/Value"; public static final String Variant = "http://www.simantics.org/Layer0-1.1/Variant"; @@ -651,12 +673,17 @@ public class Layer0 { DomainOf = getResourceOrNull(graph, URIs.DomainOf); Double = getResourceOrNull(graph, URIs.Double); DoubleArray = getResourceOrNull(graph, URIs.DoubleArray); + EmptyRVI = getResourceOrNull(graph, URIs.EmptyRVI); Entity = getResourceOrNull(graph, URIs.Entity); Entity_ClusterConstraint = getResourceOrNull(graph, URIs.Entity_ClusterConstraint); Entity_PropertyConstraint = getResourceOrNull(graph, URIs.Entity_PropertyConstraint); Entity_RelationConstraint = getResourceOrNull(graph, URIs.Entity_RelationConstraint); Entity_URIConstraint = getResourceOrNull(graph, URIs.Entity_URIConstraint); Entity_ValueConstraint = getResourceOrNull(graph, URIs.Entity_ValueConstraint); + Entity_method = getResourceOrNull(graph, URIs.Entity_method); + Entity_method_Inverse = getResourceOrNull(graph, URIs.Entity_method_Inverse); + Entity_methods = getResourceOrNull(graph, URIs.Entity_methods); + Entity_methods_Inverse = getResourceOrNull(graph, URIs.Entity_methods_Inverse); Entity_published = getResourceOrNull(graph, URIs.Entity_published); Entity_published_Inverse = getResourceOrNull(graph, URIs.Entity_published_Inverse); Enumeration = getResourceOrNull(graph, URIs.Enumeration); @@ -673,10 +700,12 @@ public class Layer0 { Functions_clusterValidator = getResourceOrNull(graph, URIs.Functions_clusterValidator); Functions_composedPropertyValue = getResourceOrNull(graph, URIs.Functions_composedPropertyValue); Functions_computeExpression = getResourceOrNull(graph, URIs.Functions_computeExpression); + Functions_defaultInstantiateUnder = getResourceOrNull(graph, URIs.Functions_defaultInstantiateUnder); Functions_entityLabel = getResourceOrNull(graph, URIs.Functions_entityLabel); Functions_functionApplication = getResourceOrNull(graph, URIs.Functions_functionApplication); Functions_hasStandardResource = getResourceOrNull(graph, URIs.Functions_hasStandardResource); Functions_listResources = getResourceOrNull(graph, URIs.Functions_listResources); + Functions_methodsPropertyDomainProperties = getResourceOrNull(graph, URIs.Functions_methodsPropertyDomainProperties); Functions_numberInputValidator = getResourceOrNull(graph, URIs.Functions_numberInputValidator); Functions_propertyValidator = getResourceOrNull(graph, URIs.Functions_propertyValidator); Functions_relationValidator = getResourceOrNull(graph, URIs.Functions_relationValidator); @@ -712,6 +741,7 @@ public class Layer0 { HasElement = getResourceOrNull(graph, URIs.HasElement); HasLabel = getResourceOrNull(graph, URIs.HasLabel); HasLabel_Inverse = getResourceOrNull(graph, URIs.HasLabel_Inverse); + HasMethod = getResourceOrNull(graph, URIs.HasMethod); HasName = getResourceOrNull(graph, URIs.HasName); HasNext = getResourceOrNull(graph, URIs.HasNext); HasObject = getResourceOrNull(graph, URIs.HasObject); @@ -766,6 +796,7 @@ public class Layer0 { Literal_LongValidator = getResourceOrNull(graph, URIs.Literal_LongValidator); Long = getResourceOrNull(graph, URIs.Long); LongArray = getResourceOrNull(graph, URIs.LongArray); + MethodOf = getResourceOrNull(graph, URIs.MethodOf); Migration = getResourceOrNull(graph, URIs.Migration); MigrationSequence = getResourceOrNull(graph, URIs.MigrationSequence); MigrationStep = getResourceOrNull(graph, URIs.MigrationStep); @@ -852,6 +883,8 @@ public class Layer0 { True = getResourceOrNull(graph, URIs.True); Type = getResourceOrNull(graph, URIs.Type); TypeWithIdentifier = getResourceOrNull(graph, URIs.TypeWithIdentifier); + Type_instantiateUnder = getResourceOrNull(graph, URIs.Type_instantiateUnder); + Type_instantiateUnder_Inverse = getResourceOrNull(graph, URIs.Type_instantiateUnder_Inverse); URI = getResourceOrNull(graph, URIs.URI); Value = getResourceOrNull(graph, URIs.Value); Variant = getResourceOrNull(graph, URIs.Variant); diff --git a/bundles/org.simantics.modeling.ontology/graph.tg b/bundles/org.simantics.modeling.ontology/graph.tg index bf2b0b29ca527232fdbd540daab731ae6eb01772..8c1541725d9898c5eeb01861363de26c926f81a6 100644 GIT binary patch literal 84951 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

X>MvPHDU+Kt`o`1lS{2l?Jc#X0YkPK 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 literal 83163 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

KeC@6*yTrmtV#O*D)Y)Q%cdP| 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 Hn2`Sg%IDoe diff --git a/bundles/org.simantics.modeling.ontology/graph/ModelingViewpoint.pgraph b/bundles/org.simantics.modeling.ontology/graph/ModelingViewpoint.pgraph index c838c0a36..7e572df9f 100644 --- a/bundles/org.simantics.modeling.ontology/graph/ModelingViewpoint.pgraph +++ b/bundles/org.simantics.modeling.ontology/graph/ModelingViewpoint.pgraph @@ -26,6 +26,9 @@ MOD.SCLLabelRule MOD.SCLAction.action ==> "Resource -> ()" MOD.SCLDropAction.action ==> "Resource -> Dynamic -> Integer -> ()" MOD.SCLTest.test ==> "Resource -> Boolean" ()" +MOD.sclDropAction : L0.Template + @template %action %expression + %action : MOD.SCLDropAction + MOD.SCLDropAction.action _ : MOD.SCLValue + L0.SCLValue.expression %expression + L0.HasValueType "Resource -> Dynamic -> Integer -> ()" + MOD.sclTest : L0.Template @template %subject %expression %subject : MOD.SCLTest @@ -642,6 +652,13 @@ ACTIONS.NavigateToSubstructure ACTIONS.NewProceduralComponentType : ACT.Action ACTIONS.NewComponentType : ACT.Action +MOD.InstantiateUnder -- MOD.InstantiateUnder.HasType --> L0.Type ()" + +ACTIONS.InstantiateUnder + @MOD.sclAction "instantiateUnderAction self" + TESTS = MAC.Tests : L0.Library TESTS.IsNotPublished @MOD.sclTest "isNotPublished" diff --git a/bundles/org.simantics.modeling.ontology/src/org/simantics/modeling/ModelingResources.java b/bundles/org.simantics.modeling.ontology/src/org/simantics/modeling/ModelingResources.java index 13cef22bc..b111ffb0c 100644 --- a/bundles/org.simantics.modeling.ontology/src/org/simantics/modeling/ModelingResources.java +++ b/bundles/org.simantics.modeling.ontology/src/org/simantics/modeling/ModelingResources.java @@ -222,6 +222,8 @@ public class ModelingResources { public final Resource InitialCondition_sclState; public final Resource InitialCondition_sclState_Inverse; public final Resource Instantiable; + public final Resource InstantiateUnder; + public final Resource InstantiateUnder_HasType; public final Resource IsLocalLibraryOf; public final Resource IsTemplatized; public final Resource LifeCycleProcess; @@ -256,6 +258,7 @@ public class ModelingResources { public final Resource ModelingActionContext_Actions_FinishSharedOntologyForPublishing; public final Resource ModelingActionContext_Actions_Help; public final Resource ModelingActionContext_Actions_ImportImages; + public final Resource ModelingActionContext_Actions_InstantiateUnder; public final Resource ModelingActionContext_Actions_Lock; public final Resource ModelingActionContext_Actions_MergeFlags; public final Resource ModelingActionContext_Actions_MigrateComponentType; @@ -349,6 +352,9 @@ public class ModelingResources { public final Resource SCLCommandSession; public final Resource SCLCommandSession_hasValue; public final Resource SCLCommandSession_hasValue_Inverse; + public final Resource SCLDropAction; + public final Resource SCLDropAction_action; + public final Resource SCLDropAction_action_Inverse; public final Resource SCLLabelRule; public final Resource SCLLabelRule_getLabels; public final Resource SCLLabelRule_getLabels_Inverse; @@ -431,6 +437,7 @@ public class ModelingResources { public final Resource scl; public final Resource sclAction; public final Resource sclAssertion; + public final Resource sclDropAction; public final Resource sclTest; public final Resource self; public final Resource self_Inverse; @@ -650,6 +657,8 @@ public class ModelingResources { public static final String InitialCondition_sclState = "http://www.simantics.org/Modeling-1.2/InitialCondition/sclState"; public static final String InitialCondition_sclState_Inverse = "http://www.simantics.org/Modeling-1.2/InitialCondition/sclState/Inverse"; public static final String Instantiable = "http://www.simantics.org/Modeling-1.2/Instantiable"; + public static final String InstantiateUnder = "http://www.simantics.org/Modeling-1.2/InstantiateUnder"; + public static final String InstantiateUnder_HasType = "http://www.simantics.org/Modeling-1.2/InstantiateUnder/HasType"; public static final String IsLocalLibraryOf = "http://www.simantics.org/Modeling-1.2/IsLocalLibraryOf"; public static final String IsTemplatized = "http://www.simantics.org/Modeling-1.2/IsTemplatized"; public static final String LifeCycleProcess = "http://www.simantics.org/Modeling-1.2/LifeCycleProcess"; @@ -684,6 +693,7 @@ public class ModelingResources { public static final String ModelingActionContext_Actions_FinishSharedOntologyForPublishing = "http://www.simantics.org/Modeling-1.2/ModelingActionContext/Actions/FinishSharedOntologyForPublishing"; public static final String ModelingActionContext_Actions_Help = "http://www.simantics.org/Modeling-1.2/ModelingActionContext/Actions/Help"; public static final String ModelingActionContext_Actions_ImportImages = "http://www.simantics.org/Modeling-1.2/ModelingActionContext/Actions/ImportImages"; + public static final String ModelingActionContext_Actions_InstantiateUnder = "http://www.simantics.org/Modeling-1.2/ModelingActionContext/Actions/InstantiateUnder"; public static final String ModelingActionContext_Actions_Lock = "http://www.simantics.org/Modeling-1.2/ModelingActionContext/Actions/Lock"; public static final String ModelingActionContext_Actions_MergeFlags = "http://www.simantics.org/Modeling-1.2/ModelingActionContext/Actions/MergeFlags"; public static final String ModelingActionContext_Actions_MigrateComponentType = "http://www.simantics.org/Modeling-1.2/ModelingActionContext/Actions/MigrateComponentType"; @@ -777,6 +787,9 @@ public class ModelingResources { public static final String SCLCommandSession = "http://www.simantics.org/Modeling-1.2/SCLCommandSession"; public static final String SCLCommandSession_hasValue = "http://www.simantics.org/Modeling-1.2/SCLCommandSession/hasValue"; public static final String SCLCommandSession_hasValue_Inverse = "http://www.simantics.org/Modeling-1.2/SCLCommandSession/hasValue/Inverse"; + public static final String SCLDropAction = "http://www.simantics.org/Modeling-1.2/SCLDropAction"; + public static final String SCLDropAction_action = "http://www.simantics.org/Modeling-1.2/SCLDropAction/action"; + public static final String SCLDropAction_action_Inverse = "http://www.simantics.org/Modeling-1.2/SCLDropAction/action/Inverse"; public static final String SCLLabelRule = "http://www.simantics.org/Modeling-1.2/SCLLabelRule"; public static final String SCLLabelRule_getLabels = "http://www.simantics.org/Modeling-1.2/SCLLabelRule/getLabels"; public static final String SCLLabelRule_getLabels_Inverse = "http://www.simantics.org/Modeling-1.2/SCLLabelRule/getLabels/Inverse"; @@ -859,6 +872,7 @@ public class ModelingResources { public static final String scl = "http://www.simantics.org/Modeling-1.2/scl"; public static final String sclAction = "http://www.simantics.org/Modeling-1.2/sclAction"; public static final String sclAssertion = "http://www.simantics.org/Modeling-1.2/sclAssertion"; + public static final String sclDropAction = "http://www.simantics.org/Modeling-1.2/sclDropAction"; public static final String sclTest = "http://www.simantics.org/Modeling-1.2/sclTest"; public static final String self = "http://www.simantics.org/Modeling-1.2/self"; public static final String self_Inverse = "http://www.simantics.org/Modeling-1.2/self/Inverse"; @@ -1088,6 +1102,8 @@ public class ModelingResources { InitialCondition_sclState = getResourceOrNull(graph, URIs.InitialCondition_sclState); InitialCondition_sclState_Inverse = getResourceOrNull(graph, URIs.InitialCondition_sclState_Inverse); Instantiable = getResourceOrNull(graph, URIs.Instantiable); + InstantiateUnder = getResourceOrNull(graph, URIs.InstantiateUnder); + InstantiateUnder_HasType = getResourceOrNull(graph, URIs.InstantiateUnder_HasType); IsLocalLibraryOf = getResourceOrNull(graph, URIs.IsLocalLibraryOf); IsTemplatized = getResourceOrNull(graph, URIs.IsTemplatized); LifeCycleProcess = getResourceOrNull(graph, URIs.LifeCycleProcess); @@ -1122,6 +1138,7 @@ public class ModelingResources { ModelingActionContext_Actions_FinishSharedOntologyForPublishing = getResourceOrNull(graph, URIs.ModelingActionContext_Actions_FinishSharedOntologyForPublishing); ModelingActionContext_Actions_Help = getResourceOrNull(graph, URIs.ModelingActionContext_Actions_Help); ModelingActionContext_Actions_ImportImages = getResourceOrNull(graph, URIs.ModelingActionContext_Actions_ImportImages); + ModelingActionContext_Actions_InstantiateUnder = getResourceOrNull(graph, URIs.ModelingActionContext_Actions_InstantiateUnder); ModelingActionContext_Actions_Lock = getResourceOrNull(graph, URIs.ModelingActionContext_Actions_Lock); ModelingActionContext_Actions_MergeFlags = getResourceOrNull(graph, URIs.ModelingActionContext_Actions_MergeFlags); ModelingActionContext_Actions_MigrateComponentType = getResourceOrNull(graph, URIs.ModelingActionContext_Actions_MigrateComponentType); @@ -1215,6 +1232,9 @@ public class ModelingResources { SCLCommandSession = getResourceOrNull(graph, URIs.SCLCommandSession); SCLCommandSession_hasValue = getResourceOrNull(graph, URIs.SCLCommandSession_hasValue); SCLCommandSession_hasValue_Inverse = getResourceOrNull(graph, URIs.SCLCommandSession_hasValue_Inverse); + SCLDropAction = getResourceOrNull(graph, URIs.SCLDropAction); + SCLDropAction_action = getResourceOrNull(graph, URIs.SCLDropAction_action); + SCLDropAction_action_Inverse = getResourceOrNull(graph, URIs.SCLDropAction_action_Inverse); SCLLabelRule = getResourceOrNull(graph, URIs.SCLLabelRule); SCLLabelRule_getLabels = getResourceOrNull(graph, URIs.SCLLabelRule_getLabels); SCLLabelRule_getLabels_Inverse = getResourceOrNull(graph, URIs.SCLLabelRule_getLabels_Inverse); @@ -1297,6 +1317,7 @@ public class ModelingResources { scl = getResourceOrNull(graph, URIs.scl); sclAction = getResourceOrNull(graph, URIs.sclAction); sclAssertion = getResourceOrNull(graph, URIs.sclAssertion); + sclDropAction = getResourceOrNull(graph, URIs.sclDropAction); sclTest = getResourceOrNull(graph, URIs.sclTest); self = getResourceOrNull(graph, URIs.self); self_Inverse = getResourceOrNull(graph, URIs.self_Inverse); diff --git a/bundles/org.simantics.modeling/adapters.xml b/bundles/org.simantics.modeling/adapters.xml index b1a0bf3e1..0e3870c35 100644 --- a/bundles/org.simantics.modeling/adapters.xml +++ b/bundles/org.simantics.modeling/adapters.xml @@ -162,7 +162,15 @@ - + + + + + + + + diff --git a/bundles/org.simantics.modeling/scl/Simantics/Action.scl b/bundles/org.simantics.modeling/scl/Simantics/Action.scl new file mode 100644 index 000000000..102012ecf --- /dev/null +++ b/bundles/org.simantics.modeling/scl/Simantics/Action.scl @@ -0,0 +1,10 @@ +import "Simantics/Variables" + +instantiateUnderAction :: Variable -> Resource -> () +instantiateUnderAction ruleVariable context = do + syncWrite (\x -> do + typeToInstantiate = singleObject (represents $ parent ruleVariable) MOD.InstantiateUnder.HasType + typeVariable = resourceVariable typeToInstantiate + fn = typeVariable#methods#instantiateUnder :: Resource -> Resource -> Resource + fn context typeToInstantiate) + () \ No newline at end of file diff --git a/bundles/org.simantics.modeling/scl/Simantics/All.scl b/bundles/org.simantics.modeling/scl/Simantics/All.scl index 02457e67f..07f8a0464 100644 --- a/bundles/org.simantics.modeling/scl/Simantics/All.scl +++ b/bundles/org.simantics.modeling/scl/Simantics/All.scl @@ -31,3 +31,4 @@ include "SWT/All" include "Simantics/UI" include "Simantics/SelectionView" include "Simantics/Formatting" +include "Simantics/Action" \ No newline at end of file diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLDropAction.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLDropAction.java new file mode 100644 index 000000000..74b19a214 --- /dev/null +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/SCLDropAction.java @@ -0,0 +1,69 @@ +package org.simantics.modeling; + +import org.simantics.Simantics; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.DropActionFactory; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.db.layer0.variable.Variables; +import org.simantics.diagram.Logger; +import org.simantics.scl.runtime.function.Function3; + +public class SCLDropAction implements DropActionFactory { + + final private Resource rule; + + public SCLDropAction(ReadGraph graph, Resource rule) throws DatabaseException { + this.rule = rule; + } + + static class RuleFunctionRequest extends ResourceRead> { + + protected RuleFunctionRequest(Resource rule) { + super(rule); + } + + @Override + public Function3 perform(ReadGraph graph) throws DatabaseException { + Variable ruleVariable = Variables.getVariable(graph, resource); + ModelingResources MOD = ModelingResources.getInstance(graph); + return ruleVariable.getPossiblePropertyValue(graph, MOD.SCLDropAction_action); + } + + } + + public static class SCLDropActionRunnable implements Runnable { + + public Resource rule; + public Resource target; + public Object source; + public int operation; + + public SCLDropActionRunnable(Resource rule, Resource target, Object source, int operation) { + this.rule = rule; + this.target = target; + this.source = source; + this.operation = operation; + } + + @Override + public void run() { + Simantics.getSession().markUndoPoint(); + try { + Function3 function = Simantics.getSession().syncRequest(new RuleFunctionRequest(rule)); + function.apply(target, source, operation); + } catch (DatabaseException e) { + Logger.defaultLogError(e); + } + } + + } + + @Override + public Runnable create(ReadGraph g, Object target, Object source, int operation) throws DatabaseException { + return new SCLDropActionRunnable(rule, (Resource)target, source, operation); + } + +} diff --git a/bundles/org.simantics.scl.db/META-INF/MANIFEST.MF b/bundles/org.simantics.scl.db/META-INF/MANIFEST.MF index 91f6e66fe..e867e9bde 100644 --- a/bundles/org.simantics.scl.db/META-INF/MANIFEST.MF +++ b/bundles/org.simantics.scl.db/META-INF/MANIFEST.MF @@ -12,7 +12,8 @@ Require-Bundle: org.eclipse.core.runtime, org.simantics.scl.osgi;bundle-version="1.0.4", org.simantics.application, org.simantics.db.management, - org.simantics.layer0.utils + org.simantics.layer0.utils, + org.slf4j.api;bundle-version="1.7.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-Vendor: VTT Technical Research Centre of Finland Export-Package: org.simantics.scl.db diff --git a/bundles/org.simantics.scl.db/scl/Simantics/DB.scl b/bundles/org.simantics.scl.db/scl/Simantics/DB.scl index 3d71ae514..54696a83d 100644 --- a/bundles/org.simantics.scl.db/scl/Simantics/DB.scl +++ b/bundles/org.simantics.scl.db/scl/Simantics/DB.scl @@ -1,5 +1,6 @@ import "JavaBuiltin" as Java include "http://www.simantics.org/Layer0-1.1" as L0 +import "Map" as Map infixl 5 (#) @@ -322,6 +323,8 @@ importJava "org.simantics.scl.db.SCLFunctions" where subquery :: ( a) -> a "Makes a new read request with given procedure for calculating the result. The request is always cached." subqueryC :: ( a) -> a + "Tries to convert the given Dynamic value to a value with the inferred type" + possibleFromDynamic :: Typeable a => String -> Dynamic -> Maybe a importJava "org.simantics.db.layer0.util.Layer0Utils" where undo :: () -> String diff --git a/bundles/org.simantics.scl.db/scl/Simantics/Variables.scl b/bundles/org.simantics.scl.db/scl/Simantics/Variables.scl index 721d52b15..1def7102c 100644 --- a/bundles/org.simantics.scl.db/scl/Simantics/Variables.scl +++ b/bundles/org.simantics.scl.db/scl/Simantics/Variables.scl @@ -73,6 +73,11 @@ Example: instanceIndexRoot :: Variable -> Resource createValueAccessor :: (Variable -> a) -> (Variable -> Binding b -> b) -> (Variable -> c -> ()) -> (Variable -> d -> Binding d -> ()) -> (Variable -> Datatype) -> ValueAccessor + + @JavaName getConfigurationContext + possibleConfigurationContext :: Resource -> Variable + + setRVIProperty :: Variable -> RVI -> () importJava "org.simantics.db.layer0.function.All" where @@ -90,6 +95,9 @@ importJava "org.simantics.db.layer0.variable.ValueAccessor" where importJava "org.simantics.db.layer0.variable.Variable" where data Variable + + @JavaName getRVI + rviOf :: Variable -> RVI @JavaName getProperties properties_ :: Variable -> Collection Variable @@ -402,4 +410,14 @@ instance Browsable Variable where propertiesClassified :: Variable -> Resource -> [Variable] propertiesClassified parent classified = do - collectionToList $ propertiesClassified_ parent classified \ No newline at end of file + collectionToList $ propertiesClassified_ parent classified + +importJava "org.simantics.db.layer0.variable.RVI" where + data RVI + + resolvePossible :: RVI -> Variable -> Maybe Variable + +instantiateUnder :: Resource -> Resource -> Resource +instantiateUnder container typeToInstantiate = do + fn = (resourceVariable typeToInstantiate)#methods#instantiateUnder :: Resource -> Resource -> Resource + fn container typeToInstantiate \ No newline at end of file diff --git a/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java b/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java index 9b4d6b8ac..00df313ad 100644 --- a/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java +++ b/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java @@ -2,6 +2,7 @@ package org.simantics.scl.db; import java.io.IOException; +import org.cojen.classfile.TypeDesc; import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; @@ -21,6 +22,14 @@ import org.simantics.db.service.ClusterControl; import org.simantics.db.service.SerialisationSupport; import org.simantics.db.service.VirtualGraphSupport; import org.simantics.layer0.utils.triggers.IActivationManager; +import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification; +import org.simantics.scl.compiler.errors.Failable; +import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator; +import org.simantics.scl.compiler.module.Module; +import org.simantics.scl.compiler.module.repository.ImportFailureException; +import org.simantics.scl.compiler.runtime.RuntimeEnvironment; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.osgi.SCLOsgi; import org.simantics.scl.runtime.SCLContext; import org.simantics.scl.runtime.function.Function; import org.simantics.scl.runtime.function.Function1; @@ -310,4 +319,28 @@ public class SCLFunctions { public static Object subqueryC(ReadGraph graph, Function q) throws DatabaseException { return graph.syncRequest(new Subquery(q), TransientCacheAsyncListener.instance()); } + + public static Object possibleFromDynamic(Type expectedType, String moduleName, Object value) { + + try { + + + Failable failable = SCLOsgi.MODULE_REPOSITORY.getModule(moduleName); + Module module = failable.getResult(); + + RuntimeEnvironment env = SCLOsgi.MODULE_REPOSITORY.createRuntimeEnvironment( + EnvironmentSpecification.of(moduleName, ""), module.getParentClassLoader()); + + JavaTypeTranslator tr = new JavaTypeTranslator(env.getEnvironment()); + TypeDesc desc = tr.toTypeDesc(expectedType); + String className = desc.getFullName(); + Class clazz = env.getMutableClassLoader().loadClass(className); + if (!clazz.isAssignableFrom(value.getClass())) + return null; + + } catch (ImportFailureException | ClassNotFoundException e) { + } + return value; + } + } -- 2.47.1