--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2012 Association for Decentralized Information Management in\r
+ * Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.document;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.util.URIStringUtils;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.RequestProcessor;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Session;\r
+import org.simantics.db.VirtualGraph;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.common.request.PossibleIndexRoot;\r
+import org.simantics.db.common.request.ResourceRead;\r
+import org.simantics.db.common.request.UniqueRead;\r
+import org.simantics.db.common.request.WriteResultRequest;\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.variable.Variable;\r
+import org.simantics.db.layer0.variable.Variables;\r
+import org.simantics.document.function.WikiDocumentNodeImpl;\r
+import org.simantics.document.node.Composite;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.scenegraph.loader.ScenegraphLoaderProcess;\r
+import org.simantics.scenegraph.loader.ScenegraphLoaderUtils;\r
+import org.simantics.scenegraph.loader.ScenegraphVariable;\r
+import org.simantics.scenegraph.ontology.ScenegraphResources;\r
+import org.simantics.simulation.ontology.SimulationResource;\r
+import org.simantics.wiki.ui.SimanticsDialect;\r
+\r
+import com.lowagie.text.Document;\r
+import com.lowagie.text.DocumentException;\r
+import com.lowagie.text.pdf.PdfWriter;\r
+\r
+public class DocumentUtils {\r
+\r
+ static class DeepDocs extends ResourceRead<List<Resource>> {\r
+\r
+ protected DeepDocs(Resource resource) {\r
+ super(resource);\r
+ }\r
+\r
+ @Override\r
+ public List<Resource> perform(ReadGraph graph) throws DatabaseException {\r
+\r
+ DocumentResource DOC = DocumentResource.getInstance(graph);\r
+ Resource doc = graph.getPossibleObject(resource, DOC.HasDocument);\r
+\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ Collection<Resource> children = graph.getObjects(resource, L0.ConsistsOf);\r
+ if(children.isEmpty()) {\r
+ if(doc != null) return Collections.singletonList(resource);\r
+ else return Collections.emptyList();\r
+ } else {\r
+ ArrayList<Resource> result = new ArrayList<Resource>();\r
+ if(doc != null) result.add(resource);\r
+ for(Resource child : children)\r
+ result.addAll(graph.syncRequest(new DeepDocs(child)));\r
+ return result;\r
+ }\r
+ \r
+ }\r
+ \r
+ }\r
+ \r
+ public DocumentSettings getDocumentSettings(RequestProcessor processor, final Resource resource) throws DatabaseException {\r
+\r
+ return processor.syncRequest(new ResourceRead<DocumentSettings>(resource) {\r
+\r
+ @Override\r
+ public DocumentSettings perform(ReadGraph graph) throws DatabaseException {\r
+\r
+ Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(resource));\r
+ if(indexRoot == null) return DocumentSettings.DEFAULT;\r
+ \r
+ DocumentResource DOC = DocumentResource.getInstance(graph);\r
+ DocumentSettings result = graph.getPossibleRelatedValue(indexRoot, DOC.documentSettings, DocumentSettings.BINDING);\r
+ if(result == null) return DocumentSettings.DEFAULT;\r
+ return result;\r
+ \r
+ }\r
+ \r
+ });\r
+\r
+ }\r
+\r
+ public void getDocumentCSSText(RequestProcessor processor, final Resource resource, final StringBuilder css) throws DatabaseException {\r
+\r
+ css.append(processor.sync(new ResourceRead<String>(resource) {\r
+\r
+ @Override\r
+ public String perform(ReadGraph graph) throws DatabaseException {\r
+\r
+ Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(resource));\r
+ if(indexRoot == null) return "";\r
+ \r
+ DocumentResource DOC = DocumentResource.getInstance(graph);\r
+ String css = graph.getPossibleRelatedValue(indexRoot, DOC.cssDocument, Bindings.STRING);\r
+ if(css == null) return "";\r
+ \r
+ return css;\r
+ \r
+ }\r
+ \r
+ }));\r
+\r
+ }\r
+\r
+ public void getDocumentWikiTextRecursive(Session session, final Resource resource, final StringBuilder wiki, final StringBuilder css) throws DatabaseException {\r
+\r
+ List<Resource> rs = session.sync(new DeepDocs(resource));\r
+ for(Resource r : rs) {\r
+ getDocumentWikiText(session, r, wiki);\r
+ }\r
+ \r
+ getDocumentCSSText(session, resource, css);\r
+ \r
+ }\r
+\r
+ public void getDocumentWikiText(Session session, final Resource resource, final StringBuilder b) {\r
+ \r
+ try {\r
+\r
+ final ScenegraphLoaderProcess loader = new ScenegraphLoaderProcess(new Composite(), "CreatePDFAction");\r
+ \r
+ final Variable context = session.sync(new WriteResultRequest<Variable>(session.getService(VirtualGraph.class)) {\r
+\r
+ @Override\r
+ public Variable perform(WriteGraph graph) throws DatabaseException {\r
+\r
+ DocumentResource DOC = DocumentResource.getInstance(graph);\r
+ Resource doc = graph.getPossibleObject(resource, DOC.HasDocument);\r
+ if(doc == null) return null;\r
+\r
+ Layer0 L0 = Layer0.getInstance(graph);\r
+ ScenegraphResources SG = ScenegraphResources.getInstance(graph);\r
+ Resource runtime = graph.newResource();\r
+ graph.claim(runtime, L0.InstanceOf, null, SG.Runtime);\r
+ Variable base = Variables.getVariable(graph, resource);\r
+\r
+ String uri = base.getURI(graph);\r
+ graph.claimLiteral(runtime, SG.Runtime_HasVariable, uri, Bindings.STRING);\r
+\r
+ return new ScenegraphVariable(base, doc, runtime, loader.getRoot());\r
+\r
+ }\r
+\r
+ });\r
+ \r
+ if(context == null) return;\r
+\r
+ String wiki = session.sync(new UniqueRead<String>() {\r
+\r
+ @Override\r
+ public String perform(ReadGraph graph) throws DatabaseException {\r
+\r
+ DocumentResource DOC = DocumentResource.getInstance(graph);\r
+ Resource doc = graph.getSingleObject(resource, DOC.HasDocumentation);\r
+ Resource scenegraph = graph.getSingleObject(doc, DOC.ScenegraphDocument_scenegraph);\r
+ \r
+ WikiDocumentNodeImpl node = loader.load(graph, scenegraph, ScenegraphLoaderUtils.getRuntime(graph, context));\r
+\r
+ StringBuilder b = new StringBuilder();\r
+ node.create(b, true);\r
+ \r
+ String text = b.toString();\r
+ \r
+ return SimanticsDialect.INSTANCE.apply(graph, Variables.getVariable(graph, resource), text);\r
+ \r
+ }\r
+\r
+ });\r
+ \r
+ loader.dispose();\r
+\r
+ b.append(wiki);\r
+ \r
+ } catch (DatabaseException e) {\r
+ e.printStackTrace();\r
+ }\r
+ } \r
+\r
+ public void print(RequestProcessor processor, Resource res, String wiki, String css, DocumentSettings settings, final PdfWriter writer, final Document document) throws DocumentException {\r
+ try {\r
+ Exportable exp = processor.syncRequest(new UniqueRead<Exportable>() {\r
+\r
+ @Override\r
+ public Exportable perform(ReadGraph graph) throws DatabaseException {\r
+ return new Exportable(graph, res, wiki, css, settings, true);\r
+ }\r
+ \r
+ });\r
+ exp.export(document, writer);\r
+ } catch (DocumentException e) {\r
+ Logger.defaultLogError(e);\r
+ } catch (DatabaseException e) {\r
+ Logger.defaultLogError(e);\r
+ }\r
+ }\r
+\r
+ public static String indexRootPath(ReadGraph graph, Variable selection) throws DatabaseException {\r
+ \r
+ Variable possibleConfiguration = Variables.getPossibleConfigurationVariable(graph, selection);\r
+ if(possibleConfiguration != null) selection = possibleConfiguration;\r
+ \r
+ Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(selection.getRepresents(graph)));\r
+ if(indexRoot == null) return "";\r
+\r
+ String selectionURI = selection.getParent(graph).getURI(graph);\r
+\r
+ SimulationResource SIMU = SimulationResource.getInstance(graph);\r
+ Resource configuration = graph.getPossibleObject(indexRoot, SIMU.HasConfiguration);\r
+ if(configuration != null) {\r
+ String configurationURI = graph.getURI(configuration);\r
+ if(selectionURI.startsWith(configurationURI)) {\r
+ if(selectionURI.equals(configurationURI)) return "Configuration / ";\r
+ return URIStringUtils.unescape(selectionURI.substring(configurationURI.length() + 1).replace("/", " / ") + " / ");\r
+ }\r
+ }\r
+ \r
+ String rootURI = graph.getURI(indexRoot);\r
+ String result = selectionURI.replace(rootURI, "");\r
+ if(result.isEmpty()) result = "/";\r
+ \r
+ return URIStringUtils.unescape(result);\r
+ \r
+ }\r
+ \r
+}\r