1 package org.simantics.document.linking.report.templates;
\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
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.linking.ontology.DocumentLink;
\r
13 import org.simantics.document.linking.report.Document;
\r
14 import org.simantics.document.linking.report.Document.TextSize;
\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
25 *
\95 Link1: Diagram, module, attribute information
\r
26 *
\95 Link2: Diagram, module, attribute information
\r
28 *
\95 Link3: Diagram, module, attribute information
\r
30 *
\95 Link4: Diagram, module, attribute information
\r
32 *
\95 Link5: Diagram, module, attribute information
\r
34 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
37 public class DocumentStructureWriter extends IndexQueryReport {
\r
40 Map<Object, Object> context;
\r
42 Comparator<Resource> referenceComparator;
\r
43 Comparator<Resource> parentComparator;
\r
44 SourceParentDiagramComparator diagramComparator;
\r
46 public void sort(List<Resource> list) throws DatabaseException{
\r
47 NestedComparator<Resource> comp = new NestedComparator<Resource>();
\r
48 comp.addComparator(referenceComparator);
\r
49 comp.addComparator(parentComparator);
\r
50 Collections.sort(list, comp);
\r
54 public String getName() {
\r
55 return "Document Structure";
\r
59 public void start(ReadGraph graph, Resource model,Document writer, Map<Object, Object> context) throws Exception{
\r
60 super.start(graph, model, writer, context);
\r
61 this.context = context;
\r
62 DocumentTitlePage titlePage = writer.newElement(DocumentTitlePage.class);
\r
63 titlePage.writeTitle(graph, context);
\r
64 writer.newElement(TableOfContents.class);
\r
65 Table table = writer.newElement(Table.class,Document.TOC);
\r
66 table.addColumn("Name", 0.2);
\r
67 table.addColumn("Attribute", 0.35);
\r
68 table.addColumn("Value", 0.15);
\r
69 table.addColumn("Comment", 0.3);
\r
71 //lineWriter.nextPage();
\r
73 this.sl = DocumentLink.getInstance(graph);
\r
75 referenceComparator = new SourceReferenceComparator(graph,model);
\r
76 parentComparator = new SourceParentHierarchyComparator(graph,model);
\r
77 diagramComparator = new SourceParentDiagramComparator(graph, model);
\r
79 LinkContentProvider linkContentProvider = new LinkContentProvider();
\r
80 HierarchyContentProvider hierarchyContentProvider = new HierarchyContentProvider(linkContentProvider);
\r
81 addLineProvider(hierarchyContentProvider);
\r
82 addCellProvider(linkContentProvider);
\r
85 private class HierarchyContentProvider implements RowContentProvider<Resource> {
\r
87 private LinkContentProvider linkContentProvider;
\r
91 public HierarchyContentProvider(LinkContentProvider linkContentProvider) {
\r
93 this.linkContentProvider = linkContentProvider;
\r
99 public void setText(Document writer, Resource previous,
\r
100 Resource current, Resource next, TextItem[] row) throws Exception {
\r
101 boolean writeDoc = false;
\r
102 boolean writeDiag = false;
\r
103 boolean writeToc = false;
\r
104 Table table = writer.getCurrentElement(Table.class);
\r
105 if (previous == null) {
\r
109 } else if (writer.getCurrentLine() == 1) {
\r
112 writeToc = referenceComparator.compare(previous, current) != 0;
\r
114 if (referenceComparator.compare(previous, current) != 0) {
\r
118 linkContentProvider.forceLabel = true;
\r
120 if (diagramComparator.compare(previous, current) != 0) {
\r
122 linkContentProvider.forceLabel = true;
\r
129 if (writer.getAvailableLines() < 8) {
\r
131 table = writer.nextElement(Table.class,Document.TOC);
\r
133 else if (writer.getCurrentLine() > 2)
\r
134 table = writer.nextElement(Table.class,Document.TOC);
\r
137 Resource doc2 = SourceLinkUtil.getReferredDocument(graph, current);
\r
138 // TextSize size = table.getTextSize();
\r
139 // table.setTextSize(TextSize.MEDIUM);
\r
140 TextItem label = null;
\r
141 if (doc2 != null) {
\r
142 label = getDocumentItem(doc2);
\r
144 label = getNonExistingDocumentItem();
\r
147 TableOfContents toc = writer.getCurrentElement(TableOfContents.class);
\r
148 toc.addTocElement(label.getText(), table);
\r
150 //table.writeRow(label);
\r
151 table.setTitle(label);
\r
152 // table.setTextSize(size);
\r
155 if (writer.getAvailableLines() < 3)
\r
157 Resource parent = graph.getSingleObject(current, sl.hasSource_Inverse);
\r
158 List<Resource> path = SourceLinkUtil.getDiagramPath(graph, model, parent);
\r
159 if (path != null) {
\r
160 TextSize size = table.getTextSize();
\r
161 table.setTextSize(TextSize.MEDIUM);
\r
162 table.writeRow(" " + diagramComparator.getText(path.get(path.size()-1)));
\r
163 table.setTextSize(size);
\r
171 private class LinkContentProvider implements RowContentProvider<Resource> {
\r
173 private boolean forceLabel = false;
\r
176 public void setText(Document writer, Resource previous,
\r
177 Resource source, Resource next, TextItem[] text) throws Exception {
\r
178 Resource holder = graph.getSingleObject(source, sl.hasSource_Inverse);
\r
179 if (forceLabel || previous == null || !graph.getSingleObject(previous, sl.hasSource_Inverse).equals(graph.getSingleObject(source, sl.hasSource_Inverse))) {
\r
180 String holderName = NameUtils.getSafeLabel(graph, holder);
\r
181 if (holderName.length() == 0)
\r
182 holderName = NameUtils.getSafeName(graph, holder);
\r
183 text[0] = writer.newItem(TextItem.class);
\r
184 text[0].setText(holderName);
\r
185 forceLabel = false;
\r
187 if (graph.isInstanceOf(source, sl.FunctionalSource)) {
\r
188 Resource relation = graph.getPossibleObject(source, sl.consernsRelation);
\r
189 text[1] = writer.newItem(TextItem.class);
\r
190 if (relation != null) {
\r
191 String relationName = NameUtils.getSafeLabel(graph, relation);
\r
192 if (relationName.length() == 0)
\r
193 relationName = NameUtils.getSafeName(graph, relation);
\r
194 Object value = graph.getPossibleRelatedValue(holder, relation);
\r
195 text[1].setText(relationName);
\r
196 if (value != null) {
\r
197 text[2] = writer.newItem(TextItem.class);
\r
198 text[2].setText(SourceLinkUtil.getValueString(value));
\r
201 text[1].setText("Error in property reference ");
\r
205 String comment = graph.getPossibleRelatedValue(source, sl.hasSourceComment);
\r
206 if (comment != null) {
\r
207 text[3] = writer.newItem(TextItem.class);
\r
208 text[3].setText(comment);
\r