]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.debug.browser/src/org/simantics/debug/browser/sections/RawStatementsSection.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.debug.browser / src / org / simantics / debug / browser / sections / RawStatementsSection.java
1 /*******************************************************************************\r
2  * Copyright (c) 2016 Association for Decentralized Information Management\r
3  * in 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  *     THTH ry - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.debug.browser.sections;\r
13 \r
14 import gnu.trove.map.hash.THashMap;\r
15 import gnu.trove.map.hash.TObjectIntHashMap;\r
16 \r
17 import java.io.PrintWriter;\r
18 import java.util.ArrayList;\r
19 import java.util.Collection;\r
20 import java.util.Collections;\r
21 import java.util.Comparator;\r
22 import java.util.Map;\r
23 \r
24 import org.simantics.db.ReadGraph;\r
25 import org.simantics.db.Resource;\r
26 import org.simantics.db.Statement;\r
27 import org.simantics.db.exception.DatabaseException;\r
28 import org.simantics.debug.browser.utils.ResourceInfo;\r
29 import org.simantics.debug.browser.utils.StatementInfo;\r
30 import org.simantics.layer0.Layer0;\r
31 \r
32 public class RawStatementsSection implements ResourceBrowserSection {\r
33     public Resource resource;\r
34     public THashMap<Resource, ArrayList<Statement>> statementsByPredicates =\r
35             new THashMap<Resource, ArrayList<Statement>>();\r
36 \r
37     @Override\r
38     public double getPriority() {\r
39         return 100.0;\r
40     }\r
41 \r
42     @Override\r
43     public void toHtml(ReadGraph graph, PrintWriter out) throws DatabaseException {\r
44         THashMap<Resource, THashMap<Resource, ArrayList<Statement>>> predicateClassification = \r
45                 new THashMap<Resource, THashMap<Resource, ArrayList<Statement>>>();\r
46         \r
47         Layer0 L0 = Layer0.getInstance(graph);\r
48         for(Map.Entry<Resource, ArrayList<Statement>> entry\r
49                 : statementsByPredicates.entrySet()) {\r
50             Resource domain = getDomain(graph, L0, resource, entry.getKey());\r
51             THashMap<Resource, ArrayList<Statement>> map = predicateClassification.get(domain);\r
52             if(map == null) {\r
53                 map = new THashMap<Resource, ArrayList<Statement>>();\r
54                 predicateClassification.put(domain, map);\r
55             }\r
56             map.put(entry.getKey(), entry.getValue());\r
57         }\r
58         \r
59         ArrayList<Resource> domains = new ArrayList<Resource>(predicateClassification.keySet());\r
60         Collections.sort(domains, new TypeComparator(graph, L0));\r
61         \r
62         for(Resource domain : domains) {\r
63             out.println("<h2>" + new ResourceInfo(graph, domain) + "</h2>");\r
64             generateStatementTable(graph, out, predicateClassification.get(domain));\r
65         }\r
66     }\r
67     \r
68     private static class TypeComparator implements Comparator<Resource> {\r
69         private final ReadGraph graph;\r
70         private final Layer0 L0;\r
71         private TObjectIntHashMap<Resource> depthCache = new TObjectIntHashMap<Resource>();\r
72         \r
73         public TypeComparator(ReadGraph graph, Layer0 L0) {\r
74             this.graph = graph;\r
75             this.L0 = L0;\r
76             depthCache.put(L0.Entity, 0);\r
77         }\r
78 \r
79         private int depth(Resource type) {\r
80             if(depthCache.containsKey(type))\r
81                 return depthCache.get(type);\r
82             \r
83             depthCache.put(type, 0); // loop guard\r
84             try {\r
85                 int depth = 0;\r
86                 for(Resource superType : graph.getObjects(type, L0.Inherits))\r
87                     depth = Math.max(depth, depth(superType));\r
88                 ++depth;\r
89                 depthCache.put(type, depth);\r
90                 return depth;\r
91             } catch(DatabaseException e) {\r
92                 e.printStackTrace();\r
93                 return 0;\r
94             }\r
95         }\r
96         \r
97         @Override\r
98         public int compare(Resource type1, Resource type2) {\r
99             return Integer.compare(depth(type2), depth(type1));\r
100         }\r
101     }\r
102     \r
103     public void generateStatementTable(ReadGraph graph, PrintWriter out,\r
104             THashMap<Resource, ArrayList<Statement>> statementsByPredicates) \r
105                     throws DatabaseException {\r
106         ArrayList<ResourceInfo> predicateInfos = new ArrayList<ResourceInfo>(statementsByPredicates.size());\r
107         for(Resource predicate : statementsByPredicates.keySet())\r
108             predicateInfos.add(new ResourceInfo(graph, predicate));\r
109         Collections.sort(predicateInfos);\r
110 \r
111         if (!predicateInfos.isEmpty()) {\r
112             out.println("<div id=\"rawStatementContent\">");\r
113             out.println("<table>");\r
114             out.println("<tr><th>Predicate</th><th>Object</th><th>Notes</th></tr>");\r
115             for(ResourceInfo predicateInfo : predicateInfos) {\r
116                 ArrayList<Statement> statements = statementsByPredicates.get(predicateInfo.resource);\r
117                 ArrayList<StatementInfo> statementInfos = new ArrayList<StatementInfo>(statements.size());\r
118                 for(Statement statement : statements)\r
119                     statementInfos.add(new StatementInfo(graph, resource, statement));\r
120                 Collections.sort(statementInfos);\r
121                 \r
122                 boolean first = true;\r
123                 for(StatementInfo statementInfo : statementInfos) {\r
124                     out.println("\t<tr>");\r
125                     if(first) {\r
126                         out.println("\t\t<td rowspan=\""+statementInfos.size()+"\">" + predicateInfo + "</td>");\r
127                         first = false;\r
128                     }\r
129                     out.print("\t\t<td");\r
130                     if (statementInfo.subject != null)\r
131                         out.print(" class=\"asserted\"");\r
132                     out.print(">" + statementInfo.object);\r
133                     if(statementInfo.objectTypes != null) {\r
134                         out.print("<span class=\"resourceType\"> : ");\r
135                         for(int i=0;i<statementInfo.objectTypes.length;++i) {\r
136                             if(i > 0)\r
137                                 out.print(", ");\r
138                             out.print(statementInfo.objectTypes[i]);\r
139                         }\r
140                         out.print("</span>");\r
141                     }\r
142                     out.println("</td>");\r
143                     if(statementInfo.graph != null || statementInfo.subject != null) {\r
144                         out.print("\t\t<td>");\r
145                         if(statementInfo.graph != null)\r
146                             out.print(" from graph " + statementInfo.graph);\r
147                         if(statementInfo.subject != null)\r
148                             out.print(" from type " + statementInfo.subject);\r
149                         out.println("</td>");\r
150                     }\r
151                     out.println("\t</tr>");\r
152                 }\r
153             }\r
154             out.println("</table>");\r
155             out.println("</div>");\r
156         }\r
157     }\r
158     \r
159     public static Resource getDomain(ReadGraph graph, Layer0 L0, Resource subject, Resource predicate) throws DatabaseException {\r
160         Collection<Resource> domains = graph.getObjects(predicate, L0.HasDomain);\r
161         switch(domains.size()) {\r
162         case 0: return L0.Entity;\r
163         case 1: return domains.iterator().next();\r
164         }\r
165         \r
166         for(Resource domain : domains)\r
167             if(graph.isInstanceOf(subject, domain))\r
168                 return domain;\r
169 \r
170         return domains.iterator().next();\r
171     }\r
172 \r
173     /*\r
174         out.println("<div id=\"rawStatementContent\">");\r
175         out.println("<script type=\"text/javascript\">");\r
176         out.println("$(document).ready(function() {");\r
177         out.println("\t$('#rawStatementContent').html( '<table id=\"rawStatementTable\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"tablesorter dataTables\"></table>' );");\r
178         out.println("\tvar oTable = $('#rawStatementTable')");\r
179         out.println("\t\t.dataTable({");\r
180         out.println("\t\t\t\"stateSave\": true,");\r
181         out.println("\t\t\t\"jQueryUI\": true,");\r
182         out.println("\t\t\t\"paging\": false,");\r
183         out.println("\t\t\t\"pagingType\": \"full_numbers\",");\r
184         out.println("\t\t\t\"filter\": true,");\r
185         out.println("\t\t\t\"info\": true,");\r
186         //out.println("\t\t\t\"dom\": '<\"H\"lr>t<\"F\"ip>',");\r
187 \r
188         out.println("\t\t\t\"data\" : [");\r
189         for (Statement stm : statements) {\r
190             out.println("\t\t\t\t[");\r
191             out.println("\t\t\t\t\t'" + toLinkedLabel(graph, stm.getSubject()) + "',");\r
192             out.println("\t\t\t\t\t'" + toLinkedLabel(graph, stm.getPredicate()) + "',");\r
193             out.println("\t\t\t\t\t'" + toLinkedLabel(graph, stm.getObject()) + "'");\r
194             out.println("\t\t\t\t],");\r
195         }\r
196         out.println("\t\t\t],");\r
197 \r
198         out.println("\t\t\t\"columns\": [");\r
199         out.println("\t\t\t\t{ \"sTitle\" : \"Subject\", \"sClass\": \"result\" },");\r
200         out.println("\t\t\t\t{ \"sTitle\" : \"Predicate\", \"sClass\": \"result\" },");\r
201         out.println("\t\t\t\t{ \"sTitle\" : \"Object\", \"sClass\": \"result\" }");\r
202         out.println("\t\t\t],");\r
203 \r
204         out.println("\t\t\t\"oLanguage\": {");\r
205         out.println("\t\t\t\t\"oPaginate\": {");\r
206         out.println("\t\t\t\t\t\"sPrevious\": \"<\",");\r
207         out.println("\t\t\t\t\t\"sNext\": \">\",");\r
208         out.println("\t\t\t\t\t\"sLast\": \">>\",");\r
209         out.println("\t\t\t\t\t\"sFirst\": \"<<\"");\r
210         out.println("\t\t\t\t},");\r
211         out.println("\t\t\t\t\"sSearch\": \"Filter:\"");\r
212         out.println("\t\t\t},");\r
213 \r
214         out.println("\t\t\t\"oSearch\": {");\r
215         out.println("\t\t\t\t\"sSearch\": \"\"");\r
216         out.println("\t\t\t}");\r
217 \r
218         out.println("\t\t});");\r
219         out.println("\t});");\r
220         out.println("</script>");\r
221         out.println("</div>");\r
222      */\r
223 }\r