Skip to content

Commit 577cf23

Browse files
Merge pull request #27 from PhilippSalvisberg/develop
Generate utPLSQL test
2 parents f48e6b4 + ed2077a commit 577cf23

20 files changed

+1277
-65
lines changed

sqldev/extension.xml

+50-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
<param name="element-class" value="oracle.dbtools.raptor.navigator.impl.ChildObjectElement" />
4747
</parameters>
4848
</rule>
49-
<composite-rule id="dbnode-is-utplsql-ready">
49+
<composite-rule id="dbnode-is-test-ready">
5050
<or>
5151
<rule-reference id="dbnode-is-db-connection" />
5252
<rule-reference id="dbnode-is-otheruser" />
@@ -56,6 +56,36 @@
5656
<rule-reference id="dbnode-is-member" />
5757
</or>
5858
</composite-rule>
59+
<rule id="dbnode-is-type" type="dbnode-has-object-type">
60+
<parameters>
61+
<param name="ObjectType" value="TYPE" />
62+
</parameters>
63+
</rule>
64+
<rule id="dbnode-is-type-body" type="dbnode-has-object-type">
65+
<parameters>
66+
<param name="ObjectType" value="TYPE BODY" />
67+
</parameters>
68+
</rule>
69+
<rule id="dbnode-is-function" type="dbnode-has-object-type">
70+
<parameters>
71+
<param name="ObjectType" value="FUNCTION" />
72+
</parameters>
73+
</rule>
74+
<rule id="dbnode-is-procedure" type="dbnode-has-object-type">
75+
<parameters>
76+
<param name="ObjectType" value="PROCEDURE" />
77+
</parameters>
78+
</rule>
79+
<composite-rule id="dbnode-is-generate-ready">
80+
<or>
81+
<rule-reference id="dbnode-is-package" />
82+
<rule-reference id="dbnode-is-package-body" />
83+
<rule-reference id="dbnode-is-type" />
84+
<rule-reference id="dbnode-is-type-body" />
85+
<rule-reference id="dbnode-is-function" />
86+
<rule-reference id="dbnode-is-procedure" />
87+
</or>
88+
</composite-rule>
5989
</rules>
6090
<triggers>
6191
<actions xmlns="http://xmlns.oracle.com/jdeveloper/1013/extension">
@@ -66,12 +96,20 @@
6696
<property name="Category">Code-Editor</property>
6797
</properties>
6898
</action>
99+
<action id="utplsql.generate">
100+
<properties>
101+
<property name="Name">${MENU_GENERATE_TEST_LABEL}</property>
102+
<property name="SmallIcon">res:/org/utplsql/sqldev/resources/images/oddgen.png</property>
103+
<property name="Category">Code-Editor</property>
104+
</properties>
105+
</action>
69106
</actions>
70107
<controllers xmlns="http://xmlns.oracle.com/ide/extension">
71108
<controller class="org.utplsql.sqldev.menu.UtplsqlController">
72109
<update-rules>
73110
<update-rule rule="always-enabled">
74111
<action id="utplsql.test" />
112+
<action id="utplsql.generate" />
75113
</update-rule>
76114
</update-rules>
77115
</controller>
@@ -82,10 +120,11 @@
82120
<section xmlns="http://jcp.org/jsr/198/extension-manifest"
83121
id="UTPLSQL_MENU" weight="2.0">
84122
<item action-ref="utplsql.test" weight="1.0" />
123+
<item action-ref="utplsql.generate" weight="1.1" />
85124
</section>
86125
</menu>
87126
</context-menu-hook>
88-
<context-menu-hook rule="dbnode-is-utplsql-ready">
127+
<context-menu-hook rule="dbnode-is-test-ready">
89128
<site idref="db_nav" />
90129
<menu>
91130
<section xmlns="http://jcp.org/jsr/198/extension-manifest"
@@ -94,6 +133,15 @@
94133
</section>
95134
</menu>
96135
</context-menu-hook>
136+
<context-menu-hook rule="dbnode-is-generate-ready">
137+
<site idref="db_nav" />
138+
<menu>
139+
<section xmlns="http://jcp.org/jsr/198/extension-manifest"
140+
id="UTPLSQL_MENU" weight="2.0">
141+
<item action-ref="utplsql.generate" weight="12.2" />
142+
</section>
143+
</menu>
144+
</context-menu-hook>
97145
<accelerator-hook>
98146
<file>org/utplsql/sqldev/resources/accelerators.xml</file>
99147
</accelerator-hook>

sqldev/pom.xml

