Skip to content

Commit 863d0f6

Browse files
add test runner view
1 parent 256e1db commit 863d0f6

File tree

5 files changed

+234
-8
lines changed

5 files changed

+234
-8
lines changed

sqldev/extension.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@
8888
</composite-rule>
8989
</rules>
9090
<triggers>
91+
<dockable-factory-hook xmlns="http://xmlns.oracle.com/ide/extension">
92+
<factory id="UTPLSQL_RUNNER_FACTORY" class="org.utplsql.sqldev.ui.runner.RunnerFactory" />
93+
</dockable-factory-hook>
9194
<actions xmlns="http://xmlns.oracle.com/jdeveloper/1013/extension">
9295
<action id="utplsql.test">
9396
<properties>
@@ -164,4 +167,11 @@
164167
</settings-ui-hook>
165168
</triggers>
166169
</trigger-hooks>
170+
171+
<hooks>
172+
<dockable-hook xmlns="http://xmlns.oracle.com/ide/extension">
173+
<dockable id="UTPLSQL_RUNNER_VIEW" />
174+
</dockable-hook>
175+
</hooks>
176+
167177
</extension>

sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.xtend

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@ import oracle.ide.controller.Controller
3737
import oracle.ide.controller.IdeAction
3838
import oracle.ide.editor.Editor
3939
import org.utplsql.sqldev.coverage.CodeCoverageReporter
40+
import org.utplsql.sqldev.dal.RealtimeReporterDao
4041
import org.utplsql.sqldev.dal.UtplsqlDao
4142
import org.utplsql.sqldev.model.URLTools
4243
import org.utplsql.sqldev.model.oddgen.GenContext
4344
import org.utplsql.sqldev.model.preference.PreferenceModel
4445
import org.utplsql.sqldev.oddgen.TestTemplate
4546
import org.utplsql.sqldev.parser.UtplsqlParser
47+
import org.utplsql.sqldev.runner.UtplsqlRunner
4648
import org.utplsql.sqldev.runner.UtplsqlWorksheetRunner
4749

