]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/templates/CompleteStructureWriter.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / report / templates / CompleteStructureWriter.java
1 package org.simantics.document.linking.report.templates;\r
2 \r
3 import java.util.Collections;\r
4 import java.util.Comparator;\r
5 import java.util.List;\r
6 import java.util.Map;\r
7 \r
8 import org.simantics.db.ReadGraph;\r
9 import org.simantics.db.Resource;\r
10 import org.simantics.db.common.utils.NameUtils;\r
11 import org.simantics.db.exception.DatabaseException;\r
12 import org.simantics.document.DocumentResource;\r
13 import org.simantics.document.linking.ontology.DocumentLink;\r
14 import org.simantics.document.linking.report.Document;\r
15 import org.simantics.document.linking.report.DocumentTitlePage;\r
16 import org.simantics.document.linking.report.RowContentProvider;\r
17 import org.simantics.document.linking.report.Table;\r
18 import org.simantics.document.linking.report.TableOfContents;\r
19 import org.simantics.document.linking.report.TextItem;\r
20 import org.simantics.document.linking.utils.SourceLinkUtil;\r
21 \r
22 /**\r
23  *  ? Configuration folder 1\r
24  *    \95 Diagram 1\r
25  *        o Link1: Document information\r
26  *        o Link2: Document information\r
27  *        o Link3: Document information\r
28  *        o Module 1\r
29  *            ? Link4: Document information\r
30  *            ? Link5: Document information\r
31  *            ? Attribute 1\r
32  *                ? Link6: Document information\r
33  *            ? Attribute 2\r
34  *                ? Link7: Document information\r
35  *                ? Link8: Document information\r
36  *        o Module 2\r
37  *            ? Link9: Document information\r
38  *            \r
39  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
40  *\r
41  */\r
42 public class CompleteStructureWriter extends IndexQueryReport {\r
43                 ReadGraph graph;\r
44                 Resource model;\r
45                 Map<Object, Object> context;\r
46                 DocumentLink sl;\r
47                 DocumentResource doc;\r
48                 ResourceNameComparator parentComparator;\r
49                 Comparator<Resource> hierarchyComparator;\r
50                 \r
51                 @Override\r
52                 public String getName() {\r
53                         return "Complete Structure";\r
54                 }\r
55                 \r
56                 @Override\r
57                 public void sort(List<Resource> list) throws DatabaseException{\r
58                         Collections.sort(list, parentComparator);\r
59                 }\r
60                 \r
61                 @Override\r
62                 public void start(final ReadGraph graph, final Resource model, Document writer, Map<Object, Object> context) throws Exception{\r
63                         super.start(graph, model, writer, context);\r
64                         this.context = context;\r
65                         DocumentTitlePage titlePage = writer.newElement(DocumentTitlePage.class);\r
66                         titlePage.writeTitle(graph, context);\r
67                         writer.newElement(TableOfContents.class);\r
68                         Table table = writer.newElement(Table.class,Document.TOC);\r
69                         \r
70                         table.addColumn("Name", 0.2);\r
71                         table.addColumn("Attribute", 0.2);\r
72                         table.addColumn("Value", 0.15);\r
73                         table.addColumn("Document", 0.2);\r
74                         table.addColumn("Comment", 0.25);\r
75                         \r
76                         //lineWriter.nextPage();\r
77                         \r
78                         this.graph = graph;\r
79                         this.sl = DocumentLink.getInstance(graph);\r
80                         this.doc = DocumentResource.getInstance(graph);\r
81                         this.model = model;\r
82                         \r
83                         \r
84                         \r
85                         parentComparator = new SourceParentHierarchyWithPropComparator(graph,model);\r
86                         hierarchyComparator = new SourceParentDiagramComparator(graph,model);\r
87                                 \r
88                         clearProviders();\r
89                         addLineProvider(new HierarchyProvider());\r
90                         addCellProvider(new LinkCellProvider());\r
91                         \r
92                 }\r
93                 \r
94                 private class HierarchyProvider implements RowContentProvider<Resource> {\r
95                         \r
96                         @Override\r
97                         public void setText(Document writer, Resource previous, Resource current, Resource next, TextItem[] row) throws Exception {\r
98                                 boolean writeHierarchy = false;\r
99                                 if (previous == null)\r
100                                         writeHierarchy = true;\r
101                                 else  {\r
102                                         if (hierarchyComparator.compare(previous, current) != 0)\r
103                                                 writeHierarchy = true;\r
104                                 }\r
105                                 if (writeHierarchy) {\r
106                                         Resource obj = graph.getPossibleObject(current, sl.hasSource_Inverse);\r
107                                         Table table = writer.getCurrentElement(Table.class);\r
108 \r
109                                         if (writer.getCurrentLine() > 2) {\r
110                                                 writer.nextPage();\r
111                                                 table = writer.nextElement(Table.class,Document.TOC);\r
112                                         }\r
113                                         \r
114                                         if (obj != null) {\r
115                                                 String text = "";\r
116                                                 List<Resource> path = SourceLinkUtil.getDiagramPath(graph, model, obj);\r
117                                                 \r
118                                                 if (path == null) {\r
119                                                         path = parentComparator.getPath(obj);\r
120                                                         for (int i = 0 ; i < path.size()-1; i++) {\r
121                                                                 Resource r = path.get(i);\r
122                                                                 text += parentComparator.getText(r);\r
123                                                                 if (i < path.size()-2)\r
124                                                                         text += "/";\r
125                                                         }\r
126                                                 } else {\r
127                                                         for (int i = 0 ; i < path.size(); i++) {\r
128                                                                 Resource r = path.get(i);\r
129                                                                 text += parentComparator.getText(r);\r
130                                                                 if (i < path.size()-1)\r
131                                                                         text += "/";\r
132                                                         }\r
133                                                 }\r
134                                                 //row[0] = text;\r
135                                                 table.setTitle(text);\r
136                                                 \r
137                                                 TableOfContents toc = writer.getCurrentElement(TableOfContents.class);\r
138                                                 toc.addTocElement(text, table);\r
139                                         } else {\r
140                                                 //row[0] =  "Hierarchy missing";\r
141                                                 table.setTitle("Hierarchy missing");\r
142                                         }\r
143                                 }\r
144                         }\r
145                 }\r
146                 \r
147                 private class LinkCellProvider implements RowContentProvider<Resource> {\r
148                         @Override\r
149                         public void setText(Document writer, Resource previous, Resource source, Resource next, TextItem[] text)\r
150                                         throws Exception {\r
151                                 Resource holder = graph.getSingleObject(source, sl.hasSource_Inverse);\r
152                                 String holderName = NameUtils.getSafeLabel(graph, holder);\r
153                                 if (holderName.length() == 0)\r
154                                         holderName = NameUtils.getSafeName(graph, holder);\r
155                                 if (previous == null || !graph.getSingleObject(previous, sl.hasSource_Inverse).equals(graph.getSingleObject(source, sl.hasSource_Inverse))) {\r
156                                         text[0] = writer.newItem(TextItem.class);\r
157                                         text[0].setText(holderName);\r
158                                 }\r
159                                 if (graph.isInstanceOf(source, sl.FunctionalSource)) {\r
160                                         Resource relation = graph.getPossibleObject(source, sl.consernsRelation);\r
161                                         text[1] = writer.newItem(TextItem.class);\r
162                                         if (relation != null) {\r
163                                                 String relationName = NameUtils.getSafeLabel(graph, relation);\r
164                                                 if (relationName.length() == 0)\r
165                                                         relationName = NameUtils.getSafeName(graph, relation);\r
166                                                 Object value = graph.getPossibleRelatedValue(holder, relation);\r
167                                                 text[1].setText(relationName);\r
168                                                 if (value != null) {\r
169                                                         text[2] = writer.newItem(TextItem.class);\r
170                                                         text[2].setText(SourceLinkUtil.getValueString(value));\r
171                                                 }\r
172                                         } else {\r
173                                                 text[1].setText("Error in property reference");\r
174                                         }\r
175                                 }\r
176                                 Resource document = SourceLinkUtil.getReferredDocument(graph, source);\r
177                                 if (document != null) {\r
178                                         text[3] = getDocumentItem(document);\r
179                                 } else {\r
180                                         text[3] = getNonExistingDocumentItem();\r
181                                 }\r
182                                 \r
183                                 String comment = graph.getPossibleRelatedValue(source, sl.hasSourceComment);\r
184                                 if (comment != null) {\r
185                                         text[4] = writer.newItem(TextItem.class);\r
186                                         text[4].setText(comment);\r
187                                 }\r
188 \r
189                         }\r
190                 }\r
191         }