+6
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,12 @@
157157
<artifactId>spring-jdbc</artifactId>
158158
<version>5.1.0.RELEASE</version>
159159
</dependency>
160+
<dependency>
161+
<groupId>org.oddgen</groupId>
162+
<artifactId>org.oddgen.sqldev</artifactId>
163+
<version>0.3.0</version>
164+
<scope>provided</scope>
165+
</dependency>
160166
<dependency>
161167
<groupId>junit</groupId>
162168
<artifactId>junit</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2018 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
17+
18+
import java.io.File
19+
import java.util.logging.Logger
20+
import javax.swing.JComboBox
21+
import javax.swing.JFileChooser
22+
import javax.swing.JFrame
23+
import javax.swing.JTextField
24+
25+
class DirectoryChooser {
26+
val static Logger logger = Logger.getLogger(DirectoryChooser.name)
27+
28+
def static choose (JFrame parentFrame, String title, String initialDirectory) {
29+
logger.finest('''parantFrame: «parentFrame»''')
30+
var String ret = null
31+
val chooser = new JFileChooser()
32+
chooser.currentDirectory = new File(initialDirectory)
33+
chooser.dialogTitle = title
34+
chooser.fileSelectionMode = JFileChooser.DIRECTORIES_ONLY
35+
chooser.acceptAllFileFilterUsed = false
36+
if (chooser.showOpenDialog(parentFrame) == JFileChooser.APPROVE_OPTION) {
37+
ret = chooser.selectedFile.absolutePath
38+
}
39+
return ret
40+
}
41+
42+
def static void choose (JFrame parentFrame, String title, JTextField textField) {
43+
val dir = choose(parentFrame, title, textField.text)
44+
if (dir !== null) {
45+
textField.text = dir
46+
}
47+
}
48+
49+
def static void choose (JFrame parentFrame, String title, JComboBox<String> comboBox) {
50+
val dir = choose(parentFrame, title, comboBox.editor.item as String);
51+
if (dir !== null) {
52+
comboBox.editor.item = dir
53+
}
54+
}
55+
56+
}

sqldev/src/main/java/org/utplsql/sqldev/PreferencePanel.xtend

+130-12
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,136 @@
1515
*/
1616
package org.utplsql.sqldev
1717

18+
import javax.swing.BorderFactory
1819
import javax.swing.JCheckBox
20+
import javax.swing.JPanel
21+
import javax.swing.JSpinner
22+
import javax.swing.JTextField
23+
import javax.swing.SpinnerNumberModel
1924
import oracle.ide.panels.DefaultTraversablePanel
2025
import oracle.ide.panels.TraversableContext
2126
import oracle.ide.panels.TraversalException
2227
import oracle.javatools.ui.layout.FieldLayoutBuilder
2328
import org.utplsql.sqldev.model.preference.PreferenceModel
2429
import org.utplsql.sqldev.resources.UtplsqlResources
30+
import javax.swing.JButton
31+
import java.awt.event.ActionEvent
32+
import java.awt.event.ActionListener
2533