4850
class UtplsqlController implements Controller {
@@ -197,7 +199,7 @@ class UtplsqlController implements Controller {
197199
set.add(path)
198200
}
199201
val ret = new ArrayList<String>
200-
val p = Pattern.compile("((((\\w+)\\.)?\\w+)\\.)?\\w+")
202+
val p = Pattern.compile("(((([^\\.]+)\\.)?[^\\.]+)\\.)?[^\\.]+")
201203
for (path : set) {
202204
val m = p.matcher(path)
203205
if (m.matches()) {
@@ -264,6 +266,7 @@ class UtplsqlController implements Controller {
264266
def runTest(Context context) {
265267
val view = context.view
266268
val node = context.node
269+
val preferences = PreferenceModel.getInstance(Preferences.preferences)
267270
logger.finer('''Run utPLSQL from view «view?.class?.name» and node «node?.class?.name».''')
268271
if (view instanceof Editor) {
269272
val component = view.defaultFocusComponent
@@ -278,20 +281,35 @@ class UtplsqlController implements Controller {
278281
}
279282
logger.fine('''connectionName: «connectionName»''')
280283
// issue 59 - always use a connection to ensure the utPL/SQL annotation API is used
281-
val parser = new UtplsqlParser(component.text, Connections.instance.getConnection(connectionName), owner)
284+
val conn = Connections.instance.getConnection(connectionName)
285+
val parser = new UtplsqlParser(component.text, conn, owner)
282286
val position = component.caretPosition
283287
val path = parser.getPathAt(position)
284-
val utPlsqlWorksheet = new UtplsqlWorksheetRunner(path.pathList, connectionName)
285-
utPlsqlWorksheet.runTestAsync
288+
val rrDao = new RealtimeReporterDao(conn)
289+
if (preferences.useRealtimeReporter && rrDao.supported) {
290+
val runner = new UtplsqlRunner(path.pathList, connectionName)
291+
runner.runTestAsync
292+
293+
} else {
294+
val worksheet = new UtplsqlWorksheetRunner(path.pathList, connectionName)
295+
worksheet.runTestAsync
296+
}
286297
}
287298
} else if (view instanceof DBNavigatorWindow) {
288299
val url=context.URL
289300
if (url !== null) {
290301
val connectionName = url.connectionName
291302
logger.fine('''connectionName: «connectionName»''')
303+
val conn = Connections.instance.getConnection(connectionName)
304+
val rrDao = new RealtimeReporterDao(conn)
292305
val pathList=context.pathList.dedupPathList
293-
val utPlsqlWorksheet = new UtplsqlWorksheetRunner(pathList, connectionName)
294-
utPlsqlWorksheet.runTestAsync
306+
if (preferences.useRealtimeReporter && rrDao.supported) {
307+
val runner = new UtplsqlRunner(pathList, connectionName)
308+
runner.runTestAsync
309+
} else {
310+
val worksheet = new UtplsqlWorksheetRunner(pathList, connectionName)
311+
worksheet.runTestAsync
312+
}
295313
}
296314
}
297315
}

sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,38 @@
1616
package org.utplsql.sqldev.runner
1717

1818
import java.sql.Connection
19+
import java.text.SimpleDateFormat
20+
import java.util.Date
1921
import java.util.List
2022
import java.util.UUID
2123
import java.util.logging.Logger
2224
import oracle.dbtools.raptor.utils.Connections
2325
import org.utplsql.sqldev.dal.RealtimeReporterDao
2426
import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer
27+
import org.utplsql.sqldev.model.runner.PostRunEvent
28+
import org.utplsql.sqldev.model.runner.PostSuiteEvent
29+
import org.utplsql.sqldev.model.runner.PostTestEvent
30+
import org.utplsql.sqldev.model.runner.PreRunEvent
31+
import org.utplsql.sqldev.model.runner.PreSuiteEvent
32+
import org.utplsql.sqldev.model.runner.PreTestEvent
2533
import org.utplsql.sqldev.model.runner.RealtimeReporterEvent
34+
import org.utplsql.sqldev.model.runner.Run
35+
import org.utplsql.sqldev.resources.UtplsqlResources
36+
import org.utplsql.sqldev.ui.runner.RunnerFactory
37+
import org.utplsql.sqldev.ui.runner.RunnerPanel
38+
import org.utplsql.sqldev.ui.runner.RunnerView
2639

2740
class UtplsqlRunner implements RealtimeReporterEventConsumer {
2841

2942
static val Logger logger = Logger.getLogger(UtplsqlRunner.name);
3043

3144
var List<String> pathList
45+
var String connectionName
3246
var Connection producerConn
3347
var Connection consumerConn
3448
val String reporterId = UUID.randomUUID().toString.replace("-", "")
49+
var Run run
50+
var RunnerPanel panel
3551
var Thread producerThread
3652
var Thread consumerThread
3753

@@ -56,6 +72,7 @@ class UtplsqlRunner implements RealtimeReporterEventConsumer {
5672
this.producerConn = Connections.instance.cloneConnection(Connections.instance.getConnection(connectionName))
5773
this.consumerConn = Connections.instance.cloneConnection(Connections.instance.getConnection(connectionName))
5874
}
75+
this.connectionName = connectionName
5976
}
6077

6178
def dispose() {
@@ -65,6 +82,80 @@ class UtplsqlRunner implements RealtimeReporterEventConsumer {
6582

6683
override void process(RealtimeReporterEvent event) {
6784
logger.fine(event.toString)
85+
event.doProcess
86+
}
87+
88+
private def getSysdate() {
89+
val dateTime = new Date(System.currentTimeMillis);
90+
val df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'000'");
91+
return df.format(dateTime)
92+
93+
}
94+
95+
private def dispatch doProcess(PreRunEvent event) {
96+
run = new Run(reporterId, connectionName)
97+
run.startTime = sysdate
98+
run.counter.disabled = 0
99+
run.counter.success = 0
100+
run.counter.failure = 0
101+
run.counter.error = 0
102+
run.counter.warning = 0
103+
run.totalNumberOfTests = event.totalNumberOfTests
104+
run.put(event.items)
105+
panel.model = run
106+
panel.status = UtplsqlResources.getString("RUNNER_INITIALIZING_TEXT")
107+
panel.updateCounter
108+
109+
}
110+
111+
private def dispatch doProcess(PostRunEvent event) {
112+
run.startTime = event.startTime
113+
run.endTime = event.endTime
114+
run.executionTime = event.executionTime
115+
run.counter = event.counter
116+
run.errorStack = event.errorStack
117+
run.serverOutput = event.serverOutput
118+
panel.status = String.format(UtplsqlResources.getString("RUNNER_FINNISHED_TEXT"), event.executionTime)
119+
panel.updateCounter
120+
}
121+
122+
private def dispatch doProcess(PreSuiteEvent event) {
123+
// ignore
124+
}
125+
126+
private def dispatch doProcess(PostSuiteEvent event) {
127+
// ignore
128+
}
129+
130+
private def dispatch doProcess(PreTestEvent event) {
131+
val test = run.getTest(event.id)
132+
if (test === null) {
133+
logger.severe('''Could not find test id "«event.id»" when processing PreTestEvent «event.toString».''')
134+
} else {
135+
test.startTime = sysdate
136+
}
137+
panel.status = '''«event.id»'''
138+
panel.updateCounter
139+
}
140+
141+
private def dispatch doProcess(PostTestEvent event) {
142+
val test = run.getTest(event.id)
143+
if (test === null) {
144+
logger.severe('''Could not find test id "«event.id»"" when processing PostTestEvent «event.toString».''')
145+
} else {
146+
test.startTime = event.startTime
147+
test.endTime = event.endTime
148+
test.executionTime = event.executionTime
149+
test.counter = event.counter
150+
test.errorStack = event.errorStack
151+
test.serverOutput = event.serverOutput
152+
}
153+
run.counter.disabled = run.counter.disabled + event.counter.disabled
154+
run.counter.success = run.counter.success + event.counter.success
155+
run.counter.failure = run.counter.failure + event.counter.failure
156+
run.counter.error = run.counter.error + event.counter.error
157+
run.counter.warning = run.counter.warning + event.counter.warning
158+
panel.updateCounter
68159
}
69160

70161
private def void produce() {
@@ -89,7 +180,11 @@ class UtplsqlRunner implements RealtimeReporterEventConsumer {
89180
}
90181
}
91182

92-
def runAsync() {
183+
def runTestAsync() {
184+
// show dockable
185+
val dockable = RunnerFactory.dockable as RunnerView
186+
RunnerFactory.showDockable;
187+
panel = dockable?.runnerPanel
93188
// the producer
94189
val Runnable producer = [|produce]
95190
producerThread = new Thread(producer)
@@ -109,5 +204,5 @@ class UtplsqlRunner implements RealtimeReporterEventConsumer {
109204
def getConsumerThread() {
110205
return consumerThread
111206
}
112-
207+
113208
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright 2019 Philipp Salvisberg <philipp.salvisberg@trivadis.com>
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.utplsql.sqldev.ui.runner
17+
18+
import oracle.ide.docking.DockStation
19+
import oracle.ide.docking.DockableFactory
20+
import oracle.ide.docking.DockingParam
21+
import oracle.ide.layout.ViewId
22+
23+
class RunnerFactory implements DockableFactory {
24+
public static val FACTORY_NAME = "UTPLSQL_RUNNER_FACTORY"
25+
26+
var RunnerView dockable
27+
28+
override install() {
29+
val dockStation = DockStation.getDockStation();
30+
val dp = new DockingParam();
31+
val referencedViewId = new ViewId("DatabaseNavigatorWindow", "DatabaseNavigatorWindow")
32+
val referencedDockable = dockStation.findDockable(referencedViewId)
33+
dp.tabbedWith = referencedDockable
34+
dockStation.dock(getLocalDockable(), dp);
35+
}
36+
37+
override getDockable(ViewId viewId) {
38+
if (viewId === RunnerView.VIEW_ID) {
39+
return localDockable
40+
}
41+
return null
42+
}
43+
44+
private def getLocalDockable() {
45+
if (dockable === null) {
46+
dockable = new RunnerView
47+
}
48+
return dockable
49+
}
50+
51+
static def getDockable() {
52+
val dockStation = DockStation.dockStation
53+
val dockable = dockStation.findDockable(RunnerView.VIEW_ID)
54+
return dockable as RunnerView
55+
}
56+
57+
static def void showDockable() {
58+
val dockStation = DockStation.dockStation
59+
dockStation.setDockableVisible(getDockable(), true)
60+
}
61+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright 2019 Philipp Salvisberg <philipp.salvisberg@trivadis.com>
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.utplsql.sqldev.ui.runner
17+
18+
import oracle.ide.docking.DockableWindow
19+
import oracle.ide.layout.ViewId
20+
import org.utplsql.sqldev.resources.UtplsqlResources
21+
22+
class RunnerView extends DockableWindow {
23+
static val VIEW_NAME = "UTPLSQL_RUNNER_VIEW"
24+
public static val ViewId VIEW_ID = new ViewId(RunnerFactory.FACTORY_NAME, VIEW_NAME)
25+
var RunnerPanel panel
26+
27+
override getTitleName() {
28+
return UtplsqlResources.getString("RUNNER_VIEW_TITLE")
29+
}
30+
31+
override getGUI() {
32+
if (panel === null) {
33+
panel = new RunnerPanel
34+
}
35+
return panel.getGUI()
36+
}
37+
38+
def getRunnerPanel() {
39+
getGUI()
40+
return panel
41+
}
42+
}

0 commit comments

Comments
 (0)