Skip to content

Commit 8370478

Browse files
convert UtplsqlWorksheetRunner to Java
1 parent 2bccdc7 commit 8370478

1 file changed

Lines changed: 139 additions & 100 deletions

File tree

sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java

Lines changed: 139 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -13,116 +13,155 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.utplsql.sqldev.runner
16+
package org.utplsql.sqldev.runner;
1717

18-
import java.util.List
19-
import java.util.logging.Logger
20-
import javax.swing.JSplitPane
21-
import oracle.dbtools.raptor.utils.Connections
22-
import oracle.dbtools.worksheet.editor.OpenWorksheetWizard
23-
import oracle.dbtools.worksheet.editor.Worksheet
24-
import oracle.dbtools.worksheet.utils.WorksheetUtil
25-
import oracle.ide.Ide
26-
import oracle.ide.config.Preferences
27-
import oracle.ide.controller.IdeAction
28-
import org.utplsql.sqldev.model.preference.PreferenceModel
29-
import org.utplsql.sqldev.resources.UtplsqlResources
18+
import java.awt.Container;
19+
import java.util.List;
20+
import java.util.logging.Logger;
3021

31-
class UtplsqlWorksheetRunner {
32-
static val Logger logger = Logger.getLogger(UtplsqlWorksheetRunner.name);
22+
import javax.swing.JSplitPane;
3323

34-
var PreferenceModel preferences
35-
var String connectionName
36-
var List<String> pathList
24+
import org.utplsql.sqldev.exception.GenericDatabaseAccessException;
25+
import org.utplsql.sqldev.model.StringTools;
26+
import org.utplsql.sqldev.model.preference.PreferenceModel;
27+
import org.utplsql.sqldev.resources.UtplsqlResources;
3728

38-
new(List<String> pathList, String connectionName) {
39-
this.pathList = pathList
40-
this.preferences = PreferenceModel.getInstance(Preferences.preferences);
41-
setConnection(connectionName)
42-
}
29+
import oracle.dbtools.raptor.utils.Connections;
30+
import oracle.dbtools.worksheet.WorksheetResultPanel;
31+
import oracle.dbtools.worksheet.editor.OpenWorksheetWizard;
32+
import oracle.dbtools.worksheet.editor.Worksheet;
33+
import oracle.dbtools.worksheet.utils.WorksheetUtil;
34+
import oracle.ide.Ide;
35+
import oracle.ide.config.Preferences;
36+
import oracle.ide.controller.IdeAction;
37+
import oracle.jdeveloper.db.ConnectionException;
4338

44-
private def setConnection(String connectionName) {
45-
if (connectionName !== null && preferences.unsharedWorksheet) {
46-
// fix for issue #47 - private connections are not closed in SQLDev >= 17.4.0
47-
try {
48-
// temporary connection is closed when worksheet is closed, but requires SQLDev >= 17.4.0
49-
this.connectionName = Connections.instance.createTemporaryConnection(connectionName)
50-
} catch (Throwable e) {
51-
// private connection is closed when worksheet is closed in SQLDev < 17.4.0
52-
this.connectionName = Connections.instance.createPrivateConnection(connectionName)
53-
}
54-
} else {
55-
this.connectionName = connectionName;
56-
}
57-
}
58-
59-
private def getCode() '''
60-
«IF preferences.resetPackage»
61-
EXECUTE dbms_session.reset_package;
62-
«ENDIF»
63-
SET SERVEROUTPUT ON SIZE UNLIMITED
64-
«IF preferences.clearScreen»
65-
CLEAR SCREEN
66-
«ENDIF»
67-
«val paths = pathList»
68-
«IF paths.size == 1»
69-
EXECUTE ut.run('«paths.get(0)»');
70-
«ELSE»
71-
EXECUTE ut.run(ut_varchar2_listFOR path : paths SEPARATOR ', '»'«path»'«ENDFOR»));
72-
«ENDIF»
73-
'''
39+
public class UtplsqlWorksheetRunner {
40+
private static final Logger logger = Logger.getLogger(UtplsqlWorksheetRunner.class.getName());
7441

75-
private def openWorksheet() {
76-
val worksheet = OpenWorksheetWizard.openNewTempWorksheet(connectionName, code.toString) as Worksheet
77-
if (connectionName === null) {
78-
worksheet.comboConnection = null
79-
}
80-
WorksheetUtil.setWorksheetTabName(worksheet.context.node.URL, UtplsqlResources.getString("WORKSHEET_TITLE"))
81-
worksheet.context.node.markDirty(false)
82-
return worksheet
83-
}
42+
private PreferenceModel preferences;
43+
private String connectionName;
44+
private List<String> pathList;
8445

85-
private def resizeResultPanel(Worksheet worksheet) {
86-
Thread.sleep(200) // give script runner time to initiate result panel
87-
val splitPane = worksheet.selectedResultPanel?.GUI?.parent?.parent?.parent
88-
if (splitPane instanceof JSplitPane) {
89-
splitPane.dividerLocation = 0.15 // 15% for Worksheet, 85% for Script Output
90-
} else {
91-
logger.
92-
severe('''Could not adjust size of worksheet. Expected JSplitPane but got «splitPane?.class?.name».''')
93-
}
94-
}
46+
public UtplsqlWorksheetRunner(final List<String> pathList, final String connectionName) {
47+
this.pathList = pathList;
48+
preferences = PreferenceModel.getInstance(Preferences.getPreferences());
49+
setConnection(connectionName);
50+
}
9551

96-
private def runScript(Worksheet worksheet) {
97-
if (preferences.autoExecute) {
98-
Thread.sleep(100) // give worksheet time to initialize
99-
val action = Ide.getIdeActionMap.get(Ide.findCmdID("Worksheet.RunScript")) as IdeAction
100-
if (action !== null) {
101-
action.performAction(worksheet.context)
102-
worksheet.resizeResultPanel
103-
}
104-
}
105-
}
52+
private void setConnection(final String connectionName) {
53+
if (connectionName != null && preferences.isUnsharedWorksheet()) {
54+
// fix for issue #47 - private connections are not closed in SQLDev >= 17.4.0
55+
try {
56+
this.connectionName = Connections.getInstance().createTemporaryConnection(connectionName);
57+
} catch (Throwable t) {
58+
// private connection is closed when worksheet is closed in SQLDev < 17.4.0
59+
try {
60+
this.connectionName = Connections.getInstance().createPrivateConnection(connectionName);
61+
} catch (ConnectionException e) {
62+
final String msg = "failed to create private connection due to " + e.getMessage();
63+
logger.severe(() -> msg);
64+
throw new GenericDatabaseAccessException(msg, e);
65+
}
66+
}
67+
} else {
68+
this.connectionName = connectionName;
69+
}
70+
}
10671

107-
private def runTest() {
108-
val worksheet = openWorksheet
109-
worksheet.runScript
110-
logger.fine('''utPLSQL test called for «pathList» in «connectionName».''')
111-
}
72+
private CharSequence getCode() {
73+
StringBuilder sb = new StringBuilder();
74+
if (preferences.isResetPackage()) {
75+
sb.append("EXECUTE dbms_session.reset_package;\n");
76+
}
77+
sb.append("SET SERVEROUTPUT ON SIZE UNLIMITED\n");
78+
if (preferences.isClearScreen()) {
79+
sb.append("CLEAR SCREEN\n");
80+
}
81+
final List<String> paths = pathList;
82+
if (paths.size() == 1) {
83+
sb.append("EXECUTE ut.run('");
84+
sb.append(paths.get(0));
85+
sb.append("');\n");
86+
} else {
87+
// we want a horizontal dense output because we resize the worksheet to fit the command in common cases
88+
sb.append("EXECUTE ut.run(ut_varchar2_list(");
89+
sb.append(StringTools.getCSV(pathList, "").replace("\n",""));
90+
sb.append("));\n");
91+
}
92+
return sb;
93+
}
11294

113-
def runTestAsync() {
114-
val Runnable runnable = [|runTest]
115-
val thread = new Thread(runnable)
116-
thread.name = "utPLSQL run test"
117-
thread.start
118-
}
95+
private Worksheet openWorksheet() {
96+
final Worksheet worksheet = (Worksheet) OpenWorksheetWizard.openNewTempWorksheet(connectionName,
97+
getCode().toString());
98+
if (connectionName == null) {
99+
worksheet.setComboConnection(null);
100+
}
101+
WorksheetUtil.setWorksheetTabName(worksheet.getContext().getNode().getURL(),
102+
UtplsqlResources.getString("WORKSHEET_TITLE"));
103+
worksheet.getContext().getNode().markDirty(false);
104+
return worksheet;
105+
}
106+
107+
private void sleep(int millis) {
108+
try {
109+
Thread.sleep(millis);
110+
} catch (InterruptedException e) {
111+
Thread.currentThread().interrupt();
112+
}
113+
}
119114

120-
static def 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-
}
115+
private void resizeResultPanel(final Worksheet worksheet) {
116+
sleep(200);
117+
Container splitPane = null;
118+
WorksheetResultPanel selectedResultPanel = worksheet.getSelectedResultPanel();
119+
if (selectedResultPanel != null && selectedResultPanel.getGUI() != null && selectedResultPanel.getGUI().getParent() != null
120+
&& selectedResultPanel.getGUI().getParent().getParent() != null && selectedResultPanel.getGUI().getParent().getParent().getParent() != null) {
121+
splitPane = selectedResultPanel.getGUI().getParent().getParent().getParent();
122+
}
123+
if ((splitPane instanceof JSplitPane)) {
124+
((JSplitPane) splitPane).setDividerLocation(0.15);
125+
} else {
126+
final String msg = "Could not adjust size of worksheet. Expected JSplitPane but got "
127+
+ (splitPane != null ? splitPane.getClass().getName() : "null") + ".";
128+
logger.severe(msg);
129+
}
130+
}
127131

132+
private void runScript(final Worksheet worksheet) {
133+
if (preferences.isAutoExecute()) {
134+
sleep(100);
135+
final IdeAction action = ((IdeAction) Ide.getIdeActionMap().get(Ide.findCmdID("Worksheet.RunScript")));
136+
if ((action != null)) {
137+
try {
138+
action.performAction(worksheet.getContext());
139+
} catch (Exception e) {
140+
logger.severe(() -> "Could not run script due to " + (e != null ? e.getMessage() : "???") + ".");
141+
}
142+
resizeResultPanel(worksheet);
143+
}
144+
}
145+
}
146+
147+
private void runTest() {
148+
final Worksheet worksheet = openWorksheet();
149+
runScript(worksheet);
150+
logger.fine(() -> "utPLSQL test called for " + pathList + " in " + connectionName + ".");
151+
}
152+
153+
public void runTestAsync() {
154+
final Thread thread = new Thread(() -> runTest());
155+
thread.setName("utPLSQL run test");
156+
thread.start();
157+
}
158+
159+
public static void openWithCode(final String code, final String connectionName) {
160+
final Worksheet worksheet = (Worksheet) OpenWorksheetWizard.openNewTempWorksheet(connectionName, code);
161+
if (connectionName == null) {
162+
worksheet.setComboConnection(null);
163+
}
164+
WorksheetUtil.setWorksheetTabName(worksheet.getContext().getNode().getURL(),
165+
UtplsqlResources.getString("WORKSHEET_TITLE"));
166+
}
128167
}

0 commit comments

Comments
 (0)