diff --git a/sqldev/pom.xml b/sqldev/pom.xml
index 3e5ab63e..a8323126 100644
--- a/sqldev/pom.xml
+++ b/sqldev/pom.xml
@@ -5,7 +5,7 @@
org.utplsql
org.utplsql.sqldev
- 0.4.1-SNAPSHOT
+ 0.5.0-SNAPSHOT
bundle
UTF-8
@@ -95,6 +95,13 @@
system
${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.jar
+
+ oracle
+ oracle.sqldeveloper.utils
+ 12.2.0
+ system
+ ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.utils.jar
+
oracle
oracle.sqldeveloper.worksheet
@@ -417,6 +424,7 @@
oracle.ide,
oracle.ide.db,
oracle.sqldeveloper,
+ oracle.sqldeveloper.utils,
oracle.sqldeveloper.worksheet,
oracle.uic
diff --git a/sqldev/src/main/java/org/utplsql/sqldev/PreferencePanel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/PreferencePanel.xtend
index 5e7cc2d0..e144328b 100644
--- a/sqldev/src/main/java/org/utplsql/sqldev/PreferencePanel.xtend
+++ b/sqldev/src/main/java/org/utplsql/sqldev/PreferencePanel.xtend
@@ -15,21 +15,24 @@
*/
package org.utplsql.sqldev
+import java.awt.event.ActionEvent
+import java.awt.event.ActionListener
+import java.util.Map
import javax.swing.BorderFactory
+import javax.swing.JButton
import javax.swing.JCheckBox
import javax.swing.JPanel
import javax.swing.JSpinner
import javax.swing.JTextField
import javax.swing.SpinnerNumberModel
+import javax.swing.table.DefaultTableModel
+import oracle.dbtools.raptor.templates.CodeTemplateUtil
import oracle.ide.panels.DefaultTraversablePanel
import oracle.ide.panels.TraversableContext
import oracle.ide.panels.TraversalException
import oracle.javatools.ui.layout.FieldLayoutBuilder
import org.utplsql.sqldev.model.preference.PreferenceModel
import org.utplsql.sqldev.resources.UtplsqlResources
-import javax.swing.JButton
-import java.awt.event.ActionEvent
-import java.awt.event.ActionListener
class PreferencePanel extends DefaultTraversablePanel {
val JPanel runTestPanel = new JPanel();
@@ -46,6 +49,8 @@ class PreferencePanel extends DefaultTraversablePanel {
val SpinnerNumberModel numberOfTestsPerUnitModel = new SpinnerNumberModel(1, 1, 10, 1);
val JSpinner numberOfTestsPerUnitSpinner = new JSpinner(numberOfTestsPerUnitModel);
val JCheckBox checkGenerateUtplsqlTestCheckBox = new JCheckBox
+ val DefaultTableModel codeTemplatesModel = new DefaultTableModel(#["Id", "Template"], 0);
+ val JButton createCodeTemplatesButton = new JButton()
val JCheckBox generateCommentsCheckBox = new JCheckBox
val JCheckBox disableTestsCheckBox = new JCheckBox
val JTextField suitePathTextField = new JTextField
@@ -55,7 +60,7 @@ class PreferencePanel extends DefaultTraversablePanel {
val JTextField rootFolderInOddgenViewTextField = new JTextField
val JCheckBox generateFilesCheckBox = new JCheckBox
val JTextField outputDirectoryTextField = new JTextField
- val JButton outputDirectoryBrowse = new JButton();
+ val JButton outputDirectoryBrowse = new JButton()
val JCheckBox deleteExistingFilesCheckBox = new JCheckBox
new() {
@@ -86,6 +91,7 @@ class PreferencePanel extends DefaultTraversablePanel {
generateTestPanel.border = BorderFactory.createTitledBorder(UtplsqlResources.getString("MENU_GENERATE_TEST_LABEL"))
val FieldLayoutBuilder b2 = new FieldLayoutBuilder(generateTestPanel)
b2.alignLabelsLeft = true
+ b2.stretchComponentsWithNoButton = true
b2.add(
b2.field.label.withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL")).component(
testPackagePrefixTextField))
@@ -115,7 +121,8 @@ class PreferencePanel extends DefaultTraversablePanel {
indentSpacesSpinner))
b2.add(
b2.field.label.withText(UtplsqlResources.getString("PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL")).component(
- checkGenerateUtplsqlTestCheckBox))
+ checkGenerateUtplsqlTestCheckBox).button(createCodeTemplatesButton).withText(
+ UtplsqlResources.getString("PREF_CREATE_CODE_TEMPLATES_BUTTON_LABEL")))
// oddgen group
oddgenPanel.border = BorderFactory.createTitledBorder("oddgen")
val FieldLayoutBuilder b3 = new FieldLayoutBuilder(oddgenPanel)
@@ -129,7 +136,8 @@ class PreferencePanel extends DefaultTraversablePanel {
generateFilesCheckBox))
b3.add(
b3.field.label.withText(UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL")).component(
- outputDirectoryTextField).button(outputDirectoryBrowse).withText("Bro&wse"))
+ outputDirectoryTextField).button(outputDirectoryBrowse).withText(
+ UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_BUTTON_LABEL")))
b3.add(
b3.field.label.withText(UtplsqlResources.getString("PREF_DELETE_EXISTING_FILES_LABEL")).component(
deleteExistingFilesCheckBox))
@@ -142,6 +150,14 @@ class PreferencePanel extends DefaultTraversablePanel {
builder.addVerticalField("", oddgenPanel)
builder.addVerticalSpring
+ // register action listener for create code template button
+ createCodeTemplatesButton.addActionListener(new ActionListener() {
+ override actionPerformed(ActionEvent event) {
+ saveCodeTemplates
+ }
+
+ })
+
// register action listener for directory chooser
outputDirectoryBrowse.addActionListener(new ActionListener() {
override actionPerformed(ActionEvent event) {
@@ -150,6 +166,98 @@ class PreferencePanel extends DefaultTraversablePanel {
}
})
}
+
+ private def loadCodeTemplates() {
+ val Map map = CodeTemplateUtil.loadFiles()
+ for (key : map.keySet) {
+ codeTemplatesModel.addRow(#[key, map.get(key)])
+ }
+ }
+
+ private def saveCodeTemplates() {
+ codeTemplatesModel.addRow(#["ut_spec", utSpecTemplate.replaceTabsWithSpaces])
+ codeTemplatesModel.addRow(#["ut_spec_proc", utSpecProcTemplate.replaceTabsWithSpaces.trimPlusNewLine])
+ codeTemplatesModel.addRow(#["ut_body", utBodyTemplate.replaceTabsWithSpaces])
+ codeTemplatesModel.addRow(#["ut_body_proc", utBodyProcTemplate.replaceTabsWithSpaces.trimPlusNewLine])
+ CodeTemplateUtil.save(codeTemplatesModel)
+ }
+
+ private def replaceTabsWithSpaces(CharSequence input) {
+ val spaces = String.format("%1$"+indentSpacesSpinner.value+"s", "")
+ return input.toString.replace("\t", spaces)
+ }
+
+ private def trimPlusNewLine(String input) {
+ input.trim + System.lineSeparator
+ }
+
+ private def utSpecTemplate() '''
+ CREATE OR REPLACE PACKAGE «testPackagePrefixTextField.text»[package_name]«testPackageSuffixTextField.text» IS
+
+ --%suite
+ «IF !suitePathTextField.text.empty»
+ --%suitepath(«suitePathTextField.text»)
+ «ENDIF»
+
+ «utSpecProcTemplate»
+ END «testPackagePrefixTextField.text»[package_name]«testPackageSuffixTextField.text»;
+ /
+ '''
+
+ private def utSpecProcTemplate() '''
+ «val withContext = numberOfTestsPerUnitModel.value as Integer > 1»
+ «IF withContext»
+ --%context([procedure_name])
+
+ «ENDIF»
+ «FOR i : 1 .. numberOfTestsPerUnitModel.value as Integer»
+ --%test
+ «IF disableTestsCheckBox.selected»
+ --%disabled
+ «ENDIF»
+ PROCEDURE «testUnitPrefixTextField.text»[procedure_name]«testUnitSuffixTextField.text»«IF withContext»«i»«ENDIF»;
+
+ «ENDFOR»
+ «IF withContext»
+ --%endcontext
+
+ «ENDIF»
+ '''
+
+ private def utBodyTemplate() '''
+ CREATE OR REPLACE PACKAGE BODY «testPackagePrefixTextField.text»[package_name]«testPackageSuffixTextField.text» IS
+
+ «utBodyProcTemplate»
+ END «testPackagePrefixTextField.text»[package_name]«testPackageSuffixTextField.text»;
+ /
+ '''
+
+ private def utBodyProcTemplate() '''
+ «val withContext = numberOfTestsPerUnitModel.value as Integer > 1»
+ «FOR i : 1 .. numberOfTestsPerUnitModel.value as Integer»
+ «IF generateCommentsCheckBox.selected»
+ --
+ -- test«IF withContext» [procedure_name] case «i»: ...«ENDIF»
+ --
+ «ENDIF»
+ PROCEDURE «testUnitPrefixTextField.text»[procedure_name]«testUnitSuffixTextField.text»«IF withContext»«i»«ENDIF» IS
+ l_actual INTEGER := 0;
+ l_expected INTEGER := 1;
+ BEGIN
+ «IF generateCommentsCheckBox.selected»
+ -- populate actual
+ -- ...
+
+ -- populate expected
+ -- ...
+
+ -- assert
+ «ENDIF»
+ ut.expect(l_actual).to_equal(l_expected);
+ END «testUnitPrefixTextField.text»[procedure_name]«testUnitSuffixTextField.text»«IF withContext»«i»«ENDIF»;
+
+ «ENDFOR»
+ '''
override onEntry(TraversableContext traversableContext) {
var PreferenceModel info = traversableContext.userInformation
@@ -164,6 +272,7 @@ class PreferencePanel extends DefaultTraversablePanel {
testUnitSuffixTextField.text = info.testUnitSuffix
numberOfTestsPerUnitSpinner.value = info.numberOfTestsPerUnit
checkGenerateUtplsqlTestCheckBox.selected = info.checkGenerateUtplsqlTest
+ loadCodeTemplates
generateCommentsCheckBox.selected = info.generateComments
disableTestsCheckBox.selected = info.disableTests
suitePathTextField.text = info.suitePath
diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties
index 803f6ec4..b2f157c0 100644
--- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties
+++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties
@@ -23,9 +23,11 @@ PREF_DISABLE_TESTS_LABEL=Disable tests?
PREF_SUITE_PATH_LABEL=Suite path
PREF_INDENT_SPACES_LABEL=Indent spaces
PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL=Check availability of "Generate utPLSQL test" menu option?
+PREF_CREATE_CODE_TEMPLATES_BUTTON_LABEL=Create code templates
PREF_ROOT_FOLDER_IN_ODDGEN_VIEW_LABEL=Root folder in Generators view
PREF_GENERATE_FILES_LABEL=Generate files?
PREF_OUTPUT_DIRECTORY_LABEL=Output directory
+PREF_OUTPUT_DIRECTORY_BUTTON_LABEL=Browse
PREF_DELETE_EXISTING_FILES_LABEL=Delete existing files in output directory?
MENU_RUN_TEST_LABEL=Run utPLSQL test
MENU_GENERATE_TEST_LABEL=Generate utPLSQL test
diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties
index 9ea32746..347b238e 100644
--- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties
+++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties
@@ -17,9 +17,11 @@ PREF_DISABLE_TESTS_LABEL=Tests deaktivieren?
PREF_SUITE_PATH_LABEL=Suite Path
PREF_INDENT_SPACES_LABEL=Einr�ckungsleerzeichen
PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL=Verf�gbarkeit der Men�option "utPLSQL Test generieren" pr�fen?
+PREF_CREATE_CODE_TEMPLATES_BUTTON_LABEL=Codevorlagen erstellen
PREF_ROOT_FOLDER_IN_ODDGEN_VIEW_LABEL=Hauptverzeichnis in Generatoren Ansicht
PREF_GENERATE_FILES_LABEL=Dateien generieren?
PREF_OUTPUT_DIRECTORY_LABEL=Ausgabeverzeichnis
+PREF_OUTPUT_DIRECTORY_BUTTON_LABEL=Ausw�hlen
PREF_DELETE_EXISTING_FILES_LABEL=Bestehende Dateien im Ausgabeverzeichnis l�schen?
MENU_RUN_TEST_LABEL=utPLSQL Test ausf�hren
MENU_GENERATE_TEST_LABEL=utPLSQL Test generieren