--- /dev/null
+package org.simantics.document.linking.report.templates;\r
+\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.utils.NameUtils;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.document.linking.ontology.DocumentLink;\r
+import org.simantics.document.linking.report.Document;\r
+import org.simantics.document.linking.report.Document.TextSize;\r
+import org.simantics.document.linking.report.DocumentTitlePage;\r
+import org.simantics.document.linking.report.RowContentProvider;\r
+import org.simantics.document.linking.report.Table;\r
+import org.simantics.document.linking.report.TableOfContents;\r
+import org.simantics.document.linking.report.TextItem;\r
+import org.simantics.document.linking.utils.SourceLinkUtil;\r
+\r
+/**\r
+ * Model information\r
+ * ? Document 1 rev1\r
+ * \95 Link1: Diagram, module, attribute information\r
+ * \95 Link2: Diagram, module, attribute information\r
+ * ? Document 1 rev2\r
+ * \95 Link3: Diagram, module, attribute information\r
+ * ? Document 1 rev3\r
+ * \95 Link4: Diagram, module, attribute information\r
+ * ? Document 2\r
+ * \95 Link5: Diagram, module, attribute information\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ *\r
+ */\r
+public class DocumentStructureWriter extends IndexQueryReport {\r
+ ReadGraph graph;\r
+ Resource model;\r
+ Map<Object, Object> context;\r
+ DocumentLink sl;\r
+ Comparator<Resource> referenceComparator;\r
+ Comparator<Resource> parentComparator;\r
+ SourceParentDiagramComparator diagramComparator;\r
+ @Override\r
+ public void sort(List<Resource> list) throws DatabaseException{\r
+ NestedComparator<Resource> comp = new NestedComparator<Resource>();\r
+ comp.addComparator(referenceComparator);\r
+ comp.addComparator(parentComparator);\r
+ Collections.sort(list, comp);\r
+ }\r
+ \r
+ @Override\r
+ public String getName() {\r
+ return "Document Structure";\r
+ }\r
+ \r
+ @Override\r
+ public void start(ReadGraph graph, Resource model,Document writer, Map<Object, Object> context) throws Exception{\r
+ super.start(graph, model, writer, context);\r
+ this.context = context;\r
+ DocumentTitlePage titlePage = writer.newElement(DocumentTitlePage.class);\r
+ titlePage.writeTitle(graph, context);\r
+ writer.newElement(TableOfContents.class);\r
+ Table table = writer.newElement(Table.class,Document.TOC);\r
+ table.addColumn("Name", 0.2);\r
+ table.addColumn("Attribute", 0.35);\r
+ table.addColumn("Value", 0.15);\r
+ table.addColumn("Comment", 0.3);\r
+ \r
+ //lineWriter.nextPage();\r
+ this.graph = graph;\r
+ this.sl = DocumentLink.getInstance(graph);\r
+ this.model = model;\r
+ referenceComparator = new SourceReferenceComparator(graph,model);\r
+ parentComparator = new SourceParentHierarchyComparator(graph,model);\r
+ diagramComparator = new SourceParentDiagramComparator(graph, model);\r
+ clearProviders();\r
+ LinkContentProvider linkContentProvider = new LinkContentProvider();\r
+ HierarchyContentProvider hierarchyContentProvider = new HierarchyContentProvider(linkContentProvider);\r
+ addLineProvider(hierarchyContentProvider);\r
+ addCellProvider(linkContentProvider);\r
+ }\r
+\r
+ private class HierarchyContentProvider implements RowContentProvider<Resource> {\r
+ \r
+ private LinkContentProvider linkContentProvider;\r
+ \r
+ \r
+ \r
+ public HierarchyContentProvider(LinkContentProvider linkContentProvider) {\r
+ super();\r
+ this.linkContentProvider = linkContentProvider;\r
+ }\r
+\r
+\r
+\r
+ @Override\r
+ public void setText(Document writer, Resource previous,\r
+ Resource current, Resource next, TextItem[] row) throws Exception {\r
+ boolean writeDoc = false;\r
+ boolean writeDiag = false;\r
+ boolean writeToc = false;\r
+ Table table = writer.getCurrentElement(Table.class);\r
+ if (previous == null) {\r
+ writeDoc = true;\r
+ writeDiag = true;\r
+ writeToc = true;\r
+ } else if (writer.getCurrentLine() == 1) {\r
+ writeDoc = true;\r
+ writeDiag = true;\r
+ writeToc = referenceComparator.compare(previous, current) != 0;\r
+ } else {\r
+ if (referenceComparator.compare(previous, current) != 0) {\r
+ writeDoc = true;\r
+ writeDiag = true;\r
+ writeToc = true;\r
+ linkContentProvider.forceLabel = true;\r
+ } else {\r
+ if (diagramComparator.compare(previous, current) != 0) {\r
+ writeDiag = true;\r
+ linkContentProvider.forceLabel = true;\r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ if (writeDoc) {\r
+ if (writer.getAvailableLines() < 8) {\r
+ writer.nextPage();\r
+ table = writer.nextElement(Table.class,Document.TOC);\r
+ }\r
+ else if (writer.getCurrentLine() > 2)\r
+ table = writer.nextElement(Table.class,Document.TOC);\r
+ \r
+ \r
+ Resource doc2 = SourceLinkUtil.getReferredDocument(graph, current);\r
+// TextSize size = table.getTextSize();\r
+// table.setTextSize(TextSize.MEDIUM);\r
+ TextItem label = null;\r
+ if (doc2 != null) {\r
+ label = getDocumentItem(doc2);\r
+ } else {\r
+ label = getNonExistingDocumentItem();\r
+ }\r
+ if (writeToc) {\r
+ TableOfContents toc = writer.getCurrentElement(TableOfContents.class);\r
+ toc.addTocElement(label.getText(), table);\r
+ }\r
+ //table.writeRow(label);\r
+ table.setTitle(label);\r
+// table.setTextSize(size);\r
+ }\r
+ if (writeDiag) {\r
+ if (writer.getAvailableLines() < 3)\r
+ writer.nextPage();\r
+ Resource parent = graph.getSingleObject(current, sl.hasSource_Inverse);\r
+ List<Resource> path = SourceLinkUtil.getDiagramPath(graph, model, parent);\r
+ if (path != null) {\r
+ TextSize size = table.getTextSize();\r
+ table.setTextSize(TextSize.MEDIUM);\r
+ table.writeRow(" " + diagramComparator.getText(path.get(path.size()-1)));\r
+ table.setTextSize(size);\r
+ }\r
+ }\r
+ \r
+ }\r
+ }\r
+ \r
+ \r
+ private class LinkContentProvider implements RowContentProvider<Resource> {\r
+ \r
+ private boolean forceLabel = false;\r
+ \r
+ @Override\r
+ public void setText(Document writer, Resource previous,\r
+ Resource source, Resource next, TextItem[] text) throws Exception {\r
+ Resource holder = graph.getSingleObject(source, sl.hasSource_Inverse);\r
+ if (forceLabel || previous == null || !graph.getSingleObject(previous, sl.hasSource_Inverse).equals(graph.getSingleObject(source, sl.hasSource_Inverse))) {\r
+ String holderName = NameUtils.getSafeLabel(graph, holder);\r
+ if (holderName.length() == 0)\r
+ holderName = NameUtils.getSafeName(graph, holder);\r
+ text[0] = writer.newItem(TextItem.class);\r
+ text[0].setText(holderName);\r
+ forceLabel = false;\r
+ }\r
+ if (graph.isInstanceOf(source, sl.FunctionalSource)) {\r
+ Resource relation = graph.getPossibleObject(source, sl.consernsRelation);\r
+ text[1] = writer.newItem(TextItem.class);\r
+ if (relation != null) {\r
+ String relationName = NameUtils.getSafeLabel(graph, relation);\r
+ if (relationName.length() == 0)\r
+ relationName = NameUtils.getSafeName(graph, relation);\r
+ Object value = graph.getPossibleRelatedValue(holder, relation);\r
+ text[1].setText(relationName);\r
+ if (value != null) {\r
+ text[2] = writer.newItem(TextItem.class);\r
+ text[2].setText(SourceLinkUtil.getValueString(value));\r
+ }\r
+ } else {\r
+ text[1].setText("Error in property reference ");\r
+ }\r
+ }\r
+ \r
+ String comment = graph.getPossibleRelatedValue(source, sl.hasSourceComment);\r
+ if (comment != null) {\r
+ text[3] = writer.newItem(TextItem.class);\r
+ text[3].setText(comment);\r
+ }\r
+ \r
+ }\r
+ \r
+ }\r
+}
\ No newline at end of file