@sclAttribute PROPERTIES.commands "commandList self" "[Command]"
COMPONENTS.PrimitiveComponent <T COMPONENTS.Component
- @L0.assert PROPERTIES.primitiveProperties
- _ : L0.Value
- L0.domainProperties FUNCTIONS.primitiveProperties
+ @L0.sclAssertion PROPERTIES.primitiveProperties "primitiveProperties" "DocumentProperties"
COMPONENTS.ParentlessComponent <T COMPONENTS.PrimitiveComponent /* Component without a parent, e.g. Root, DialogBox */
COMPONENTS.CommandEvent <T COMPONENTS.Event
@connectionPoint RELATIONS.data1
- @sclAttribute PROPERTIES.dataDefinitions "dataDefinitions self" "[DataDefinition]"
+ @sclAttribute PROPERTIES.dataDefinitions "computeDataDefinitions self" "[DataDefinition]"
@sclAttribute PROPERTIES.SCLFunction "emptyOnClick ()" "String"
DOC.commandEvent : L0.Template
==> "Variable"
PROPERTIES.primitiveProperties <R L0.HasProperty : L0.FunctionalRelation
- ==> "String"
+ ==> "DocumentProperties"
PROPERTIES.exists
@defAttribute L0.Value
import "Simantics/Variables"
import "JavaBuiltin" as Java
+importJava "org.simantics.document.server.DocumentProperties" where
+ data DocumentProperties
+
importJava "org.simantics.document.server.io.IConsole" where
data IConsole
addMessage :: IConsole -> String -> <Proc> ()
dataDefinitions :: Variable -> <ReadGraph> [DataDefinition]
+ @JavaName "dataDefinitions"
+ computeDataDefinitions :: Variable -> <ReadGraph> [DataDefinition]
+
emptyOnClick :: () -> <ReadGraph> AbstractEventHandler
writeEventHandler :: Variable -> (Variable -> (String -> Maybe String) -> <WriteGraph> String) -> <ReadGraph> AbstractEventHandler
stateVariable :: Variable -> <ReadGraph> Variable
compileDocumentSCLValueExpression :: Variable -> <ReadGraph> String
+
+ primitiveProperties :: <Proc> DocumentProperties
propertyValueCached :: Serializable a => Typeable a => Variable -> String -> <ReadGraph> a
propertyValueCached var prop = propertyValueCached_ var prop binding
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2018 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:
+ * Semantum Oy - initial API and implementation
+ *******************************************************************************/
+package org.simantics.document.server;
+
+import java.util.Collection;
+
+import org.simantics.db.ReadGraph;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.variable.Variable;
+
+/**
+ * This interface abstracts the computation of document component properties.
+ * The key,value -pairs returned by this interface are used to build the
+ * org.simantics.document.server.JSONObject values used in the document
+ * scene graph.
+ *
+ * @author Antti Villberg
+ * @since 1.36.0
+ */
+public interface DocumentProperties {
+
+ /*
+ * Returns the set of attribute keys for the given document component.
+ * Does not return null.
+ */
+ Collection<String> getKeys(ReadGraph graph, Variable component) throws DatabaseException;
+ /*
+ * Returns a value for a key in the key set.
+ * Null values are allowed and normal DatabaseException
+ * are thrown when evaluating the value.
+ */
+ Object getValue(ReadGraph graph, Variable component, String key) throws DatabaseException;
+
+}
import org.simantics.db.layer0.variable.Variable;
import org.simantics.db.layer0.variable.Variables;
import org.simantics.document.base.ontology.DocumentationResource;
-import org.simantics.document.server.Functions.RootVariable;
import org.simantics.document.server.request.NodeRequest;
import org.simantics.document.server.request.NodeRequestUtils;
import org.simantics.structural2.variables.Connection;
import org.simantics.structural2.variables.VariableConnectionPointDescriptor;
-import org.simantics.utils.datastructures.Pair;
import org.simantics.utils.strings.AlphanumComparator;
public class DocumentServerUtils {
public static Variable getPossibleOtherConnectionPoint(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException {
- Collection<VariableConnectionPointDescriptor> descs = conn.getConnectionPointDescriptors(graph, null);
+ Collection<VariableConnectionPointDescriptor> descs = conn.getConnection2().getConnectionPointDescriptors(graph, connectionPoint.getParent(graph), null);
if(descs.size() != 2) return null;
for(VariableConnectionPointDescriptor desc : descs) {
public static Variable getPossibleChildConnectionPoint(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException {
- Collection<VariableConnectionPointDescriptor> descs = conn.getConnectionPointDescriptors(graph, null);
+ Collection<VariableConnectionPointDescriptor> descs = conn.getConnection2().getConnectionPointDescriptors(graph, connectionPoint.getParent(graph), null);
if(descs.size() != 2) return null;
DocumentationResource DOC = DocumentationResource.getInstance(graph);
public static Variable getPossibleCommandTriggerConnectionPoint(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException {
- Collection<Variable> cpts = conn.getConnectionPoints(graph, null);
+ Collection<Variable> cpts = conn.getConnection2().getConnectionPoints(graph, connectionPoint.getParent(graph), null);
Variable result = null;
public static Collection<Variable> getPossibleOtherConnectionPoints(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException {
- Collection<Variable> cpts = conn.getConnectionPoints(graph, null);
+ Collection<Variable> cpts = conn.getConnection2().getConnectionPoints(graph, connectionPoint.getParent(graph), null);
if(cpts.size() < 2)
return Collections.emptyList();
public static String getId(ReadGraph graph, Variable node) throws DatabaseException {
- if(node == null) return "root";
- else {
- String uri = node.getURI(graph);
- int l = uri.lastIndexOf(ProxyChildVariable.CONTEXT_END);
- return uri.substring(l+4);
- }
+ if(node == null) return "root";
+ else {
+ String name = node.getName(graph);
+ if(ProxyChildVariable.CONTEXT_END.equals(name)) return "";
+ else {
+ String parentId = getId(graph, node.getParent(graph));
+ if(parentId.isEmpty()) return name;
+ else return parentId + "/" + name;
+ }
+
+ }
}
public static Collection<Variable> getAttributes(ReadGraph graph, DocumentationResource DOC, Variable variable) throws DatabaseException {
return variable.getProperties(graph, DOC.Document_AttributeRelation);
}
-
- public static class AttributesRequest extends VariableRead<Pair<JSONObject, Collection<Variable>>> {
+
+ public static class AttributesRequest extends VariableRead<JSONObject> {
public AttributesRequest(Variable variable) {
super(variable);
}
@Override
- public Pair<JSONObject,Collection<Variable>> perform(ReadGraph graph) throws DatabaseException {
- ArrayList<Variable> statics = new ArrayList<Variable>();
- DocumentationResource DOC = DocumentationResource.getInstance(graph);
-
- Variable primitives = variable.getProperty(graph, DOC.Properties_primitiveProperties);
- for(Variable property : primitives.getProperties(graph)) {
- statics.add(property);
- // NO SUPPORT FOR DYNAMICS AT THIS STAGE
- }
-
- JSONObject staticContent = computeStatic(graph, variable, statics);
-
- return new Pair<JSONObject, Collection<Variable>>(staticContent, Collections.emptyList());
-
+ public JSONObject perform(ReadGraph graph) throws DatabaseException {
+ DocumentationResource DOC = DocumentationResource.getInstance(graph);
+ DocumentProperties properties = variable.getPropertyValue(graph, DOC.Properties_primitiveProperties);
+ return computeStatic(graph, variable, properties);
}
-
- JSONObject computeStatic(ReadGraph graph, Variable variable, ArrayList<Variable> statics) throws DatabaseException {
-
+
+ JSONObject computeStatic(ReadGraph graph, Variable variable, DocumentProperties statics) throws DatabaseException {
+
JSONObject base = graph.syncRequest(new org.simantics.document.server.request.DefaultFields(variable));
JSONObject object = base.clone();
-
- for(Variable attrib : statics) {
- String name = attrib.getName(graph);
+
+ for(String name : statics.getKeys(graph, variable)) {
try {
if (name.equals(NodeRequest.PROPERTY_VALUE_EXCEPTIONS)) {
- @SuppressWarnings("unchecked")
- Map<String, Exception> exceptions = (Map<String, Exception>)DocumentServerUtils.getValue(graph, attrib);
-
- List<String> errorList = object.getJSONField(NodeRequest.ERRORS);
- if(errorList == null)
- errorList = new ArrayList<String>();
-
- for (Map.Entry<String, Exception> entry : exceptions.entrySet()) {
- String errorMessage = NodeRequestUtils.formatErrorMessage(entry.getKey(), entry.getValue());
- errorList.add(errorMessage);
- }
- object.addJSONField(NodeRequest.ERRORS, errorList);
-
- } else {
- Object value = DocumentServerUtils.getValue(graph, attrib);
- object.addJSONField(name, value);
- }
+ @SuppressWarnings("unchecked")
+ Map<String, Exception> exceptions = (Map<String, Exception>)statics.getValue(graph, variable, name);
+
+ List<String> errorList = object.getJSONField(NodeRequest.ERRORS);
+ if(errorList == null)
+ errorList = new ArrayList<>();
+
+ for (Map.Entry<String, Exception> entry : exceptions.entrySet()) {
+ String errorMessage = NodeRequestUtils.formatErrorMessage(entry.getKey(), entry.getValue());
+ errorList.add(errorMessage);
+ }
+ object.addJSONField(NodeRequest.ERRORS, errorList);
+ } else {
+ object.addJSONField(name, statics.getValue(graph, variable, name));
+ }
} catch (Throwable t) {
- List<String> errorList = object.getJSONField(NodeRequest.ERRORS);
- if(errorList == null)
- errorList = new ArrayList<String>();
-
- String errorMessage = NodeRequestUtils.formatErrorMessage(name, t);
-
- errorList.add(errorMessage);
- object.addJSONField(NodeRequest.ERRORS, errorList);
+ List<String> errorList = object.getJSONField(NodeRequest.ERRORS);
+ if(errorList == null)
+ errorList = new ArrayList<>(1);
+
+ String errorMessage = NodeRequestUtils.formatErrorMessage(name, t);
+ errorList.add(errorMessage);
+ object.addJSONField(NodeRequest.ERRORS, errorList);
}
}
return object;
-
+
}
-
+
}
public static Collection<Variable> getDynamicAttributes(ReadGraph graph, final DocumentationResource DOC, Variable variable) throws DatabaseException {
- Pair<JSONObject, Collection<Variable>> attribs = graph.syncRequest(new AttributesRequest(variable));
- return attribs.second;
+ return Collections.emptyList();
}
-
+
public static Variable getPossibleDocumentRootVariable(ReadGraph graph, Variable documentPart) throws DatabaseException {
- if(documentPart instanceof RootVariable) return documentPart;
+ if(ProxyChildVariable.CONTEXT_END.equals(documentPart.getName(graph))) return documentPart;
Variable parent = documentPart.getParent(graph);
if(parent == null) return null;
return getPossibleDocumentRootVariable(graph, parent);
import org.simantics.databoard.Datatypes;
import org.simantics.databoard.binding.Binding;
import org.simantics.databoard.type.Datatype;
-import org.simantics.db.AsyncReadGraph;
import org.simantics.db.DirectStatements;
import org.simantics.db.ReadGraph;
import org.simantics.db.RequestProcessor;
import org.simantics.db.WriteGraph;
import org.simantics.db.common.primitiverequest.Adapter;
import org.simantics.db.common.procedure.adapter.TransientCacheListener;
-import org.simantics.db.common.request.UnaryRead;
+import org.simantics.db.common.request.BinaryRead;
import org.simantics.db.common.request.UniqueRead;
import org.simantics.db.common.request.WriteResultRequest;
import org.simantics.db.common.utils.Logger;
import org.simantics.db.layer0.variable.ConstantPropertyVariable;
import org.simantics.db.layer0.variable.ProxyChildVariable;
import org.simantics.db.layer0.variable.ProxySessionRequest;
+import org.simantics.db.layer0.variable.ProxyVariableSupport;
import org.simantics.db.layer0.variable.ProxyVariables;
import org.simantics.db.layer0.variable.StandardAssertedGraphPropertyVariable;
-import org.simantics.db.layer0.variable.StandardGraphChildVariable;
import org.simantics.db.layer0.variable.StandardGraphPropertyVariable;
import org.simantics.db.layer0.variable.Variable;
import org.simantics.db.layer0.variable.VariableMap;
import org.simantics.db.layer0.variable.VariableMapImpl;
import org.simantics.db.layer0.variable.Variables;
-import org.simantics.db.procedure.AsyncProcedure;
import org.simantics.db.service.DirectQuerySupport;
import org.simantics.document.base.ontology.DocumentationResource;
import org.simantics.document.server.bean.Command;
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(Functions.class);
- private static class PrimitivePropertyStatementsProcedure implements AsyncProcedure<DirectStatements> {
-
- public DirectStatements result;
-
- @Override
- public void execute(AsyncReadGraph graph, DirectStatements result) {
- this.result = result;
- }
-
- @Override
- public void exception(AsyncReadGraph graph, Throwable throwable) {
- }
-
- }
-
@SCLValue(type = "VariableMap")
public static VariableMap primitiveProperties = new VariableMapImpl() {
private void storePropertyValueAndExceptions(ReadGraph graph, Variable parent, String name, Variable property, Map<String, Variable> map) {
};
+ static class StandardDocumentProperties implements DocumentProperties {
+
+ @Override
+ public Collection<String> getKeys(ReadGraph graph, Variable context) throws DatabaseException {
+
+ DocumentationResource DOC = DocumentationResource.getInstance(graph);
+ StandardGraphPropertyVariable asd = new StandardGraphPropertyVariable(graph, context, DOC.Properties_primitiveProperties);
+ Map<String, Variable> ps = primitiveProperties.getVariables(graph, asd, null);
+ return ps.keySet();
+
+ }
+
+ @Override
+ public Object getValue(ReadGraph graph, Variable context, String key) throws DatabaseException {
+
+ DocumentationResource DOC = DocumentationResource.getInstance(graph);
+ StandardGraphPropertyVariable asd = new StandardGraphPropertyVariable(graph, context, DOC.Properties_primitiveProperties);
+ Map<String, Variable> ps = primitiveProperties.getVariables(graph, asd, null);
+ return ps.get(key).getValue(graph);
+
+ }
+
+ }
+
+ public static DocumentProperties primitiveProperties() throws DatabaseException {
+ return new StandardDocumentProperties();
+ }
+
@SCLValue(type = "VariableMap")
public static VariableMap inputSpaceChildren = new VariableMapImpl() {
};
- static class DocumentProxyChildVariable extends ProxyChildVariable {
+ static class DocumentProxyChildVariable extends ProxyChildVariable implements ProxyVariableSupport {
public DocumentProxyChildVariable(Variable base, Variable parent, Variable other, String name) {
super(base, parent, other, name);
if(other instanceof ProxyChildVariable) {
// The context is also a proxy - let it do the job
return super.getPossibleChild(graph, name);
- } else {
- return new RootVariable(this, base.getRepresents(graph));
- }
- }
-
- return super.getPossibleChild(graph, name);
-
- }
-
- public Collection<Variable> getChildren(ReadGraph graph) throws DatabaseException {
-
- Collection<Variable> result = super.getChildren(graph);
- if(!(base instanceof ProxyChildVariable)) {
- result.add(new RootVariable(this, base.getRepresents(graph)));
+ } else {
+ return ProxyVariables.tryToOwnRenamed(graph, this, base, CONTEXT_END);
+ }
}
- return result;
-
- }
- }
-
- static class RootVariable extends StandardGraphChildVariable {
+ return super.getPossibleChild(graph, name);
- public RootVariable(DocumentProxyChildVariable parent, Resource resource) {
- super(parent, null, resource);
}
@Override
- public String getName(ReadGraph graph) throws DatabaseException {
- return ProxyChildVariable.CONTEXT_END;
+ public Variable attachTo(ReadGraph graph, Variable parent) {
+ return attachToRenamed(graph, parent, name);
}
-
- @SuppressWarnings("deprecation")
+
@Override
- public Variable getNameVariable(ReadGraph graph) throws DatabaseException {
- return new ConstantPropertyVariable(this, Variables.NAME, ProxyChildVariable.CONTEXT_END, Bindings.STRING);
+ public Variable attachToRenamed(ReadGraph graph, Variable parent, String name) {
+ if(this.parent.equals(base))
+ return new DocumentProxyChildVariable(parent, parent, other, name);
+ else
+ return new DocumentProxyChildVariable(base, parent, other, name);
}
}
return true;
}
} else {
- Variable parentCp = graph.sync(new UnaryRead<Connection, Variable>(conn) {
+ Variable parentCp = graph.sync(new BinaryRead<Variable, Connection, Variable>(widget, conn) {
@Override
public Variable perform(ReadGraph graph) throws DatabaseException {
DocumentationResource DOC = DocumentationResource.getInstance(graph);
- Collection<VariableConnectionPointDescriptor> descs = parameter.getConnectionPointDescriptors(graph, null);
+ Collection<VariableConnectionPointDescriptor> descs = parameter2.getConnection2().getConnectionPointDescriptors(graph, parameter, null);
for(VariableConnectionPointDescriptor desc : descs) {
if (DOC.Relations_partN.equals(desc.getConnectionPointResource(graph))) {
package org.simantics.document.server.request;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
import org.simantics.db.ReadGraph;
import org.simantics.db.exception.DatabaseException;
import org.simantics.db.layer0.request.VariableRead;
import org.simantics.db.layer0.variable.Variable;
import org.simantics.document.server.DocumentServerUtils.AttributesRequest;
import org.simantics.document.server.JSONObject;
-import org.simantics.utils.datastructures.Pair;
public class NodeRequest extends VariableRead<JSONObject> {
public static final String ERRORS = "Errors";
public static final String PROPERTY_VALUE_EXCEPTIONS = "_PropertyValueExceptions";
-
- public NodeRequest(Variable node) {
- super(node);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public JSONObject perform(ReadGraph graph) throws DatabaseException {
-
- long s = System.nanoTime();
-
- Pair<JSONObject, Collection<Variable>> attribs = graph.syncRequest(new AttributesRequest(variable));
-
- JSONObject staticContent = attribs.first;
- if(attribs.second.isEmpty()) {
-
- if(DocumentRequest.PROFILE) {
- long dura = System.nanoTime()-s;
- if(dura > DocumentRequest.PROFILE_THRESHOLD_NODEREQUEST * 1e3) {
- System.err.println("NodeRequest " + System.identityHashCode(this) + " in " + 1e-6*dura + "ms. " + variable.getURI(graph));
- }
- }
- return staticContent;
- }
-
- Map<String,Object> dynamicContent = graph.syncRequest(new NodeRequestDynamic(variable));
- if(dynamicContent.isEmpty()) {
- return staticContent;
- }
-
- JSONObject result = staticContent.clone();
- result.add(dynamicContent);
-
- if(dynamicContent.containsKey(ERRORS) || staticContent.getJSONField(ERRORS) != null) {
- ArrayList<String> errorList = new ArrayList<>();
-
- if(dynamicContent.containsKey(ERRORS))
- errorList.addAll((List<String>)dynamicContent.get(ERRORS));
+ public NodeRequest(Variable node) {
+ super(node);
+ }
- if(staticContent.getJSONField(ERRORS) != null)
- errorList.addAll((List<String>)staticContent.getJSONField(ERRORS));
+ @Override
+ public JSONObject perform(ReadGraph graph) throws DatabaseException {
+ long s = DocumentRequest.PROFILE ? System.nanoTime() : 0L;
- result.addJSONField(ERRORS, errorList);
- }
+ JSONObject staticContent = graph.syncRequest(new AttributesRequest(variable));
- if(DocumentRequest.PROFILE) {
+ if (DocumentRequest.PROFILE) {
long dura = System.nanoTime()-s;
- if(dura > DocumentRequest.PROFILE_THRESHOLD_NODEREQUEST * 1e3) {
+ if (dura > DocumentRequest.PROFILE_THRESHOLD_NODEREQUEST * 1e3) {
System.err.println("NodeRequest " + System.identityHashCode(this) + " in " + 1e-6*dura + "ms. " + variable.getURI(graph));
}
}
-
- return result;
+ return staticContent;
}
-}
\ No newline at end of file
+}