Skip to content

Commit 17ce4c0

Browse files
add asynchronous code coverage report in new DB connection
1 parent 880a53d commit 17ce4c0

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.utplsql.sqldev
2+
3+
import java.awt.Desktop
4+
import java.io.File
5+
import java.net.URL
6+
import java.nio.charset.StandardCharsets
7+
import java.nio.file.Files
8+
import java.nio.file.Paths
9+
import java.sql.Connection
10+
import java.util.List
11+
import java.util.logging.Logger
12+
import oracle.dbtools.raptor.utils.Connections
13+
import org.utplsql.sqldev.dal.UtplsqlDao
14+
15+
class CodeCoverageReporter {
16+
static val Logger logger = Logger.getLogger(CodeCoverageReporter.name);
17+
18+
var Connection conn
19+
var List<String> pathList
20+
21+
new(List<String> pathList, String connectionName) {
22+
this.pathList = pathList
23+
setConnection(connectionName)
24+
}
25+
26+
private def setConnection(String connectionName) {
27+
if (connectionName === null) {
28+
throw new RuntimeException("Cannot initialize a CodeCoverageReporter without a ConnectionName")
29+
} else {
30+
// must be closed manually
31+
this.conn = Connections.instance.cloneConnection(Connections.instance.getConnection(connectionName))
32+
}
33+
}
34+
35+
private def run() {
36+
try {
37+
logger.fine('''Running code coverage reporter for «pathList»...''')
38+
val dal = new UtplsqlDao(conn)
39+
val content = dal.htmlCodeCoverage(pathList)
40+
val file = File.createTempFile("utplsql_", "html")
41+
logger.fine('''Writing result to «file.absolutePath»...''')
42+
Files.write(Paths.get(file.absolutePath), content.split(System.lineSeparator), StandardCharsets.UTF_8);
43+
val url = file.toURI().toURL().toExternalForm()
44+
logger.fine('''Opening «url» in browser...''')
45+
val Desktop desktop = if (Desktop.isDesktopSupported()) {Desktop.getDesktop()} else {null}
46+
if (desktop !== null && desktop.isSupported(Desktop.Action.BROWSE) && url !== null) {
47+
desktop.browse((new URL(url)).toURI)
48+
logger.fine(url + " opened in browser.");
49+
} else {
50+
logger.severe('''Could not launch «file» in browser. No default browser defined on this system.''')
51+
}
52+
} catch (Exception e) {
53+
logger.severe('''Error when running code coverage: «e?.message»''')
54+
}
55+
finally {
56+
conn.close
57+
}
58+
}
59+
60+
def runAsync() {
61+
val Runnable runnable = [|run]
62+
val thread = new Thread(runnable)
63+
thread.name = "code coverage reporter"
64+
thread.start
65+
}
66+
67+
}

0 commit comments

Comments
 (0)