]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document/src/org/simantics/document/DocumentUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document / src / org / simantics / document / DocumentUtils.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.document;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Collections;\r
17 import java.util.List;\r
18 \r
19 import org.simantics.databoard.Bindings;\r
20 import org.simantics.databoard.util.URIStringUtils;\r
21 import org.simantics.db.ReadGraph;\r
22 import org.simantics.db.RequestProcessor;\r
23 import org.simantics.db.Resource;\r
24 import org.simantics.db.Session;\r
25 import org.simantics.db.VirtualGraph;\r
26 import org.simantics.db.WriteGraph;\r
27 import org.simantics.db.common.request.PossibleIndexRoot;\r
28 import org.simantics.db.common.request.ResourceRead;\r
29 import org.simantics.db.common.request.UniqueRead;\r
30 import org.simantics.db.common.request.WriteResultRequest;\r
31 import org.simantics.db.common.utils.Logger;\r
32 import org.simantics.db.exception.DatabaseException;\r
33 import org.simantics.db.layer0.variable.Variable;\r
34 import org.simantics.db.layer0.variable.Variables;\r
35 import org.simantics.document.function.WikiDocumentNodeImpl;\r
36 import org.simantics.document.node.Composite;\r
37 import org.simantics.layer0.Layer0;\r
38 import org.simantics.scenegraph.loader.ScenegraphLoaderProcess;\r
39 import org.simantics.scenegraph.loader.ScenegraphLoaderUtils;\r
40 import org.simantics.scenegraph.loader.ScenegraphVariable;\r
41 import org.simantics.scenegraph.ontology.ScenegraphResources;\r
42 import org.simantics.simulation.ontology.SimulationResource;\r
43 import org.simantics.wiki.ui.SimanticsDialect;\r
44 \r
45 import com.lowagie.text.Document;\r
46 import com.lowagie.text.DocumentException;\r
47 import com.lowagie.text.pdf.PdfWriter;\r
48 \r
49 public class DocumentUtils {\r
50 \r
51         static class DeepDocs extends ResourceRead<List<Resource>> {\r
52 \r
53                 protected DeepDocs(Resource resource) {\r
54                         super(resource);\r
55                 }\r
56 \r
57                 @Override\r
58                 public List<Resource> perform(ReadGraph graph) throws DatabaseException {\r
59 \r
60                         DocumentResource DOC = DocumentResource.getInstance(graph);\r
61                         Resource doc = graph.getPossibleObject(resource, DOC.HasDocument);\r
62 \r
63                         Layer0 L0 = Layer0.getInstance(graph);\r
64                         Collection<Resource> children = graph.getObjects(resource, L0.ConsistsOf);\r
65                         if(children.isEmpty()) {\r
66                                 if(doc != null) return Collections.singletonList(resource);\r
67                                 else return Collections.emptyList();\r
68                         } else {\r
69                                 ArrayList<Resource> result = new ArrayList<Resource>();\r
70                                 if(doc != null) result.add(resource);\r
71                                 for(Resource child : children)\r
72                                         result.addAll(graph.syncRequest(new DeepDocs(child)));\r
73                                 return result;\r
74                         }\r
75                         \r
76                 }\r
77          \r
78         }\r
79         \r
80         public DocumentSettings getDocumentSettings(RequestProcessor processor, final Resource resource) throws DatabaseException {\r
81 \r
82                 return processor.syncRequest(new ResourceRead<DocumentSettings>(resource) {\r
83 \r
84                         @Override\r
85                         public DocumentSettings perform(ReadGraph graph) throws DatabaseException {\r
86 \r
87                                 Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(resource));\r
88                                 if(indexRoot == null) return DocumentSettings.DEFAULT;\r
89                                 \r
90                                 DocumentResource DOC = DocumentResource.getInstance(graph);\r
91                                 DocumentSettings result = graph.getPossibleRelatedValue(indexRoot, DOC.documentSettings, DocumentSettings.BINDING);\r
92                                 if(result == null) return DocumentSettings.DEFAULT;\r
93                                 return result;\r
94                                 \r
95                         }\r
96                         \r
97                 });\r
98 \r
99         }\r
100 \r
101         public void getDocumentCSSText(RequestProcessor processor, final Resource resource, final StringBuilder css) throws DatabaseException {\r
102 \r
103                 css.append(processor.sync(new ResourceRead<String>(resource) {\r
104 \r
105                         @Override\r
106                         public String perform(ReadGraph graph) throws DatabaseException {\r
107 \r
108                                 Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(resource));\r
109                                 if(indexRoot == null) return "";\r
110                                 \r
111                                 DocumentResource DOC = DocumentResource.getInstance(graph);\r
112                                 String css = graph.getPossibleRelatedValue(indexRoot, DOC.cssDocument, Bindings.STRING);\r
113                                 if(css == null) return "";\r
114                                 \r
115                                 return css;\r
116                                 \r
117                         }\r
118                         \r
119                 }));\r
120 \r
121         }\r
122 \r
123         public void getDocumentWikiTextRecursive(Session session, final Resource resource, final StringBuilder wiki, final StringBuilder css) throws DatabaseException {\r
124 \r
125                 List<Resource> rs = session.sync(new DeepDocs(resource));\r
126                 for(Resource r : rs) {\r
127                         getDocumentWikiText(session, r, wiki);\r
128                 }\r
129                 \r
130                 getDocumentCSSText(session, resource, css);\r
131                 \r
132         }\r
133 \r
134         public void getDocumentWikiText(Session session, final Resource resource, final StringBuilder b) {\r
135                 \r
136                 try {\r
137 \r
138                         final ScenegraphLoaderProcess loader = new ScenegraphLoaderProcess(new Composite(), "CreatePDFAction");\r
139                         \r
140                         final Variable context = session.sync(new WriteResultRequest<Variable>(session.getService(VirtualGraph.class)) {\r
141 \r
142                                 @Override\r
143                                 public Variable perform(WriteGraph graph) throws DatabaseException {\r
144 \r
145                                         DocumentResource DOC = DocumentResource.getInstance(graph);\r
146                                         Resource doc = graph.getPossibleObject(resource, DOC.HasDocument);\r
147                                         if(doc == null) return null;\r
148 \r
149                                         Layer0 L0 = Layer0.getInstance(graph);\r
150                                         ScenegraphResources SG = ScenegraphResources.getInstance(graph);\r
151                                         Resource runtime = graph.newResource();\r
152                                         graph.claim(runtime, L0.InstanceOf, null, SG.Runtime);\r
153                                         Variable base = Variables.getVariable(graph, resource);\r
154 \r
155                                         String uri = base.getURI(graph);\r
156                                         graph.claimLiteral(runtime, SG.Runtime_HasVariable, uri, Bindings.STRING);\r
157 \r
158                                         return new ScenegraphVariable(base, doc, runtime, loader.getRoot());\r
159 \r
160                                 }\r
161 \r
162                         });\r
163                         \r
164                         if(context == null) return;\r
165 \r
166                         String wiki = session.sync(new UniqueRead<String>() {\r
167 \r
168                                 @Override\r
169                                 public String perform(ReadGraph graph) throws DatabaseException {\r
170 \r
171                                         DocumentResource DOC = DocumentResource.getInstance(graph);\r
172                                         Resource doc = graph.getSingleObject(resource, DOC.HasDocumentation);\r
173                                         Resource scenegraph = graph.getSingleObject(doc, DOC.ScenegraphDocument_scenegraph);\r
174                                         \r
175                                         WikiDocumentNodeImpl node = loader.load(graph, scenegraph, ScenegraphLoaderUtils.getRuntime(graph, context));\r
176 \r
177                                         StringBuilder b = new StringBuilder();\r
178                                         node.create(b, true);\r
179                                         \r
180                                         String text = b.toString();\r
181                                         \r
182                                         return SimanticsDialect.INSTANCE.apply(graph, Variables.getVariable(graph, resource), text);\r
183                                         \r
184                                 }\r
185 \r
186                         });\r
187                         \r
188                         loader.dispose();\r
189 \r
190                         b.append(wiki);\r
191                         \r
192                 } catch (DatabaseException e) {\r
193                         e.printStackTrace();\r
194                 }\r
195         }       \r
196 \r
197         public void print(RequestProcessor processor, Resource res, String wiki, String css, DocumentSettings settings, final PdfWriter writer, final Document document) throws DocumentException {\r
198                 try {\r
199                         Exportable exp = processor.syncRequest(new UniqueRead<Exportable>() {\r
200 \r
201                                 @Override\r
202                                 public Exportable perform(ReadGraph graph) throws DatabaseException {\r
203                                         return new Exportable(graph, res, wiki, css, settings, true);\r
204                                 }\r
205                                 \r
206                         });\r
207                         exp.export(document, writer);\r
208                 } catch (DocumentException e) {\r
209                         Logger.defaultLogError(e);\r
210                 } catch (DatabaseException e) {\r
211                         Logger.defaultLogError(e);\r
212                 }\r
213         }\r
214 \r
215     public static String indexRootPath(ReadGraph graph, Variable selection) throws DatabaseException {\r
216         \r
217         Variable possibleConfiguration = Variables.getPossibleConfigurationVariable(graph, selection);\r
218         if(possibleConfiguration != null) selection = possibleConfiguration;\r
219         \r
220         Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(selection.getRepresents(graph)));\r
221         if(indexRoot == null) return "";\r
222 \r
223         String selectionURI = selection.getParent(graph).getURI(graph);\r
224 \r
225         SimulationResource SIMU = SimulationResource.getInstance(graph);\r
226         Resource configuration = graph.getPossibleObject(indexRoot, SIMU.HasConfiguration);\r
227         if(configuration != null) {\r
228                 String configurationURI = graph.getURI(configuration);\r
229                 if(selectionURI.startsWith(configurationURI)) {\r
230                         if(selectionURI.equals(configurationURI)) return "Configuration / ";\r
231                         return URIStringUtils.unescape(selectionURI.substring(configurationURI.length() + 1).replace("/", " / ") + " / ");\r
232                 }\r
233         }\r
234         \r
235         String rootURI = graph.getURI(indexRoot);\r
236         String result = selectionURI.replace(rootURI, "");\r
237         if(result.isEmpty()) result = "/";\r
238         \r
239         return URIStringUtils.unescape(result);\r
240         \r
241     }\r
242         \r
243 }\r