--- /dev/null
+package org.simantics.document.ui.dialogs;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.List;\r
+\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.IWorkbenchPartSite;\r
+import org.simantics.Simantics;\r
+import org.simantics.annotation.ontology.AnnotationResource;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.VirtualGraph;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.WriteRequest;\r
+import org.simantics.db.common.request.WriteResultRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.request.Read;\r
+import org.simantics.db.service.VirtualGraphSupport;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.selectionview.ComparableTabContributor;\r
+import org.simantics.selectionview.IPropertyTab;\r
+import org.simantics.selectionview.TabContribution;\r
+import org.simantics.utils.ui.ExceptionUtils;\r
+\r
+/**\r
+ * Tool for configuring annotations for a resource before it is instantiated.\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class AnnotationConfigurator {\r
+\r
+ private Resource type;\r
+ private Resource lib;\r
+ boolean useVG = false;\r
+ Variable annotationHolderVariable;\r
+ \r
+ public AnnotationConfigurator(Resource type, Resource lib) {\r
+ this.type = type;\r
+ this.lib = lib;\r
+ \r
+ }\r
+ \r
+ public void createComposite(Composite parent) {\r
+ annotationHolderVariable = createAnnotationHolder2();\r
+ \r
+// IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();\r
+// IWorkbenchPartSite site = page.getActivePart().getSite();\r
+ IWorkbenchPartSite site = null;\r
+ \r
+ Collection<ComparableTabContributor> contribution = getAnnotationTab(annotationHolderVariable);\r
+ ISelection selection = new StructuredSelection(annotationHolderVariable);\r
+ for (ComparableTabContributor c : contribution) {\r
+ \r
+ IPropertyTab tab = c.create(parent, site, Simantics.getSessionContext(), selection);\r
+ tab.setInput(Simantics.getSessionContext(), selection, false);\r
+ }\r
+ }\r
+ \r
+ \r
+// private Resource createAnnotationHolder() {\r
+// VirtualGraph vg = null;\r
+// if (useVG) {\r
+// VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
+// vg = support.getMemoryPersistent("document_annotation");\r
+// }\r
+// Resource annotationHolder = null;\r
+// try {\r
+// annotationHolder = Simantics.getSession().syncRequest(new WriteResultRequest<Resource>(vg) {\r
+// public Resource perform(WriteGraph graph) throws DatabaseException {\r
+// Layer0 l0 = Layer0.getInstance(graph);\r
+// Resource annotationHolderDoc = graph.newResource();\r
+// graph.claim(annotationHolderDoc, l0.InstanceOf, type);\r
+// graph.claimLiteral(annotationHolderDoc, l0.HasName, "Template");\r
+// graph.claim(lib, l0.ConsistsOf, annotationHolderDoc);\r
+// return annotationHolderDoc;\r
+// }\r
+// });\r
+// \r
+// } catch (DatabaseException e1) {\r
+// ExceptionUtils.logAndShowError(e1);\r
+// }\r
+// return annotationHolder;\r
+// }\r
+ \r
+ private Variable createAnnotationHolder2() {\r
+ VirtualGraph vg = null;\r
+ if (useVG) {\r
+ VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
+ vg = support.getMemoryPersistent("document_annotation");\r
+ }\r
+ Variable annotationHolder = null;\r
+ try {\r
+ annotationHolder = Simantics.getSession().syncRequest(new WriteResultRequest<Variable>(vg) {\r
+ public Variable perform(WriteGraph graph) throws DatabaseException {\r
+ Layer0 l0 = Layer0.getInstance(graph);\r
+ Resource annotationHolderDoc = graph.newResource();\r
+ graph.claim(annotationHolderDoc, l0.InstanceOf, type);\r
+ graph.claimLiteral(annotationHolderDoc, l0.HasName, "Template");\r
+ graph.claim(lib, l0.ConsistsOf, annotationHolderDoc);\r
+ if (graph.isInstanceOf(lib, type)) {\r
+ copyAnnotations(graph, lib, annotationHolderDoc);\r
+ }\r
+ return graph.adapt(annotationHolderDoc, Variable.class);\r
+ }\r
+ });\r
+ \r
+ } catch (DatabaseException e1) {\r
+ ExceptionUtils.logAndShowError(e1);\r
+ }\r
+ return annotationHolder;\r
+ }\r
+ \r
+// private Variable createAnnotationHolder3() {\r
+// Resource r = createAnnotationHolder();\r
+// return new StandardGraphChildVariable(null, null, r);\r
+// }\r
+ \r
+ private Collection<ComparableTabContributor> getAnnotationTab(final Object selection) {\r
+ try {\r
+ return Simantics.getSession().syncRequest(new Read<Collection<ComparableTabContributor>>() {\r
+ @SuppressWarnings({ "rawtypes", "unchecked" })\r
+ @Override\r
+ public Collection<ComparableTabContributor> perform(ReadGraph graph)\r
+ throws DatabaseException {\r
+ AnnotationResource ann = AnnotationResource.getInstance(graph);\r
+ TabContribution contribution = graph.adapt(ann.SelectionTabContribution, TabContribution.class);\r
+ Collection<ComparableTabContributor> coll = new ArrayList<ComparableTabContributor>();\r
+ contribution.contribute(graph, selection, coll);\r
+ return coll;\r
+ }\r
+ });\r
+ } catch (DatabaseException e) {\r
+ ExceptionUtils.logAndShowError(e);\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ public void apply(final Resource to) throws DatabaseException{\r
+ Simantics.getSession().syncRequest(new WriteRequest() {\r
+ \r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ apply(graph, to);\r
+ }\r
+ });\r
+ \r
+ }\r
+ \r
+ public void apply(WriteGraph graph, Resource to) throws DatabaseException{\r
+ Resource from = annotationHolderVariable.getPossibleRepresents(graph);\r
+ copyAnnotations(graph, from, to);\r
+\r
+ }\r
+ \r
+ private void copyAnnotations(WriteGraph graph, Resource from, Resource to) throws DatabaseException{\r
+ Layer0 l0 = Layer0.getInstance(graph);\r
+ AnnotationResource ann = AnnotationResource.getInstance(graph);\r
+ \r
+ List<Statement> annotations = new ArrayList<Statement>();\r
+ for (Statement s : graph.getStatements(from, l0.HasProperty)) {\r
+ if (graph.isInstanceOf(s.getObject(),ann.Annotation) ){\r
+ annotations.add(s);\r
+ }\r
+ }\r
+ \r
+ for (Statement annotation : annotations) {\r
+ Resource annotationInstance = graph.newResource();\r
+ graph.claim(to, annotation.getPredicate(), annotationInstance);\r
+ for (Resource type : graph.getObjects(annotation.getObject(), l0.InstanceOf)) {\r
+ graph.claim(annotationInstance, l0.InstanceOf, type);\r
+ }\r
+ for (Statement property : graph.getStatements(annotation.getObject(), l0.HasProperty)) {\r
+ if (property.isAsserted(annotation.getObject()))\r
+ continue;\r
+ graph.claimLiteral(annotationInstance, property.getPredicate(), graph.getValue(property.getObject()));\r
+ }\r
+ }\r
+ }\r
+ \r
+ public void dispose() {\r
+ \r
+ if (useVG) {\r
+ VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);\r
+ VirtualGraph vg = support.getMemoryPersistent("document_annotation");\r
+ support.discard(vg);\r
+ } else {\r
+ \r
+ Simantics.getSession().asyncRequest(new WriteRequest() {\r
+ \r
+ @Override\r
+ public void perform(WriteGraph graph) throws DatabaseException {\r
+ Resource r = annotationHolderVariable.getPossibleRepresents(graph);\r
+ graph.deny(r);\r
+ \r
+ }\r
+ });\r
+ \r
+ }\r
+ \r
+ }\r
+}\r