2634
class PreferencePanel extends DefaultTraversablePanel {
35+
val JPanel runTestPanel = new JPanel();
2736
val JCheckBox unsharedWorksheetCheckBox = new JCheckBox
2837
val JCheckBox resetPackageCheckBox = new JCheckBox
2938
val JCheckBox clearScreenCheckBox = new JCheckBox
3039
val JCheckBox autoExecuteCheckBox = new JCheckBox
3140
val JCheckBox checkRunUtplsqlTestCheckBox = new JCheckBox
41+
val JPanel generateTestPanel = new JPanel();
42+
val JTextField testPackagePrefixTextField = new JTextField
43+
val JTextField testPackageSuffixTextField = new JTextField
44+
val JTextField testUnitPrefixTextField = new JTextField
45+
val JTextField testUnitSuffixTextField = new JTextField
46+
val SpinnerNumberModel numberOfTestsPerUnitModel = new SpinnerNumberModel(1, 1, 10, 1);
47+
val JSpinner numberOfTestsPerUnitSpinner = new JSpinner(numberOfTestsPerUnitModel);
48+
val JCheckBox checkGenerateUtplsqlTestCheckBox = new JCheckBox
49+
val JCheckBox generateCommentsCheckBox = new JCheckBox
50+
val JCheckBox disableTestsCheckBox = new JCheckBox
51+
val JTextField suitePathTextField = new JTextField
52+
val SpinnerNumberModel indentSpacesModel = new SpinnerNumberModel(1, 1, 8, 1);
53+
val JSpinner indentSpacesSpinner = new JSpinner(indentSpacesModel);
54+
val JPanel oddgenPanel = new JPanel();
55+
val JTextField rootFolderInOddgenViewTextField = new JTextField
56+
val JCheckBox generateFilesCheckBox = new JCheckBox
57+
val JTextField outputDirectoryTextField = new JTextField
58+
val JButton outputDirectoryBrowse = new JButton();
3259

3360
new() {
3461
layoutControls()
3562
}
3663

3764
def private layoutControls() {
38-
val FieldLayoutBuilder builder = new FieldLayoutBuilder(this)
39-
builder.alignLabelsLeft = true
40-
builder.add(
41-
builder.field.label.withText(UtplsqlResources.getString("PREF_UNSHARED_WORKSHEET_LABEL")).component(
65+
// run test group
66+
runTestPanel.border = BorderFactory.createTitledBorder(UtplsqlResources.getString("MENU_RUN_TEST_LABEL"))
67+
val FieldLayoutBuilder b1 = new FieldLayoutBuilder(runTestPanel)
68+
b1.alignLabelsLeft = true
69+
b1.add(
70+
b1.field.label.withText(UtplsqlResources.getString("PREF_UNSHARED_WORKSHEET_LABEL")).component(
4271
unsharedWorksheetCheckBox))
43-
builder.add(
44-
builder.field.label.withText(UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL")).component(
72+
b1.add(
73+
b1.field.label.withText(UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL")).component(
4574
resetPackageCheckBox))
46-
builder.add(
47-
builder.field.label.withText(UtplsqlResources.getString("PREF_CLEAR_SCREEN_LABEL")).component(
75+
b1.add(
76+
b1.field.label.withText(UtplsqlResources.getString("PREF_CLEAR_SCREEN_LABEL")).component(
4877
clearScreenCheckBox))
49-
builder.add(
50-
builder.field.label.withText(UtplsqlResources.getString("PREF_AUTO_EXECUTE_LABEL")).component(
78+
b1.add(
79+
b1.field.label.withText(UtplsqlResources.getString("PREF_AUTO_EXECUTE_LABEL")).component(
5180
autoExecuteCheckBox))
52-
builder.add(
53-
builder.field.label.withText(UtplsqlResources.getString("PREF_CHECK_RUN_UTPLSQL_TEST_LABEL")).component(
81+
b1.add(
82+
b1.field.label.withText(UtplsqlResources.getString("PREF_CHECK_RUN_UTPLSQL_TEST_LABEL")).component(
5483
checkRunUtplsqlTestCheckBox))
84+
// generate test group
85+
generateTestPanel.border = BorderFactory.createTitledBorder(UtplsqlResources.getString("MENU_GENERATE_TEST_LABEL"))
86+
val FieldLayoutBuilder b2 = new FieldLayoutBuilder(generateTestPanel)
87+
b2.alignLabelsLeft = true
88+
b2.add(
89+
b2.field.label.withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL")).component(
90+
testPackagePrefixTextField))
91+
b2.add(
92+
b2.field.label.withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_SUFFIX_LABEL")).component(
93+
testPackageSuffixTextField))
94+
b2.add(
95+
b2.field.label.withText(UtplsqlResources.getString("PREF_TEST_UNIT_PREFIX_LABEL")).component(
96+
testUnitPrefixTextField))
97+
b2.add(
98+
b2.field.label.withText(UtplsqlResources.getString("PREF_TEST_UNIT_SUFFIX_LABEL")).component(
99+
testUnitSuffixTextField))
100+
b2.add(
101+
b2.field.label.withText(UtplsqlResources.getString("PREF_NUMBER_OF_TESTS_PER_UNIT_LABEL")).component(
102+
numberOfTestsPerUnitSpinner))
103+
b2.add(
104+
b2.field.label.withText(UtplsqlResources.getString("PREF_GENERATE_COMMENTS_LABEL")).component(
105+
generateCommentsCheckBox))
106+
b2.add(
107+
b2.field.label.withText(UtplsqlResources.getString("PREF_DISABLE_TESTS_LABEL")).component(
108+
disableTestsCheckBox))
109+
b2.add(
110+
b2.field.label.withText(UtplsqlResources.getString("PREF_SUITE_PATH_LABEL")).component(
111+
suitePathTextField))
112+
b2.add(
113+
b2.field.label.withText(UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL")).component(
114+
indentSpacesSpinner))
115+
b2.add(
116+
b2.field.label.withText(UtplsqlResources.getString("PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL")).component(
117+
checkGenerateUtplsqlTestCheckBox))
118+
// oddgen group
119+
oddgenPanel.border = BorderFactory.createTitledBorder("oddgen")
120+
val FieldLayoutBuilder b3 = new FieldLayoutBuilder(oddgenPanel)
121+
b3.alignLabelsLeft = true
122+
b3.stretchComponentsWithNoButton = true
123+
b3.add(
124+
b3.field.label.withText(UtplsqlResources.getString("PREF_ROOT_FOLDER_IN_ODDGEN_VIEW_LABEL")).component(
125+
rootFolderInOddgenViewTextField))
126+
b3.add(
127+
b3.field.label.withText(UtplsqlResources.getString("PREF_GENERATE_FILES_LABEL")).component(
128+
generateFilesCheckBox))
129+
b3.add(
130+
b3.field.label.withText(UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL")).component(
131+
outputDirectoryTextField).button(outputDirectoryBrowse).withText("Bro&wse"))
132+
133+
// putting everything together
134+
val FieldLayoutBuilder builder = new FieldLayoutBuilder(this)
135+
builder.alignLabelsLeft = true
136+
builder.addVerticalField("", runTestPanel)
137+
builder.addVerticalField("", generateTestPanel)
138+
builder.addVerticalField("", oddgenPanel)
55139
builder.addVerticalSpring
140+
141+
// register action listener for directory chooser
142+
outputDirectoryBrowse.addActionListener(new ActionListener() {
143+
override actionPerformed(ActionEvent event) {
144+
DirectoryChooser.choose(null, UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL"),
145+
outputDirectoryTextField)
146+
}
147+
})
56148
}
57149

58150
override onEntry(TraversableContext traversableContext) {
@@ -62,6 +154,19 @@ class PreferencePanel extends DefaultTraversablePanel {
62154
clearScreenCheckBox.selected = info.clearScreen
63155
autoExecuteCheckBox.selected = info.autoExecute
64156
checkRunUtplsqlTestCheckBox.selected = info.checkRunUtplsqlTest
157+
testPackagePrefixTextField.text = info.testPackagePrefix
158+
testPackageSuffixTextField.text = info.testPackageSuffix
159+
testUnitPrefixTextField.text = info.testUnitPrefix
160+
testUnitSuffixTextField.text = info.testUnitSuffix
161+
numberOfTestsPerUnitSpinner.value = info.numberOfTestsPerUnit
162+
checkGenerateUtplsqlTestCheckBox.selected = info.checkGenerateUtplsqlTest
163+
generateCommentsCheckBox.selected = info.generateComments
164+
disableTestsCheckBox.selected = info.disableTests
165+
suitePathTextField.text = info.suitePath
166+
indentSpacesSpinner.value = info.indentSpaces
167+
rootFolderInOddgenViewTextField.text = info.rootFolderInOddgenView
168+
generateFilesCheckBox.selected = info.generateFiles
169+
outputDirectoryTextField.text = info.outputDirectory
65170
super.onEntry(traversableContext)
66171
}
67172

@@ -72,6 +177,19 @@ class PreferencePanel extends DefaultTraversablePanel {
72177
info.clearScreen = clearScreenCheckBox.selected
73178
info.autoExecute = autoExecuteCheckBox.selected
74179
info.checkRunUtplsqlTest = checkRunUtplsqlTestCheckBox.selected
180+
info.testPackagePrefix = testPackagePrefixTextField.text
181+
info.testPackageSuffix = testPackageSuffixTextField.text
182+
info.testUnitPrefix = testUnitPrefixTextField.text
183+
info.testUnitSuffix = testUnitSuffixTextField.text
184+
info.numberOfTestsPerUnit = numberOfTestsPerUnitSpinner.value as Integer
185+
info.checkGenerateUtplsqlTest = checkGenerateUtplsqlTestCheckBox.selected
186+
info.generateComments = generateCommentsCheckBox.selected
187+
info.disableTests = disableTestsCheckBox.selected
188+
info.suitePath = suitePathTextField.text
189+
info.indentSpaces = indentSpacesSpinner.value as Integer
190+
info.rootFolderInOddgenView = rootFolderInOddgenViewTextField.text
191+
info.generateFiles = generateFilesCheckBox.selected
192+
info.outputDirectory = outputDirectoryTextField.text
75193
super.onExit(traversableContext)
76194
}
77195

sqldev/src/main/java/org/utplsql/sqldev/UtplsqlWorksheet.xtend

+8
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,12 @@ class UtplsqlWorksheet {
117117
thread.start
118118
}
119119
120+
def static void openWithCode(String code, String connectionName) {
121+
val worksheet = OpenWorksheetWizard.openNewTempWorksheet(connectionName, code) as Worksheet
122+
if (connectionName === null) {
123+
worksheet.comboConnection = null
124+
}
125+
WorksheetUtil.setWorksheetTabName(worksheet.context.node.URL, UtplsqlResources.getString("WORKSHEET_TITLE"))
126+
}
127+
120128
}

0 commit comments

Comments
 (0)