]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.linking.ui/src/org/simantics/document/linking/report/html/HTMLDocument.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.document.linking.ui / src / org / simantics / document / linking / report / html / HTMLDocument.java
1 package org.simantics.document.linking.report.html;\r
2 \r
3 import java.io.File;\r
4 import java.io.IOException;\r
5 import java.io.PrintStream;\r
6 import java.net.URL;\r
7 import java.net.URLDecoder;\r
8 import java.util.HashMap;\r
9 import java.util.Map;\r
10 \r
11 import org.eclipse.core.runtime.FileLocator;\r
12 import org.eclipse.core.runtime.Path;\r
13 import org.eclipse.core.runtime.Platform;\r
14 import org.osgi.framework.Bundle;\r
15 import org.simantics.document.linking.Activator;\r
16 import org.simantics.document.linking.report.Document;\r
17 import org.simantics.document.linking.report.DocumentElement;\r
18 import org.simantics.document.linking.report.DocumentItem;\r
19 import org.simantics.document.linking.report.DocumentTitlePage;\r
20 import org.simantics.document.linking.report.Table;\r
21 import org.simantics.document.linking.report.TableOfContents;\r
22 import org.simantics.document.linking.report.TextItem;\r
23 import org.simantics.document.linking.report.URLItem;\r
24 import org.simantics.document.linking.report.base.TextItemImpl;\r
25 import org.simantics.utils.datastructures.Arrays;\r
26 \r
27 \r
28 /**\r
29  * HTML format reporter.\r
30  * \r
31  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
32  *\r
33  */\r
34 public class HTMLDocument extends HTMLStreamElement implements Document {\r
35         \r
36         \r
37         boolean referCSS = false;  // if true, generated report refers to bas css in the plug-in. Otherwise the base css's contents are copied to report file.\r
38         \r
39         int currentPage = 0;\r
40         int currentLine = 1;\r
41 \r
42         HTMLStreamElement content;\r
43         \r
44         private Map<Class<? extends HTMLElement>, Integer> uniqueIndex = new HashMap<Class<? extends HTMLElement>, Integer>();\r
45         \r
46         \r
47         @Override\r
48         public String getId() {\r
49                 return null;\r
50         }\r
51         \r
52         public HTMLDocument(File file) throws Exception {\r
53                 super(file);\r
54                 content = new HTMLStreamElement(this);\r
55         }\r
56         \r
57         String getUniqueId(Class<? extends HTMLElement> cls) {\r
58                 Integer index = uniqueIndex.get(cls);\r
59                 if (index == null)\r
60                         index = 1;\r
61                 else\r
62                         index = index + 1;\r
63                 uniqueIndex.put(cls,index);\r
64                 \r
65                 return cls.getSimpleName() +"_"+index;\r
66         }\r
67         String getUniqueId(HTMLElement element) {\r
68                 Class<? extends HTMLElement> cls = element.getClass();\r
69                 return getUniqueId(cls);\r
70         }\r
71         \r
72         private static String getDataUrl() throws IOException {\r
73                  Bundle b = Platform.getBundle(Activator.PLUGIN_ID);\r
74                  URL dataUrl = FileLocator.find(b, new Path("report"), null);\r
75                  URL fileUrl = FileLocator.toFileURL(dataUrl);\r
76                  return URLDecoder.decode(fileUrl.getPath(), "UTF-8"); \r
77         }\r
78         \r
79         private void copyBaseCSS(String cssUrl) throws Exception {\r
80                 File f = new File(URLDecoder.decode(cssUrl, "UTF-8")).getAbsoluteFile();\r
81                 copyData(f, os);\r
82         }\r
83 \r
84         \r
85         private void header() throws Exception {\r
86                 PrintStream resultOs = os;\r
87                 String cssUrl = getDataUrl() +"/report.css";\r
88                 resultOs.println("<!DOCTYPE html>");\r
89                 resultOs.println("<html lang=\"en\">");\r
90                 resultOs.println("<head>");\r
91                 resultOs.println("  <meta charset=\"utf-8\">");\r
92                 resultOs.println("  <title>Report</title>");\r
93                 if (referCSS)\r
94                         resultOs.println("  <link rel=\"stylesheet\" href=\"" + cssUrl + "\" type=\"text/css\">");\r
95                 resultOs.println("  <style>");\r
96                 if (!referCSS) {\r
97                         copyBaseCSS(cssUrl);\r
98                 }\r
99                 \r
100                 resultOs.println("  </style>");\r
101                 resultOs.println("</head>");\r
102                 resultOs.println("<body>");\r
103         }\r
104 \r
105         private void footer() throws Exception{\r
106                 if (currentTable != null)\r
107                         currentTable.endTable();\r
108                 if (toc != null)\r
109                         toc.close();\r
110                 content.close();\r
111                 PrintStream resultOs = os;\r
112                 resultOs.println("</body>");\r
113                 resultOs.println("</html>");\r
114         }\r
115         \r
116         @Override\r
117         public void close() throws Exception {\r
118                 footer();\r
119                 super.close();\r
120         }\r
121         \r
122 \r
123         @Override\r
124         public int getCurrentLine() {\r
125                 return currentLine;\r
126         }\r
127         \r
128         @Override\r
129         public int getAvailableLines() {\r
130                 return Integer.MAX_VALUE;\r
131         }\r
132         \r
133         @Override\r
134         public void nextPage() throws Exception {\r
135                 if (currentPage == 0)\r
136                         header();       \r
137                 currentPage++;\r
138                 currentLine = 1;\r
139         }\r
140         \r
141         @SuppressWarnings("unchecked")\r
142         @Override\r
143         public <T extends DocumentElement> T newElement(Class<T> cls,String...options) throws Exception {\r
144                 if (cls == Table.class) {\r
145                         return (T)newTable(Arrays.contains(options, Document.TOC));\r
146                 } else if (cls == TableOfContents.class) {\r
147                         return (T)getOrCreateToc();\r
148                 } else if (cls == DocumentTitlePage.class) {\r
149                         if (titlePage != null)\r
150                                 throw new Exception("Document many have only one title page");\r
151                         titlePage = new HTMLTitlePage(this);\r
152                         return (T)titlePage;\r
153                 }\r
154                 return null;\r
155         }\r
156         \r
157         @SuppressWarnings("unchecked")\r
158         @Override\r
159         public <T extends DocumentElement> T nextElement(Class<T> cls,String...options) throws Exception {\r
160                 if (cls == Table.class) {\r
161                         return (T)nextTable(Arrays.contains(options, Document.TOC));\r
162                 } else if (cls == TableOfContents.class) {\r
163                         return (T)getOrCreateToc();\r
164                 }\r
165                 return null;\r
166         }\r
167         \r
168         @SuppressWarnings("unchecked")\r
169         @Override\r
170         public <T extends DocumentElement> T getCurrentElement(Class<T> cls) {\r
171                 if (cls == Table.class) {\r
172                         return (T)getCurrentTable();\r
173                 } else if (cls == TableOfContents.class) {\r
174                         return (T)toc;\r
175                 } else if (cls == DocumentTitlePage.class) {\r
176                         return (T)titlePage;\r
177                 }\r
178                 return null;\r
179         }\r
180         \r
181         @SuppressWarnings("unchecked")\r
182         @Override\r
183         public <T extends DocumentItem> T newItem(Class<T> cls, String... options)\r
184                         throws Exception {\r
185                 if (cls == TextItem.class)\r
186                         return (T)new TextItemImpl();\r
187                 if (cls == URLItem.class)\r
188                         return (T)new HTMLURLItemImpl();\r
189                 return null;\r
190         }\r
191         \r
192         private HTMLTable currentTable;\r
193         \r
194         \r
195         public Table nextTable(boolean id) throws Exception {\r
196                 if (currentTable != null) {\r
197                         currentTable.endTable();\r
198                         currentTable = new HTMLTable(currentTable,id);\r
199                         return currentTable;\r
200                 } else {\r
201                         return currentTable;\r
202                 }\r
203                 \r
204         }\r
205         \r
206         \r
207         public Table newTable(boolean id) throws Exception {\r
208                 if (currentTable != null) {\r
209                         currentTable.endTable();\r
210                 }\r
211                 currentTable = new HTMLTable(this,content.os,id);\r
212                 return currentTable;\r
213         }\r
214         \r
215         \r
216         public Table getCurrentTable() {\r
217                 return currentTable;\r
218         }\r
219         \r
220         HTMLTocElement toc;\r
221         \r
222         public TableOfContents getOrCreateToc() throws Exception{\r
223                 if (toc == null) {\r
224                         toc = new HTMLTocElement(this);\r
225                 }\r
226                 return toc;\r
227         }\r
228         \r
229         HTMLTitlePage titlePage;\r
230 \r
231 }\r