]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.server/src/org/simantics/document/server/DocumentServerUtils.java
Multiple readers and variable optimization
[simantics/platform.git] / bundles / org.simantics.document.server / src / org / simantics / document / server / DocumentServerUtils.java
index 8e0a0e99138ff728e8a37fa733cb8f1df21c9276..d8294c5e09e0c202e6a96bf2ade19932281d6fae 100644 (file)
@@ -3,6 +3,8 @@ package org.simantics.document.server;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
@@ -10,7 +12,7 @@ import java.util.TreeMap;
 import org.simantics.databoard.Bindings;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
-import org.simantics.db.common.request.UnaryRead;
+import org.simantics.db.common.request.BinaryRead;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.db.layer0.request.VariableRead;
 import org.simantics.db.layer0.variable.ProxyChildVariable;
@@ -18,9 +20,10 @@ 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 {
@@ -70,32 +73,29 @@ public class DocumentServerUtils {
        
                SortedMap<String, Variable> childMap = new TreeMap<String, Variable>(AlphanumComparator.COMPARATOR);
                
-               for(Variable property : variable.getProperties(graph)) {
-                       Collection<String> classifications = property.getPossiblePropertyValue(graph, Variables.CLASSIFICATIONS);
-                       if(classifications != null) {
-                               if(classifications.contains(DocumentationResource.URIs.Document_ChildRelation)) {
-                                       Resource cp = property.getPossiblePredicateResource(graph);
-                                       String i = graph.getRelatedValue(cp, DOC.Document_ChildRelation_ordinal, Bindings.STRING);
-                                       
-                                       Connection conn = property.getValue(graph);
-                                       Variable childConnectionPoint = DocumentServerUtils.getPossibleOtherConnectionPoint(graph, property, conn);
-                                       if(childConnectionPoint != null) {
-                                               childMap.put(i, childConnectionPoint.getParent(graph));
-                                       }
-                               } else if (DOC.Relations_partN.equals(property.getPossiblePredicateResource(graph))) {
-                                       Connection conn = property.getValue(graph);
-
-                                       for (Variable childConnectionPoint : DocumentServerUtils.getOtherConnectionPoints(graph, property, conn)) {
-                                               Variable child = childConnectionPoint.getParent(graph);
-                                               String i = findManualOrdinal(graph, child);
-                                               if (i == null) {
-                                                       i = "0";
-                                               }
-                                               childMap.put(i, child);
-                                       }
+               for(Variable property : variable.getProperties(graph, DocumentationResource.URIs.Document_ChildRelation)) {
+                       Resource cp = property.getPossiblePredicateResource(graph);
+                       String i = graph.getRelatedValue(cp, DOC.Document_ChildRelation_ordinal, Bindings.STRING);
+                       Connection conn = property.getValue(graph);
+                       Variable childConnectionPoint = DocumentServerUtils.getPossibleOtherConnectionPoint(graph, property, conn);
+                       if(childConnectionPoint != null) {
+                               childMap.put(i, childConnectionPoint.getParent(graph));
+                       }
+               }
+               
+               Variable property = variable.getPossibleProperty(graph, "partN");
+               if(property != null) {
+                       Connection conn = property.getValue(graph);
+                       for (Variable childConnectionPoint : DocumentServerUtils.getOtherConnectionPoints(graph, property, conn)) {
+                               Variable child = childConnectionPoint.getParent(graph);
+                               String i = findManualOrdinal(graph, child);
+                               if (i == null) {
+                                       i = "0";
                                }
+                               childMap.put(i, child);
                        }
                }
+
                return childMap.values();
 
        }    
@@ -126,7 +126,7 @@ 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.getConnectionPointDescriptors(graph, connectionPoint.getParent(graph), null);
                if(descs.size() != 2) return null;
 
                for(VariableConnectionPointDescriptor desc : descs) {
@@ -137,12 +137,30 @@ public class DocumentServerUtils {
                return null;
 
        }
+
+       public static Variable getPossibleChildConnectionPoint(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException {
+
+               Collection<VariableConnectionPointDescriptor> descs = conn.getConnectionPointDescriptors(graph, connectionPoint.getParent(graph), null);
+               if(descs.size() != 2) return null;
+
+       DocumentationResource DOC = DocumentationResource.getInstance(graph);
+               
+               for(VariableConnectionPointDescriptor desc : descs) {
+                       Resource res = desc.getConnectionPointResource(graph);
+                       if(graph.isInstanceOf(res, DOC.Relations_parentRelation)) continue;
+                       //if(desc.isFlattenedFrom(graph, connectionPoint)) continue;
+                       return desc.getVariable(graph);
+               }
+               
+               return null;
+
+       }
        
        public static Collection<Variable> getOtherConnectionPoints(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException {
 
                ArrayList<Variable> connectionPoints = new ArrayList<Variable>();
                
-               Collection<VariableConnectionPointDescriptor> descs = conn.getConnectionPointDescriptors(graph, null);
+               Collection<VariableConnectionPointDescriptor> descs = conn.getConnectionPointDescriptors(graph, connectionPoint.getParent(graph), null);
 
                for(VariableConnectionPointDescriptor desc : descs) {
                        if(desc.isFlattenedFrom(graph, connectionPoint)) continue;
@@ -155,7 +173,7 @@ public class DocumentServerUtils {
 
        public static Variable getPossibleCommandTriggerConnectionPoint(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException {
 
-               Collection<Variable> cpts = conn.getConnectionPoints(graph, null);
+               Collection<Variable> cpts = conn.getConnectionPoints(graph, connectionPoint.getParent(graph), null);
 
                Variable result = null;
                
@@ -173,7 +191,7 @@ public class DocumentServerUtils {
 
        public static Collection<Variable> getPossibleOtherConnectionPoints(ReadGraph graph, Variable connectionPoint, Connection conn) throws DatabaseException {
 
-           Collection<Variable> cpts = conn.getConnectionPoints(graph, null);
+           Collection<Variable> cpts = conn.getConnectionPoints(graph, connectionPoint.getParent(graph), null);
            if(cpts.size() < 2) 
                return Collections.emptyList();
 
@@ -196,24 +214,6 @@ public class DocumentServerUtils {
 
        }
 
-       public static class DocumentValue extends VariableRead<Object> {
-
-               public DocumentValue(Variable variable) {
-                       super(variable);
-               }
-
-               @Override
-               public Object perform(ReadGraph graph) throws DatabaseException {
-                       return variable.getValue(graph);
-               }
-               
-               @Override
-               public String toString() {
-                       return "DocumentValue[" + variable + "]";
-               }
-               
-       }
-       
        public static Object getValue(ReadGraph graph, Variable attrib) throws DatabaseException {
                return graph.syncRequest(new DocumentValue(attrib));
        }
@@ -236,11 +236,11 @@ public class DocumentServerUtils {
                if (otherCp != null) {
                        return otherCp;
                } else {
-                       Variable parentCp = graph.sync(new UnaryRead<Connection, Variable>(conn) {
+                       Variable parentCp = graph.sync(new BinaryRead<Variable, Connection, Variable>(connectionPoint.getParent(graph), 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.getConnectionPointDescriptors(graph, parameter, null);
 
                                for(VariableConnectionPointDescriptor desc : descs) {
                                        if (DOC.Relations_partN.equals(desc.getConnectionPointResource(graph))) {
@@ -293,43 +293,68 @@ public class DocumentServerUtils {
                return variable.getProperties(graph, DOC.Document_AttributeRelation);
        }
        
-       static class AttributesRequest extends VariableRead<Pair<Collection<Variable>, Collection<Variable>>> {
+       public static class AttributesRequest extends VariableRead<JSONObject> {
 
                public AttributesRequest(Variable variable) {
                        super(variable);
                }
 
                @Override
-               public Pair<Collection<Variable>,Collection<Variable>> perform(ReadGraph graph) throws DatabaseException {
-               ArrayList<Variable> statics = new ArrayList<Variable>();
-               ArrayList<Variable> dynamics = new ArrayList<Variable>();
-               DocumentationResource DOC = DocumentationResource.getInstance(graph);
-               for(Variable property : getAttributes(graph, DOC, variable)) {
-                       Boolean defaultProperty = property.getPossiblePropertyValue(graph, "default");
-                       if(defaultProperty != null && defaultProperty) {
-//                             System.err.println("" + property.getURI(graph) + " is default");
-                               continue;
-                       } 
-//                     else {
-//                             System.err.println("" + property.getURI(graph) + " is not default");
-//                     }
-                       Boolean dynamicProperty = property.getPossiblePropertyValue(graph, DOC.Document_AttributeRelation_dynamic);
-                       if(dynamicProperty != null && dynamicProperty) dynamics.add(property);
-                       else statics.add(property);
-               }
-               return new Pair<Collection<Variable>, Collection<Variable>>(statics, dynamics);
+               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, DocumentProperties statics) throws DatabaseException {
+                       
+                       JSONObject base = graph.syncRequest(new org.simantics.document.server.request.DefaultFields(variable));
+                       JSONObject object = base.clone();
+                       
+                       for(String name : statics.getKeys(graph, variable)) {
+                               try {
+                                       if (name.equals(NodeRequest.PROPERTY_VALUE_EXCEPTIONS)) {
+                                       @SuppressWarnings("unchecked")
+                                               Map<String, Exception> exceptions = (Map<String, Exception>)statics.getValue(graph, variable, name);//(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.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);
+                               }
+
+                       }
+
+                       return object;
+                       
                }
                
        }
-       
-    public static Collection<Variable> getStaticAttributes(ReadGraph graph, DocumentationResource DOC, Variable variable) throws DatabaseException {
-       Pair<Collection<Variable>, Collection<Variable>> attribs = graph.syncRequest(new AttributesRequest(variable));
-       return attribs.first;
-    }
 
        public static Collection<Variable> getDynamicAttributes(ReadGraph graph, final DocumentationResource DOC, Variable variable) throws DatabaseException {
-       Pair<Collection<Variable>, Collection<Variable>> attribs = graph.syncRequest(new AttributesRequest(variable));
-       return attribs.second;
+               return Collections.emptyList();
        }
        
        public static Variable getPossibleDocumentRootVariable(ReadGraph graph, Variable documentPart) throws DatabaseException {