From ed54e1e243881eb1ef55fe738f0a78aa03403aff Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 22 May 2020 16:09:02 +0200 Subject: [PATCH 001/286] rename CodeCoverageReporter.xtend to CodeCoverageReporter.java --- .../{CodeCoverageReporter.xtend => CodeCoverageReporter.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/coverage/{CodeCoverageReporter.xtend => CodeCoverageReporter.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.xtend b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java From 78dafee1392b7ae6041a3dd9bee8fdf1a1f5132b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 22 May 2020 16:09:24 +0200 Subject: [PATCH 002/286] convert CodeCoverageReporter to Java --- .../sqldev/coverage/CodeCoverageReporter.java | 293 ++++++++++-------- 1 file changed, 156 insertions(+), 137 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index 1b4acb50..bec577c1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -13,140 +13,159 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.coverage - -import java.awt.Desktop -import java.io.File -import java.net.URL -import java.nio.charset.StandardCharsets -import java.nio.file.Files -import java.nio.file.Paths -import java.sql.Connection -import java.util.ArrayList -import java.util.List -import java.util.logging.Logger -import oracle.dbtools.raptor.utils.Connections -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.ui.coverage.CodeCoverageReporterDialog - -class CodeCoverageReporter { - static val Logger logger = Logger.getLogger(CodeCoverageReporter.name); - - var Connection conn - var List pathList - var List includeObjectList - var CodeCoverageReporterDialog frame - var String schemas - var String includeObjects - var String excludeObjects - - new(List pathList, List includeObjectList, String connectionName) { - this.pathList = pathList - this.includeObjectList = includeObjectList - setConnection(connectionName) - } - - new(List pathList, List includeObjectList, Connection conn) { - this.pathList = pathList - this.includeObjectList = includeObjectList - this.conn = conn - } - - private def setConnection(String connectionName) { - if (connectionName === null) { - throw new RuntimeException("Cannot initialize a CodeCoverageReporter without a ConnectionName") - } else { - // must be closed manually - this.conn = Connections.instance.cloneConnection(Connections.instance.getConnection(connectionName)) - } - } - - private def toStringList(String s) { - val list = new ArrayList - if (s !== null && !s.empty) { - for (item : s.split(",")) { - if (!item.empty) { - list.add(item.trim) - } - } - } - return list - } - - private def void run() { - try { - logger.fine('''Running code coverage reporter for «pathList»...''') - val dal = new UtplsqlDao(conn) - val content = dal.htmlCodeCoverage(pathList, toStringList(schemas), toStringList(includeObjects), toStringList(excludeObjects)) - val file = File.createTempFile("utplsql_", ".html") - logger.fine('''Writing result to «file.absolutePath»...''') - Files.write(Paths.get(file.absolutePath), content.split(System.lineSeparator), StandardCharsets.UTF_8); - val url = file.toURI().toURL().toExternalForm() - logger.fine('''Opening «url» in browser...''') - val Desktop desktop = if (Desktop.isDesktopSupported()) {Desktop.getDesktop()} else {null} - if (desktop !== null && desktop.isSupported(Desktop.Action.BROWSE) && url !== null) { - desktop.browse((new URL(url)).toURI) - logger.fine(url + " opened in browser."); - } else { - logger.severe('''Could not launch «file» in browser. No default browser defined on this system.''') - } - } catch (Exception e) { - logger.severe('''Error when running code coverage: «e?.message»''') - } - finally { - conn.close - if (frame !== null) { - frame.exit - } - } - } - - def setFrame(CodeCoverageReporterDialog frame) { - this.frame = frame; - } - - def getFrame() { - return this.frame - } - - def getConnection() { - return conn - } - - def getPathList() { - return pathList - } - - def getIncludeObjectList() { - if (includeObjectList === null) { - return new ArrayList - } else { - return includeObjectList - } - } - - def setSchemas(String schemas) { - this.schemas = schemas - } - - def setIncludeObjects(String includeObjects) { - this.includeObjects = includeObjects - } - - def setExcludeObjects(String excludeObjects) { - this.excludeObjects = excludeObjects - } - - def Thread runAsync() { - val Runnable runnable = [|run] - val thread = new Thread(runnable) - thread.name = "code coverage reporter" - thread.start - return thread - } - - def showParameterWindow() { - CodeCoverageReporterDialog.createAndShow(this) - } - -} \ No newline at end of file +package org.utplsql.sqldev.coverage; + +import java.awt.Desktop; +import java.io.File; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Logger; + +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.ui.coverage.CodeCoverageReporterDialog; + +import oracle.dbtools.raptor.utils.Connections; +import oracle.javatools.db.DBException; +import oracle.jdeveloper.db.ConnectionException; + +public class CodeCoverageReporter { + private static final Logger logger = Logger.getLogger(CodeCoverageReporter.class.getName()); + + private Connection conn; + private List pathList; + private List includeObjectList; + private CodeCoverageReporterDialog frame; + private String schemas; + private String includeObjects; + private String excludeObjects; + + public CodeCoverageReporter(final List pathList, final List includeObjectList, + final String connectionName) { + this.pathList = pathList; + this.includeObjectList = includeObjectList; + this.setConnection(connectionName); + } + + public CodeCoverageReporter(final List pathList, final List includeObjectList, + final Connection conn) { + this.pathList = pathList; + this.includeObjectList = includeObjectList; + this.conn = conn; + } + + private void setConnection(final String connectionName) { + if (connectionName == null) { + throw new RuntimeException("Cannot initialize a CodeCoverageReporter without a ConnectionName"); + } else { + try { + // must be closed manually + this.conn = Connections.getInstance() + .cloneConnection(Connections.getInstance().getConnection(connectionName)); + } catch (ConnectionException e) { + throw new RuntimeException(e); + } catch (DBException e) { + throw new RuntimeException(e); + } + } + } + + private ArrayList toStringList(final String s) { + final ArrayList list = new ArrayList<>(); + if (s != null && !s.isEmpty()) { + for (final String item : s.split(",")) { + if (!item.isEmpty()) { + list.add(item.trim()); + } + } + } + return list; + } + + private void run() { + logger.fine(() -> "Running code coverage reporter for " + pathList + "..."); + try { + final UtplsqlDao dal = new UtplsqlDao(this.conn); + final String content = dal.htmlCodeCoverage(this.pathList, this.toStringList(this.schemas), + this.toStringList(this.includeObjects), this.toStringList(this.excludeObjects)); + final File file = File.createTempFile("utplsql_", ".html"); + logger.fine(() -> "Writing result to " + file + "..."); + Files.write(file.toPath(), Arrays.asList(content.split(System.lineSeparator())), StandardCharsets.UTF_8); + final URL url = file.toURI().toURL(); + logger.fine(() -> "Opening " + url.toExternalForm() + " in browser..."); + final Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null; + if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE) && url != null) { + desktop.browse(url.toURI()); + logger.fine(() -> url.toExternalForm() + " opened in browser."); + } else { + logger.severe( + () -> "Could not launch " + file + "in browser. No default browser defined on this system."); + } + } catch (Exception e) { + logger.severe(() -> "Error when running code coverage: " + e.getMessage()); + } finally { + try { + conn.close(); + } catch (SQLException e) { + // ignore + } + if (frame != null) { + frame.exit(); + } + } + } + + public void setFrame(final CodeCoverageReporterDialog frame) { + this.frame = frame; + } + + public CodeCoverageReporterDialog getFrame() { + return this.frame; + } + + public Connection getConnection() { + return this.conn; + } + + public List getPathList() { + return this.pathList; + } + + public List getIncludeObjectList() { + if ((this.includeObjectList == null)) { + return new ArrayList(); + } else { + return this.includeObjectList; + } + } + + public void setSchemas(final String schemas) { + this.schemas = schemas; + } + + public void setIncludeObjects(final String includeObjects) { + this.includeObjects = includeObjects; + } + + public void setExcludeObjects(final String excludeObjects) { + this.excludeObjects = excludeObjects; + } + + public Thread runAsync() { + final Thread thread = new Thread(() -> { + this.run(); + }); + thread.setName("code coverage reporter"); + thread.start(); + return thread; + } + + public void showParameterWindow() { + CodeCoverageReporterDialog.createAndShow(this); + } +} From da98eadc4b7f128165eb37e86c6f6076a18d7aa7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 22 May 2020 16:15:54 +0200 Subject: [PATCH 003/286] rename RealtimeReporterDao.xtend to RealtimeReporterDao.java --- .../dal/{RealtimeReporterDao.xtend => RealtimeReporterDao.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/dal/{RealtimeReporterDao.xtend => RealtimeReporterDao.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.xtend b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java From c6411ec71416112a4606e6fbebac455e460b7339 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 22 May 2020 22:03:35 +0200 Subject: [PATCH 004/286] extracted repetitive logic from RealtimeReporterDao --- .../org/utplsql/sqldev/model/XMLTools.xtend | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.xtend index 5126486a..23d49e75 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.xtend @@ -21,6 +21,7 @@ import javax.xml.transform.dom.DOMSource import javax.xml.transform.stream.StreamResult import javax.xml.xpath.XPathConstants import javax.xml.xpath.XPathFactory +import org.w3c.dom.Element import org.w3c.dom.Node import org.w3c.dom.NodeList @@ -64,4 +65,24 @@ class XMLTools { val fixedResult = result.replaceAll('''''',"") return fixedResult } + + def getAttributeValue(Node node, String namedItem) { + var String value = null + if (node instanceof Element) { + value = node.attributes?.getNamedItem(namedItem)?.nodeValue; + } + return value + } + + def getElementValue(Node node, String tagName) { + return getElementNode(node, tagName)?.textContent + } + + def getElementNode(Node node, String tagName) { + var Node resultNode = null + if (node instanceof Element) { + resultNode = node.getElementsByTagName(tagName)?.item(0) + } + return resultNode + } } From 2aef3f623647bb57b056c6e148de43e85d58c5fd Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 22 May 2020 22:05:59 +0200 Subject: [PATCH 005/286] convert RealtimeReporterDao to Java --- .../sqldev/dal/RealtimeReporterDao.java | 560 ++++++++++-------- 1 file changed, 301 insertions(+), 259 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index 442027ac..b956d68a 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -13,271 +13,313 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.dal +package org.utplsql.sqldev.dal; -import java.io.StringReader -import java.sql.CallableStatement -import java.sql.Connection -import java.sql.ResultSet -import java.sql.SQLException -import java.util.List -import java.util.logging.Logger -import javax.xml.parsers.DocumentBuilderFactory -import oracle.jdbc.OracleTypes -import org.springframework.dao.DataAccessException -import org.springframework.jdbc.core.CallableStatementCallback -import org.springframework.jdbc.core.JdbcTemplate -import org.springframework.jdbc.datasource.SingleConnectionDataSource -import org.utplsql.sqldev.model.XMLTools -import org.utplsql.sqldev.model.runner.Counter -import org.utplsql.sqldev.model.runner.Expectation -import org.utplsql.sqldev.model.runner.PostEvent -import org.utplsql.sqldev.model.runner.PostRunEvent -import org.utplsql.sqldev.model.runner.PostSuiteEvent -import org.utplsql.sqldev.model.runner.PostTestEvent -import org.utplsql.sqldev.model.runner.PreRunEvent -import org.utplsql.sqldev.model.runner.PreSuiteEvent -import org.utplsql.sqldev.model.runner.PreTestEvent -import org.utplsql.sqldev.model.runner.RealtimeReporterEvent -import org.utplsql.sqldev.model.runner.Suite -import org.utplsql.sqldev.model.runner.Test -import org.w3c.dom.Document -import org.w3c.dom.Element -import org.w3c.dom.Node -import org.xml.sax.InputSource +import java.io.IOException; +import java.io.StringReader; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collections; +import java.util.List; +import java.util.logging.Logger; -class RealtimeReporterDao { - static val Logger logger = Logger.getLogger(RealtimeReporterDao.name); - static val FIRST_VERSION_WITH_REALTIME_REPORTER = 3001004 - val extension XMLTools xmlTools = new XMLTools - var Connection conn - var JdbcTemplate jdbcTemplate +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; - new(Connection connection) { - conn = connection - jdbcTemplate = new JdbcTemplate(new SingleConnectionDataSource(conn, true)) - jdbcTemplate.fetchSize = 1 - } - - def isSupported() { - return new UtplsqlDao(conn).normalizedUtPlsqlVersionNumber >= FIRST_VERSION_WITH_REALTIME_REPORTER - } - - def produceReport(String reporterId, List pathList) { - var plsql = ''' - DECLARE - l_reporter ut_realtime_reporter := ut_realtime_reporter(); - BEGIN - l_reporter.set_reporter_id(?); - l_reporter.output_buffer.init(); - sys.dbms_output.enable(NULL); - ut_runner.run( - a_paths => ut_varchar2_list( - «FOR path : pathList SEPARATOR ","» - '«path»' - «ENDFOR» - ), - a_reporters => ut_reporters(l_reporter) - ); - sys.dbms_output.disable; - END; - ''' - jdbcTemplate.update(plsql, #[reporterId]) - } - - def consumeReport(String reporterId, RealtimeReporterEventConsumer consumer) { - val plsql = ''' - DECLARE - l_reporter ut_realtime_reporter := ut_realtime_reporter(); - BEGIN - l_reporter.set_reporter_id(?); - ? := l_reporter.get_lines_cursor(); - END; - ''' - jdbcTemplate.execute(plsql, new CallableStatementCallback() { - override doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { - cs.setString(1, reporterId) - cs.registerOutParameter(2, OracleTypes.CURSOR) - cs.execute - val rs = cs.getObject(2) as ResultSet - while(rs.next) { - val itemType = rs.getString("item_type") - val textClob = rs.getClob("text") - val textString = textClob.getSubString(1, textClob.length as int) - val event = convert(itemType, textString) - if (event !== null) { - consumer.process(event) - } - } - rs.close - return null - } - }) - } - - private def RealtimeReporterEvent convert(String itemType, String text) { - logger.fine(''' - ---- «itemType» ---- - «text» - ''') - val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder() - val doc = docBuilder.parse(new InputSource(new StringReader(text))) - var RealtimeReporterEvent event - if (itemType == "pre-run") { - event = doc.convertToPreRunEvent - } else if (itemType == "post-run") { - event = doc.convertToPostRunEvent - } else if (itemType == "pre-suite") { - event = doc.convertToPreSuiteEvent - } else if (itemType == "post-suite") { - event = doc.convertToPostSuiteEvent - } else if (itemType == "pre-test") { - event = doc.convertToPreTestEvent - } else if (itemType == "post-test") { - event = doc.convertToPostTestEvent - } - return event - } - - private def RealtimeReporterEvent convertToPreRunEvent(Document doc) { - val event = new PreRunEvent - event.totalNumberOfTests = Integer.valueOf(doc.getNode("/event/totalNumberOfTests")?.textContent) - val nodeList = doc.getNodeList("/event/items/*") - for (i : 0 ..< nodeList.length) { - val node = nodeList.item(i) - if (node.nodeName == "suite") { - val suite = new Suite - event.items.add(suite) - suite.populate(node) - } else if (node.nodeName == "test") { - val test = new Test - event.items.add(test) - test.populate(node) - } - } - return event - } +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.CallableStatementCallback; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.model.XMLTools; +import org.utplsql.sqldev.model.runner.Counter; +import org.utplsql.sqldev.model.runner.Expectation; +import org.utplsql.sqldev.model.runner.PostEvent; +import org.utplsql.sqldev.model.runner.PostRunEvent; +import org.utplsql.sqldev.model.runner.PostSuiteEvent; +import org.utplsql.sqldev.model.runner.PostTestEvent; +import org.utplsql.sqldev.model.runner.PreRunEvent; +import org.utplsql.sqldev.model.runner.PreSuiteEvent; +import org.utplsql.sqldev.model.runner.PreTestEvent; +import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; +import org.utplsql.sqldev.model.runner.Suite; +import org.utplsql.sqldev.model.runner.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; - private def RealtimeReporterEvent convertToPostRunEvent(Document doc) { - val event = new PostRunEvent - event.populate(doc.getNode("/event/run")) - return event - } +import oracle.jdbc.OracleTypes; - private def RealtimeReporterEvent convertToPreSuiteEvent(Document doc) { - val event = new PreSuiteEvent - val node = doc.getNode("/event/suite") - if (node instanceof Element) { - event.id = node.attributes?.getNamedItem("id")?.nodeValue - } - return event - } - - private def RealtimeReporterEvent convertToPostSuiteEvent(Document doc) { - val event = new PostSuiteEvent - val node = doc.getNode("/event/suite") - if (node instanceof Element) { - event.id = node.attributes?.getNamedItem("id")?.nodeValue - event.populate(node) - } - return event - } +public class RealtimeReporterDao { + private static final Logger logger = Logger.getLogger(RealtimeReporterDao.class.getName()); + private static final int FIRST_VERSION_WITH_REALTIME_REPORTER = 3001004; + private final XMLTools xmlTools = new XMLTools(); + private Connection conn; + private JdbcTemplate jdbcTemplate; - private def RealtimeReporterEvent convertToPreTestEvent(Document doc) { - val event = new PreTestEvent - val node = doc.getNode("/event/test") - if (node instanceof Element) { - event.id = node.attributes?.getNamedItem("id")?.nodeValue - event.testNumber = Integer.valueOf(node.getElementsByTagName("testNumber")?.item(0)?.textContent) - event.totalNumberOfTests = Integer.valueOf(node.getElementsByTagName("totalNumberOfTests")?.item(0)?.textContent) - } - return event - } + public RealtimeReporterDao(final Connection conn) { + this.conn = conn; + jdbcTemplate = new JdbcTemplate(new SingleConnectionDataSource(conn, true)); + jdbcTemplate.setFetchSize(1); + } - private def RealtimeReporterEvent convertToPostTestEvent(Document doc) { - val event = new PostTestEvent - val node = doc.getNode("/event/test") - if (node instanceof Element) { - event.id = node.attributes?.getNamedItem("id")?.nodeValue - event.testNumber = Integer.valueOf(node.getElementsByTagName("testNumber")?.item(0)?.textContent) - event.totalNumberOfTests = Integer.valueOf(node.getElementsByTagName("totalNumberOfTests")?.item(0)?.textContent) - event.populate(node) - val failedExpectations = node.getNodeList("failedExpectations/expectation") - for (i : 0 ..< failedExpectations.length) { - val expectationNode = failedExpectations.item(i) - val expectation = new Expectation - event.failedExpectations.add(expectation) - expectation.populate(expectationNode) - } - } - return event - } + public boolean isSupported() { + return new UtplsqlDao(conn) + .normalizedUtPlsqlVersionNumber() >= RealtimeReporterDao.FIRST_VERSION_WITH_REALTIME_REPORTER; + } - private def void populate(Suite suite, Node node) { - if (node instanceof Element) { - suite.id = node.attributes?.getNamedItem("id")?.nodeValue - suite.name = node.getElementsByTagName("name")?.item(0)?.textContent - suite.description = node.getElementsByTagName("description")?.item(0)?.textContent - val nodeList = node.getNodeList("items/*") - for (i : 0 ..< nodeList.length) { - val childNode = nodeList.item(i) - if (childNode.nodeName == "suite") { - val childSuite = new Suite - suite.items.add(childSuite) - childSuite.populate(childNode) - } else if (childNode.nodeName == "test") { - val childTest = new Test - suite.items.add(childTest) - childTest.populate(childNode) - } - } - } - } - - private def void populate(Test test, Node node) { - if (node instanceof Element) { - test.id = node.attributes?.getNamedItem("id")?.nodeValue - test.executableType = node.getElementsByTagName("executableType")?.item(0)?.textContent - test.ownerName = node.getElementsByTagName("ownerName")?.item(0)?.textContent - test.objectName = node.getElementsByTagName("objectName")?.item(0)?.textContent - test.procedureName = node.getElementsByTagName("procedureName")?.item(0)?.textContent - test.disabled = node.getElementsByTagName("disabled")?.item(0)?.textContent == "true" - test.name = node.getElementsByTagName("name")?.item(0)?.textContent - test.description = node.getElementsByTagName("description")?.item(0)?.textContent - test.testNumber = Integer.valueOf(node.getElementsByTagName("testNumber")?.item(0)?.textContent) - } - } - - private def void populate(PostEvent event, Node node) { - if (node instanceof Element) { - event.startTime = node.getElementsByTagName("startTime")?.item(0)?.textContent - event.endTime = node.getElementsByTagName("endTime")?.item(0)?.textContent - event.executionTime = Double.valueOf(node.getElementsByTagName("executionTime")?.item(0)?.textContent) - event.counter.populate(node) - event.errorStack = node.getElementsByTagName("errorStack")?.item(0)?.textContent - event.serverOutput = node.getElementsByTagName("serverOutput")?.item(0)?.textContent - event.warnings = node.getElementsByTagName("warnings")?.item(0)?.textContent - } - } - - private def void populate(Counter counter, Node node) { - if (node instanceof Element) { - val counterNode = node.getElementsByTagName("counter")?.item(0) - if (counterNode instanceof Element) { - counter.disabled = Integer.valueOf(counterNode.getElementsByTagName("disabled")?.item(0)?.textContent) - counter.success = Integer.valueOf(counterNode.getElementsByTagName("success")?.item(0)?.textContent) - counter.failure = Integer.valueOf(counterNode.getElementsByTagName("failure")?.item(0)?.textContent) - counter.error = Integer.valueOf(counterNode.getElementsByTagName("error")?.item(0)?.textContent) - counter.warning = Integer.valueOf(counterNode.getElementsByTagName("warning")?.item(0)?.textContent) - } - } - } + private static String getPathList(List pathList, int indentSpaces) { + final StringBuilder sb = new StringBuilder(); + final String indent = String.join("", Collections.nCopies(indentSpaces, " ")); + for (final String path : pathList) { + if (sb.length() > 0) { + sb.append(",\n"); + } + sb.append(indent); + sb.append("'"); + sb.append(path); + sb.append("'"); + } + sb.append("\n"); + return sb.toString(); + } - private def void populate(Expectation expectation, Node node) { - if (node instanceof Element) { - expectation.description = node.getElementsByTagName("description")?.item(0)?.textContent - expectation.message = node.getElementsByTagName("message")?.item(0)?.textContent - expectation.caller = node.getElementsByTagName("caller")?.item(0)?.textContent - } - } -} \ No newline at end of file + public void produceReport(final String reporterId, final List pathList) { + StringBuilder sb = new StringBuilder(); + sb.append("DECLARE\n"); + sb.append(" l_reporter ut_realtime_reporter := ut_realtime_reporter();\n"); + sb.append("BEGIN\n"); + sb.append(" l_reporter.set_reporter_id(?);\n"); + sb.append(" l_reporter.output_buffer.init();\n"); + sb.append(" sys.dbms_output.enable(NULL);\n"); + sb.append(" ut_runner.run(\n"); + sb.append(" a_paths => ut_varchar2_list(\n"); + sb.append(getPathList(pathList, 24)); + sb.append(" ),\n"); + sb.append(" a_reporters => ut_reporters(l_reporter)\n"); + sb.append(" );\n"); + sb.append(" sys.dbms_output.disable;\n"); + sb.append("END;"); + final String plsql = sb.toString(); + final Object[] binds = { reporterId }; + jdbcTemplate.update(plsql, binds); + } + + public void consumeReport(final String reporterId, final RealtimeReporterEventConsumer consumer) { + StringBuilder sb = new StringBuilder(); + sb.append("DECLARE\n"); + sb.append(" l_reporter ut_realtime_reporter := ut_realtime_reporter();\n"); + sb.append("BEGIN\n"); + sb.append(" l_reporter.set_reporter_id(?);\n"); + sb.append(" ? := l_reporter.get_lines_cursor();\n"); + sb.append("END;"); + final String plsql = sb.toString(); + jdbcTemplate.execute(plsql, new CallableStatementCallback() { + @Override + public Void doInCallableStatement(final CallableStatement cs) throws SQLException, DataAccessException { + cs.setString(1, reporterId); + cs.registerOutParameter(2, OracleTypes.CURSOR); + cs.execute(); + final ResultSet rs = ((ResultSet) cs.getObject(2)); + while (rs.next()) { + final String itemType = rs.getString("item_type"); + final Clob textClob = rs.getClob("text"); + final String textString = textClob.getSubString(1, ((int) textClob.length())); + final RealtimeReporterEvent event = convert(itemType, textString); + if ((event != null)) { + consumer.process(event); + } + } + rs.close(); + return null; + } + }); + } + + private RealtimeReporterEvent convert(final String itemType, final String text) { + logger.fine(() -> "\n---- " + itemType + " ----\n" + text); + try { + final DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + final Document doc = docBuilder.parse(new InputSource(new StringReader(text))); + RealtimeReporterEvent event = null; + if ("pre-run".equals(itemType)) { + event = convertToPreRunEvent(doc); + } else if ("post-run".equals(itemType)) { + event = convertToPostRunEvent(doc); + } else if ("pre-suite".equals(itemType)) { + event = convertToPreSuiteEvent(doc); + } else if ("post-suite".equals(itemType)) { + event = convertToPostSuiteEvent(doc); + } else if ("pre-test".equals(itemType)) { + event = convertToPreTestEvent(doc); + } else if ("post-test".equals(itemType)) { + event = convertToPostTestEvent(doc); + } + return event; + } catch (ParserConfigurationException e) { + logger.severe(() -> "cannot create docBuilder, due to " + e.getMessage()); + throw new RuntimeException(e); + } catch (SAXException e) { + logger.severe(() -> "parse error while processing event: " + e.getMessage()); + throw new RuntimeException(e); + } catch (IOException e) { + logger.severe(() -> "I/O error while processing event: " + e.getMessage()); + throw new RuntimeException(e); + } + } + + private RealtimeReporterEvent convertToPreRunEvent(final Document doc) { + final PreRunEvent event = new PreRunEvent(); + final Node totalNumberOfTestsNode = xmlTools.getNode(doc, "/event/totalNumberOfTests"); + String totalNumberOfTestsTextContent = null; + if (totalNumberOfTestsNode != null) { + totalNumberOfTestsTextContent = totalNumberOfTestsNode.getTextContent(); + } + event.setTotalNumberOfTests(Integer.valueOf(totalNumberOfTestsTextContent)); + final NodeList nodes = xmlTools.getNodeList(doc, "/event/items/*"); + for (int i = 0; i < nodes.getLength(); i++) { + final Node node = nodes.item(i); + final String nodeName = node.getNodeName(); + if ("suite".equals(nodeName)) { + final Suite suite = new Suite(); + event.getItems().add(suite); + populate(suite, node); + } else if ("test".equals(nodeName)) { + final Test test = new Test(); + event.getItems().add(test); + populate(test, node); + } + } + return event; + } + + private RealtimeReporterEvent convertToPostRunEvent(final Document doc) { + final PostRunEvent event = new PostRunEvent(); + populate(event, xmlTools.getNode(doc, "/event/run")); + return event; + } + + private RealtimeReporterEvent convertToPreSuiteEvent(final Document doc) { + final PreSuiteEvent event = new PreSuiteEvent(); + final Node node = xmlTools.getNode(doc, "/event/suite"); + if (node instanceof Element) { + event.setId(xmlTools.getAttributeValue(node, "id")); + } + return event; + } + + private RealtimeReporterEvent convertToPostSuiteEvent(final Document doc) { + final PostSuiteEvent event = new PostSuiteEvent(); + final Node node = xmlTools.getNode(doc, "/event/suite"); + if (node instanceof Element) { + event.setId(xmlTools.getAttributeValue(node, "id")); + populate(event, node); + } + return event; + } + + private RealtimeReporterEvent convertToPreTestEvent(final Document doc) { + final PreTestEvent event = new PreTestEvent(); + final Node node = xmlTools.getNode(doc, "/event/test"); + if (node instanceof Element) { + event.setId(xmlTools.getAttributeValue(node, "id")); + event.setTestNumber(Integer.valueOf(xmlTools.getElementValue(node, "testNumber"))); + event.setTotalNumberOfTests(Integer.valueOf(xmlTools.getElementValue(node, "totalNumberOfTests"))); + } + return event; + } + + private RealtimeReporterEvent convertToPostTestEvent(final Document doc) { + final PostTestEvent event = new PostTestEvent(); + final Node node = xmlTools.getNode(doc, "/event/test"); + if (node instanceof Element) { + event.setId(xmlTools.getAttributeValue(node, "id")); + event.setTestNumber(Integer.valueOf(xmlTools.getElementValue(node, "testNumber"))); + event.setTotalNumberOfTests(Integer.valueOf(xmlTools.getElementValue(node, "totalNumberOfTests"))); + populate(event, node); + final NodeList failedExpectations = xmlTools.getNodeList(node, "failedExpectations/expectation"); + for (int i = 0; i < failedExpectations.getLength(); i++) { + final Node expectationNode = failedExpectations.item(i); + final Expectation expectation = new Expectation(); + event.getFailedExpectations().add(expectation); + populate(expectation, expectationNode); + } + } + return event; + } + + private void populate(final Suite suite, final Node node) { + if (node instanceof Element) { + suite.setId(xmlTools.getAttributeValue(node, "id")); + suite.setName(xmlTools.getElementValue(node, "name")); + suite.setDescription(xmlTools.getElementValue(node, "description")); + final NodeList nodeList = xmlTools.getNodeList(node, "items/*"); + for (int i = 0; i < nodeList.getLength(); i++) { + final Node childNode = nodeList.item(i); + final String nodeName = childNode.getNodeName(); + if ("suite".equals(nodeName)) { + final Suite childSuite = new Suite(); + suite.getItems().add(childSuite); + populate(childSuite, childNode); + } else if ("test".equals(nodeName)) { + final Test childTest = new Test(); + suite.getItems().add(childTest); + populate(childTest, childNode); + } + } + } + } + + private void populate(final Test test, final Node node) { + if (node instanceof Element) { + test.setId(xmlTools.getAttributeValue(node, "id")); + test.setExecutableType(xmlTools.getElementValue(node, "executableType")); + test.setOwnerName(xmlTools.getElementValue(node, "ownerName")); + test.setObjectName(xmlTools.getElementValue(node, "objectName")); + test.setProcedureName(xmlTools.getElementValue(node, "procedureName")); + test.setDisabled(Boolean.valueOf("true".equals(xmlTools.getElementValue(node, "disabled")))); + test.setName(xmlTools.getElementValue(node, "name")); + test.setDescription(xmlTools.getElementValue(node, "description")); + test.setTestNumber(Integer.valueOf(xmlTools.getElementValue(node, "testNumber"))); + } + } + + private void populate(final PostEvent event, final Node node) { + if (node instanceof Element) { + event.setStartTime(xmlTools.getElementValue(node, "startTime")); + event.setEndTime(xmlTools.getElementValue(node, "endTime")); + event.setExecutionTime(Double.valueOf(xmlTools.getElementValue(node, "executionTime"))); + populate(event.getCounter(), node); + event.setErrorStack(xmlTools.getElementValue(node, "errorStack")); + event.setServerOutput(xmlTools.getElementValue(node, "serverOutput")); + event.setWarnings(xmlTools.getElementValue(node, "warnings")); + } + } + + private void populate(final Counter counter, final Node node) { + if (node instanceof Element) { + final Node counterNode = xmlTools.getElementNode(node, "counter"); + if (counterNode instanceof Element) { + counter.setDisabled(Integer.valueOf(xmlTools.getElementValue(counterNode, "disabled"))); + counter.setSuccess(Integer.valueOf(xmlTools.getElementValue(counterNode, "success"))); + counter.setFailure(Integer.valueOf(xmlTools.getElementValue(counterNode, "failure"))); + counter.setError(Integer.valueOf(xmlTools.getElementValue(counterNode, "error"))); + counter.setWarning(Integer.valueOf(xmlTools.getElementValue(counterNode, "warning"))); + } + } + } + + private void populate(final Expectation expectation, final Node node) { + if (node instanceof Element) { + expectation.setDescription(xmlTools.getElementValue(node, "description")); + expectation.setMessage(xmlTools.getElementValue(node, "description")); + expectation.setCaller(xmlTools.getElementValue(node, "caller")); + } + } +} From eefee4598e40c27724b6c7adcf90c5e17071bb6e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 22 May 2020 22:19:27 +0200 Subject: [PATCH 006/286] add logging messages on error --- .../org/utplsql/sqldev/coverage/CodeCoverageReporter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index bec577c1..f82f7be2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -61,15 +61,19 @@ public CodeCoverageReporter(final List pathList, final List incl private void setConnection(final String connectionName) { if (connectionName == null) { - throw new RuntimeException("Cannot initialize a CodeCoverageReporter without a ConnectionName"); + final String msg = "Cannot initialize a CodeCoverageReporter without a ConnectionName"; + logger.severe(() -> msg); + throw new RuntimeException(msg); } else { try { // must be closed manually this.conn = Connections.getInstance() .cloneConnection(Connections.getInstance().getConnection(connectionName)); } catch (ConnectionException e) { + logger.severe(() -> "ConnectionException while setting connection: " + e.getMessage()); throw new RuntimeException(e); } catch (DBException e) { + logger.severe(() -> "DBException while setting connection: " + e.getMessage()); throw new RuntimeException(e); } } From 4980d72d215676d942bb2406bbb26320d742e135 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 22 May 2020 22:20:07 +0200 Subject: [PATCH 007/286] fix type in logging message and throw runtime error on exception --- .../java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index f82f7be2..5105237e 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -111,7 +111,8 @@ private void run() { () -> "Could not launch " + file + "in browser. No default browser defined on this system."); } } catch (Exception e) { - logger.severe(() -> "Error when running code coverage: " + e.getMessage()); + logger.severe(() -> "Error while running code coverage: " + e.getMessage()); + throw new RuntimeException(e); } finally { try { conn.close(); From e5bb2bf6c463a7317dc1692cf5a4ea869fdc4375 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 22 May 2020 22:43:17 +0200 Subject: [PATCH 008/286] remove unnecessary this usages --- .../sqldev/coverage/CodeCoverageReporter.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index 5105237e..6a697b12 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -49,7 +49,7 @@ public CodeCoverageReporter(final List pathList, final List incl final String connectionName) { this.pathList = pathList; this.includeObjectList = includeObjectList; - this.setConnection(connectionName); + setConnection(connectionName); } public CodeCoverageReporter(final List pathList, final List includeObjectList, @@ -67,7 +67,7 @@ private void setConnection(final String connectionName) { } else { try { // must be closed manually - this.conn = Connections.getInstance() + conn = Connections.getInstance() .cloneConnection(Connections.getInstance().getConnection(connectionName)); } catch (ConnectionException e) { logger.severe(() -> "ConnectionException while setting connection: " + e.getMessage()); @@ -94,9 +94,9 @@ private ArrayList toStringList(final String s) { private void run() { logger.fine(() -> "Running code coverage reporter for " + pathList + "..."); try { - final UtplsqlDao dal = new UtplsqlDao(this.conn); - final String content = dal.htmlCodeCoverage(this.pathList, this.toStringList(this.schemas), - this.toStringList(this.includeObjects), this.toStringList(this.excludeObjects)); + final UtplsqlDao dal = new UtplsqlDao(conn); + final String content = dal.htmlCodeCoverage(pathList, toStringList(schemas), + toStringList(includeObjects), toStringList(excludeObjects)); final File file = File.createTempFile("utplsql_", ".html"); logger.fine(() -> "Writing result to " + file + "..."); Files.write(file.toPath(), Arrays.asList(content.split(System.lineSeparator())), StandardCharsets.UTF_8); @@ -130,22 +130,22 @@ public void setFrame(final CodeCoverageReporterDialog frame) { } public CodeCoverageReporterDialog getFrame() { - return this.frame; + return frame; } public Connection getConnection() { - return this.conn; + return conn; } public List getPathList() { - return this.pathList; + return pathList; } public List getIncludeObjectList() { - if ((this.includeObjectList == null)) { + if ((includeObjectList == null)) { return new ArrayList(); } else { - return this.includeObjectList; + return includeObjectList; } } @@ -163,7 +163,7 @@ public void setExcludeObjects(final String excludeObjects) { public Thread runAsync() { final Thread thread = new Thread(() -> { - this.run(); + run(); }); thread.setName("code coverage reporter"); thread.start(); From 118e4ef88f46e849a50189eaf159b87498117ea1 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 10:41:27 +0200 Subject: [PATCH 009/286] define generic runtime exceptions for this project --- .../GenericDatabaseAccessException.java | 32 +++++++++++++++++++ .../exception/GenericRuntimeException.java | 32 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 sqldev/src/main/java/org/utplsql/sqldev/exception/GenericDatabaseAccessException.java create mode 100644 sqldev/src/main/java/org/utplsql/sqldev/exception/GenericRuntimeException.java diff --git a/sqldev/src/main/java/org/utplsql/sqldev/exception/GenericDatabaseAccessException.java b/sqldev/src/main/java/org/utplsql/sqldev/exception/GenericDatabaseAccessException.java new file mode 100644 index 00000000..a343592b --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/exception/GenericDatabaseAccessException.java @@ -0,0 +1,32 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.exception; + +public class GenericDatabaseAccessException extends RuntimeException { + private static final long serialVersionUID = -5489500390596695295L; + + public GenericDatabaseAccessException(String message) { + super(message); + } + + public GenericDatabaseAccessException(String message, Throwable cause) { + super(message, cause); + } + + public GenericDatabaseAccessException(Throwable cause) { + super(cause); + } +} diff --git a/sqldev/src/main/java/org/utplsql/sqldev/exception/GenericRuntimeException.java b/sqldev/src/main/java/org/utplsql/sqldev/exception/GenericRuntimeException.java new file mode 100644 index 00000000..5a89ad13 --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/exception/GenericRuntimeException.java @@ -0,0 +1,32 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.exception; + +public class GenericRuntimeException extends RuntimeException { + private static final long serialVersionUID = -6258053040039956647L; + + public GenericRuntimeException(String message) { + super(message); + } + + public GenericRuntimeException(String message, Throwable cause) { + super(message, cause); + } + + public GenericRuntimeException(Throwable cause) { + super(cause); + } +} From 02f06691cd6aea6d6eec07246f7b6d4286810b51 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 10:43:15 +0200 Subject: [PATCH 010/286] store message instead of description in expectation message --- .../main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index b956d68a..ec13e424 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -318,7 +318,7 @@ private void populate(final Counter counter, final Node node) { private void populate(final Expectation expectation, final Node node) { if (node instanceof Element) { expectation.setDescription(xmlTools.getElementValue(node, "description")); - expectation.setMessage(xmlTools.getElementValue(node, "description")); + expectation.setMessage(xmlTools.getElementValue(node, "message")); expectation.setCaller(xmlTools.getElementValue(node, "caller")); } } From fa2765cd67559abd2ed1c0c06aa108a0a6934d85 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 10:43:53 +0200 Subject: [PATCH 011/286] simplify code --- .../java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index 6a697b12..8fdcb511 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -143,7 +143,7 @@ public List getPathList() { public List getIncludeObjectList() { if ((includeObjectList == null)) { - return new ArrayList(); + return new ArrayList<>(); } else { return includeObjectList; } From f062c64b33d1b2f57188ef7e75626e7c3c8a3270 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 10:45:05 +0200 Subject: [PATCH 012/286] enable secure XML processing --- .../java/org/utplsql/sqldev/dal/RealtimeReporterDao.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index ec13e424..9b62caaf 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.logging.Logger; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -145,7 +146,9 @@ public Void doInCallableStatement(final CallableStatement cs) throws SQLExceptio private RealtimeReporterEvent convert(final String itemType, final String text) { logger.fine(() -> "\n---- " + itemType + " ----\n" + text); try { - final DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); + final DocumentBuilder docBuilder = factory.newDocumentBuilder(); final Document doc = docBuilder.parse(new InputSource(new StringReader(text))); RealtimeReporterEvent event = null; if ("pre-run".equals(itemType)) { From 789ebeb2d480807d5302b4c6505b809e78ee3a45 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 10:46:14 +0200 Subject: [PATCH 013/286] throw new runtime exceptions with specific messages --- .../sqldev/coverage/CodeCoverageReporter.java | 19 ++++++++++++------- .../sqldev/dal/RealtimeReporterDao.java | 16 ++++++++++------ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index 8fdcb511..5f27d5f1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -28,6 +28,8 @@ import java.util.logging.Logger; import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.exception.GenericRuntimeException; import org.utplsql.sqldev.ui.coverage.CodeCoverageReporterDialog; import oracle.dbtools.raptor.utils.Connections; @@ -63,18 +65,20 @@ private void setConnection(final String connectionName) { if (connectionName == null) { final String msg = "Cannot initialize a CodeCoverageReporter without a ConnectionName"; logger.severe(() -> msg); - throw new RuntimeException(msg); + throw new NullPointerException(); } else { try { // must be closed manually conn = Connections.getInstance() .cloneConnection(Connections.getInstance().getConnection(connectionName)); } catch (ConnectionException e) { - logger.severe(() -> "ConnectionException while setting connection: " + e.getMessage()); - throw new RuntimeException(e); + final String msg = "ConnectionException while setting connection: " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); } catch (DBException e) { - logger.severe(() -> "DBException while setting connection: " + e.getMessage()); - throw new RuntimeException(e); + final String msg = "DBException while setting connection: " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); } } } @@ -111,8 +115,9 @@ private void run() { () -> "Could not launch " + file + "in browser. No default browser defined on this system."); } } catch (Exception e) { - logger.severe(() -> "Error while running code coverage: " + e.getMessage()); - throw new RuntimeException(e); + final String msg = "Error while running code coverage: " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); } finally { try { conn.close(); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index 9b62caaf..ba72ad32 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -35,6 +35,7 @@ import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.exception.GenericRuntimeException; import org.utplsql.sqldev.model.XMLTools; import org.utplsql.sqldev.model.runner.Counter; import org.utplsql.sqldev.model.runner.Expectation; @@ -166,14 +167,17 @@ private RealtimeReporterEvent convert(final String itemType, final String text) } return event; } catch (ParserConfigurationException e) { - logger.severe(() -> "cannot create docBuilder, due to " + e.getMessage()); - throw new RuntimeException(e); + final String msg = "cannot create docBuilder, due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); } catch (SAXException e) { - logger.severe(() -> "parse error while processing event: " + e.getMessage()); - throw new RuntimeException(e); + final String msg = "parse error while processing event: " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); } catch (IOException e) { - logger.severe(() -> "I/O error while processing event: " + e.getMessage()); - throw new RuntimeException(e); + final String msg = "I/O error while processing event: " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); } } From 3655a2631a59062f294c709bbd1d7ed48f4d5ce9 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 11:05:04 +0200 Subject: [PATCH 014/286] remove throws DataAccessException which is a runtime exception --- .../main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index ba72ad32..49079ae1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -31,7 +31,6 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SingleConnectionDataSource; @@ -124,7 +123,7 @@ public void consumeReport(final String reporterId, final RealtimeReporterEventCo final String plsql = sb.toString(); jdbcTemplate.execute(plsql, new CallableStatementCallback() { @Override - public Void doInCallableStatement(final CallableStatement cs) throws SQLException, DataAccessException { + public Void doInCallableStatement(final CallableStatement cs) throws SQLException { cs.setString(1, reporterId); cs.registerOutParameter(2, OracleTypes.CURSOR); cs.execute(); From b48879ec5d4a11b4eecbf28f4cb642d4e8642705 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 11:17:38 +0200 Subject: [PATCH 015/286] rename RealtimeReporterEventConsumer.xtend to RealtimeReporterEventConsumer.java --- ...rterEventConsumer.xtend => RealtimeReporterEventConsumer.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/dal/{RealtimeReporterEventConsumer.xtend => RealtimeReporterEventConsumer.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterEventConsumer.xtend b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterEventConsumer.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterEventConsumer.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterEventConsumer.java From c101a4942ff6021fc07b1dae1d9e87ef167cb2c8 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 11:18:38 +0200 Subject: [PATCH 016/286] convert RealtimeReporterEventConsumer to Java --- .../sqldev/dal/RealtimeReporterEventConsumer.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterEventConsumer.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterEventConsumer.java index 9a1d7727..65427f35 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterEventConsumer.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterEventConsumer.java @@ -13,12 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.dal +package org.utplsql.sqldev.dal; -import org.utplsql.sqldev.model.runner.RealtimeReporterEvent - -interface RealtimeReporterEventConsumer { - - def void process(RealtimeReporterEvent event) +import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; +public interface RealtimeReporterEventConsumer { + public abstract void process(final RealtimeReporterEvent event); } From 03eef16ea95d88185ef586cd689ed3eda094c852 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 11:23:56 +0200 Subject: [PATCH 017/286] rename UtplsqlDao.xtend to UtplsqlDao.java --- .../org/utplsql/sqldev/dal/{UtplsqlDao.xtend => UtplsqlDao.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/dal/{UtplsqlDao.xtend => UtplsqlDao.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.xtend b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java From 82b11be976a71f86f389edef167f41f9387700b0 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 14:46:59 +0200 Subject: [PATCH 018/286] simplify jdbcTemplate call --- .../main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index 49079ae1..0ff947fb 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -121,7 +121,7 @@ public void consumeReport(final String reporterId, final RealtimeReporterEventCo sb.append(" ? := l_reporter.get_lines_cursor();\n"); sb.append("END;"); final String plsql = sb.toString(); - jdbcTemplate.execute(plsql, new CallableStatementCallback() { + jdbcTemplate.execute(plsql, new CallableStatementCallback() { @Override public Void doInCallableStatement(final CallableStatement cs) throws SQLException { cs.setString(1, reporterId); From b33bbda9718f062ab7f37f22572ff9ee5e461e35 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 17:14:14 +0200 Subject: [PATCH 019/286] add StringUtil for repetitive string operations --- .../org/utplsql/sqldev/dal/StringUtil.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java new file mode 100644 index 00000000..5437d150 --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java @@ -0,0 +1,42 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.dal; + +import java.util.Collections; +import java.util.List; + +public class StringUtil { + // do not instantiate this class + private StringUtil() { + super(); + } + + public static String getCSV(List list, int indentSpaces) { + final StringBuilder sb = new StringBuilder(); + final String indent = String.join("", Collections.nCopies(indentSpaces, " ")); + for (final String path : list) { + if (sb.length() > 0) { + sb.append(",\n"); + } + sb.append(indent); + sb.append("'"); + sb.append(path); + sb.append("'"); + } + sb.append("\n"); + return sb.toString(); + } +} From 557b2e5e978c252c468def26ce4f5adb6732c966 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 17:15:29 +0200 Subject: [PATCH 020/286] simplified by using StringUtil.getCSV --- .../sqldev/dal/RealtimeReporterDao.java | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index 0ff947fb..8290dcf2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -22,7 +22,6 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.Collections; import java.util.List; import java.util.logging.Logger; @@ -75,22 +74,6 @@ public boolean isSupported() { .normalizedUtPlsqlVersionNumber() >= RealtimeReporterDao.FIRST_VERSION_WITH_REALTIME_REPORTER; } - private static String getPathList(List pathList, int indentSpaces) { - final StringBuilder sb = new StringBuilder(); - final String indent = String.join("", Collections.nCopies(indentSpaces, " ")); - for (final String path : pathList) { - if (sb.length() > 0) { - sb.append(",\n"); - } - sb.append(indent); - sb.append("'"); - sb.append(path); - sb.append("'"); - } - sb.append("\n"); - return sb.toString(); - } - public void produceReport(final String reporterId, final List pathList) { StringBuilder sb = new StringBuilder(); sb.append("DECLARE\n"); @@ -101,7 +84,7 @@ public void produceReport(final String reporterId, final List pathList) sb.append(" sys.dbms_output.enable(NULL);\n"); sb.append(" ut_runner.run(\n"); sb.append(" a_paths => ut_varchar2_list(\n"); - sb.append(getPathList(pathList, 24)); + sb.append(StringUtil.getCSV(pathList, 24)); sb.append(" ),\n"); sb.append(" a_reporters => ut_reporters(l_reporter)\n"); sb.append(" );\n"); From 4c376b448b4e4da1e8c9567043471a297fc58499 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sat, 23 May 2020 17:18:05 +0200 Subject: [PATCH 021/286] convert UtplsqlDao to Java --- .../org/utplsql/sqldev/dal/UtplsqlDao.java | 2047 +++++++++-------- 1 file changed, 1053 insertions(+), 994 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index 7070a25f..c2ef19ac 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -13,1008 +13,1067 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.dal +package org.utplsql.sqldev.dal; -import java.sql.CallableStatement -import java.sql.Connection -import java.sql.SQLException -import java.sql.Types -import java.util.List -import java.util.regex.Pattern -import org.oddgen.sqldev.generators.model.Node -import org.springframework.dao.DataAccessException -import org.springframework.dao.EmptyResultDataAccessException -import org.springframework.jdbc.core.BeanPropertyRowMapper -import org.springframework.jdbc.core.CallableStatementCallback -import org.springframework.jdbc.core.JdbcTemplate -import org.springframework.jdbc.datasource.SingleConnectionDataSource -import org.utplsql.sqldev.model.ut.Annotation -import org.utplsql.sqldev.model.ut.OutputLines +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Types; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; -class UtplsqlDao { - public static val UTPLSQL_PACKAGE_NAME = "UT" - public static val NOT_INSTALLED = 0000000 - public static val FIRST_VERSION_WITH_INTERNAL_ANNOTATION_API = 3000004 - public static val FIRST_VERSION_WITH_ANNOTATION_API = 3001003 - public static val FIRST_VERSION_WITHOUT_INTERNAL_API = 3001008 - public static val FIRST_VERSION_WITH_HAS_SUITES_API = 3001008 - var Connection conn - var JdbcTemplate jdbcTemplate - // cache fields - Boolean cachedDbaViewAccessible - String cachedUtplsqlSchema - String cachedUtPlsqlVersion +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.oddgen.sqldev.generators.model.Node; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.CallableStatementCallback; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.model.ut.Annotation; +import org.utplsql.sqldev.model.ut.OutputLines; - new(Connection connection) { - conn = connection - jdbcTemplate = new JdbcTemplate(new SingleConnectionDataSource(conn, true)) - } - - /** - * used for testing purposes only - */ - def setUtPlsqlVersion(String utPlsqlVersion) { - cachedUtPlsqlVersion = utPlsqlVersion - } - - /** - * returns a normalized utPLSQL version in format 9.9.9 - */ - def String normalizedUtPlsqlVersion() { - val version = getUtPlsqlVersion() - if (version !== null) { - val p = Pattern.compile("(\\d+\\.\\d+\\.\\d+)") - val m = p.matcher(version) - if (m.find) { - return m.group(0) - } - } - return "0.0.0" - } - - /** - * get version as number, e.g. 3001004 - */ - def int normalizedUtPlsqlVersionNumber() { - val p = Pattern.compile("(\\d+)") - val version = normalizedUtPlsqlVersion() - val m = p.matcher(version) - m.find - val major = m.group - m.find - val minor = m.group - m.find - val bugfix = m.group - val versionNumber = Integer.valueOf(major)*1000000 + Integer.valueOf(minor)*1000 + Integer.valueOf(bugfix) - return versionNumber - } - - /** - * gets version of installed utPLSQL - */ - def String getUtPlsqlVersion() { - if (cachedUtPlsqlVersion === null) { - val sql = ''' - BEGIN - ? := ut.version; - END; - ''' - try { - cachedUtPlsqlVersion = jdbcTemplate.execute(sql, new CallableStatementCallback() { - override String doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { - cs.registerOutParameter(1, Types.VARCHAR); - cs.execute - val version = cs.getString(1) - return version - } - }) - } catch (SQLException e) { - // ignore error - } catch (DataAccessException e) { - // ignore error - } - } - return cachedUtPlsqlVersion - } - - def boolean isDbaViewAccessible() { - if (cachedDbaViewAccessible === null) { - try { - val sql = ''' - SELECT 1 AS dummy - FROM dba_objects - WHERE 1=2 - UNION ALL - SELECT 1 - FROM dba_synonyms - WHERE 1=2 - UNION ALL - SELECT 1 - FROM dba_dependencies - WHERE 1=2 - ''' - jdbcTemplate.execute(sql) - cachedDbaViewAccessible = true - } catch (DataAccessException e) { - cachedDbaViewAccessible = false - } - } - return cachedDbaViewAccessible.booleanValue - } - - /** - * Gets the schema name of the utPLSQL installation. - * - * @return utPLSQL schema or null if no utPLSQL is not installed - * @throws DataAccessException if there is a problem - */ - def String getUtplsqlSchema() { - if (cachedUtplsqlSchema === null) { - val sql = ''' - SELECT table_owner - FROM «IF dbaViewAccessible»dba«ELSE»all«ENDIF»_synonyms - WHERE owner = 'PUBLIC' - AND synonym_name = '«UTPLSQL_PACKAGE_NAME»' - AND table_name = '«UTPLSQL_PACKAGE_NAME»' - ''' - try { - val schema = jdbcTemplate.queryForObject(sql, String) - cachedUtplsqlSchema = schema - } catch (EmptyResultDataAccessException e) { - cachedUtplsqlSchema = null - } - } - return cachedUtplsqlSchema - } - - /** - * Checks if the package ut_annotation_manager is installed. - * This package has been introduced with utPLSQL 3.0.4. - * This version is a prerequisite to identify - * utPLSQL unit test procedures. - * - * @return true if ut_annotation_manager package has been found - * @throws DataAccessException if there is a problem - */ - def boolean isUtAnnotationManagerInstalled() { - return normalizedUtPlsqlVersionNumber >= FIRST_VERSION_WITH_INTERNAL_ANNOTATION_API - } - - /** - * Checks if utPLSQL tests exist - * - * @param owner schema name, mandatory, case-insensitive - * @param objectName name of the package or package body, optional, case-insensitive - * @param subobjectName name of the procedure, optional, case-insensitive - * @return true if at least one test has been found - * @throws DataAccessException if a utPLSQL version less than 3.0.4 is installed or if there are other problems - */ - def boolean containsUtplsqlTest(String owner, String objectName, String subobjectName) { - try { - if (normalizedUtPlsqlVersionNumber >= org.utplsql.sqldev.dal.UtplsqlDao.FIRST_VERSION_WITH_HAS_SUITES_API && objectName !== null && subobjectName !== null) { - // use faster check function available since v3.1.3 (reliable in v3.1.8) - val sql = ''' - DECLARE - l_return VARCHAR2(1) := '0'; - BEGIN - IF ut_runner.is_test(?, ?, ?) THEN - l_return := '1'; - END IF; - ? := l_return; - END; - ''' - val ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { - override Boolean doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { - cs.setString(1, owner) - cs.setString(2, objectName) - cs.setString(3, subobjectName) - cs.registerOutParameter(4, Types.VARCHAR); - cs.execute - val ret = cs.getString(4) - return ret == "1" - } - }) - return ret - } else if (normalizedUtPlsqlVersionNumber >= FIRST_VERSION_WITH_ANNOTATION_API) { - // using API available since 3.1.3, can handle nulls in objectName and subobjectName - val sql = ''' - SELECT count(*) - FROM TABLE(ut_runner.get_suites_info(upper(?), upper(?))) - WHERE item_type IN ('UT_TEST', 'UT_SUITE') - AND (item_name = upper(?) or ? IS NULL) - ''' - val found = jdbcTemplate.queryForObject(sql, Integer, #[owner, objectName, subobjectName, subobjectName]) - return found > 0 - } else { - // using internal API (deprecated) - val sql = ''' - SELECT count( - CASE - WHEN a.name = 'test' - AND (upper(a.subobject_name) = upper(?) OR ? IS NULL) - THEN - 1 - ELSE - NULL - END - ) - FROM TABLE(«utplsqlSchema».ut_annotation_manager.get_annotated_objects(upper(?), 'PACKAGE')) o - CROSS JOIN TABLE(o.annotations) a - WHERE (o.object_name = upper(?) OR ? IS NULL) - AND a.name IN ('test', 'suite') - HAVING count( - CASE - WHEN a.name = 'suite' THEN - 1 - ELSE - NULL - END - ) > 0 - ''' - val found = jdbcTemplate.queryForObject(sql, Integer, #[subobjectName, subobjectName, owner, objectName, objectName]) - return found > 0 - } - } catch (EmptyResultDataAccessException e) { - return false - } - } - - def boolean containsUtplsqlTest(String owner) { - if (normalizedUtPlsqlVersionNumber >= org.utplsql.sqldev.dal.UtplsqlDao.FIRST_VERSION_WITH_HAS_SUITES_API) { - // use faster check function available since v3.1.3 (reliable in v3.1.8) - val sql = ''' - DECLARE - l_return VARCHAR2(1) := '0'; - BEGIN - IF ut_runner.has_suites(?) THEN - l_return := '1'; - END IF; - ? := l_return; - END; - ''' - val ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { - override Boolean doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { - cs.setString(1, owner) - cs.registerOutParameter(2, Types.VARCHAR); - cs.execute - val ret = cs.getString(2) - return ret == "1" - } - }) - return ret - } else { - return containsUtplsqlTest(owner, null, null) - } - } - - def boolean containsUtplsqlTest(String owner, String objectName) { - if (normalizedUtPlsqlVersionNumber >= org.utplsql.sqldev.dal.UtplsqlDao.FIRST_VERSION_WITH_HAS_SUITES_API) { - // use faster check function available since v3.1.3 (reliable in v3.1.8) - val sql = ''' - DECLARE - l_return VARCHAR2(1) := '0'; - BEGIN - IF ut_runner.is_suite(?, ?) THEN - l_return := '1'; - END IF; - ? := l_return; - END; - ''' - val ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { - override Boolean doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { - cs.setString(1, owner) - cs.setString(2, objectName) - cs.registerOutParameter(3, Types.VARCHAR); - cs.execute - val ret = cs.getString(3) - return ret == "1" - } - }) - return ret - } else { - return containsUtplsqlTest(owner, objectName, null) - } - } - - /** - * Gets a list of utPLSQL annotations for a given PL/SQL package specification - * - * @param owner schema name, mandatory, case-insensitive - * @param objectName name of the package or package body, optional, case-insensitive - * @return list of Annotation with name 'suite' or 'test' - * @throws DataAccessException if a utPLSQL version less than 3.0.4 is installed or if there are other problems - */ - def List annotations(String owner, String objectName) { - var String sql - if (normalizedUtPlsqlVersionNumber >= FIRST_VERSION_WITH_ANNOTATION_API) { - // using API available since 3.1.3 - sql = ''' - SELECT object_owner, - object_name, - lower(substr(item_type, 4)) AS name, - item_name as subobject_name - FROM TABLE(ut_runner.get_suites_info(upper(?), upper(?))) - ''' - - } else { - // using internal API (deprecated) - sql = ''' - SELECT o.object_owner, - o.object_name, - a.name, - a.text, - coalesce(upper(a.subobject_name), o.object_name) AS subobject_name - FROM TABLE(«utplsqlSchema».ut_annotation_manager.get_annotated_objects(upper(?), 'PACKAGE')) o - CROSS JOIN TABLE(o.annotations) a - WHERE o.object_name = upper(?) - ''' - } - val result = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Annotation), #[owner, objectName]) - return result - } +import com.google.common.base.Objects; - /** - * Gets a list of public units in the object type - * - * @param objectType expected object types are PACKAGE, TYPE, FUNCTION, PROCEDURE - * @param objectName name of the object - * @return list of the public units in the object type - * @throws DataAccessException if there is a problem - */ - def List units(String objectType, String objectName) { - if (objectType == "PACKAGE" || objectType == "TYPE") { - val sql = ''' - SELECT procedure_name - FROM user_procedures - WHERE object_type = ? - AND object_name = ? - AND procedure_name IS NOT NULL - GROUP BY procedure_name - ORDER BY min(subprogram_id) - ''' - val result = jdbcTemplate.queryForList(sql, String, #[objectType, objectName]) - return result - } else { - return #[objectName] - } - } - - /** - * Gets a list of oddgen's nodes as candidates to create utPLSQL test packages. - * Candidates are packages, types, functions and procedures in the current user. - * - * This functions must be called from an oddgen generator only, since the Node is not - * defined in the utPLSQL extension. - * - * @param objectType expected object types are PACKAGE, TYPE, FUNCTION, PROCEDURE - * @return list of the oddgen nodes for the requested object type - * @throws DataAccessException if there is a problem - */ - def List testables(String objectType) { - var String sql; - if (objectType == "PACKAGE") { - if (normalizedUtPlsqlVersionNumber >= FIRST_VERSION_WITH_ANNOTATION_API) { - // using API available since 3.1.3 - sql = ''' - SELECT DISTINCT - object_type || '.' || object_name AS id, - object_type AS parent_id, - 1 AS leaf, - 1 AS generatable, - 1 AS multiselectable - FROM user_procedures - WHERE object_type = ? - AND procedure_name IS NOT NULL - AND object_name NOT IN ( - SELECT object_name - FROM TABLE(ut_runner.get_suites_info(USER)) - WHERE item_type = 'UT_SUITE' - ) - ''' - } else { - // using internal API (deprecated) - sql = ''' - SELECT DISTINCT - object_type || '.' || object_name AS id, - object_type AS parent_id, - 1 AS leaf, - 1 AS generatable, - 1 AS multiselectable - FROM user_procedures - WHERE object_type = ? - AND procedure_name IS NOT NULL - AND object_name NOT IN ( - SELECT object_name - FROM TABLE(«utplsqlSchema».ut_annotation_manager.get_annotated_objects(USER, 'PACKAGE')) - ) - ''' - } - } - else if (objectType == "TYPE") { - sql = ''' - SELECT DISTINCT - object_type || '.' || object_name AS id, - object_type AS parent_id, - 1 AS leaf, - 1 AS generatable, - 1 AS multiselectable - FROM user_procedures - WHERE object_type = ? - AND procedure_name IS NOT NULL - ''' - } - else { - sql = ''' - SELECT object_type || '.' || object_name AS id, - object_type AS parent_id, - 1 AS leaf, - 1 AS generatable, - 1 AS multiselectable - FROM user_objects - WHERE object_type = ? - AND generated = 'N' - ''' - } - val nodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Node), #[objectType]) - return nodes - } +public class UtplsqlDao { + public static final String UTPLSQL_PACKAGE_NAME = "UT"; + public static final int NOT_INSTALLED = 0; + public static final int FIRST_VERSION_WITH_INTERNAL_ANNOTATION_API = 3000004; + public static final int FIRST_VERSION_WITH_ANNOTATION_API = 3001003; + public static final int FIRST_VERSION_WITHOUT_INTERNAL_API = 3001008; + public static final int FIRST_VERSION_WITH_HAS_SUITES_API = 3001008; + private JdbcTemplate jdbcTemplate; + // cache fields + private Boolean cachedDbaViewAccessible; + private String cachedUtplsqlSchema; + private String cachedUtPlsqlVersion; - /** - * Gets a list of oddgen's nodes as candidates to run utPLSQL tests. - * - * This functions must be called from an oddgen generator only, since the Node is not - * defined in the utPLSQL extension. - * - * @return list of oddgen nodes (complete hierarchy loaded eagerly) - * @throws DataAccessException if there is a problem - */ - def List runnables() { - var String sql - if (normalizedUtPlsqlVersionNumber >= FIRST_VERSION_WITH_ANNOTATION_API) { - // using API available since 3.1.3 - sql = ''' - WITH - test AS ( - SELECT object_owner, - object_name, - path AS suitepath, - count( - CASE - WHEN item_type = 'UT_TEST' THEN - 1 - ELSE - NULL - END - ) over (partition by object_owner, object_name) AS test_count, - item_type, - item_name, - item_description - FROM TABLE(ut_runner.get_suites_info(user)) - ), - suite_tree AS ( - SELECT null AS parent_id, - 'SUITE' AS id, - 'All Suites' AS name, - 'All utPLSQL test suites' AS description, - 'PACKAGE_FOLDER_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM dual - UNION ALL - SELECT DISTINCT - 'SUITE' AS parent_id, - object_owner || '.' || object_name AS id, - object_name AS name, - null AS description, - 'PACKAGE_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM test - WHERE item_type IN ('UT_TEST', 'UT_SUITE') - UNION ALL - SELECT object_owner || '.' || object_name AS parent_id, - object_owner || '.' || object_name || '.' || item_name AS id, - item_name AS name, - item_description AS description, - 'PROCEDURE_ICON' AS iconName, - 'Yes' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM test - WHERE item_type = 'UT_TEST' - ), - suitepath_tree AS ( - SELECT NULL AS parent_id, - 'SUITEPATH' AS id, - 'All Suitepaths' AS name, - 'All utPLSQL test suitepathes' AS description, - 'FOLDER_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM dual - UNION ALL - SELECT CASE - WHEN regexp_replace(suitepath,'\.?\w+$','') IS NULL THEN - 'SUITEPATH' - ELSE - object_owner || ':' || regexp_replace(suitepath,'\.?\w+$','') - END AS parent_id, - object_owner || ':' || suitepath AS id, - item_name AS name, - item_description AS description, - CASE - WHEN item_type = 'UT_SUITE' AND test_count > 0 THEN - 'PACKAGE_ICON' - WHEN item_type = 'UT_TEST' THEN - 'PROCEDURE_ICON' - ELSE - 'FOLDER_ICON' - END AS iconName, - CASE item_type - WHEN 'UT_TEST' THEN - 'Yes' - ELSE - 'No' - END AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM test - ), - tree AS ( - SELECT parent_id, id, name, description, iconName, leaf, generatable, multiselectable, relevant - FROM suite_tree - UNION ALL - SELECT parent_id, id, name, description, iconName, leaf, generatable, multiselectable, relevant - FROM suitepath_tree - ) - SELECT parent_id, id, initcap(name) AS name, description, iconName, leaf, generatable, multiselectable, relevant - FROM tree - ''' - } else { - // using internal API (deprecated) - sql = ''' - WITH - base AS ( - SELECT rownum AS an_id, - o.object_owner, - o.object_type, - o.object_name, - lower(a.name) AS name, - a.text, - a.subobject_name - FROM table(«utplsqlSchema».ut_annotation_manager.get_annotated_objects(user, 'PACKAGE')) o - CROSS JOIN table(o.annotations) a - WHERE lower(a.name) in ('suite', 'suitepath', 'endcontext', 'test') - OR lower(a.name) = 'context' AND regexp_like(text, '(\w+)(\.\w+)*') - ), - suite AS ( - SELECT object_owner, object_type, object_name, text AS suite_description - FROM base - WHERE name = 'suite' - ), - suitepath as ( - SELECT object_owner, object_type, object_name, lower(text) AS suitepath - FROM base - WHERE name = 'suitepath' - ), - context_base AS ( - SELECT an_id, - lead(an_id) over (partition by object_owner, object_type, object_name order by an_id) AS an_id_end, - object_owner, - object_type, - object_name, - name, - lead(name) over (partition by object_owner, object_type, object_name order by an_id) AS name_end, - text as context - FROM base - WHERE name IN ('context', 'endcontext') - ), - context as ( - SELECT an_id, an_id_end, object_owner, object_type, object_name, context - FROM context_base - WHERE name = 'context' - AND name_end = 'endcontext' - ), - test AS ( - SELECT b.an_id, - b.object_owner, - b.object_type, - b.object_name, - p.suitepath, - c.context, - b.subobject_name, - b.text AS test_description - FROM base b - LEFT JOIN suitepath p - ON p.object_owner = b.object_owner - AND p.object_type = b.object_type - AND p.object_name = b.object_name - LEFT JOIN context c - ON c.object_owner = b.object_owner - AND c.object_type = b.object_type - AND c.object_name = b.object_name - AND b.an_id BETWEEN c.an_id AND c.an_id_end - WHERE name = 'test' - AND (b.object_owner, b.object_type, b.object_name) IN ( - SELECT object_owner, object_type, object_name - FROM suite - ) - ), - suite_tree AS ( - SELECT null AS parent_id, - 'SUITE' AS id, - 'All Suites' AS name, - 'All utPLSQL test suites' AS description, - 'PACKAGE_FOLDER_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM dual - UNION ALL - SELECT DISTINCT - 'SUITE' AS parent_id, - object_owner || '.' || object_name AS id, - object_name AS name, - null AS description, - 'PACKAGE_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM test - UNION ALL - SELECT object_owner || '.' || object_name AS parent_id, - object_owner || '.' || object_name || '.' || upper(subobject_name) AS id, - subobject_name AS name, - null AS description, - 'PROCEDURE_ICON' AS iconName, - 'Yes' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM test - ), - suitepath_base AS ( - SELECT DISTINCT - suitepath - FROM suitepath - ), - gen AS ( - SELECT rownum AS pos - FROM xmltable('1 to 100') - ), - suitepath_part AS ( - SELECT DISTINCT - lower(substr(suitepath, 1, instr(suitepath || '.', '.', 1, g.pos) -1)) AS suitepath - FROM suitepath_base b - JOIN gen g - ON g.pos <= regexp_count(suitepath, '\w+') - ), - suitepath_tree AS ( - SELECT NULL AS parent_id, - 'SUITEPATH' AS id, - 'All Suitepaths' AS name, - 'All utPLSQL test suitepathes' AS description, - 'FOLDER_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM dual - UNION ALL - SELECT CASE - WHEN regexp_replace(suitepath,'\.?\w+$','') IS NULL THEN - 'SUITEPATH' - ELSE - USER || ':' || regexp_replace(suitepath,'\.?\w+$','') - END AS parent_id, - USER || ':' || suitepath AS id, - regexp_substr(suitepath, '\.?(\w+$)', 1, 1, NULL, 1) AS name, - null AS description, - 'FOLDER_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM suitepath_part - UNION ALL - SELECT DISTINCT - object_owner || ':' || suitepath AS parent_id, - object_owner || ':' || suitepath || '.' || lower(object_name) AS id, - object_name AS name, - null AS description, - 'PACKAGE_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM test - WHERE suitepath IS NOT NULL - UNION ALL - SELECT DISTINCT - object_owner || ':' || suitepath || '.' || lower(object_name) AS parent_id, - object_owner || ':' || suitepath || '.' || lower(object_name) || '.' || context AS id, - context AS name, - null AS description, - 'FOLDER_ICON' AS iconName, - 'No' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM test - WHERE suitepath IS NOT NULL - AND context IS NOT NULL - UNION ALL - SELECT object_owner || ':' || suitepath || '.' || lower(object_name) || CASE WHEN context IS NOT NULL THEN '.' || context END AS parent_id, - object_owner || ':' || suitepath || '.' || lower(object_name) || CASE WHEN context IS NOT NULL THEN '.' || context END || '.' || lower(subobject_name) AS id, - subobject_name AS name, - null AS description, - 'PROCEDURE_ICON' AS iconName, - 'Yes' AS leaf, - 'Yes' AS generatable, - 'Yes' AS multiselectable, - 'Yes' AS relevant - FROM test - WHERE suitepath IS NOT NULL - ), - tree AS ( - SELECT parent_id, id, name, description, iconName, leaf, generatable, multiselectable, relevant - FROM suite_tree - UNION ALL - SELECT parent_id, id, name, description, iconName, leaf, generatable, multiselectable, relevant - FROM suitepath_tree - ) - SELECT parent_id, id, initcap(name) AS name, description, iconName, leaf, generatable, multiselectable, relevant - FROM tree - ''' - } - val nodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Node)) - return nodes - } - - /** - * enable DBMS_OUTPUT - * - * @throws DataAccessException if there is a problem - */ - def void enableDbmsOutput() { - // equivalent to "set serveroutput on size unlimited" - jdbcTemplate.update(''' - BEGIN - sys.dbms_output.enable(NULL); - END; - ''') - } + public UtplsqlDao(final Connection conn) { + jdbcTemplate = new JdbcTemplate(new SingleConnectionDataSource(conn, true)); + } - /** - * disable DBMS_OUTPUT - * - * @throws DataAccessException if there is a problem - */ - def void disableDbmsOutput() { - jdbcTemplate.update(''' - BEGIN - sys.dbms_output.disable; - END; - ''') - } + /** + * used for testing purposes only + */ + public void setUtPlsqlVersion(final String utPlsqlVersion) { + this.cachedUtPlsqlVersion = utPlsqlVersion; + } - /** - * return the content of DBMS_OUTPUT as String - * - * @throws DataAccessException if there is a problem - */ - def String getDbmsOutput() { - return getDbmsOutput(1000) - } - - /** - * return the content of DBMS_OUTPUT as String + /** + * returns a normalized utPLSQL version in format 9.9.9 + */ + public String normalizedUtPlsqlVersion() { + final String version = this.getUtPlsqlVersion(); + if ((version != null)) { + final Pattern p = Pattern.compile("(\\d+\\.\\d+\\.\\d+)"); + final Matcher m = p.matcher(version); + if (m.find()) { + return m.group(0); + } + } + return "0.0.0"; + } - * @param bufferSize maximum number of rows to be read from the DBMS_OUTPUT buffer in one network round trip - * @return content of DBMS_OUTPUT as String - * @throws DataAccessException if there is a problem - */ - def String getDbmsOutput(int bufferSize) { - val sb = new StringBuffer - val sql = ''' - BEGIN - sys.dbms_output.get_lines(?, ?); - END; - ''' - var OutputLines ret - do { - ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { - override OutputLines doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { - cs.registerOutParameter(1, Types.ARRAY, "DBMSOUTPUT_LINESARRAY"); - cs.registerOutParameter(2, Types.INTEGER) - cs.setInt(2, bufferSize) - cs.execute - val out = new OutputLines - out.lines = cs.getArray(1).array as String[] - out.numlines = cs.getInt(2) - return out - } - }) - for (i : 0 ..< ret.numlines) { - val line = ret.lines.get(i) - if (line !== null) { - sb.append(ret.lines.get(i)) - } - sb.append(System.lineSeparator) - } - } while (ret.numlines > 0) - return sb.toString - } + /** + * get version as number, e.g. 3001004 + */ + public int normalizedUtPlsqlVersionNumber() { + final Pattern p = Pattern.compile("(\\d+)"); + final String version = this.normalizedUtPlsqlVersion(); + final Matcher m = p.matcher(version); + m.find(); + final String major = m.group(); + m.find(); + final String minor = m.group(); + m.find(); + final String bugfix = m.group(); + final int versionNumber = Integer.valueOf(major) * 1000000 + Integer.valueOf(minor) * 1000 + + Integer.valueOf(bugfix); + return versionNumber; + } - /** - * gets the HTML code coverage report as String - * - * @param pathList utPLSQL path list - * @param schemaList list of schemas under tests. Current schema, if empty - * @param includeObjectList list of objects to be included for coverage analysis. All, if empty - * @param excludeObjectList list of objects to be excluded from coverage analysis. None, if empty - * @return HTML code coverage report in HTML format - * @throws DataAccessException if there is a problem - */ - def String htmlCodeCoverage(List pathList, List schemaList, List includeObjectList, List excludeObjectList) { - val sql = ''' - SELECT column_value - FROM table( - ut.run( - a_paths => ut_varchar2_list( - «FOR path : pathList SEPARATOR ", "» - '«path»' - «ENDFOR» - ), - «IF schemaList.size > 0» - a_coverage_schemes => ut_varchar2_list( - «FOR schema : schemaList SEPARATOR ", "» - '«schema»' - «ENDFOR» - ), - «ENDIF» - «IF includeObjectList.size > 0» - a_include_objects => ut_varchar2_list( - «FOR includeObject : includeObjectList SEPARATOR ", "» - '«includeObject»' - «ENDFOR» - ), - «ENDIF» - «IF excludeObjectList.size > 0» - a_exclude_objects => ut_varchar2_list( - «FOR excludeObject : excludeObjectList SEPARATOR ", "» - '«excludeObject»' - «ENDFOR» - ), - «ENDIF» - a_reporter => ut_coverage_html_reporter() - ) - ) - ''' - val lines = jdbcTemplate.queryForList(sql, String) - val sb = new StringBuilder - for (line : lines.filter[it !== null]) { - sb.append(line) - sb.append("\n") - } - return sb.toString - } + /** + * gets version of installed utPLSQL + */ + public String getUtPlsqlVersion() { + if (cachedUtPlsqlVersion == null) { + final StringBuilder sb = new StringBuilder(); + sb.append("BEGIN\n"); + sb.append(" ? := ut.version;\n"); + sb.append("END;"); + final String sql = sb.toString(); + try { + cachedUtPlsqlVersion = jdbcTemplate.execute(sql, new CallableStatementCallback() { + @Override + public String doInCallableStatement(final CallableStatement cs) throws SQLException { + cs.registerOutParameter(1, Types.VARCHAR); + cs.execute(); + final String version = cs.getString(1); + return version; + } + }); + } catch (DataAccessException e) { + // ignore error + } + } + return cachedUtPlsqlVersion; + } - /** - * gets dependencies of a given object. - * - * The result can be used as input for the includeObjectList in htmlCodeCoverage - * The scope is reduced to non-oracle maintained schemas. - * - * Oracle introduced the column ORACLE_MAINTAINED in 12.1. - * To simplify the query and compatibility the result of the following - * query is included - * - * SELECT '''' || listagg(username, ''', ''') || '''' AS oracle_maintained_users - * FROM dba_users - * WHERE oracle_maintained = 'Y' - * ORDER BY username; - * - * The result may include test packages - * - * @param name test package name - * @return list of dependencies in the current schema - */ - def List includes(String owner, String name) { - val sql = ''' - select referenced_owner || '.' || referenced_name AS dep_name - from «IF dbaViewAccessible»dba«ELSE»all«ENDIF»_dependencies - WHERE owner = upper(?) - AND name = upper(?) - AND referenced_owner NOT IN ( - 'SYS', 'SYSTEM', 'XS$NULL', 'OJVMSYS', 'LBACSYS', 'OUTLN', 'SYS$UMF', - 'DBSNMP', 'APPQOSSYS', 'DBSFWUSER', 'GGSYS', 'ANONYMOUS', 'CTXSYS', - 'SI_INFORMTN_SCHEMA', 'DVF', 'DVSYS', 'GSMADMIN_INTERNAL', 'ORDPLUGINS', - 'MDSYS', 'OLAPSYS', 'ORDDATA', 'XDB', 'WMSYS', 'ORDSYS', 'GSMCATUSER', - 'MDDATA', 'REMOTE_SCHEDULER_AGENT', 'SYSBACKUP', 'GSMUSER', 'APEX_PUBLIC_USER', - 'SYSRAC', 'AUDSYS', 'DIP', 'SYSKM', 'ORACLE_OCM', 'APEX_INSTANCE_ADMIN_USER', - 'SYSDG', 'FLOWS_FILES', 'ORDS_METADATA', 'ORDS_PUBLIC_USER' - ) - AND referenced_owner NOT LIKE 'APEX\_______' - AND referenced_type IN ('PACKAGE', 'TYPE', 'PROCEDURE', 'FUNCTION', 'TRIGGER') - ''' - val deps = jdbcTemplate.queryForList(sql, String, #[owner, name]) - return deps - } + public boolean isDbaViewAccessible() { + if ((cachedDbaViewAccessible == null)) { + try { + final StringBuilder sb = new StringBuilder(); + sb.append("SELECT 1 AS dummy\n"); + sb.append(" FROM dba_objects\n"); + sb.append(" WHERE 1=2\n"); + sb.append("UNION ALL\n"); + sb.append("SELECT 1\n"); + sb.append(" FROM dba_synonyms\n"); + sb.append(" WHERE 1=2\n"); + sb.append("UNION ALL\n"); + sb.append("SELECT 1\n"); + sb.append(" FROM dba_dependencies\n"); + sb.append(" WHERE 1=2\n"); + final String sql = sb.toString(); + jdbcTemplate.execute(sql); + cachedDbaViewAccessible = true; + } catch (DataAccessException e) { + cachedDbaViewAccessible = false; + } + } + return cachedDbaViewAccessible.booleanValue(); + } + + public String getDbaView(String viewName) { + StringBuilder sb = new StringBuilder(); + if (isDbaViewAccessible()) { + sb.append("dba"); + } else { + sb.append("all"); + } + sb.append("_"); + sb.append(viewName); + return sb.toString(); + } - /** - * gets source of an object from the database via DBMS_METADATA - * - * @param owner owner of the object (schema) - * @param objectType expected object types are PACKAGE, PACKAGE BODY - * @param objectName name of the object - * @return the source code of the object - * @throws DataAccessException if there is a problem - */ - def getSource(String owner, String objectType, String objectName) { - // dbms_metadata uses slightly different objectTypes - val fixedObjectType = if (objectType == "PACKAGE") { - "PACKAGE_SPEC" - } else if (objectType == "PACKAGE BODY") { - "PACKAGE_BODY" - } else { - objectType - } - val sql = ''' - BEGIN - ? := sys.dbms_metadata.get_ddl( - schema => ?, - object_type => ?, - name => ? - ); - END; - ''' - val ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { - override String doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { - cs.registerOutParameter(1, Types.CLOB); - cs.setString(2, owner) - cs.setString(3, fixedObjectType) - cs.setString(4, objectName) - cs.execute - return cs.getString(1) - } - }) - return ret - } - - /** - * gets the object type of a database object - * - * The object types "PACKAGE BODY", "TYPE BODY" have higher priority. - * "PACKAGE" OR "TYPE" will be returned only when no body exists. - * - * @param owner owner of the object (schema) - * @param objectName name of the object - * @return the object type, e.g. PACKAGE BODY, TYPE BODY, PROCEDURE, FUNCTION - */ - def getObjectType(String owner, String objectName) { - val sql = ''' - SELECT object_type - FROM ( - SELECT object_type - FROM «IF dbaViewAccessible»dba«ELSE»all«ENDIF»_objects - WHERE owner = ? - AND object_name = ? - ORDER BY decode(object_type, 'PACKAGE', 10, 'TYPE', 10, 'SYNONYM', 20, 1) - ) - WHERE rownum = 1 - ''' - val objectType = jdbcTemplate.queryForObject(sql, #[owner, objectName], String) - return objectType - } -} \ No newline at end of file + /** + * Gets the schema name of the utPLSQL installation. + * + * @return utPLSQL schema or null if no utPLSQL is not installed + * @throws DataAccessException + * if there is a problem + */ + public String getUtplsqlSchema() { + if ((cachedUtplsqlSchema == null)) { + final StringBuilder sb = new StringBuilder(); + sb.append("SELECT table_owner\n"); + sb.append(" FROM "); + sb.append(getDbaView("synonyms\n")); + sb.append(" WHERE owner = 'PUBLIC'\n"); + sb.append(" AND synonym_name = '"); + sb.append(UtplsqlDao.UTPLSQL_PACKAGE_NAME); + sb.append("'\n"); + sb.append(" AND table_name = '"); + sb.append(UtplsqlDao.UTPLSQL_PACKAGE_NAME); + sb.append("'"); + final String sql = sb.toString(); + try { + final String schema = jdbcTemplate.queryForObject(sql, String.class); + cachedUtplsqlSchema = schema; + } catch (EmptyResultDataAccessException e) { + cachedUtplsqlSchema = null; + } + } + return cachedUtplsqlSchema; + } + + /** + * Checks if the package ut_annotation_manager is installed. This package has + * been introduced with utPLSQL 3.0.4. This version is a prerequisite to + * identify utPLSQL unit test procedures. + * + * @return true if ut_annotation_manager package has been found + * @throws DataAccessException + * if there is a problem + */ + public boolean isUtAnnotationManagerInstalled() { + return normalizedUtPlsqlVersionNumber() >= UtplsqlDao.FIRST_VERSION_WITH_INTERNAL_ANNOTATION_API; + } + + /** + * Checks if utPLSQL tests exist + * + * @param owner + * schema name, mandatory, case-insensitive + * @param objectName + * name of the package or package body, optional, case-insensitive + * @param subobjectName + * name of the procedure, optional, case-insensitive + * @return true if at least one test has been found + * @throws DataAccessException + * if a utPLSQL version less than 3.0.4 is installed or if there are + * other problems + */ + public boolean containsUtplsqlTest(final String owner, final String objectName, final String subobjectName) { + try { + if (normalizedUtPlsqlVersionNumber() >= UtplsqlDao.FIRST_VERSION_WITH_HAS_SUITES_API && objectName != null + && subobjectName != null) { + // use faster check function available since v3.1.3 (reliable in v3.1.8) + final StringBuilder sb = new StringBuilder(); + sb.append("DECLARE\n"); + sb.append(" l_return VARCHAR2(1) := '0';\n"); + sb.append("BEGIN\n"); + sb.append(" IF ut_runner.is_test(?, ?, ?) THEN\n"); + sb.append(" l_return := '1';\n"); + sb.append(" END IF;\n"); + sb.append(" ? := l_return;\n"); + sb.append("END;"); + final String sql = sb.toString(); + final Boolean ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + @Override + public Boolean doInCallableStatement(final CallableStatement cs) throws SQLException { + cs.setString(1, owner); + cs.setString(2, objectName); + cs.setString(3, subobjectName); + cs.registerOutParameter(4, Types.VARCHAR); + cs.execute(); + final String ret = cs.getString(4); + return Boolean.valueOf(Objects.equal(ret, "1")); + } + }); + return ret; + } else if (normalizedUtPlsqlVersionNumber() >= FIRST_VERSION_WITH_ANNOTATION_API) { + // using API available since 3.1.3, can handle nulls in objectName and subobjectName + StringBuilder sb = new StringBuilder(); + sb.append("SELECT count(*)\n"); + sb.append(" FROM TABLE(ut_runner.get_suites_info(upper(?), upper(?)))\n"); + sb.append(" WHERE item_type IN ('UT_TEST', 'UT_SUITE')\n"); + sb.append(" AND (item_name = upper(?) or ? IS NULL)\n"); + final String sql = sb.toString(); + final Object[] binds = new Object[] {owner, objectName, subobjectName, subobjectName}; + final Integer found = jdbcTemplate.queryForObject(sql, Integer.class, binds); + return found > 0; + } else { + // using internal API (deprecated, not accessible in latest version) + StringConcatenation sb = new StringConcatenation(); + sb.append("SELECT count(\n"); + sb.append(" CASE\n"); + sb.append(" WHEN a.name = 'test'\n"); + sb.append(" AND (upper(a.subobject_name) = upper(?) OR ? IS NULL)\n"); + sb.append(" THEN\n"); + sb.append(" 1\n"); + sb.append(" ELSE\n"); + sb.append(" NULL\n"); + sb.append(" END\n"); + sb.append(" )\n"); + sb.append(" FROM TABLE("); + sb.append(getUtplsqlSchema()); + sb.append(".ut_annotation_manager.get_annotated_objects(upper(?), 'PACKAGE')) o\n"); + sb.append(" CROSS JOIN TABLE(o.annotations) a\n"); + sb.append(" WHERE (o.object_name = upper(?) OR ? IS NULL)\n"); + sb.append(" AND a.name IN ('test', 'suite')\n"); + sb.append("HAVING count(\n"); + sb.append(" CASE\n"); + sb.append(" WHEN a.name = 'suite' THEN\n"); + sb.append(" 1\n"); + sb.append(" ELSE\n"); + sb.append(" NULL\n"); + sb.append(" END\n"); + sb.append(" ) > 0"); + final String sql = sb.toString(); + final Object[] binds = new Object[] {subobjectName, subobjectName, owner, objectName, objectName}; + final Integer found = jdbcTemplate.queryForObject(sql, Integer.class, binds); + return found > 0; + } + } catch (EmptyResultDataAccessException e) { + return false; + } + } + + public boolean containsUtplsqlTest(final String owner) { + if (normalizedUtPlsqlVersionNumber() >= org.utplsql.sqldev.dal.UtplsqlDao.FIRST_VERSION_WITH_HAS_SUITES_API) { + // use faster check function available since v3.1.3 (reliable in v3.1.8) + StringBuilder sb = new StringBuilder(); + sb.append("DECLARE\n"); + sb.append(" l_return VARCHAR2(1) := '0';\n"); + sb.append("BEGIN\n"); + sb.append(" IF ut_runner.has_suites(?) THEN\n"); + sb.append(" l_return := '1';\n"); + sb.append(" END IF;\n"); + sb.append(" ? := l_return;\n"); + sb.append("END;"); + final String sql = sb.toString(); + final Boolean ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + @Override + public Boolean doInCallableStatement(final CallableStatement cs) + throws SQLException { + cs.setString(1, owner); + cs.registerOutParameter(2, Types.VARCHAR); + cs.execute(); + final String ret = cs.getString(2); + return Boolean.valueOf(Objects.equal(ret, "1")); + } + }); + return ret; + } else { + return containsUtplsqlTest(owner, null, null); + } + } + + public boolean containsUtplsqlTest(final String owner, final String objectName) { + if (normalizedUtPlsqlVersionNumber() >= org.utplsql.sqldev.dal.UtplsqlDao.FIRST_VERSION_WITH_HAS_SUITES_API) { + StringBuilder sb = new StringBuilder(); + sb.append("DECLARE\n"); + sb.append(" l_return VARCHAR2(1) := '0';\n"); + sb.append("BEGIN\n"); + sb.append(" IF ut_runner.is_suite(?, ?) THEN\n"); + sb.append(" l_return := '1';\n"); + sb.append(" END IF;\n"); + sb.append(" ? := l_return;\n"); + sb.append("END;"); + final String sql = sb.toString(); + final Boolean ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + @Override + public Boolean doInCallableStatement(final CallableStatement cs) + throws SQLException { + cs.setString(1, owner); + cs.setString(2, objectName); + cs.registerOutParameter(3, Types.VARCHAR); + cs.execute(); + final String ret = cs.getString(3); + return Boolean.valueOf(Objects.equal(ret, "1")); + } + }); + return ret; + } else { + return containsUtplsqlTest(owner, objectName, null); + } + } + + /** + * Gets a list of utPLSQL annotations for a given PL/SQL package specification + * + * @param owner + * schema name, mandatory, case-insensitive + * @param objectName + * name of the package or package body, optional, case-insensitive + * @return list of Annotation with name 'suite' or 'test' + * @throws DataAccessException + * if a utPLSQL version less than 3.0.4 is installed or if there are + * other problems + */ + public List annotations(final String owner, final String objectName) { + StringBuilder sb = new StringBuilder(); + if (normalizedUtPlsqlVersionNumber() >= FIRST_VERSION_WITH_ANNOTATION_API) { + sb.append("SELECT object_owner,\n"); + sb.append(" object_name,\n"); + sb.append(" lower(substr(item_type, 4)) AS name,\n"); + sb.append(" item_name as subobject_name\n"); + sb.append(" FROM TABLE(ut_runner.get_suites_info(upper(?), upper(?)))"); + } else { + sb.append("SELECT o.object_owner,\n"); + sb.append(" o.object_name,\n"); + sb.append(" a.name,\n"); + sb.append(" a.text,\n"); + sb.append(" coalesce(upper(a.subobject_name), o.object_name) AS subobject_name\n"); + sb.append(" FROM TABLE("); + sb.append(getUtplsqlSchema()); + sb.append(".ut_annotation_manager.get_annotated_objects(upper(?), 'PACKAGE')) o\n"); + sb.append(" CROSS JOIN TABLE(o.annotations) a\n"); + sb.append(" WHERE o.object_name = upper(?)"); + } + final String sql = sb.toString(); + final BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper<>(Annotation.class); + final Object[] binds = new Object[] {owner, objectName}; + final List result = jdbcTemplate.query(sql, rowMapper, binds); + return result; + } + + /** + * Gets a list of public units in the object type + * + * @param objectType + * expected object types are PACKAGE, TYPE, FUNCTION, PROCEDURE + * @param objectName + * name of the object + * @return list of the public units in the object type + * @throws DataAccessException + * if there is a problem + */ + public List units(final String objectType, final String objectName) { + if ("PACKAGE".equals(objectType) || "TYPE".equals(objectType)) { + StringBuilder sb = new StringBuilder(); + sb.append("SELECT procedure_name\n"); + sb.append(" FROM user_procedures\n"); + sb.append(" WHERE object_type = ?\n"); + sb.append(" AND object_name = ?\n"); + sb.append(" AND procedure_name IS NOT NULL\n"); + sb.append(" GROUP BY procedure_name\n"); + sb.append(" ORDER BY min(subprogram_id)"); + final String sql = sb.toString(); + final Object[] binds = new Object[] {objectType, objectName}; + final List result = jdbcTemplate.queryForList(sql, String.class, binds); + return result; + } else { + return CollectionLiterals.newArrayList(objectName); + } + } + + /** + * Gets a list of oddgen's nodes as candidates to create utPLSQL test packages. + * Candidates are packages, types, functions and procedures in the current user. + * + * This functions must be called from an oddgen generator only, since the Node + * is not defined in the utPLSQL extension. + * + * @param objectType + * expected object types are PACKAGE, TYPE, FUNCTION, PROCEDURE + * @return list of the oddgen nodes for the requested object type + * @throws DataAccessException + * if there is a problem + */ + public List testables(final String objectType) { + StringConcatenation sb = new StringConcatenation(); + if ("PACKAGE".equals(objectType)) { + if (normalizedUtPlsqlVersionNumber() >= FIRST_VERSION_WITH_ANNOTATION_API) { + // using API available since 3.1.3 + sb.append("SELECT DISTINCT\n"); + sb.append(" object_type || '.' || object_name AS id,\n"); + sb.append(" object_type AS parent_id,\n"); + sb.append(" 1 AS leaf,\n"); + sb.append(" 1 AS generatable\n,"); + sb.append(" 1 AS multiselectable\n"); + sb.append(" FROM user_procedures\n"); + sb.append(" WHERE object_type = ?\n"); + sb.append(" AND procedure_name IS NOT NULL\n"); + sb.append(" AND object_name NOT IN (\n"); + sb.append(" SELECT object_name\n"); + sb.append(" FROM TABLE(ut_runner.get_suites_info(USER))\n"); + sb.append(" WHERE item_type = 'UT_SUITE'\n"); + sb.append(" )"); + } else { + // using internal API (deprecated, not accessible in latest version) + sb.append("SELECT DISTINCT\n"); + sb.append(" object_type || '.' || object_name AS id,\n"); + sb.append(" object_type AS parent_id,\n"); + sb.append(" 1 AS leaf,\n"); + sb.append(" 1 AS generatable,\n"); + sb.append(" 1 AS multiselectable\n"); + sb.append(" FROM user_procedures\n"); + sb.append(" WHERE object_type = ?\n"); + sb.append(" AND procedure_name IS NOT NULL\n"); + sb.append(" AND object_name NOT IN (\n"); + sb.append(" SELECT object_name\n"); + sb.append(" FROM TABLE(\n"); + sb.append(getUtplsqlSchema()); + sb.append(".ut_annotation_manager.get_annotated_objects(USER, 'PACKAGE'))\n"); + sb.append(" )"); + } + } else if ("TYPE".equals(objectType)) { + sb.append("SELECT DISTINCT\n"); + sb.append(" object_type || '.' || object_name AS id,\n"); + sb.append(" object_type AS parent_id,\n"); + sb.append(" 1 AS leaf,\n"); + sb.append(" 1 AS generatable,\n"); + sb.append(" 1 AS multiselectable\n"); + sb.append(" FROM user_procedures\n"); + sb.append(" WHERE object_type = ?\n"); + sb.append(" AND procedure_name IS NOT NULL"); + } else { + sb.append("SELECT object_type || '.' || object_name AS id,\n"); + sb.append(" object_type AS parent_id,\n"); + sb.append(" 1 AS leaf,\n"); + sb.append(" 1 AS generatable,\n"); + sb.append(" 1 AS multiselectable\n"); + sb.append(" FROM user_objects\n"); + sb.append(" WHERE object_type = ?\n"); + sb.append(" AND generated = 'N'"); + } + final String sql = sb.toString(); + final Object[] binds = new Object[] {objectType}; + BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper<>(Node.class); + final List nodes = jdbcTemplate.query(sql, rowMapper, binds); + return nodes; + } + + /** + * Gets a list of oddgen's nodes as candidates to run utPLSQL tests. + * + * This functions must be called from an oddgen generator only, since the Node + * is not defined in the utPLSQL extension. + * + * @return list of oddgen nodes (complete hierarchy loaded eagerly) + * @throws DataAccessException + * if there is a problem + */ + public List runnables() { + StringBuilder sb = new StringBuilder(); + if (normalizedUtPlsqlVersionNumber() >= FIRST_VERSION_WITH_ANNOTATION_API) { + // using API available since 3.1.3 + sb.append("WITH\n"); + sb.append(" test AS (\n"); + sb.append(" SELECT object_owner,\n"); + sb.append(" object_name,\n"); + sb.append(" path AS suitepath,\n"); + sb.append(" count(\n"); + sb.append(" CASE\n"); + sb.append(" WHEN item_type = 'UT_TEST' THEN\n"); + sb.append(" 1\n"); + sb.append(" ELSE\n"); + sb.append(" NULL\n"); + sb.append(" END\n"); + sb.append(" ) over (partition by object_owner, object_name) AS test_count,\n"); + sb.append(" item_type,\n"); + sb.append(" item_name,\n"); + sb.append(" item_description\n"); + sb.append(" FROM TABLE(ut_runner.get_suites_info(user))\n"); + sb.append(" ),\n"); + sb.append(" suite_tree AS (\n"); + sb.append(" SELECT null AS parent_id,\n"); + sb.append(" 'SUITE' AS id,\n"); + sb.append(" 'All Suites' AS name,\n"); + sb.append(" 'All utPLSQL test suites' AS description,\n"); + sb.append(" 'PACKAGE_FOLDER_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM dual\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT DISTINCT\n"); + sb.append(" 'SUITE' AS parent_id,\n"); + sb.append(" object_owner || '.' || object_name AS id,\n"); + sb.append(" object_name AS name,\n"); + sb.append(" null AS description,\n"); + sb.append(" 'PACKAGE_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM test\n"); + sb.append(" WHERE item_type IN ('UT_TEST', 'UT_SUITE')\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT object_owner || '.' || object_name AS parent_id,\n"); + sb.append(" object_owner || '.' || object_name || '.' || item_name AS id,\n"); + sb.append(" item_name AS name,\n"); + sb.append(" item_description AS description,\n"); + sb.append(" 'PROCEDURE_ICON' AS iconName,\n"); + sb.append(" 'Yes' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM test\n"); + sb.append(" WHERE item_type = 'UT_TEST'\n"); + sb.append(" ),\n"); + sb.append(" suitepath_tree AS (\n"); + sb.append(" SELECT NULL AS parent_id,\n"); + sb.append(" 'SUITEPATH' AS id,\n"); + sb.append(" 'All Suitepaths' AS name\n,"); + sb.append(" 'All utPLSQL test suitepathes' AS description,\n"); + sb.append(" 'FOLDER_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM dual\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT CASE\n"); + sb.append(" WHEN regexp_replace(suitepath,'\\.?\\w+$','') IS NULL THEN\n"); + sb.append(" 'SUITEPATH'\n"); + sb.append(" ELSE\n"); + sb.append(" object_owner || ':' || regexp_replace(suitepath,'\\.?\\w+$','')\n"); + sb.append(" END AS parent_id,\n"); + sb.append(" object_owner || ':' || suitepath AS id,\n"); + sb.append(" item_name AS name,\n"); + sb.append(" item_description AS description,\n"); + sb.append(" CASE\n"); + sb.append(" WHEN item_type = 'UT_SUITE' AND test_count > 0 THEN\n"); + sb.append(" 'PACKAGE_ICON'\n"); + sb.append(" WHEN item_type = 'UT_TEST' THEN\n"); + sb.append(" 'PROCEDURE_ICON'\n"); + sb.append(" ELSE\n"); + sb.append(" 'FOLDER_ICON'\n"); + sb.append(" END AS iconName,\n"); + sb.append(" CASE item_type\n"); + sb.append(" WHEN 'UT_TEST' THEN\n"); + sb.append(" 'Yes'\n"); + sb.append(" ELSE\n"); + sb.append(" 'No'\n"); + sb.append(" END AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM test\n"); + sb.append(" ),\n"); + sb.append(" tree AS (\n"); + sb.append(" SELECT parent_id, id, name, description, iconName, leaf, generatable, multiselectable, relevant\n"); + sb.append(" FROM suite_tree\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT parent_id, id, name, description, iconName, leaf, generatable, multiselectable, relevant\n"); + sb.append(" FROM suitepath_tree\n"); + sb.append(" )\n"); + sb.append("SELECT parent_id, id, initcap(name) AS name, description, iconName, leaf, generatable, multiselectable, relevant\n"); + sb.append(" FROM tree"); + } else { + // using internal API (deprecated, not accessible in latest version) + sb.append("WITH\n"); + sb.append(" base AS (\n"); + sb.append(" SELECT rownum AS an_id,\n"); + sb.append(" o.object_owner,\n"); + sb.append(" o.object_type,\n"); + sb.append(" o.object_name,\n"); + sb.append(" lower(a.name) AS name,\n"); + sb.append(" a.text,\n"); + sb.append(" a.subobject_name\n"); + sb.append(" FROM table("); + sb.append(getUtplsqlSchema()); + sb.append(".ut_annotation_manager.get_annotated_objects(user, 'PACKAGE')) o\n"); + sb.append(" CROSS JOIN table(o.annotations) a\n"); + sb.append(" WHERE lower(a.name) in ('suite', 'suitepath', 'endcontext', 'test')\n"); + sb.append(" OR lower(a.name) = 'context' AND regexp_like(text, '(\\w+)(\\.\\w+)*')\n"); + sb.append(" ),\n"); + sb.append(" suite AS (\n"); + sb.append(" SELECT object_owner, object_type, object_name, text AS suite_description\n"); + sb.append(" FROM base\n"); + sb.append(" WHERE name = 'suite'\n"); + sb.append(" ),\n"); + sb.append(" suitepath as (\n"); + sb.append(" SELECT object_owner, object_type, object_name, lower(text) AS suitepath\n"); + sb.append(" FROM base\n"); + sb.append(" WHERE name = 'suitepath'"); + sb.append(" ),\n"); + sb.append(" context_base AS (\n"); + sb.append(" SELECT an_id,\n"); + sb.append(" lead(an_id) over (partition by object_owner, object_type, object_name order by an_id) AS an_id_end,\n"); + sb.append(" object_owner,\n"); + sb.append(" object_type,\n"); + sb.append(" object_name,\n"); + sb.append(" name,\n"); + sb.append(" lead(name) over (partition by object_owner, object_type, object_name order by an_id) AS name_end,\n"); + sb.append(" text AS context\n"); + sb.append(" FROM base\n"); + sb.append(" WHERE name IN ('context', 'endcontext')\n"); + sb.append(" ),\n"); + sb.append(" context AS (\n"); + sb.append(" SELECT an_id, an_id_end, object_owner, object_type, object_name, context\n"); + sb.append(" FROM context_base\n"); + sb.append(" WHERE name = 'context'\n"); + sb.append(" AND name_end = 'endcontext'\n"); + sb.append(" ),\n"); + sb.append(" test AS (\n"); + sb.append(" SELECT b.an_id,\n"); + sb.append(" b.object_owner,\n"); + sb.append(" b.object_type,\n"); + sb.append(" b.object_name,\n"); + sb.append(" p.suitepath,\n"); + sb.append(" c.context,\n"); + sb.append(" b.subobject_name,\n"); + sb.append(" b.text AS test_description\n"); + sb.append(" FROM base b\n"); + sb.append(" LEFT JOIN suitepath p\n"); + sb.append(" ON p.object_owner = b.object_owner\n"); + sb.append(" AND p.object_type = b.object_type\n"); + sb.append(" AND p.object_name = b.object_name\n"); + sb.append(" LEFT JOIN context c\n"); + sb.append(" ON c.object_owner = b.object_owner\n"); + sb.append(" AND c.object_type = b.object_type\n"); + sb.append(" AND c.object_name = b.object_name\n"); + sb.append(" AND b.an_id BETWEEN c.an_id AND c.an_id_end\n"); + sb.append(" WHERE name = 'test'\n"); + sb.append(" AND (b.object_owner, b.object_type, b.object_name) IN (\n"); + sb.append(" SELECT object_owner, object_type, object_name\n"); + sb.append(" FROM suite\n"); + sb.append(" )\n"); + sb.append(" ),\n"); + sb.append(" suite_tree AS (\n"); + sb.append(" SELECT null AS parent_id,\n"); + sb.append(" 'SUITE' AS id,\n"); + sb.append(" 'All Suites' AS name,\n"); + sb.append(" 'All utPLSQL test suites' AS description,\n"); + sb.append(" 'PACKAGE_FOLDER_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM dual\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT DISTINCT\n"); + sb.append(" 'SUITE' AS parent_id,\n"); + sb.append(" 'object_owner || '.' || object_name AS id,\n"); + sb.append(" object_name AS name,\n"); + sb.append(" NULL AS description,\n"); + sb.append(" 'PACKAGE_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM test\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT object_owner || '.' || object_name AS parent_id,\n"); + sb.append(" object_owner || '.' || object_name || '.' || upper(subobject_name) AS id,\n"); + sb.append(" subobject_name AS name,\n"); + sb.append(" NULL AS description,\n"); + sb.append(" 'PROCEDURE_ICON' AS iconName,\n"); + sb.append(" 'Yes' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM test\n"); + sb.append(" ),\n"); + sb.append(" suitepath_base AS (\n"); + sb.append(" SELECT DISTINCT\n"); + sb.append(" suitepath\n"); + sb.append(" FROM suitepath\n"); + sb.append(" ),\n"); + sb.append(" gen AS (\n"); + sb.append(" SELECT rownum AS pos\n"); + sb.append(" FROM xmltable(\'1 to 100\')\n"); + sb.append(" ),\n"); + sb.append(" suitepath_part AS (\n"); + sb.append(" SELECT DISTINCT\n"); + sb.append(" lower(substr(suitepath, 1, instr(suitepath || '.', '.', 1, g.pos) -1)) AS suitepath\n"); + sb.append(" FROM suitepath_base b\n"); + sb.append(" JOIN gen g\n"); + sb.append(" ON g.pos <= regexp_count(suitepath, '\\w+')\n"); + sb.append(" ),\n"); + sb.append(" suitepath_tree AS (\n"); + sb.append(" SELECT NULL AS parent_id,\n"); + sb.append(" 'SUITEPATH' AS id,\n"); + sb.append(" 'All Suitepaths' AS name,\n"); + sb.append(" 'All utPLSQL test suitepathes' AS description,\n"); + sb.append(" 'FOLDER_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM dual\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT CASE\n"); + sb.append(" WHEN regexp_replace(suitepath,'\\.?\\w+$','') IS NULL THEN\n"); + sb.append(" 'SUITEPATH'\n"); + sb.append(" ELSE\n"); + sb.append(" USER || ':' || regexp_replace(suitepath,'\\.?\\w+$','')"); + sb.append(" END AS parent_id,\n"); + sb.append(" USER || ':' || suitepath AS id,\n"); + sb.append(" regexp_substr(suitepath, '\\.?(\\w+$)', 1, 1, NULL, 1) AS name,\n"); + sb.append(" NULL AS description,\n"); + sb.append(" 'FOLDER_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM suitepath_part\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT DISTINCT\n"); + sb.append(" object_owner || ':' || suitepath AS parent_id,\n"); + sb.append(" object_owner || ':' || suitepath || '.' || lower(object_name) AS id,\n"); + sb.append(" object_name AS name,\n"); + sb.append(" NULL AS description,\n"); + sb.append(" 'PACKAGE_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM test\n"); + sb.append(" WHERE suitepath IS NOT NULL\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT DISTINCT\n"); + sb.append(" object_owner || ':' || suitepath || '.' || lower(object_name) AS parent_id,\n"); + sb.append(" object_owner || ':' || suitepath || '.' || lower(object_name) || '.' || context AS id,\n"); + sb.append(" context AS name,\n"); + sb.append(" NULL AS description,\n"); + sb.append(" 'FOLDER_ICON' AS iconName,\n"); + sb.append(" 'No' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable,\n"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM test\n"); + sb.append(" WHERE suitepath IS NOT NULL\n"); + sb.append(" AND context IS NOT NULL\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT object_owner || ':' || suitepath || '.' || lower(object_name) || CASE WHEN context IS NOT NULL THEN '.' || context END AS parent_id,\n"); + sb.append(" object_owner || ':' || suitepath || '.' || lower(object_name) || CASE WHEN context IS NOT NULL THEN '.' || context END || '.' || lower(subobject_name) AS id,\n"); + sb.append(" subobject_name AS name,\n"); + sb.append(" NULL AS description,\n"); + sb.append(" 'PROCEDURE_ICON' AS iconName,\n"); + sb.append(" 'Yes' AS leaf,\n"); + sb.append(" 'Yes' AS generatable,\n"); + sb.append(" 'Yes' AS multiselectable\n,"); + sb.append(" 'Yes' AS relevant\n"); + sb.append(" FROM test\n"); + sb.append(" WHERE suitepath IS NOT NULL\n"); + sb.append(" ),\n"); + sb.append(" tree AS (\n"); + sb.append(" SELECT parent_id, id, name, description, iconName, leaf, generatable, multiselectable, relevant\n"); + sb.append(" FROM suite_tree\n"); + sb.append(" UNION ALL\n"); + sb.append(" SELECT parent_id, id, name, description, iconName, leaf, generatable, multiselectable, relevant\n"); + sb.append(" FROM suitepath_tree\n"); + sb.append(" )\n"); + sb.append("SELECT parent_id, id, initcap(name) AS name, description, iconName, leaf, generatable, multiselectable, relevant\n"); + sb.append(" FROM tree"); + } + BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper(Node.class); + final String sql = sb.toString(); + final List nodes = jdbcTemplate.query(sql, rowMapper); + return nodes; + } + + /** + * enable DBMS_OUTPUT + * + * @throws DataAccessException + * if there is a problem + */ + public void enableDbmsOutput() { + // equivalent to "set serveroutput on size unlimited" + StringBuilder sb = new StringBuilder(); + sb.append("BEGIN"); + sb.append(" sys.dbms_output.enable(NULL);\n"); + sb.append("END;"); + jdbcTemplate.update(sb.toString()); + } + + /** + * disable DBMS_OUTPUT + * + * @throws DataAccessException + * if there is a problem + */ + public void disableDbmsOutput() { + StringBuilder sb = new StringBuilder(); + sb.append("BEGIN\n"); + sb.append(" sys.dbms_output.disable;\n"); + sb.append("END;"); + jdbcTemplate.update(sb.toString()); + } + + /** + * return the content of DBMS_OUTPUT as String + * + * @throws DataAccessException + * if there is a problem + */ + public String getDbmsOutput() { + return getDbmsOutput(1000); + } + + /** + * return the content of DBMS_OUTPUT as String + * + * @param bufferSize + * maximum number of rows to be read from the DBMS_OUTPUT buffer in + * one network round trip + * @return content of DBMS_OUTPUT as String + * @throws DataAccessException + * if there is a problem + */ + public String getDbmsOutput(final int bufferSize) { + final StringBuilder resultSb = new StringBuilder(); + StringBuilder sb = new StringBuilder(); + sb.append("BEGIN"); + sb.append(" sys.dbms_output.get_lines(?, ?);\n"); + sb.append("END;"); + final String sql = sb.toString(); + OutputLines ret = null; + do { + ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + @Override + public OutputLines doInCallableStatement(final CallableStatement cs) throws SQLException { + cs.registerOutParameter(1, Types.ARRAY, "DBMSOUTPUT_LINESARRAY"); + cs.registerOutParameter(2, Types.INTEGER); + cs.setInt(2, bufferSize); + cs.execute(); + final OutputLines out = new OutputLines(); + Object _array = cs.getArray(1).getArray(); + out.setLines(((String[]) _array)); + out.setNumlines(Integer.valueOf(cs.getInt(2))); + return out; + } + }); + for (int i = 0; i < ret.getNumlines(); i++) { + final String line = ret.getLines()[i]; + if ((line != null)) { + resultSb.append(ret.getLines()[i]); + } + resultSb.append(System.lineSeparator()); + } + } while (ret.getNumlines() > 0); + return resultSb.toString(); + } + + /** + * gets the HTML code coverage report as String + * + * @param pathList + * utPLSQL path list + * @param schemaList + * list of schemas under tests. Current schema, if empty + * @param includeObjectList + * list of objects to be included for coverage analysis. All, if + * empty + * @param excludeObjectList + * list of objects to be excluded from coverage analysis. None, if + * empty + * @return HTML code coverage report in HTML format + * @throws DataAccessException + * if there is a problem + */ + public String htmlCodeCoverage(final List pathList, final List schemaList, + final List includeObjectList, final List excludeObjectList) { + StringBuilder sb = new StringBuilder(); + sb.append("SELECT column_value\n"); + sb.append(" FROM table(\n"); + sb.append(" ut.run(\n"); + sb.append(" a_paths => ut_varchar2_list(\n"); + sb.append(StringUtil.getCSV(pathList, 16)); + sb.append(" ),\n"); + if (schemaList.size() > 0) { + sb.append(" a_coverage_schemes => ut_varchar2_list(\n"); + sb.append(StringUtil.getCSV(schemaList, 16)); + sb.append(" ),\n"); + } + if (includeObjectList.size() > 0) { + sb.append(" a_include_objects => ut_varchar2_list(\n"); + sb.append(StringUtil.getCSV(includeObjectList, 16)); + sb.append(" ),\n"); + } + if (excludeObjectList.size() > 0) { + sb.append(" a_exclude_objects => ut_varchar2_list(\n"); + sb.append(StringUtil.getCSV(excludeObjectList, 16)); + sb.append(" ),\n"); + } + sb.append(" a_reporter => ut_coverage_html_reporter()\n"); + sb.append(" )\n"); + sb.append(" )"); + final String sql = sb.toString(); + final List lines = jdbcTemplate.queryForList(sql, String.class); + final StringBuilder resultSb = new StringBuilder(); + for (String line : lines) { + if (line != null) { + resultSb.append(line); + resultSb.append("\n"); + } + } + return resultSb.toString(); + } + + /** + * gets dependencies of a given object. + * + * The result can be used as input for the includeObjectList in htmlCodeCoverage + * The scope is reduced to non-oracle maintained schemas. + * + * Oracle introduced the column ORACLE_MAINTAINED in 12.1. To simplify the query + * and compatibility the result of the following query is included + * + * SELECT '''' || listagg(username, ''', ''') || '''' AS oracle_maintained_users + * FROM dba_users WHERE oracle_maintained = 'Y' ORDER BY username; + * + * The result may include test packages + * + * @param name + * test package name + * @return list of dependencies in the current schema + */ + public List includes(final String owner, final String name) { + StringBuilder sb = new StringBuilder(); + sb.append("SELECT referenced_owner || '.' || referenced_name AS dep_name\n"); + sb.append(" FROM "); + sb.append(getDbaView("dependencies\n")); + sb.append(" WHERE owner = upper(?)\n"); + sb.append(" AND name = upper(?)\n"); + sb.append(" AND referenced_owner NOT IN (\n"); + sb.append(" 'SYS', 'SYSTEM', 'XS$NULL', 'OJVMSYS', 'LBACSYS', 'OUTLN', 'SYS$UMF',\n"); + sb.append(" 'DBSNMP', 'APPQOSSYS', 'DBSFWUSER', 'GGSYS', 'ANONYMOUS', 'CTXSYS',\n"); + sb.append(" 'SI_INFORMTN_SCHEMA', 'DVF', 'DVSYS', 'GSMADMIN_INTERNAL', 'ORDPLUGINS',\n"); + sb.append(" 'MDSYS', 'OLAPSYS', 'ORDDATA', 'XDB', 'WMSYS', 'ORDSYS', 'GSMCATUSER',\n"); + sb.append(" 'MDDATA', 'REMOTE_SCHEDULER_AGENT', 'SYSBACKUP', 'GSMUSER', 'APEX_PUBLIC_USER',\n"); + sb.append(" 'SYSRAC', 'AUDSYS', 'DIP', 'SYSKM', 'ORACLE_OCM', 'APEX_INSTANCE_ADMIN_USER',\n"); + sb.append(" 'SYSDG', 'FLOWS_FILES', 'ORDS_METADATA', 'ORDS_PUBLIC_USER'\n"); + sb.append(" )\n"); + sb.append(" AND referenced_owner NOT LIKE 'APEX\\_______'"); + sb.append(" AND referenced_type IN ('PACKAGE', 'TYPE', 'PROCEDURE', 'FUNCTION', 'TRIGGER')"); + final String sql = sb.toString(); + final Object[] binds = new Object[] {owner, name}; + final List deps = jdbcTemplate.queryForList(sql, String.class, binds); + return deps; + } + + /** + * gets source of an object from the database via DBMS_METADATA + * + * @param owner + * owner of the object (schema) + * @param objectType + * expected object types are PACKAGE, PACKAGE BODY + * @param objectName + * name of the object + * @return the source code of the object + * @throws DataAccessException + * if there is a problem + */ + public String getSource(final String owner, final String objectType, final String objectName) { + String fixedObjectType; + if ("PACKAGE".equals(objectType)) { + fixedObjectType = "PACKAGE_SPEC"; + } else if ("PACKAGE BODY".equals(objectType)) { + fixedObjectType = "PACKAGE_BODY"; + } else { + fixedObjectType = objectType; + } + StringBuilder sb = new StringBuilder(); + sb.append("BEGIN\n"); + sb.append(" ? := sys.dbms_metadata.get_ddl(\n"); + sb.append(" schema => ?,\n"); + sb.append(" object_type => ?,\n"); + sb.append(" name => ?\n"); + sb.append(" );\n"); + sb.append("END;"); + final String sql = sb.toString(); + final String ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + @Override + public String doInCallableStatement(final CallableStatement cs) throws SQLException { + cs.registerOutParameter(1, Types.CLOB); + cs.setString(2, owner); + cs.setString(3, fixedObjectType); + cs.setString(4, objectName); + cs.execute(); + return cs.getString(1); + } + }); + return ret; + } + + /** + * gets the object type of a database object + * + * The object types "PACKAGE BODY", "TYPE BODY" have higher priority. "PACKAGE" + * OR "TYPE" will be returned only when no body exists. + * + * @param owner + * owner of the object (schema) + * @param objectName + * name of the object + * @return the object type, e.g. PACKAGE BODY, TYPE BODY, PROCEDURE, FUNCTION + */ + public String getObjectType(final String owner, final String objectName) { + StringConcatenation sb = new StringConcatenation(); + sb.append("SELECT object_type\n"); + sb.append(" FROM (\n"); + sb.append(" SELECT object_type\n"); + sb.append(" FROM "); + sb.append(getDbaView("objects\n")); + sb.append(" WHERE owner = ?\n"); + sb.append(" AND object_name = ?\n"); + sb.append(" ORDER BY decode(object_type, 'PACKAGE', 10, 'TYPE', 10, 'SYNONYM', 20, 1)\n"); + sb.append(" )\n"); + sb.append(" WHERE rownum = 1"); + final String sql = sb.toString(); + final Object[] binds = new Object[] {owner, objectName}; + final String objectType = jdbcTemplate.queryForObject(sql, binds, String.class); + return objectType; + } +} From a6ac516337887c2ff215540fef1588b1039cf964 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 09:18:56 +0200 Subject: [PATCH 022/286] rename UtplsqlController.xtend to UtplsqlController.java --- .../menu/{UtplsqlController.xtend => UtplsqlController.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/menu/{UtplsqlController.xtend => UtplsqlController.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.xtend b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java From ba96d9668209b1b41829a071a547223b319b95ab Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 13:48:52 +0200 Subject: [PATCH 023/286] add getSimpleCSV method for logging purposes --- .../java/org/utplsql/sqldev/dal/StringUtil.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java index 5437d150..d8e43102 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java @@ -27,16 +27,27 @@ private StringUtil() { public static String getCSV(List list, int indentSpaces) { final StringBuilder sb = new StringBuilder(); final String indent = String.join("", Collections.nCopies(indentSpaces, " ")); - for (final String path : list) { + for (final String item : list) { if (sb.length() > 0) { sb.append(",\n"); } sb.append(indent); sb.append("'"); - sb.append(path); + sb.append(item); sb.append("'"); } sb.append("\n"); return sb.toString(); } + + public static String getSimpleCSV(List list) { + final StringBuilder sb = new StringBuilder(); + for (final String item : list) { + if (sb.length() > 0) { + sb.append(", "); + } + sb.append(item); + } + return sb.toString(); + } } From 0bae77dffeab84a964971fa673dba8ff4ce949ac Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 13:50:42 +0200 Subject: [PATCH 024/286] convert UtplsqlController to Java --- .../sqldev/menu/UtplsqlController.java | 957 ++++++++++-------- 1 file changed, 534 insertions(+), 423 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java index 28eadd5d..50fd33c1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java @@ -1,4 +1,5 @@ -/* Copyright 2018 Philipp Salvisberg +/* + * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,437 +13,547 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.menu +package org.utplsql.sqldev.menu; -import java.net.URL -import java.util.ArrayList -import java.util.HashSet -import java.util.List -import java.util.logging.Logger -import java.util.regex.Pattern -import javax.swing.JEditorPane -import oracle.dbtools.raptor.navigator.db.DBNavigatorWindow -import oracle.dbtools.raptor.navigator.db.DatabaseConnection -import oracle.dbtools.raptor.navigator.impl.ChildObjectElement -import oracle.dbtools.raptor.navigator.impl.DatabaseSourceNode -import oracle.dbtools.raptor.navigator.impl.ObjectFolder -import oracle.dbtools.raptor.navigator.impl.SchemaFolder -import oracle.dbtools.raptor.navigator.plsql.PlSqlNode -import oracle.dbtools.raptor.utils.Connections -import oracle.dbtools.worksheet.editor.Worksheet -import oracle.ide.Context -import oracle.ide.Ide -import oracle.ide.config.Preferences -import oracle.ide.controller.Controller -import oracle.ide.controller.IdeAction -import oracle.ide.editor.Editor -import org.utplsql.sqldev.coverage.CodeCoverageReporter -import org.utplsql.sqldev.dal.RealtimeReporterDao -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.model.URLTools -import org.utplsql.sqldev.model.oddgen.GenContext -import org.utplsql.sqldev.model.preference.PreferenceModel -import org.utplsql.sqldev.oddgen.TestTemplate -import org.utplsql.sqldev.parser.UtplsqlParser -import org.utplsql.sqldev.runner.UtplsqlRunner -import org.utplsql.sqldev.runner.UtplsqlWorksheetRunner +import java.awt.Component; +import java.io.IOException; +import java.net.URL; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; -class UtplsqlController implements Controller { - static final Logger logger = Logger.getLogger(UtplsqlController.name); - val extension URLTools urlTools = new URLTools +import javax.swing.JEditorPane; - public static int UTPLSQL_TEST_CMD_ID = Ide.findCmdID("utplsql.test") - public static int UTPLSQL_COVERAGE_CMD_ID = Ide.findCmdID("utplsql.coverage") - public static int UTPLSQL_GENERATE_CMD_ID = Ide.findCmdID("utplsql.generate") - public static final IdeAction UTPLSQL_TEST_ACTION = IdeAction.get(UtplsqlController.UTPLSQL_TEST_CMD_ID) - public static final IdeAction UTPLSQL_COVERAGE_ACTION = IdeAction.get(UtplsqlController.UTPLSQL_COVERAGE_CMD_ID) - public static final IdeAction UTPLSQL_GENERATE_ACTION = IdeAction.get(UtplsqlController.UTPLSQL_GENERATE_CMD_ID) +import org.eclipse.xtend2.lib.StringConcatenation; +import org.utplsql.sqldev.coverage.CodeCoverageReporter; +import org.utplsql.sqldev.dal.RealtimeReporterDao; +import org.utplsql.sqldev.dal.StringUtil; +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.URLTools; +import org.utplsql.sqldev.model.oddgen.GenContext; +import org.utplsql.sqldev.model.parser.PlsqlObject; +import org.utplsql.sqldev.model.preference.PreferenceModel; +import org.utplsql.sqldev.oddgen.TestTemplate; +import org.utplsql.sqldev.parser.UtplsqlParser; +import org.utplsql.sqldev.runner.UtplsqlRunner; +import org.utplsql.sqldev.runner.UtplsqlWorksheetRunner; - override handleEvent(IdeAction action, Context context) { - try { - if (action.commandId === UTPLSQL_TEST_CMD_ID) { - logger.finer("handle utplsql.test") - runTest(context) - return true - } else if (action.commandId === UTPLSQL_COVERAGE_CMD_ID) { - logger.finer("handle utplsql.coverage") - codeCoverage(context) - return true - } else if (action.commandId === UTPLSQL_GENERATE_CMD_ID) { - logger.finer("handle utplsql.generate") - generateTest(context) - return true - } - } catch (Exception e) { - logger.severe("Failed to handle event due to exception " + e?.message) - } - return false - } +import oracle.dbtools.raptor.navigator.db.DBNavigatorWindow; +import oracle.dbtools.raptor.navigator.db.DatabaseConnection; +import oracle.dbtools.raptor.navigator.impl.ChildObjectElement; +import oracle.dbtools.raptor.navigator.impl.DatabaseSourceNode; +import oracle.dbtools.raptor.navigator.impl.ObjectFolder; +import oracle.dbtools.raptor.navigator.impl.SchemaFolder; +import oracle.dbtools.raptor.navigator.plsql.PlSqlNode; +import oracle.dbtools.raptor.utils.Connections; +import oracle.dbtools.worksheet.editor.Worksheet; +import oracle.ide.Context; +import oracle.ide.Ide; +import oracle.ide.config.Preferences; +import oracle.ide.controller.Controller; +import oracle.ide.controller.IdeAction; +import oracle.ide.editor.Editor; +import oracle.ide.model.Node; +import oracle.ide.view.View; +import oracle.javatools.db.DBException; - override update(IdeAction action, Context context) { - if (action.commandId === UTPLSQL_TEST_CMD_ID || action.commandId === UTPLSQL_COVERAGE_CMD_ID) { - val preferences = PreferenceModel.getInstance(Preferences.preferences) - action.enabled = false - val view = context.view - if (view instanceof Editor) { - val component = view.defaultFocusComponent - if (component instanceof JEditorPane) { - if (preferences.checkRunUtplsqlTest) { - val node = context.node - var String connectionName = null; - var String owner = null; - if (node instanceof DatabaseSourceNode) { - connectionName = node.connectionName - owner = node.owner - } else if (view instanceof Worksheet) { - connectionName = view.connectionName - } - logger.fine('''connectionName: «connectionName»''') - val parser = new UtplsqlParser(component.text, Connections.instance.getConnection(connectionName), owner) - if (!parser.getPathAt(component.caretPosition).empty) { - action.enabled = true - } - } else { - action.enabled = true - } - } - } else if (view instanceof DBNavigatorWindow) { - action.enabled = true - // disable action if a node in the selection is not runnable - for (i : 0 ..< context.selection.length) { - logger.fine('''section «i» is «context.selection.get(i).toString» of class «context.selection.get(i).class.name»''') - if (action.enabled) { - val element = context.selection.get(i) - if (Connections.instance.isConnectionOpen(context.URL.connectionName)) { - val dao = new UtplsqlDao(Connections.instance.getConnection(context.URL.connectionName)) - if (preferences.checkRunUtplsqlTest && dao.utAnnotationManagerInstalled) { - if (element instanceof DatabaseConnection) { - action.enabled = dao.containsUtplsqlTest(element.connection.schema) - } else if (element instanceof SchemaFolder) { - action.enabled = dao.containsUtplsqlTest(element.schemaName) - } else if (element instanceof ObjectFolder) { - action.enabled = dao.containsUtplsqlTest(element.URL.schema) - } else if (element instanceof PlSqlNode) { - action.enabled = dao.containsUtplsqlTest(element.owner, element.objectName) - } else if (element instanceof ChildObjectElement) { - action.enabled = dao.containsUtplsqlTest(element.URL.schema, element.URL.memberObject, element.shortLabel) - } - } - } else { - action.enabled = false - } - } - } - } - return true - } else if (action.commandId === UTPLSQL_GENERATE_CMD_ID) { - action.enabled = false - // enable if generation is possible - val view = context.view - if (view instanceof Editor) { - val component = view.defaultFocusComponent - if (component instanceof JEditorPane) { - val preferences = PreferenceModel.getInstance(Preferences.preferences) - if (preferences.checkGenerateUtplsqlTest) { - val parser = new UtplsqlParser(component.text) - action.enabled = parser.getObjectAt(component.caretPosition) !== null - } else { - action.enabled = true - } - } - } else if (view instanceof DBNavigatorWindow) { - // multiselection is not supported, use oddgen to generte tests for multiple objects - if (context.selection.length == 1) { - val element = context.selection.get(0) - if (element instanceof PlSqlNode) { - val ot = element.objectType - if (ot.startsWith("PACKAGE") || ot.startsWith("TYPE") || ot == "FUNCTION" || ot == "PROCEDURE") { - action.enabled = true - } - } - } - } - } - return false - } +@SuppressWarnings("all") +public class UtplsqlController implements Controller { + private static final Logger logger = Logger.getLogger(UtplsqlController.class.getName()); + private final URLTools urlTools = new URLTools(); - private def getPath(Object element) { - var String path - if (element instanceof DatabaseConnection) { - path = element.connection.schema - } else if (element instanceof SchemaFolder) { - path = element.schemaName - } else if (element instanceof ObjectFolder) { - path = element.URL.schema - } else if (element instanceof PlSqlNode) { - path = '''«element.owner».«element.objectName»''' - } else if (element instanceof ChildObjectElement) { - path = '''«element.URL.schema».«element.URL.memberObject».«element.shortLabel»''' - } else { - path = "" - } - logger.fine('''path: «path»''') - return path - } - - private def getPathList(Context context) { - val pathList = new ArrayList() - for (i : 0 ..< context.selection.length) { - val element = context.selection.get(i) - pathList.add(element.path) - } - return pathList - } - - private def getPathList(String path) { - val pathList = new ArrayList - pathList.add(path) - return pathList - } - - private def dedupPathList(List pathList) { - val set = new HashSet - for (path : pathList) { - set.add(path) - } - val ret = new ArrayList - val p = Pattern.compile("(((([^\\.]+)\\.)?[^\\.]+)\\.)?[^\\.]+") - for (path : set) { - val m = p.matcher(path) - if (m.matches()) { - val parent1 = m.group(4) // user - val parent2 = m.group(2) // user.package - if (parent1 === null || !set.contains(parent1)) { - if (parent2 === null || !set.contains(parent2)) { - ret.add(path) - } - } - } else { - logger.severe('''path: «path» did not match «p.toString», this is unexected!''') - } - } - return ret - } + public static int UTPLSQL_TEST_CMD_ID = (Ide.findCmdID("utplsql.test")).intValue(); + public static int UTPLSQL_COVERAGE_CMD_ID = (Ide.findCmdID("utplsql.coverage")).intValue(); + public static int UTPLSQL_GENERATE_CMD_ID = (Ide.findCmdID("utplsql.generate")).intValue(); + public static final IdeAction UTPLSQL_TEST_ACTION = IdeAction.get(UTPLSQL_TEST_CMD_ID); + public static final IdeAction UTPLSQL_COVERAGE_ACTION = IdeAction.get(UTPLSQL_COVERAGE_CMD_ID); + public static final IdeAction UTPLSQL_GENERATE_ACTION = IdeAction.get(UTPLSQL_GENERATE_CMD_ID); - private def getURL(Context context) { - var URL url - val element = context.selection.get(0) - if (element instanceof DatabaseConnection) { - url = element.URL - } else if (element instanceof SchemaFolder) { - url = element.URL - } else if (element instanceof ObjectFolder) { - url = element.URL - } else if (element instanceof PlSqlNode) { - url = element.URL - } else if (element instanceof ChildObjectElement) { - url = element.URL - } - logger.fine('''url: «url»''') - return url - } - - private def void populateGenContext(GenContext genContext, PreferenceModel preferences) { - genContext.testPackagePrefix = preferences.testPackagePrefix.toLowerCase - genContext.testPackageSuffix = preferences.testPackageSuffix.toLowerCase - genContext.testUnitPrefix = preferences.testUnitPrefix.toLowerCase - genContext.testUnitSuffix = preferences.testUnitSuffix.toLowerCase - genContext.numberOfTestsPerUnit = preferences.numberOfTestsPerUnit - genContext.generateComments = preferences.generateComments - genContext.disableTests = preferences.disableTests - genContext.suitePath = preferences.suitePath.toLowerCase - genContext.indentSpaces = preferences.indentSpaces - } - - private def getGenContext(Context context) { - val connectionName = context.URL.connectionName - val genContext = new GenContext - if (Connections.instance.isConnectionOpen(connectionName)) { - genContext.conn = Connections.instance.getConnection(connectionName) - val element = context.selection.get(0) - if (element instanceof PlSqlNode) { - genContext.objectType = element.objectType.replace(" BODY", "") - genContext.objectName = element.objectName - val preferences = PreferenceModel.getInstance(Preferences.preferences) - populateGenContext(genContext, preferences) - } - } - return genContext - } + @Override + public boolean handleEvent(final IdeAction action, final Context context) { + try { + if (action.getCommandId() == UTPLSQL_TEST_CMD_ID) { + logger.finer(() -> "handle utplsql.test"); + runTest(context); + return true; + } else if (action.getCommandId() == UTPLSQL_COVERAGE_CMD_ID) { + logger.finer(() -> "handle utplsql.coverage"); + codeCoverage(context); + return true; + } else if (action.getCommandId() == UTPLSQL_GENERATE_CMD_ID) { + logger.finer(() -> "handle utplsql.generate"); + generateTest(context); + return true; + } + } catch (Exception e) { + final String msg = "Failed to handle event due to exception " + e != null ? e.getMessage() : ""; + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + return false; + } - def runTest(Context context) { - val view = context.view - val node = context.node - val preferences = PreferenceModel.getInstance(Preferences.preferences) - logger.finer('''Run utPLSQL from view «view?.class?.name» and node «node?.class?.name».''') - if (view instanceof Editor) { - val component = view.defaultFocusComponent - if (component instanceof JEditorPane) { - var String connectionName = null; - var String owner = null; - if (node instanceof DatabaseSourceNode) { - connectionName = node.connectionName - owner = node.owner - } else if (view instanceof Worksheet) { - connectionName = view.connectionName - } - logger.fine('''connectionName: «connectionName»''') - // issue 59 - always use a connection to ensure the utPL/SQL annotation API is used - val conn = Connections.instance.getConnection(connectionName) - val parser = new UtplsqlParser(component.text, conn, owner) - val position = component.caretPosition - val path = parser.getPathAt(position) - val rrDao = new RealtimeReporterDao(conn) - if (preferences.useRealtimeReporter && rrDao.supported) { - val runner = new UtplsqlRunner(path.pathList, connectionName) - runner.runTestAsync - - } else { - val worksheet = new UtplsqlWorksheetRunner(path.pathList, connectionName) - worksheet.runTestAsync - } - } - } else if (view instanceof DBNavigatorWindow) { - val url=context.URL - if (url !== null) { - val connectionName = url.connectionName - logger.fine('''connectionName: «connectionName»''') - val conn = Connections.instance.getConnection(connectionName) - val rrDao = new RealtimeReporterDao(conn) - val pathList=context.pathList.dedupPathList - if (preferences.useRealtimeReporter && rrDao.supported) { - val runner = new UtplsqlRunner(pathList, connectionName) - runner.runTestAsync - } else { - val worksheet = new UtplsqlWorksheetRunner(pathList, connectionName) - worksheet.runTestAsync - } - } - } - } + @Override + public boolean update(final IdeAction action, final Context context) { + if (action.getCommandId() == UTPLSQL_TEST_CMD_ID || action.getCommandId() == UTPLSQL_COVERAGE_CMD_ID) { + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + action.setEnabled(false); + final View view = context.getView(); + if (view instanceof Editor) { + final Component component = ((Editor) view).getDefaultFocusComponent(); + if (component instanceof JEditorPane) { + if (preferences.isCheckRunUtplsqlTest()) { + final Node node = context.getNode(); + String connectionName = null; + String owner = null; + if (node instanceof DatabaseSourceNode) { + connectionName = ((DatabaseSourceNode) node).getConnectionName(); + owner = ((DatabaseSourceNode) node).getOwner(); + } else { + if ((view instanceof Worksheet)) { + connectionName = ((Worksheet) view).getConnectionName(); + } + } + logger.fine("connectionName: " + connectionName); + final String text = ((JEditorPane) component).getText(); + final Connection conn = getConnection(connectionName); + final UtplsqlParser parser = new UtplsqlParser(text, conn, owner); + if (!parser.getPathAt(((JEditorPane) component).getCaretPosition()).isEmpty()) { + action.setEnabled(true); + } + } else { + action.setEnabled(true); + } + } + } else if (view instanceof DBNavigatorWindow) { + action.setEnabled(true); + // disable action if a node in the selection is not runnable + for (int i = 0; i < context.getSelection().length; i++) { + logger.fine("section " + i + " is " + context.getSelection()[i].toString() + " of class " + + context.getSelection()[i].getClass().getName()); + if (action.isEnabled()) { + final Object element = context.getSelection()[i]; + final String connectionName = urlTools.getConnectionName(getURL(context)); + if (Connections.getInstance().isConnectionOpen(connectionName)) { + Connection conn = getConnection(connectionName); + final UtplsqlDao dao = new UtplsqlDao(conn); + if (preferences.isCheckRunUtplsqlTest() && dao.isUtAnnotationManagerInstalled()) { + if (element instanceof DatabaseConnection) { + final String schema = getSchema(getConnection((DatabaseConnection) element)); + action.setEnabled(dao.containsUtplsqlTest(schema)); + } else if ((element instanceof SchemaFolder)) { + final String schema = ((SchemaFolder) element).getSchemaName(); + action.setEnabled(dao.containsUtplsqlTest(schema)); + } else if ((element instanceof ObjectFolder)) { + final String schema = urlTools.getSchema(((ObjectFolder) element).getURL()); + action.setEnabled(dao.containsUtplsqlTest(schema)); + } else if ((element instanceof PlSqlNode)) { + final String schema = ((PlSqlNode) element).getOwner(); + final String objectName = ((PlSqlNode) element).getObjectName(); + action.setEnabled(dao.containsUtplsqlTest(schema, objectName)); + } else if ((element instanceof ChildObjectElement)) { + final String schema = urlTools.getSchema(((ChildObjectElement) element).getURL()); + final String objectName = urlTools.getMemberObject(((ChildObjectElement) element).getURL()); + final String subObjectName = ((ChildObjectElement) element).getShortLabel(); + action.setEnabled(dao.containsUtplsqlTest(schema, objectName, subObjectName)); + } + } + } else { + action.setEnabled(false); + } + } + } + } + return true; + } else if (action.getCommandId() == UTPLSQL_GENERATE_CMD_ID) { + action.setEnabled(false); + // enable if generation is possible + final View view = context.getView(); + if (view instanceof Editor) { + final Component component = ((Editor) view).getDefaultFocusComponent(); + if (component instanceof JEditorPane) { + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + if (preferences.isCheckGenerateUtplsqlTest()) { + final String text = ((JEditorPane) component).getText(); + final UtplsqlParser parser = new UtplsqlParser(text); + PlsqlObject plsqlObject = parser.getObjectAt(((JEditorPane) component).getCaretPosition()); + action.setEnabled(plsqlObject != null); + } else { + action.setEnabled(true); + } + } + } else if (view instanceof DBNavigatorWindow) { + // multiselection is not supported, use oddgen to generte tests for multiple objects + if (context.getSelection().length == 1) { + final Object element = context.getSelection()[0]; + if (element instanceof PlSqlNode) { + final String ot = ((PlSqlNode) element).getObjectType(); + if (ot.startsWith("PACKAGE") || ot.startsWith("TYPE") || "FUNCTION".equals(ot) || "PROCEDURE".equals(ot)) { + action.setEnabled(true); + } + } + } + } + } + return false; + } - def List dependencies(String name, String connectionName) { - var List ret = null - if (connectionName !== null) { - val owner = Connections.instance.getConnection(connectionName).schema - ret = dependencies(owner, name, connectionName) - } - return ret - } - - def List dependencies(String owner, String name, String connectionName) { - var List ret = null - if (connectionName !== null) { - val dao = new UtplsqlDao(Connections.instance.getConnection(connectionName)) - ret = dao.includes(owner, name) - } - return ret - } - - def List dependencies(Context context, String connectionName) { - val HashSet ret = new HashSet - for (i : 0 ..< context.selection.length) { - val element = context.selection.get(i) - if (element instanceof PlSqlNode) { - val dep = dependencies(element.owner, element.objectName, connectionName) - for (d : dep) { - ret.add(d) - } - } else if (element instanceof ChildObjectElement) { - val dep = dependencies(element.URL.schema, element.URL.memberObject, connectionName) - for (d : dep) { - ret.add(d) - } - } - } - return ret.toList.sortBy[it] - } - - def codeCoverage(Context context) { - val view = context.view - val node = context.node - logger.finer('''Code coverage from view «view?.class?.name» and node «node?.class?.name».''') - if (view instanceof Editor) { - val component = view.defaultFocusComponent - if (component instanceof JEditorPane) { - var String connectionName = null; - var String owner = null; - if (node instanceof DatabaseSourceNode) { - connectionName = node.connectionName - } else if (view instanceof Worksheet) { - connectionName = view.connectionName - } - logger.fine('''connectionName: «connectionName»''') - val preferences = PreferenceModel.getInstance(Preferences.preferences) - val parser = new UtplsqlParser(component.text, if (preferences.checkRunUtplsqlTest) {Connections.instance.getConnection(connectionName)} else {null}, owner) - val position = component.caretPosition - val path = parser.getPathAt(position) - val object = parser.getObjectAt(position) - val includeObjectList = dependencies(object.name, connectionName) - val reporter = new CodeCoverageReporter(path.pathList, includeObjectList, connectionName) - reporter.showParameterWindow - } - } else if (view instanceof DBNavigatorWindow) { - logger.finer("Code coverage from DB navigator") - val url=context.URL - if (url !== null) { - val connectionName = url.connectionName - logger.fine('''connectionName: «connectionName»''') - val pathList=context.pathList.dedupPathList - logger.finer('''pathList: «pathList»''') - val includeObjectList = dependencies(context, connectionName) - logger.finer('''includeObjectList: «includeObjectList»''') - val reporter = new CodeCoverageReporter(pathList, includeObjectList, connectionName) - logger.finer("showing code coverage dialog") - reporter.showParameterWindow - logger.finer("code coverage dialog shown") - } else { - logger.warning('''url is null''') - } - } - } + private String getPath(final Object element) { + String path = null; + if (element instanceof DatabaseConnection) { + path = getSchema(getConnection(((DatabaseConnection) element))); + } else if (element instanceof SchemaFolder) { + path = ((SchemaFolder) element).getSchemaName(); + } else if (element instanceof ObjectFolder) { + path = urlTools.getSchema(((ObjectFolder) element).getURL()); + } else if (element instanceof PlSqlNode) { + final StringBuilder sb = new StringBuilder(); + sb.append(((PlSqlNode) element).getOwner()); + sb.append("."); + sb.append(((PlSqlNode) element).getObjectName()); + path = sb.toString(); + } else if (element instanceof ChildObjectElement) { + StringBuilder sb = new StringBuilder(); + sb.append(urlTools.getSchema(((ChildObjectElement) element).getURL())); + sb.append("."); + sb.append(urlTools.getMemberObject(((ChildObjectElement) element).getURL())); + sb.append("."); + sb.append( ((ChildObjectElement) element).getShortLabel()); + path = sb.toString(); + } else { + path = ""; + } + logger.fine("path: " + path); + return path; + } - def generateTest(Context context) { - val view = context.view - val node = context.node - logger.finer('''Generate utPLSQL test from view «view?.class?.name» and node «node?.class?.name».''') - if (view instanceof Editor) { - val component = view.defaultFocusComponent - if (component instanceof JEditorPane) { - var String connectionName = null; - if (node instanceof DatabaseSourceNode) { - connectionName = node.connectionName - } else if (view instanceof Worksheet) { - connectionName = view.connectionName - } - if (connectionName !== null) { - if (Connections.instance.isConnectionOpen(connectionName)) { - val genContext = new GenContext - genContext.conn = Connections.instance.getConnection(connectionName) - val parser = new UtplsqlParser(component.text) - val position = component.caretPosition - val obj = parser.getObjectAt(position) - if (obj !== null) { - genContext.objectType = obj.type.toUpperCase - genContext.objectName = obj.name.toUpperCase - val preferences = PreferenceModel.getInstance(Preferences.preferences) - populateGenContext(genContext, preferences) - val testTemplate = new TestTemplate(genContext) - val code = testTemplate.generate.toString - UtplsqlWorksheetRunner.openWithCode(code, connectionName) - } - } - } - } + private ArrayList getPathList(final Context context) { + final ArrayList pathList = new ArrayList<>(); + for (int i = 0; i < context.getSelection().length; i++) { + final Object element = context.getSelection()[i]; + pathList.add(getPath(element)); + } + return pathList; + } - } else if (view instanceof DBNavigatorWindow) { - val url=context.URL - if (url !== null) { - val connectionName = url.connectionName - val testTemplate = new TestTemplate(context.genContext) - val code = testTemplate.generate.toString - UtplsqlWorksheetRunner.openWithCode(code, connectionName) - } - } - } + private ArrayList getPathList(final String path) { + final ArrayList pathList = new ArrayList<>(); + pathList.add(path); + return pathList; + } + + private ArrayList dedupPathList(final List pathList) { + final HashSet set = new HashSet<>(); + for (final String path : pathList) { + set.add(path); + } + final ArrayList ret = new ArrayList<>(); + final Pattern p = Pattern.compile("(((([^\\.]+)\\.)?[^\\.]+)\\.)?[^\\.]+"); + for (final String path : set) { + final Matcher m = p.matcher(path); + if (m.matches()) { + final String parent1 = m.group(4); // user + final String parent2 = m.group(2); // user.package + if (parent1 == null || !set.contains(parent1)) { + if (parent2 == null || !set.contains(parent2)) { + ret.add(path); + } + } + } else { + logger.severe("path: " + path + " did not match " + p.toString() + ", this is unexected!"); + } + } + return ret; + } + + private URL getURL(final Context context) { + URL url = null; + final Object element = context.getSelection()[0]; + if (element instanceof DatabaseConnection) { + url = ((DatabaseConnection) element).getURL(); + } else if (element instanceof SchemaFolder) { + url = ((SchemaFolder) element).getURL(); + } else if (element instanceof ObjectFolder) { + url = ((ObjectFolder) element).getURL(); + } else if (element instanceof PlSqlNode) { + url = ((PlSqlNode) element).getURL(); + } else if (element instanceof ChildObjectElement) { + url = ((ChildObjectElement) element).getURL(); + } + logger.fine("url: " + url); + return url; + } + + private void populateGenContext(final GenContext genContext, final PreferenceModel preferences) { + genContext.setTestPackagePrefix(preferences.getTestPackagePrefix().toLowerCase()); + genContext.setTestPackageSuffix(preferences.getTestPackageSuffix().toLowerCase()); + genContext.setTestUnitPrefix(preferences.getTestUnitPrefix().toLowerCase()); + genContext.setTestUnitSuffix(preferences.getTestUnitSuffix().toLowerCase()); + genContext.setNumberOfTestsPerUnit(preferences.getNumberOfTestsPerUnit()); + genContext.setGenerateComments(preferences.isGenerateComments()); + genContext.setDisableTests(preferences.isDisableTests()); + genContext.setSuitePath(preferences.getSuitePath().toLowerCase()); + genContext.setIndentSpaces(preferences.getIndentSpaces()); + } + + private GenContext getGenContext(final Context context) { + final String connectionName = urlTools.getConnectionName(getURL(context)); + final GenContext genContext = new GenContext(); + if (Connections.getInstance().isConnectionOpen(connectionName)) { + genContext.setConn(getConnection(connectionName)); + final Object element = context.getSelection()[0]; + if ((element instanceof PlSqlNode)) { + genContext.setObjectType(((PlSqlNode) element).getObjectType().replace(" BODY", "")); + genContext.setObjectName(((PlSqlNode) element).getObjectName()); + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + populateGenContext(genContext, preferences); + } + } + return genContext; + } + + private Connection getConnection(String connectionName) { + try { + return Connections.getInstance().getConnection(connectionName); + } catch (DBException e) { + final String msg = "DBException while getting connection for " + connectionName + " due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + private Connection getConnection(DatabaseConnection dbconn) { + try { + return dbconn.getConnection(); + } catch (IOException e) { + final String msg = "IOException while getting connection for " + dbconn.getConnectionName() + " due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + private String getSchema(Connection conn) { + try { + return conn.getSchema(); + } catch (SQLException e) { + final String msg = "SQLException while getting schema for connection due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + public void runTest(final Context context) { + final View view = context.getView(); + final Node node = context.getNode(); + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + final StringConcatenation sb = new StringConcatenation(); + sb.append("Run utPLSQL from view "); + sb.append(view != null ? view.getClass().getName() : "???"); + sb.append(" and node "); + sb.append(node != null ? node.getClass().getName() : "???"); + sb.append("."); + logger.finer(() -> sb.toString()); + if ((view instanceof Editor)) { + final Component component = ((Editor) view).getDefaultFocusComponent(); + if (component instanceof JEditorPane) { + String connectionName = null; + String owner = null; + if (node instanceof DatabaseSourceNode) { + connectionName = ((DatabaseSourceNode) node).getConnectionName(); + owner = ((DatabaseSourceNode) node).getOwner(); + } else { + if (view instanceof Worksheet) { + connectionName = ((Worksheet) view).getConnectionName(); + } + } + logger.fine("connectionName: " + connectionName); + final Connection conn = getConnection(connectionName); + String text = ((JEditorPane) component).getText(); + final UtplsqlParser parser = new UtplsqlParser(text, conn, owner); + final int position = ((JEditorPane) component).getCaretPosition(); + final String path = parser.getPathAt(position); + final RealtimeReporterDao rrDao = new RealtimeReporterDao(conn); + if (preferences.isUseRealtimeReporter() && rrDao.isSupported()) { + final UtplsqlRunner runner = new UtplsqlRunner(getPathList(path), connectionName); + runner.runTestAsync(); + } else { + final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(getPathList(path), connectionName); + worksheet.runTestAsync(); + } + } + } else if (view instanceof DBNavigatorWindow) { + final URL url = getURL(context); + if ((url != null)) { + final String connectionName = urlTools.getConnectionName(url); + logger.fine("connectionName: " + connectionName); + final Connection conn = getConnection(connectionName); + final RealtimeReporterDao rrDao = new RealtimeReporterDao(conn); + final ArrayList pathList = dedupPathList(getPathList(context)); + if (preferences.isUseRealtimeReporter() && rrDao.isSupported()) { + final UtplsqlRunner runner = new UtplsqlRunner(pathList, connectionName); + runner.runTestAsync(); + } else { + final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(pathList, connectionName); + worksheet.runTestAsync(); + } + } + } + } + + public List dependencies(final String name, final String connectionName) { + List ret = null; + if (connectionName != null) { + final String owner = getSchema(getConnection(connectionName)); + ret = dependencies(owner, name, connectionName); + } + return ret; + } + + public List dependencies(final String owner, final String name, final String connectionName) { + List ret = null; + if (connectionName != null) { + Connection conn = getConnection(connectionName); + final UtplsqlDao dao = new UtplsqlDao(conn); + ret = dao.includes(owner, name); + } + return ret; + } + + public List dependencies(final Context context, final String connectionName) { + final HashSet ret = new HashSet(); + for (int i = 0; i < context.getSelection().length; i++) { + final Object element = context.getSelection()[i]; + if (element instanceof PlSqlNode) { + final String owner = ((PlSqlNode) element).getOwner(); + final String objectName = ((PlSqlNode) element).getObjectName(); + final List dep = dependencies(owner, objectName, connectionName); + ret.addAll(dep); + } else { + if (element instanceof ChildObjectElement) { + final String owner = urlTools.getSchema(((ChildObjectElement) element).getURL()); + final String objectName = urlTools.getMemberObject(((ChildObjectElement) element).getURL()); + final List dep = dependencies(owner, objectName, connectionName); + ret.addAll(dep); + } + } + } + return ret.stream().sorted().collect(Collectors.toList()); + } + + public void codeCoverage(final Context context) { + final View view = context.getView(); + final Node node = context.getNode(); + final StringConcatenation sb = new StringConcatenation(); + sb.append("Code coverage from view "); + sb.append(view != null ? view.getClass().getName() : "???"); + sb.append(" and node "); + sb.append(node != null ? node.getClass().getName() : "???"); + sb.append("."); + logger.finer(() -> sb.toString()); + if (view instanceof Editor) { + final Component component = ((Editor) view).getDefaultFocusComponent(); + if (component instanceof JEditorPane) { + String connectionName = null; + String owner = null; + if (node instanceof DatabaseSourceNode) { + connectionName = ((DatabaseSourceNode) node).getConnectionName(); + } else if (view instanceof Worksheet) { + connectionName = ((Worksheet) view).getConnectionName(); + } + logger.fine("connectionName: " + connectionName); + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + String text = ((JEditorPane) component).getText(); + Connection conn = null; + if (preferences.isCheckRunUtplsqlTest()) { + conn = getConnection(connectionName); + } else { + conn = null; + } + final UtplsqlParser parser = new UtplsqlParser(text, conn, owner); + final int position = ((JEditorPane) component).getCaretPosition(); + final String path = parser.getPathAt(position); + final PlsqlObject object = parser.getObjectAt(position); + final List includeObjectList = dependencies(object.getName(), connectionName); + final CodeCoverageReporter reporter = new CodeCoverageReporter(getPathList(path), includeObjectList, connectionName); + reporter.showParameterWindow(); + } + } else if ((view instanceof DBNavigatorWindow)) { + logger.finer("Code coverage from DB navigator"); + final URL url = getURL(context); + if (url != null) { + final String connectionName = urlTools.getConnectionName(url); + logger.fine(() -> "connectionName: " + connectionName); + final ArrayList pathList = dedupPathList(getPathList(context)); + logger.fine(() -> "pathlist: " + StringUtil.getSimpleCSV(pathList)); + final List includeObjectList = dependencies(context, connectionName); + logger.finer(() -> "includeObjectList: " + StringUtil.getSimpleCSV(includeObjectList)); + final CodeCoverageReporter reporter = new CodeCoverageReporter(pathList, includeObjectList, connectionName); + logger.finer(() -> "showing code coverage dialog"); + reporter.showParameterWindow(); + logger.finer(() -> "code coverage dialog shown"); + } else { + logger.warning("url is null"); + } + } + } + + public void generateTest(final Context context) { + final View view = context.getView(); + final Node node = context.getNode(); + final StringConcatenation sb = new StringConcatenation(); + sb.append("Generate utPLSQL test from view "); + sb.append(view != null ? view.getClass().getName() : "???"); + sb.append(" and node "); + sb.append(node != null ? node.getClass().getName() : "???"); + sb.append("."); + logger.finer(() -> sb.toString()); + if (view instanceof Editor) { + final Component component = ((Editor) view).getDefaultFocusComponent(); + if (component instanceof JEditorPane) { + String connectionName = null; + if (node instanceof DatabaseSourceNode) { + connectionName = ((DatabaseSourceNode) node).getConnectionName(); + } else if (view instanceof Worksheet) { + connectionName = ((Worksheet) view).getConnectionName(); + } + if (connectionName != null) { + if (Connections.getInstance().isConnectionOpen(connectionName)) { + final GenContext genContext = new GenContext(); + genContext.setConn(getConnection(connectionName)); + String text = ((JEditorPane) component).getText(); + final UtplsqlParser parser = new UtplsqlParser(text); + final int position = ((JEditorPane) component).getCaretPosition(); + final PlsqlObject obj = parser.getObjectAt(position); + if (obj != null) { + genContext.setObjectType(obj.getType().toUpperCase()); + genContext.setObjectName(obj.getName().toUpperCase()); + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + populateGenContext(genContext, preferences); + final TestTemplate testTemplate = new TestTemplate(genContext); + final String code = testTemplate.generate().toString(); + UtplsqlWorksheetRunner.openWithCode(code, connectionName); + } + } + } + } + } else { + if (view instanceof DBNavigatorWindow) { + final URL url = getURL(context); + if (url != null) { + final String connectionName = urlTools.getConnectionName(url); + GenContext genContext = getGenContext(context); + final TestTemplate testTemplate = new TestTemplate(genContext); + final String code = testTemplate.generate().toString(); + UtplsqlWorksheetRunner.openWithCode(code, connectionName); + } + } + } + } } From 749934c66f64f2053d754c5af47aeae869b37b97 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 14:04:25 +0200 Subject: [PATCH 025/286] rename LimitedLinkedHashMap.xtend to LimitedLinkedHashMap.java --- .../{LimitedLinkedHashMap.xtend => LimitedLinkedHashMap.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/{LimitedLinkedHashMap.xtend => LimitedLinkedHashMap.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/LimitedLinkedHashMap.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/LimitedLinkedHashMap.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/LimitedLinkedHashMap.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/LimitedLinkedHashMap.java From c265c4fad1a6fc7cc9935fb36f38d0aba799093a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 14:04:58 +0200 Subject: [PATCH 026/286] convert LimitedLinkedHashMap to Java --- .../sqldev/model/LimitedLinkedHashMap.java | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/LimitedLinkedHashMap.java b/sqldev/src/main/java/org/utplsql/sqldev/model/LimitedLinkedHashMap.java index 2d3605d9..de702252 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/LimitedLinkedHashMap.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/LimitedLinkedHashMap.java @@ -13,25 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model +package org.utplsql.sqldev.model; -import java.util.LinkedHashMap -import java.util.Map +import java.util.LinkedHashMap; +import java.util.Map; -class LimitedLinkedHashMap extends LinkedHashMap { - val int maxEntries - - new (int maxEntries) { - super(maxEntries + 1, 1.0f, false) - - this.maxEntries = maxEntries; - } - - override removeEldestEntry(Map.Entry eldest) { - return size > maxEntries - } - - def getMaxEntries() { - return maxEntries - } -} \ No newline at end of file +public class LimitedLinkedHashMap extends LinkedHashMap { + private static final long serialVersionUID = -4184317926729190411L; + private final int maxEntries; + + public LimitedLinkedHashMap(final int maxEntries) { + super((maxEntries + 1), 1.0f, false); + this.maxEntries = maxEntries; + } + + @Override + public boolean removeEldestEntry(final Map.Entry eldest) { + return (size() > maxEntries); + } + + public int getMaxEntries() { + return maxEntries; + } +} From 1a62459e95a7541cbf7092e2f6b6aa51e941c658 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 14:08:36 +0200 Subject: [PATCH 027/286] do not escape apostrophes in string literals --- sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index c2ef19ac..aeb337e4 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -729,7 +729,7 @@ public List runnables() { sb.append(" ),\n"); sb.append(" gen AS (\n"); sb.append(" SELECT rownum AS pos\n"); - sb.append(" FROM xmltable(\'1 to 100\')\n"); + sb.append(" FROM xmltable('1 to 100')\n"); sb.append(" ),\n"); sb.append(" suitepath_part AS (\n"); sb.append(" SELECT DISTINCT\n"); From 31da3f775a1dc8c63eed82273b0616bd02aab05b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 14:11:51 +0200 Subject: [PATCH 028/286] rename PrefixTools.xtend to PrefixTools.java --- .../utplsql/sqldev/model/{PrefixTools.xtend => PrefixTools.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/{PrefixTools.xtend => PrefixTools.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java From 30e11bb40f1bfad011c48f25e55974fe63c17c08 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 14:54:28 +0200 Subject: [PATCH 029/286] convert PrefixTools to Java --- .../org/utplsql/sqldev/model/PrefixTools.java | 136 +++++++++--------- 1 file changed, 67 insertions(+), 69 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java index c1fc822f..ab95c589 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java @@ -13,79 +13,77 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model +package org.utplsql.sqldev.model; -import java.util.List +import java.util.List; -// converted to Xtend based on Java code on https://www.geeksforgeeks.org/longest-common-prefix-using-binary-search/ -class PrefixTools { - def static int findMinLength(String[] arr, int n) { - var int min = Integer.MAX_VALUE - for (var int i = 0; i < n; i++) { - if ({ - val _rdIndx_arr = i - arr.get(_rdIndx_arr) - }.length() < min) { - min = { - val _rdIndx_arr = i - arr.get(_rdIndx_arr) - }.length() - } - } - return min - } +//converted to Xtend based on Java code on https://www.geeksforgeeks.org/longest-common-prefix-using-binary-search/ +//converted back to Java with some amendments +public class PrefixTools { + + // do not instantiate this class + private PrefixTools() { + super(); + } + + public static int findMinLength(final String[] arr, final int n) { + int min = Integer.MAX_VALUE; + for (int i=0; i < n; i++) { + if (arr[i].length() < min) { + min = arr[i].length(); + } + } + return min; + } - def static boolean allContainsPrefix(String[] arr, int n, String str, int start, int end) { - for (var int i = 0; i < n; i++) { - var String arr_i = { - val _rdIndx_arr = i - arr.get(_rdIndx_arr) - } - for (var int j = start; j <= end; j++) { - if (arr_i.charAt(j) !== str.charAt(j)) { - return false - } - } - } - return true - } + public static boolean allContainsPrefix(final String[] arr, final int n, final String str, final int start, final int end) { + for (int i=0; i < n; i++) { + String item = arr[i]; + for (int j = start; j <= end; j++) { + if (item.charAt(j) != str.charAt(j)) { + return false; + } + } + } + return true; + } - def static String commonPrefix(String[] arr, int n) { - var int index = findMinLength(arr, n) - var String prefix = "" - var int low = 0 - var int high = index - while (low <= high) { - var int mid = low + (high - low) / 2 - if (allContainsPrefix(arr, n, arr.get(0), low, mid)) { - prefix = prefix + arr.get(0).substring(low, mid + 1) - low = mid + 1 - } else { - high = mid - 1 - } - } - return prefix - } + public static String commonPrefix(final String[] arr, final int n) { + int index = findMinLength(arr, n); + StringBuilder prefix = new StringBuilder(); + int low = 0; + int high = index; // index-1 is wrong + while (low <= high) { + int mid = low + (high - low) / 2; + if (allContainsPrefix(arr, n, arr[0], low, mid)) { + prefix.append(arr[0].substring(low, mid + 1)); + low = mid + 1; + } else { + high = mid - 1; + } + } + return prefix.toString(); + } - def static String commonPrefix(List list) { - try { - if (list.size === 0) { - return "" - } else if (list.size === 1) { - val pos = list.get(0).lastIndexOf("."); - if (pos > 0) { - return list.get(0).substring(0, pos + 1) - } else { - return "" - } - } else { - var String[] testArray = newArrayOfSize(list.size) - var prefix = commonPrefix(list.toArray(testArray), list.size) - return prefix - } - } catch (Exception e) { - return "" - } - } + public static String commonPrefix(final List list) { + try { + if (list.size() == 0) { + return ""; + } else if (list.size() == 1) { + final int pos = list.get(0).lastIndexOf("."); + if (pos > 0) { + return list.get(0).substring(0, pos + 1); + } else { + return ""; + } + } else { + final String[] testArray = new String[list.size()]; + final String prefix = commonPrefix(list.toArray(testArray), list.size()); + return prefix; + } + } catch (final Exception e) { + return ""; + } + } } From 51cad61b23a0143ba37e6737e51d296dd8f77da3 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 14:56:31 +0200 Subject: [PATCH 030/286] move StringUtil org.utplsql.sqldev.model --- .../main/java/org/utplsql/sqldev/{dal => model}/StringUtil.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/{dal => model}/StringUtil.java (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java b/sqldev/src/main/java/org/utplsql/sqldev/model/StringUtil.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/dal/StringUtil.java rename to sqldev/src/main/java/org/utplsql/sqldev/model/StringUtil.java From aefdc3fa60800b4d5ff4edc023d718b4fb6590a7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 14:57:34 +0200 Subject: [PATCH 031/286] rename SpringUtil to SpringTools to be consistent with other tool classes in the model package --- .../utplsql/sqldev/model/{StringUtil.java => StringTools.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/{StringUtil.java => StringTools.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/StringUtil.java b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/StringUtil.java rename to sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java From e17f2e4f8030f15173a384b2ce70c6977c49e634 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 14:59:46 +0200 Subject: [PATCH 032/286] use StringTools instead of StringUtil --- .../java/org/utplsql/sqldev/dal/RealtimeReporterDao.java | 3 ++- .../src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java | 9 +++++---- .../java/org/utplsql/sqldev/menu/UtplsqlController.java | 6 +++--- .../main/java/org/utplsql/sqldev/model/StringTools.java | 6 +++--- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index 8290dcf2..ec5fb87d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -34,6 +34,7 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.StringTools; import org.utplsql.sqldev.model.XMLTools; import org.utplsql.sqldev.model.runner.Counter; import org.utplsql.sqldev.model.runner.Expectation; @@ -84,7 +85,7 @@ public void produceReport(final String reporterId, final List pathList) sb.append(" sys.dbms_output.enable(NULL);\n"); sb.append(" ut_runner.run(\n"); sb.append(" a_paths => ut_varchar2_list(\n"); - sb.append(StringUtil.getCSV(pathList, 24)); + sb.append(StringTools.getCSV(pathList, 24)); sb.append(" ),\n"); sb.append(" a_reporters => ut_reporters(l_reporter)\n"); sb.append(" );\n"); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index aeb337e4..45f78efe 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -32,6 +32,7 @@ import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.model.StringTools; import org.utplsql.sqldev.model.ut.Annotation; import org.utplsql.sqldev.model.ut.OutputLines; @@ -928,21 +929,21 @@ public String htmlCodeCoverage(final List pathList, final List s sb.append(" FROM table(\n"); sb.append(" ut.run(\n"); sb.append(" a_paths => ut_varchar2_list(\n"); - sb.append(StringUtil.getCSV(pathList, 16)); + sb.append(StringTools.getCSV(pathList, 16)); sb.append(" ),\n"); if (schemaList.size() > 0) { sb.append(" a_coverage_schemes => ut_varchar2_list(\n"); - sb.append(StringUtil.getCSV(schemaList, 16)); + sb.append(StringTools.getCSV(schemaList, 16)); sb.append(" ),\n"); } if (includeObjectList.size() > 0) { sb.append(" a_include_objects => ut_varchar2_list(\n"); - sb.append(StringUtil.getCSV(includeObjectList, 16)); + sb.append(StringTools.getCSV(includeObjectList, 16)); sb.append(" ),\n"); } if (excludeObjectList.size() > 0) { sb.append(" a_exclude_objects => ut_varchar2_list(\n"); - sb.append(StringUtil.getCSV(excludeObjectList, 16)); + sb.append(StringTools.getCSV(excludeObjectList, 16)); sb.append(" ),\n"); } sb.append(" a_reporter => ut_coverage_html_reporter()\n"); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java index 50fd33c1..8d8a4e8a 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java @@ -33,9 +33,9 @@ import org.eclipse.xtend2.lib.StringConcatenation; import org.utplsql.sqldev.coverage.CodeCoverageReporter; import org.utplsql.sqldev.dal.RealtimeReporterDao; -import org.utplsql.sqldev.dal.StringUtil; import org.utplsql.sqldev.dal.UtplsqlDao; import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.StringTools; import org.utplsql.sqldev.model.URLTools; import org.utplsql.sqldev.model.oddgen.GenContext; import org.utplsql.sqldev.model.parser.PlsqlObject; @@ -491,9 +491,9 @@ public void codeCoverage(final Context context) { final String connectionName = urlTools.getConnectionName(url); logger.fine(() -> "connectionName: " + connectionName); final ArrayList pathList = dedupPathList(getPathList(context)); - logger.fine(() -> "pathlist: " + StringUtil.getSimpleCSV(pathList)); + logger.fine(() -> "pathlist: " + StringTools.getSimpleCSV(pathList)); final List includeObjectList = dependencies(context, connectionName); - logger.finer(() -> "includeObjectList: " + StringUtil.getSimpleCSV(includeObjectList)); + logger.finer(() -> "includeObjectList: " + StringTools.getSimpleCSV(includeObjectList)); final CodeCoverageReporter reporter = new CodeCoverageReporter(pathList, includeObjectList, connectionName); logger.finer(() -> "showing code coverage dialog"); reporter.showParameterWindow(); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java index d8e43102..8951a3d2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.dal; +package org.utplsql.sqldev.model; import java.util.Collections; import java.util.List; -public class StringUtil { +public class StringTools { // do not instantiate this class - private StringUtil() { + private StringTools() { super(); } From 6ad999f2fd582fbc2e6eadbd8b7da88743bf0d32 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 15:10:59 +0200 Subject: [PATCH 033/286] add test cases for StringTools --- .../utplsql/sqldev/test/StringToolsTest.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 sqldev/src/test/java/org/utplsql/sqldev/test/StringToolsTest.java diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/StringToolsTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/StringToolsTest.java new file mode 100644 index 00000000..8cb642ca --- /dev/null +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/StringToolsTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.test; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.model.StringTools; + +public class StringToolsTest { + + @Test + public void one_entry_as_CSV() { + final List list = new ArrayList<>(); + list.add("hello"); + Assert.assertEquals(" 'hello'\n", StringTools.getCSV(list, 5)); + } + + @Test + public void two_entries_as_CSV() { + final List list = new ArrayList<>(); + list.add("hello"); + list.add("world"); + Assert.assertEquals(" 'hello',\n 'world'\n", StringTools.getCSV(list, 5)); + } + + @Test + public void one_entry_as_simpleCSV() { + final List list = new ArrayList<>(); + list.add("hello"); + Assert.assertEquals("hello", StringTools.getSimpleCSV(list)); + } + + @Test + public void two_entries_as_simpleCSV() { + final List list = new ArrayList<>(); + list.add("hello"); + list.add("world"); + Assert.assertEquals("hello, world", StringTools.getSimpleCSV(list)); + } + +} From 6c94bf8a06366c84465699e36e04b38957d189e7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 15:32:38 +0200 Subject: [PATCH 034/286] rename URLTools.xtend to URLTools.java --- .../org/utplsql/sqldev/model/{URLTools.xtend => URLTools.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/{URLTools.xtend => URLTools.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java From 69661830ff667a69069fedff263d2701ea13e6be Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 15:38:18 +0200 Subject: [PATCH 035/286] convert URLTools to Java --- .../org/utplsql/sqldev/model/URLTools.java | 119 +++++++++--------- 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java index 507d7035..9c62698f 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java @@ -1,4 +1,5 @@ -/* Copyright 2018 Philipp Salvisberg +/* + * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,63 +13,63 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model +package org.utplsql.sqldev.model; -import java.net.URL -import java.util.regex.Pattern +import java.net.URL; +import java.util.regex.Matcher; +import java.util.regex.Pattern; -class URLTools { - def replaceHexChars(String input) { - var String output = input; - val p = Pattern.compile("%([0-9A-F]{2})") - val m = p.matcher(input) - while (m.find) { - val what = m.group(0); - val decimal = Integer.parseInt(m.group(1), 16) - val with = String.valueOf(decimal as char) - output = output.replace(what, with) - } - return output - } - - def getConnectionName(URL url) { - val p = Pattern.compile("(sqldev.nav:)([^/]+)(//)?") - val m = p.matcher(url.toString) - if (m.find) { - return m.group(2).replace("IdeConnections%2523", "IdeConnections%23").replaceHexChars - } else { - return "" - } - } - - def getSchema(URL url) { - val p = Pattern.compile("(//)([^/]+)") - val m = p.matcher(url.toString) - if (m.find) { - return m.group(2) - } else { - return "" - } - } - - def getObjectType(URL url) { - val p = Pattern.compile("(//)([^/]+)(/)([^/]+)") - val m = p.matcher(url.toString) - if (m.find) { - return m.group(4) - } else { - return "" - } - } - - def getMemberObject(URL url) { - val p = Pattern.compile("(/)([^/]+)(#MEMBER)") - val m = p.matcher(url.toString) - - if (m.find) { - return m.group(2) - } else { - return "" - } - } -} \ No newline at end of file +public class URLTools { + public String replaceHexChars(final String input) { + String output = input; + final Pattern p = Pattern.compile("%([0-9A-F]{2})"); + final Matcher m = p.matcher(input); + while (m.find()) { + final String what = m.group(0); + final int decimal = Integer.parseInt(m.group(1), 16); + final String with = String.valueOf((char) decimal); + output = output.replace(what, with); + } + return output; + } + + public String getConnectionName(final URL url) { + final Pattern p = Pattern.compile("(sqldev.nav:)([^/]+)(//)?"); + final Matcher m = p.matcher(url.toString()); + if (m.find()) { + return replaceHexChars(m.group(2).replace("IdeConnections%2523", "IdeConnections%23")); + } else { + return ""; + } + } + + public String getSchema(final URL url) { + final Pattern p = Pattern.compile("(//)([^/]+)"); + final Matcher m = p.matcher(url.toString()); + if (m.find()) { + return m.group(2); + } else { + return ""; + } + } + + public String getObjectType(final URL url) { + final Pattern p = Pattern.compile("(//)([^/]+)(/)([^/]+)"); + final Matcher m = p.matcher(url.toString()); + if (m.find()) { + return m.group(4); + } else { + return ""; + } + } + + public String getMemberObject(final URL url) { + final Pattern p = Pattern.compile("(/)([^/]+)(#MEMBER)"); + final Matcher m = p.matcher(url.toString()); + if (m.find()) { + return m.group(2); + } else { + return ""; + } + } +} From c16bccc88017d772d73a36c377eb7d02dba88a51 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 15:51:05 +0200 Subject: [PATCH 036/286] make URLTools a static helper class --- .../sqldev/menu/UtplsqlController.java | 27 +++++++++---------- .../org/utplsql/sqldev/model/URLTools.java | 16 +++++++---- .../utplsql/sqldev/test/UrlToolsTest.xtend | 19 +++++++------ 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java index 8d8a4e8a..6da01c2f 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java @@ -67,7 +67,6 @@ @SuppressWarnings("all") public class UtplsqlController implements Controller { private static final Logger logger = Logger.getLogger(UtplsqlController.class.getName()); - private final URLTools urlTools = new URLTools(); public static int UTPLSQL_TEST_CMD_ID = (Ide.findCmdID("utplsql.test")).intValue(); public static int UTPLSQL_COVERAGE_CMD_ID = (Ide.findCmdID("utplsql.coverage")).intValue(); @@ -140,7 +139,7 @@ public boolean update(final IdeAction action, final Context context) { + context.getSelection()[i].getClass().getName()); if (action.isEnabled()) { final Object element = context.getSelection()[i]; - final String connectionName = urlTools.getConnectionName(getURL(context)); + final String connectionName = URLTools.getConnectionName(getURL(context)); if (Connections.getInstance().isConnectionOpen(connectionName)) { Connection conn = getConnection(connectionName); final UtplsqlDao dao = new UtplsqlDao(conn); @@ -152,15 +151,15 @@ public boolean update(final IdeAction action, final Context context) { final String schema = ((SchemaFolder) element).getSchemaName(); action.setEnabled(dao.containsUtplsqlTest(schema)); } else if ((element instanceof ObjectFolder)) { - final String schema = urlTools.getSchema(((ObjectFolder) element).getURL()); + final String schema = URLTools.getSchema(((ObjectFolder) element).getURL()); action.setEnabled(dao.containsUtplsqlTest(schema)); } else if ((element instanceof PlSqlNode)) { final String schema = ((PlSqlNode) element).getOwner(); final String objectName = ((PlSqlNode) element).getObjectName(); action.setEnabled(dao.containsUtplsqlTest(schema, objectName)); } else if ((element instanceof ChildObjectElement)) { - final String schema = urlTools.getSchema(((ChildObjectElement) element).getURL()); - final String objectName = urlTools.getMemberObject(((ChildObjectElement) element).getURL()); + final String schema = URLTools.getSchema(((ChildObjectElement) element).getURL()); + final String objectName = URLTools.getMemberObject(((ChildObjectElement) element).getURL()); final String subObjectName = ((ChildObjectElement) element).getShortLabel(); action.setEnabled(dao.containsUtplsqlTest(schema, objectName, subObjectName)); } @@ -212,7 +211,7 @@ private String getPath(final Object element) { } else if (element instanceof SchemaFolder) { path = ((SchemaFolder) element).getSchemaName(); } else if (element instanceof ObjectFolder) { - path = urlTools.getSchema(((ObjectFolder) element).getURL()); + path = URLTools.getSchema(((ObjectFolder) element).getURL()); } else if (element instanceof PlSqlNode) { final StringBuilder sb = new StringBuilder(); sb.append(((PlSqlNode) element).getOwner()); @@ -221,9 +220,9 @@ private String getPath(final Object element) { path = sb.toString(); } else if (element instanceof ChildObjectElement) { StringBuilder sb = new StringBuilder(); - sb.append(urlTools.getSchema(((ChildObjectElement) element).getURL())); + sb.append(URLTools.getSchema(((ChildObjectElement) element).getURL())); sb.append("."); - sb.append(urlTools.getMemberObject(((ChildObjectElement) element).getURL())); + sb.append(URLTools.getMemberObject(((ChildObjectElement) element).getURL())); sb.append("."); sb.append( ((ChildObjectElement) element).getShortLabel()); path = sb.toString(); @@ -304,7 +303,7 @@ private void populateGenContext(final GenContext genContext, final PreferenceMod } private GenContext getGenContext(final Context context) { - final String connectionName = urlTools.getConnectionName(getURL(context)); + final String connectionName = URLTools.getConnectionName(getURL(context)); final GenContext genContext = new GenContext(); if (Connections.getInstance().isConnectionOpen(connectionName)) { genContext.setConn(getConnection(connectionName)); @@ -391,7 +390,7 @@ public void runTest(final Context context) { } else if (view instanceof DBNavigatorWindow) { final URL url = getURL(context); if ((url != null)) { - final String connectionName = urlTools.getConnectionName(url); + final String connectionName = URLTools.getConnectionName(url); logger.fine("connectionName: " + connectionName); final Connection conn = getConnection(connectionName); final RealtimeReporterDao rrDao = new RealtimeReporterDao(conn); @@ -437,8 +436,8 @@ public List dependencies(final Context context, final String connectionN ret.addAll(dep); } else { if (element instanceof ChildObjectElement) { - final String owner = urlTools.getSchema(((ChildObjectElement) element).getURL()); - final String objectName = urlTools.getMemberObject(((ChildObjectElement) element).getURL()); + final String owner = URLTools.getSchema(((ChildObjectElement) element).getURL()); + final String objectName = URLTools.getMemberObject(((ChildObjectElement) element).getURL()); final List dep = dependencies(owner, objectName, connectionName); ret.addAll(dep); } @@ -488,7 +487,7 @@ public void codeCoverage(final Context context) { logger.finer("Code coverage from DB navigator"); final URL url = getURL(context); if (url != null) { - final String connectionName = urlTools.getConnectionName(url); + final String connectionName = URLTools.getConnectionName(url); logger.fine(() -> "connectionName: " + connectionName); final ArrayList pathList = dedupPathList(getPathList(context)); logger.fine(() -> "pathlist: " + StringTools.getSimpleCSV(pathList)); @@ -547,7 +546,7 @@ public void generateTest(final Context context) { if (view instanceof DBNavigatorWindow) { final URL url = getURL(context); if (url != null) { - final String connectionName = urlTools.getConnectionName(url); + final String connectionName = URLTools.getConnectionName(url); GenContext genContext = getGenContext(context); final TestTemplate testTemplate = new TestTemplate(genContext); final String code = testTemplate.generate().toString(); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java index 9c62698f..de225bcf 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/URLTools.java @@ -20,7 +20,13 @@ import java.util.regex.Pattern; public class URLTools { - public String replaceHexChars(final String input) { + + // do not instantiate this class + private URLTools() { + super(); + } + + public static String replaceHexChars(final String input) { String output = input; final Pattern p = Pattern.compile("%([0-9A-F]{2})"); final Matcher m = p.matcher(input); @@ -33,7 +39,7 @@ public String replaceHexChars(final String input) { return output; } - public String getConnectionName(final URL url) { + public static String getConnectionName(final URL url) { final Pattern p = Pattern.compile("(sqldev.nav:)([^/]+)(//)?"); final Matcher m = p.matcher(url.toString()); if (m.find()) { @@ -43,7 +49,7 @@ public String getConnectionName(final URL url) { } } - public String getSchema(final URL url) { + public static String getSchema(final URL url) { final Pattern p = Pattern.compile("(//)([^/]+)"); final Matcher m = p.matcher(url.toString()); if (m.find()) { @@ -53,7 +59,7 @@ public String getSchema(final URL url) { } } - public String getObjectType(final URL url) { + public static String getObjectType(final URL url) { final Pattern p = Pattern.compile("(//)([^/]+)(/)([^/]+)"); final Matcher m = p.matcher(url.toString()); if (m.find()) { @@ -63,7 +69,7 @@ public String getObjectType(final URL url) { } } - public String getMemberObject(final URL url) { + public static String getMemberObject(final URL url) { final Pattern p = Pattern.compile("(/)([^/]+)(#MEMBER)"); final Matcher m = p.matcher(url.toString()); if (m.find()) { diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.xtend index 1ee8f4ac..05ff2bc4 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.xtend +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.xtend @@ -20,27 +20,26 @@ import org.junit.Test import org.utplsql.sqldev.model.URLTools class UrlToolsTest { - val extension URLTools urlTools = new URLTools @Test def void replacePlusSign() { - Assert.assertEquals("+", "%2B".replaceHexChars) - Assert.assertEquals("++", "%2B%2B".replaceHexChars) - Assert.assertEquals("abc+%xyz", "abc%2B%xyz".replaceHexChars) + Assert.assertEquals("+", URLTools.replaceHexChars("%2B")) + Assert.assertEquals("++", URLTools.replaceHexChars("%2B%2B")) + Assert.assertEquals("abc+%xyz", URLTools.replaceHexChars("abc%2B%xyz")) } @Test def void replaceAtSign() { - Assert.assertEquals("@", "%40".replaceHexChars) - Assert.assertEquals("@@", "%40%40".replaceHexChars) - Assert.assertEquals("abc@%xyz", "abc%40%xyz".replaceHexChars) + Assert.assertEquals("@", URLTools.replaceHexChars("%40")) + Assert.assertEquals("@@", URLTools.replaceHexChars("%40%40")) + Assert.assertEquals("abc@%xyz", URLTools.replaceHexChars("abc%40%xyz")) } @Test def void replaceAtAndPlusSign() { - Assert.assertEquals("@+", "%40%2B".replaceHexChars) - Assert.assertEquals("@+@+", "%40%2B%40%2B".replaceHexChars) - Assert.assertEquals("abc@+%xyz", "abc%40%2B%xyz".replaceHexChars) + Assert.assertEquals("@+", URLTools.replaceHexChars("%40%2B")) + Assert.assertEquals("@+@+", URLTools.replaceHexChars("%40%2B%40%2B")) + Assert.assertEquals("abc@+%xyz", URLTools.replaceHexChars("abc%40%2B%xyz")) } } From eec53c1302db01e4ae06193a46a65238435f4d3f Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 15:58:02 +0200 Subject: [PATCH 037/286] rename XMLTools.xtend to XMLTools.java --- .../org/utplsql/sqldev/model/{XMLTools.xtend => XMLTools.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/{XMLTools.xtend => XMLTools.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java From 53894c2474c60b2977ccc51714f3eb538dc0bd60 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 16:54:39 +0200 Subject: [PATCH 038/286] convert XMLTools to Java --- .../org/utplsql/sqldev/model/XMLTools.java | 186 +++++++++++------- 1 file changed, 115 insertions(+), 71 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java index 23d49e75..1367382d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java @@ -1,4 +1,5 @@ -/* Copyright 2018 Philipp Salvisberg +/* + * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,77 +13,120 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model +package org.utplsql.sqldev.model; -import java.io.StringWriter -import javax.xml.transform.OutputKeys -import javax.xml.transform.TransformerFactory -import javax.xml.transform.dom.DOMSource -import javax.xml.transform.stream.StreamResult -import javax.xml.xpath.XPathConstants -import javax.xml.xpath.XPathFactory -import org.w3c.dom.Element -import org.w3c.dom.Node -import org.w3c.dom.NodeList +import java.io.StringWriter; +import java.util.logging.Logger; -class XMLTools { - val xpathFactory = XPathFactory.newInstance() - val xpath = xpathFactory.newXPath() - - def getNodeList(Node doc, String xpathString) { - val expr = xpath.compile(xpathString); - val NodeList nodeList = expr.evaluate(doc, XPathConstants.NODESET) as NodeList - return nodeList - } - - def getNode(Node doc, String xpathString) { - val expr = xpath.compile(xpathString); - val Node node = expr.evaluate(doc, XPathConstants.NODE) as Node - return node - } - - def void trimWhitespace(Node node) { - val children = node.childNodes - for (i : 0 ..< children.length) { - val child = children.item(i) - if (child.nodeType == Node.TEXT_NODE) { - child.textContent = child.textContent.trim - } - trimWhitespace(child); - } - } - - def nodeToString(Node node, String cdataSectionElements) { - node.trimWhitespace - val writer = new StringWriter() - val factory = TransformerFactory.newInstance().newTransformer() - factory.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes") - factory.setOutputProperty(OutputKeys.INDENT, "yes") - factory.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3"); - factory.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, cdataSectionElements) - factory.transform(new DOMSource(node), new StreamResult(writer)) - val result = writer.toString() - val fixedResult = result.replaceAll('''''',"") - return fixedResult - } - - def getAttributeValue(Node node, String namedItem) { - var String value = null - if (node instanceof Element) { - value = node.attributes?.getNamedItem(namedItem)?.nodeValue; - } - return value - } - - def getElementValue(Node node, String tagName) { - return getElementNode(node, tagName)?.textContent - } +import javax.xml.XMLConstants; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; - def getElementNode(Node node, String tagName) { - var Node resultNode = null - if (node instanceof Element) { - resultNode = node.getElementsByTagName(tagName)?.item(0) - } - return resultNode - } +import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class XMLTools { + private static final Logger logger = Logger.getLogger(XMLTools.class.getName()); + private final XPathFactory xpathFactory = XPathFactory.newInstance(); + private final XPath xpath = xpathFactory.newXPath(); + + public NodeList getNodeList(final Node doc, final String xpathString) { + try { + final XPathExpression expr = xpath.compile(xpathString); + return ((NodeList) expr.evaluate(doc, XPathConstants.NODESET)); + } catch (XPathExpressionException e) { + final String msg = "XPathExpressionException for " + xpathString + " due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + public Node getNode(final Node doc, final String xpathString) { + try { + final XPathExpression expr = xpath.compile(xpathString); + return ((Node) expr.evaluate(doc, XPathConstants.NODE)); + } catch (XPathExpressionException e) { + final String msg = "XPathExpressionException for " + xpathString + " due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + public void trimWhitespace(final Node node) { + final NodeList children = node.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + final Node child = children.item(i); + if (child.getNodeType() == Node.TEXT_NODE) { + child.setTextContent(child.getTextContent().trim()); + } + trimWhitespace(child); + } + } + + public String nodeToString(final Node node, final String cdataSectionElements) { + try { + trimWhitespace(node); + final StringWriter writer = new StringWriter(); + TransformerFactory factory = TransformerFactory.newInstance(); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + final Transformer transformer = factory.newTransformer(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3"); + transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, cdataSectionElements); + transformer.transform( new DOMSource(node), new StreamResult(writer)); + final String result = writer.toString(); + return result.replaceAll("", ""); + } catch (TransformerException e) { + final String msg = "TransformerException for " + cdataSectionElements + " due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + public String getAttributeValue(final Node node, final String namedItem) { + String value = null; + if (node instanceof Element) { + final NamedNodeMap attributes = ((Element) node).getAttributes(); + if (attributes != null) { + final Node item = attributes.getNamedItem(namedItem); + if (item != null) { + value = item.getNodeValue(); + } + } + } + return value; + } + + public String getElementValue(final Node node, final String tagName) { + String value = null; + final Node item = getElementNode(node, tagName); + if (item != null) { + value = item.getTextContent(); + } + return value; + } + + public Node getElementNode(final Node node, final String tagName) { + Node resultNode = null; + if (node instanceof Element) { + NodeList list = ((Element) node).getElementsByTagName(tagName); + if (list != null && list.getLength() > 0) { + resultNode = list.item(0); + } + } + return resultNode; + } } From a2b2694e8077ec808679507f4c5bbeccf394503f Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 16:57:19 +0200 Subject: [PATCH 039/286] use ' instead of " for a char --- sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java index ab95c589..71d22257 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java @@ -70,7 +70,7 @@ public static String commonPrefix(final List list) { if (list.size() == 0) { return ""; } else if (list.size() == 1) { - final int pos = list.get(0).lastIndexOf("."); + final int pos = list.get(0).lastIndexOf('.'); if (pos > 0) { return list.get(0).substring(0, pos + 1); } else { From dc1ba4403083dc70a85df02056c90193cd06a3ef Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 16:58:06 +0200 Subject: [PATCH 040/286] use isEmpty() to check for empty array --- sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java index 71d22257..17ea5c6c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java @@ -67,7 +67,7 @@ public static String commonPrefix(final String[] arr, final int n) { public static String commonPrefix(final List list) { try { - if (list.size() == 0) { + if (list.isEmpty()) { return ""; } else if (list.size() == 1) { final int pos = list.get(0).lastIndexOf('.'); From 330d1d3747aa1614661652a9e4bb2be4bfe2735b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 16:58:59 +0200 Subject: [PATCH 041/286] simplify, return result as early as possible --- sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java index 17ea5c6c..d111354d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java @@ -78,8 +78,7 @@ public static String commonPrefix(final List list) { } } else { final String[] testArray = new String[list.size()]; - final String prefix = commonPrefix(list.toArray(testArray), list.size()); - return prefix; + return commonPrefix(list.toArray(testArray), list.size()); } } catch (final Exception e) { From bf5673a8242b32779fb5293a0feb8ce6b51ca6dc Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 17:00:41 +0200 Subject: [PATCH 042/286] simplify, do not duplicate type when creating instance --- sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index 45f78efe..de7f942a 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -816,7 +816,7 @@ public List runnables() { sb.append("SELECT parent_id, id, initcap(name) AS name, description, iconName, leaf, generatable, multiselectable, relevant\n"); sb.append(" FROM tree"); } - BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper(Node.class); + BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper<>(Node.class); final String sql = sb.toString(); final List nodes = jdbcTemplate.query(sql, rowMapper); return nodes; From 165e602530717eb4a48ef075c6a3ef39e5333e2e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 17:01:29 +0200 Subject: [PATCH 043/286] rename variable to match naming conventions --- sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index de7f942a..17ca7a8a 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -888,8 +888,8 @@ public OutputLines doInCallableStatement(final CallableStatement cs) throws SQLE cs.setInt(2, bufferSize); cs.execute(); final OutputLines out = new OutputLines(); - Object _array = cs.getArray(1).getArray(); - out.setLines(((String[]) _array)); + Object array = cs.getArray(1).getArray(); + out.setLines(((String[]) array)); out.setNumlines(Integer.valueOf(cs.getInt(2))); return out; } From 40f6c13d290785a4baaf87f4b1b4d6104a1c1ee4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 17:01:56 +0200 Subject: [PATCH 044/286] simplify return result as early as possible --- .../org/utplsql/sqldev/dal/UtplsqlDao.java | 43 +++++++------------ 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index 17ca7a8a..ccda90a1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -90,9 +90,7 @@ public int normalizedUtPlsqlVersionNumber() { final String minor = m.group(); m.find(); final String bugfix = m.group(); - final int versionNumber = Integer.valueOf(major) * 1000000 + Integer.valueOf(minor) * 1000 - + Integer.valueOf(bugfix); - return versionNumber; + return Integer.valueOf(major) * 1000000 + Integer.valueOf(minor) * 1000 + Integer.valueOf(bugfix); } /** @@ -111,8 +109,7 @@ public String getUtPlsqlVersion() { public String doInCallableStatement(final CallableStatement cs) throws SQLException { cs.registerOutParameter(1, Types.VARCHAR); cs.execute(); - final String version = cs.getString(1); - return version; + return cs.getString(1); } }); } catch (DataAccessException e) { @@ -232,7 +229,7 @@ public boolean containsUtplsqlTest(final String owner, final String objectName, sb.append(" ? := l_return;\n"); sb.append("END;"); final String sql = sb.toString(); - final Boolean ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + return jdbcTemplate.execute(sql, new CallableStatementCallback() { @Override public Boolean doInCallableStatement(final CallableStatement cs) throws SQLException { cs.setString(1, owner); @@ -244,7 +241,6 @@ public Boolean doInCallableStatement(final CallableStatement cs) throws SQLExcep return Boolean.valueOf(Objects.equal(ret, "1")); } }); - return ret; } else if (normalizedUtPlsqlVersionNumber() >= FIRST_VERSION_WITH_ANNOTATION_API) { // using API available since 3.1.3, can handle nulls in objectName and subobjectName StringBuilder sb = new StringBuilder(); @@ -306,7 +302,7 @@ public boolean containsUtplsqlTest(final String owner) { sb.append(" ? := l_return;\n"); sb.append("END;"); final String sql = sb.toString(); - final Boolean ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + return jdbcTemplate.execute(sql, new CallableStatementCallback() { @Override public Boolean doInCallableStatement(final CallableStatement cs) throws SQLException { @@ -317,7 +313,6 @@ public Boolean doInCallableStatement(final CallableStatement cs) return Boolean.valueOf(Objects.equal(ret, "1")); } }); - return ret; } else { return containsUtplsqlTest(owner, null, null); } @@ -335,7 +330,7 @@ public boolean containsUtplsqlTest(final String owner, final String objectName) sb.append(" ? := l_return;\n"); sb.append("END;"); final String sql = sb.toString(); - final Boolean ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + return jdbcTemplate.execute(sql, new CallableStatementCallback() { @Override public Boolean doInCallableStatement(final CallableStatement cs) throws SQLException { @@ -347,7 +342,6 @@ public Boolean doInCallableStatement(final CallableStatement cs) return Boolean.valueOf(Objects.equal(ret, "1")); } }); - return ret; } else { return containsUtplsqlTest(owner, objectName, null); } @@ -388,8 +382,7 @@ public List annotations(final String owner, final String objectName) final String sql = sb.toString(); final BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper<>(Annotation.class); final Object[] binds = new Object[] {owner, objectName}; - final List result = jdbcTemplate.query(sql, rowMapper, binds); - return result; + return jdbcTemplate.query(sql, rowMapper, binds); } /** @@ -415,8 +408,7 @@ public List units(final String objectType, final String objectName) { sb.append(" ORDER BY min(subprogram_id)"); final String sql = sb.toString(); final Object[] binds = new Object[] {objectType, objectName}; - final List result = jdbcTemplate.queryForList(sql, String.class, binds); - return result; + return jdbcTemplate.queryForList(sql, String.class, binds); } else { return CollectionLiterals.newArrayList(objectName); } @@ -495,8 +487,7 @@ public List testables(final String objectType) { final String sql = sb.toString(); final Object[] binds = new Object[] {objectType}; BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper<>(Node.class); - final List nodes = jdbcTemplate.query(sql, rowMapper, binds); - return nodes; + return jdbcTemplate.query(sql, rowMapper, binds); } /** @@ -818,8 +809,7 @@ public List runnables() { } BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper<>(Node.class); final String sql = sb.toString(); - final List nodes = jdbcTemplate.query(sql, rowMapper); - return nodes; + return jdbcTemplate.query(sql, rowMapper); } /** @@ -931,17 +921,17 @@ public String htmlCodeCoverage(final List pathList, final List s sb.append(" a_paths => ut_varchar2_list(\n"); sb.append(StringTools.getCSV(pathList, 16)); sb.append(" ),\n"); - if (schemaList.size() > 0) { + if (!schemaList.isEmpty()) { sb.append(" a_coverage_schemes => ut_varchar2_list(\n"); sb.append(StringTools.getCSV(schemaList, 16)); sb.append(" ),\n"); } - if (includeObjectList.size() > 0) { + if (!includeObjectList.isEmpty()) { sb.append(" a_include_objects => ut_varchar2_list(\n"); sb.append(StringTools.getCSV(includeObjectList, 16)); sb.append(" ),\n"); } - if (excludeObjectList.size() > 0) { + if (!excludeObjectList.isEmpty()) { sb.append(" a_exclude_objects => ut_varchar2_list(\n"); sb.append(StringTools.getCSV(excludeObjectList, 16)); sb.append(" ),\n"); @@ -999,8 +989,7 @@ public List includes(final String owner, final String name) { sb.append(" AND referenced_type IN ('PACKAGE', 'TYPE', 'PROCEDURE', 'FUNCTION', 'TRIGGER')"); final String sql = sb.toString(); final Object[] binds = new Object[] {owner, name}; - final List deps = jdbcTemplate.queryForList(sql, String.class, binds); - return deps; + return jdbcTemplate.queryForList(sql, String.class, binds); } /** @@ -1034,7 +1023,7 @@ public String getSource(final String owner, final String objectType, final Strin sb.append(" );\n"); sb.append("END;"); final String sql = sb.toString(); - final String ret = jdbcTemplate.execute(sql, new CallableStatementCallback() { + return jdbcTemplate.execute(sql, new CallableStatementCallback() { @Override public String doInCallableStatement(final CallableStatement cs) throws SQLException { cs.registerOutParameter(1, Types.CLOB); @@ -1045,7 +1034,6 @@ public String doInCallableStatement(final CallableStatement cs) throws SQLExcept return cs.getString(1); } }); - return ret; } /** @@ -1074,7 +1062,6 @@ public String getObjectType(final String owner, final String objectName) { sb.append(" WHERE rownum = 1"); final String sql = sb.toString(); final Object[] binds = new Object[] {owner, objectName}; - final String objectType = jdbcTemplate.queryForObject(sql, binds, String.class); - return objectType; + return jdbcTemplate.queryForObject(sql, binds, String.class); } } From 1e10c8972931e9399d40287364ecdc9116accbe1 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 17:10:18 +0200 Subject: [PATCH 045/286] rename GenContext.xtend to GenContext.java --- .../sqldev/model/oddgen/{GenContext.xtend => GenContext.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/{GenContext.xtend => GenContext.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java From 683095636087828c62648fe578bca3832a75ecce Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 17:47:32 +0200 Subject: [PATCH 046/286] convert GenContext to Java --- .../sqldev/model/oddgen/GenContext.java | 153 +++++++++++++++--- 1 file changed, 133 insertions(+), 20 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java index bb4afc77..7e5b603c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java @@ -13,24 +13,137 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.oddgen - -import java.sql.Connection -import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel - -@Accessors -class GenContext extends AbstractModel { - Connection conn - String objectType - String objectName - String testPackagePrefix - String testPackageSuffix - String testUnitPrefix - String testUnitSuffix - int numberOfTestsPerUnit - boolean generateComments - boolean disableTests - String suitePath - int indentSpaces +package org.utplsql.sqldev.model.oddgen; + +import java.sql.Connection; + +import org.springframework.core.style.ToStringCreator; + +public class GenContext { + private Connection conn; + private String objectType; + private String objectName; + private String testPackagePrefix; + private String testPackageSuffix; + private String testUnitPrefix; + private String testUnitSuffix; + private int numberOfTestsPerUnit; + private boolean generateComments; + private boolean disableTests; + private String suitePath; + private int indentSpaces; + + public Connection getConn() { + return this.conn; + } + + @Override + public String toString() { + return new ToStringCreator(this) + .append("conn", conn) + .append("objectType", objectType) + .append("objectName", objectName) + .append("testPackagePrefix", testPackagePrefix) + .append("testPackageSuffix", testPackageSuffix) + .append("testUnitPrefix", testUnitPrefix) + .append("testUnitSuffix", testUnitSuffix) + .append("numberOfTestsPerUnit", numberOfTestsPerUnit) + .append("generateComments", generateComments) + .append("disableTests", disableTests) + .append("suitePath", suitePath) + .append("indentSpaces", indentSpaces) + .toString(); + } + + public void setConn(final Connection conn) { + this.conn = conn; + } + + public String getObjectType() { + return this.objectType; + } + + public void setObjectType(final String objectType) { + this.objectType = objectType; + } + + public String getObjectName() { + return this.objectName; + } + + public void setObjectName(final String objectName) { + this.objectName = objectName; + } + + public String getTestPackagePrefix() { + return this.testPackagePrefix; + } + + public void setTestPackagePrefix(final String testPackagePrefix) { + this.testPackagePrefix = testPackagePrefix; + } + + public String getTestPackageSuffix() { + return this.testPackageSuffix; + } + + public void setTestPackageSuffix(final String testPackageSuffix) { + this.testPackageSuffix = testPackageSuffix; + } + + public String getTestUnitPrefix() { + return this.testUnitPrefix; + } + + public void setTestUnitPrefix(final String testUnitPrefix) { + this.testUnitPrefix = testUnitPrefix; + } + + public String getTestUnitSuffix() { + return this.testUnitSuffix; + } + + public void setTestUnitSuffix(final String testUnitSuffix) { + this.testUnitSuffix = testUnitSuffix; + } + + public int getNumberOfTestsPerUnit() { + return this.numberOfTestsPerUnit; + } + + public void setNumberOfTestsPerUnit(final int numberOfTestsPerUnit) { + this.numberOfTestsPerUnit = numberOfTestsPerUnit; + } + + public boolean isGenerateComments() { + return this.generateComments; + } + + public void setGenerateComments(final boolean generateComments) { + this.generateComments = generateComments; + } + + public boolean isDisableTests() { + return this.disableTests; + } + + public void setDisableTests(final boolean disableTests) { + this.disableTests = disableTests; + } + + public String getSuitePath() { + return this.suitePath; + } + + public void setSuitePath(final String suitePath) { + this.suitePath = suitePath; + } + + public int getIndentSpaces() { + return this.indentSpaces; + } + + public void setIndentSpaces(final int indentSpaces) { + this.indentSpaces = indentSpaces; + } } From 57cfe384b2fe58213d4fd8bfb8a952fe8119577c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 20:50:33 +0200 Subject: [PATCH 047/286] rename PlsqlObject.xtend to PlsqlObject.java --- .../sqldev/model/parser/{PlsqlObject.xtend => PlsqlObject.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/parser/{PlsqlObject.xtend => PlsqlObject.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java From 156a3dc58c58c63508a000a08fd76ef50960ed46 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 20:52:23 +0200 Subject: [PATCH 048/286] value and toString styler for model classes --- .../sqldev/model/UtplsqlToStringStyler.java | 31 +++++ .../sqldev/model/UtplsqlValueStyler.java | 107 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java create mode 100644 sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java new file mode 100644 index 00000000..74f48cb1 --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java @@ -0,0 +1,31 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.model; + +import org.springframework.core.style.DefaultToStringStyler; + +public class UtplsqlToStringStyler extends DefaultToStringStyler { + + public UtplsqlToStringStyler() { + super(new UtplsqlValueStyler()); + } + + @Override + public void styleFieldSeparator(StringBuilder buffer) { + buffer.append(','); + buffer.append('\n'); + } +} diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java new file mode 100644 index 00000000..3eaae8f2 --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java @@ -0,0 +1,107 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.model; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringJoiner; + +import org.springframework.core.style.DefaultValueStyler; +import org.springframework.lang.Nullable; +import org.springframework.util.ClassUtils; +import org.springframework.util.ObjectUtils; + +public class UtplsqlValueStyler extends DefaultValueStyler { + private static final String EMPTY = "[[empty]]"; + private static final String COLLECTION = "collection"; + private static final String SET = "set"; + private static final String LIST = "list"; + private static final String MAP = "map"; + private static final String EMPTY_MAP = MAP + EMPTY; + private static final String ARRAY = "array"; + + @Override + public String style(@Nullable Object value) { + if (value == null) { + return super.style(value); + } else if (value instanceof Map) { + return styleMap((Map) value); + } else if (value instanceof Map.Entry) { + return styleMapEntry((Map.Entry) value); + } else if (value instanceof Collection) { + return styleCollection((Collection) value); + } else if (value.getClass().isArray()) { + return styleArray(ObjectUtils.toObjectArray(value)); + } else { + return super.style(value); + } + } + + private String styleMap(Map value) { + if (value.isEmpty()) { + return EMPTY_MAP; + } + + StringJoiner result = new StringJoiner(",\n", "[", "]"); + for (Map.Entry entry : value.entrySet()) { + result.add(styleMapEntry(entry)); + } + return MAP + result; + } + + private String styleMapEntry(Map.Entry value) { + return style(value.getKey()) + " -> " + style(value.getValue()); + } + + private String styleCollection(Collection value) { + String collectionType = getCollectionTypeString(value); + + if (value.isEmpty()) { + return collectionType + EMPTY; + } + + StringJoiner result = new StringJoiner(",\n", "[", "]"); + for (Object o : value) { + result.add(style(o)); + } + return collectionType + result; + } + + private String getCollectionTypeString(Collection value) { + if (value instanceof List) { + return LIST; + } else if (value instanceof Set) { + return SET; + } else { + return COLLECTION; + } + } + + private String styleArray(Object[] array) { + if (array.length == 0) { + return ARRAY + '<' + ClassUtils.getShortName(array.getClass().getComponentType()) + '>' + EMPTY; + } + + StringJoiner result = new StringJoiner(",\n ", "[", "]"); + for (Object o : array) { + result.add(style(o)); + } + return ARRAY + '<' + ClassUtils.getShortName(array.getClass().getComponentType()) + '>' + result; + } + +} From 1187f85bebf4b9d4a8f70b663024505fa5c056cf Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 20:52:38 +0200 Subject: [PATCH 049/286] configure styler for model classes --- .../main/java/org/utplsql/sqldev/model/AbstractModel.xtend | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend index f4356033..6638539b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend @@ -16,9 +16,16 @@ package org.utplsql.sqldev.model import org.eclipse.xtext.xbase.lib.util.ToStringBuilder +import org.springframework.core.style.ToStringStyler abstract class AbstractModel { + static final ToStringStyler STYLER = new UtplsqlToStringStyler(); + override toString() { new ToStringBuilder(this).addAllFields.toString } + + def getStyler() { + return STYLER; + } } From 8cfa66c79850716f0826f78bf20cad4fb65d9ea8 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 20:53:45 +0200 Subject: [PATCH 050/286] extend from AbstractModel again and configure styler --- .../java/org/utplsql/sqldev/model/oddgen/GenContext.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java index 7e5b603c..19a8a0f1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java @@ -18,8 +18,9 @@ import java.sql.Connection; import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.AbstractModel; -public class GenContext { +public class GenContext extends AbstractModel { private Connection conn; private String objectType; private String objectName; @@ -39,7 +40,7 @@ public Connection getConn() { @Override public String toString() { - return new ToStringCreator(this) + return new ToStringCreator(this, getStyler()) .append("conn", conn) .append("objectType", objectType) .append("objectName", objectName) From 9376a4aa89bb5ff82762f8179699f09679167108 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 20:54:24 +0200 Subject: [PATCH 051/286] convert PlsqlObject to Java --- .../sqldev/model/parser/PlsqlObject.java | 70 +++++++++++++++---- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java index 96b71db1..8930b038 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java @@ -13,17 +13,59 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.parser - -import java.util.List -import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel -import org.utplsql.sqldev.model.ut.Annotation - -@Accessors -class PlsqlObject extends AbstractModel { - String name - String type - Integer position - List annotations -} \ No newline at end of file +package org.utplsql.sqldev.model.parser; + +import java.util.List; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.AbstractModel; +import org.utplsql.sqldev.model.ut.Annotation; + +public class PlsqlObject extends AbstractModel { + private String name; + private String type; + private Integer position; + private List annotations; + + @Override + public String toString() { + return new ToStringCreator(this, getStyler()) + .append("name", name) + .append("type", type) + .append("position", position) + .append("annotations", annotations) + .toString(); + } + + public String getName() { + return this.name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getType() { + return this.type; + } + + public void setType(final String type) { + this.type = type; + } + + public Integer getPosition() { + return this.position; + } + + public void setPosition(final Integer position) { + this.position = position; + } + + public List getAnnotations() { + return this.annotations; + } + + public void setAnnotations(final List annotations) { + this.annotations = annotations; + } +} From f231205cffab82dffab9efdbb4f7d075c8ac1d72 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 22:32:31 +0200 Subject: [PATCH 052/286] rename Annotation.xtend to Annotation.java --- .../utplsql/sqldev/model/ut/{Annotation.xtend => Annotation.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/ut/{Annotation.xtend => Annotation.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java From d03f7ab8ff432be83fcd119d071ace8b5c0332c2 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 22:33:25 +0200 Subject: [PATCH 053/286] convert Annotation to Java --- .../utplsql/sqldev/model/ut/Annotation.java | 76 +++++++++++++++---- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java index ee658e91..cd11ce93 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java @@ -13,16 +13,66 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.ut - -import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel - -@Accessors -class Annotation extends AbstractModel { - String objectOwner - String objectName - String name - String text - String subobjectName -} \ No newline at end of file +package org.utplsql.sqldev.model.ut; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.AbstractModel; + +public class Annotation extends AbstractModel { + private String objectOwner; + private String objectName; + private String name; + private String text; + private String subobjectName; + + @Override + public String toString() { + return new ToStringCreator(this, getStyler()) + .append("objectOwner", objectOwner) + .append("objectName", objectName) + .append("name", name) + .append("text", text) + .append("subobjectName", subobjectName) + .toString(); + } + + public String getObjectOwner() { + return this.objectOwner; + } + + public void setObjectOwner(final String objectOwner) { + this.objectOwner = objectOwner; + } + + public String getObjectName() { + return this.objectName; + } + + public void setObjectName(final String objectName) { + this.objectName = objectName; + } + + public String getName() { + return this.name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getText() { + return this.text; + } + + public void setText(final String text) { + this.text = text; + } + + public String getSubobjectName() { + return this.subobjectName; + } + + public void setSubobjectName(final String subobjectName) { + this.subobjectName = subobjectName; + } +} From 6cca6f4d093f18d3e3b32206495eb0b7ebd35e90 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 22:35:18 +0200 Subject: [PATCH 054/286] add newline after object hash --- .../sqldev/model/UtplsqlToStringStyler.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java index 74f48cb1..5c50e93b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java @@ -16,16 +16,36 @@ package org.utplsql.sqldev.model; import org.springframework.core.style.DefaultToStringStyler; +import org.springframework.util.ClassUtils; +import org.springframework.util.ObjectUtils; public class UtplsqlToStringStyler extends DefaultToStringStyler { public UtplsqlToStringStyler() { super(new UtplsqlValueStyler()); } - + @Override public void styleFieldSeparator(StringBuilder buffer) { - buffer.append(','); + buffer.append(",\n"); + } + + @Override + public void styleStart(StringBuilder buffer, Object obj) { + if (!obj.getClass().isArray()) { + buffer.append("[").append(ClassUtils.getShortName(obj.getClass())); + myStyleIdentityHashCode(buffer, obj); + } else { + buffer.append("["); + myStyleIdentityHashCode(buffer, obj); + buffer.append(' '); + styleValue(buffer, obj); + } + } + + private void myStyleIdentityHashCode(StringBuilder buffer, Object obj) { + buffer.append('@'); + buffer.append(ObjectUtils.getIdentityHexString(obj)); buffer.append('\n'); } } From 7e917c484565ce556712c1a4ef93d34ec3ded959 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 22:35:59 +0200 Subject: [PATCH 055/286] add missing newlines --- .../sqldev/model/UtplsqlValueStyler.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java index 3eaae8f2..b5b639be 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java @@ -15,6 +15,7 @@ */ package org.utplsql.sqldev.model; +import java.lang.reflect.Method; import java.util.Collection; import java.util.List; import java.util.Map; @@ -34,48 +35,51 @@ public class UtplsqlValueStyler extends DefaultValueStyler { private static final String MAP = "map"; private static final String EMPTY_MAP = MAP + EMPTY; private static final String ARRAY = "array"; - + @Override public String style(@Nullable Object value) { if (value == null) { return super.style(value); + } else if (value instanceof String) { + return super.style(value); + } else if (value instanceof Class) { + return super.style(value); + } else if (value instanceof Method) { + return super.style(value); } else if (value instanceof Map) { - return styleMap((Map) value); + return style((Map) value); } else if (value instanceof Map.Entry) { - return styleMapEntry((Map.Entry) value); + return style((Map.Entry) value); } else if (value instanceof Collection) { - return styleCollection((Collection) value); + return style((Collection) value); } else if (value.getClass().isArray()) { - return styleArray(ObjectUtils.toObjectArray(value)); + return style(ObjectUtils.toObjectArray(value)); } else { return super.style(value); } } - private String styleMap(Map value) { + private String style(Map value) { if (value.isEmpty()) { return EMPTY_MAP; } - - StringJoiner result = new StringJoiner(",\n", "[", "]"); + StringJoiner result = new StringJoiner(",\n", "[\n", "]"); for (Map.Entry entry : value.entrySet()) { - result.add(styleMapEntry(entry)); + result.add(style(entry)); } return MAP + result; } - private String styleMapEntry(Map.Entry value) { + private String style(Map.Entry value) { return style(value.getKey()) + " -> " + style(value.getValue()); } - private String styleCollection(Collection value) { + private String style(Collection value) { String collectionType = getCollectionTypeString(value); - if (value.isEmpty()) { return collectionType + EMPTY; } - - StringJoiner result = new StringJoiner(",\n", "[", "]"); + StringJoiner result = new StringJoiner(",\n", "[\n", "]"); for (Object o : value) { result.add(style(o)); } @@ -92,16 +96,14 @@ private String getCollectionTypeString(Collection value) { } } - private String styleArray(Object[] array) { + private String style(Object[] array) { if (array.length == 0) { return ARRAY + '<' + ClassUtils.getShortName(array.getClass().getComponentType()) + '>' + EMPTY; } - - StringJoiner result = new StringJoiner(",\n ", "[", "]"); + StringJoiner result = new StringJoiner(",\n", "[\n", "]"); for (Object o : array) { result.add(style(o)); } return ARRAY + '<' + ClassUtils.getShortName(array.getClass().getComponentType()) + '>' + result; } - } From b3132c503dab2fd0ba0f8c043141ff9a4acd2eec Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 22:54:02 +0200 Subject: [PATCH 056/286] remove object hash in toString to avoid failing tests --- .../utplsql/sqldev/model/UtplsqlToStringStyler.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java index 5c50e93b..6628bafc 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java @@ -17,7 +17,6 @@ import org.springframework.core.style.DefaultToStringStyler; import org.springframework.util.ClassUtils; -import org.springframework.util.ObjectUtils; public class UtplsqlToStringStyler extends DefaultToStringStyler { @@ -34,18 +33,10 @@ public void styleFieldSeparator(StringBuilder buffer) { public void styleStart(StringBuilder buffer, Object obj) { if (!obj.getClass().isArray()) { buffer.append("[").append(ClassUtils.getShortName(obj.getClass())); - myStyleIdentityHashCode(buffer, obj); + buffer.append('\n'); } else { - buffer.append("["); - myStyleIdentityHashCode(buffer, obj); - buffer.append(' '); + buffer.append('['); styleValue(buffer, obj); } } - - private void myStyleIdentityHashCode(StringBuilder buffer, Object obj) { - buffer.append('@'); - buffer.append(ObjectUtils.getIdentityHexString(obj)); - buffer.append('\n'); - } } From ef41f398344d82660b16e516cec7432e38aca8af Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 22:56:51 +0200 Subject: [PATCH 057/286] rename Unit.xtend to Unit.java --- .../org/utplsql/sqldev/model/parser/{Unit.xtend => Unit.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/parser/{Unit.xtend => Unit.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java From d1e66f8bfa0b65e19ad09b9559fd9db104279330 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 22:57:21 +0200 Subject: [PATCH 058/286] convert Unit to Java --- .../org/utplsql/sqldev/model/parser/Unit.java | 50 +++++++++++++++---- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java index a913f70b..0b6a4eba 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java @@ -13,14 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.parser +package org.utplsql.sqldev.model.parser; -import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.AbstractModel; -@Accessors -class Unit extends AbstractModel { - String name - Integer position - Integer positionOfName -} \ No newline at end of file +public class Unit extends AbstractModel { + private String name; + private Integer position; + private Integer positionOfName; + + @Override + public String toString() { + return new ToStringCreator(this, getStyler()) + .append("name", name) + .append("position", position) + .append("positionOfName", positionOfName) + .toString(); + } + + public String getName() { + return this.name; + } + + public void setName(final String name) { + this.name = name; + } + + public Integer getPosition() { + return this.position; + } + + public void setPosition(final Integer position) { + this.position = position; + } + + public Integer getPositionOfName() { + return this.positionOfName; + } + + public void setPositionOfName(final Integer positionOfName) { + this.positionOfName = positionOfName; + } +} From 6e02a69e57bb7413a17c7bd4bd0b7aeb97a2dbde Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 23:01:37 +0200 Subject: [PATCH 059/286] rename PreferenceModel.xtend to PreferenceModel.java --- .../preference/{PreferenceModel.xtend => PreferenceModel.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/preference/{PreferenceModel.xtend => PreferenceModel.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java From 81bf82193c43443fe816d14189a41f20fb9388a7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 23:52:30 +0200 Subject: [PATCH 060/286] moved STYLER instance to UtplsqlToStringStyler --- .../main/java/org/utplsql/sqldev/model/AbstractModel.xtend | 4 +--- .../java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend index 6638539b..b980872a 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend @@ -16,16 +16,14 @@ package org.utplsql.sqldev.model import org.eclipse.xtext.xbase.lib.util.ToStringBuilder -import org.springframework.core.style.ToStringStyler abstract class AbstractModel { - static final ToStringStyler STYLER = new UtplsqlToStringStyler(); override toString() { new ToStringBuilder(this).addAllFields.toString } def getStyler() { - return STYLER; + return UtplsqlToStringStyler.STYLER; } } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java index 6628bafc..4f8fb079 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java @@ -16,9 +16,11 @@ package org.utplsql.sqldev.model; import org.springframework.core.style.DefaultToStringStyler; +import org.springframework.core.style.ToStringStyler; import org.springframework.util.ClassUtils; public class UtplsqlToStringStyler extends DefaultToStringStyler { + public static final ToStringStyler STYLER = new UtplsqlToStringStyler(); public UtplsqlToStringStyler() { super(new UtplsqlValueStyler()); From d186bfd965bf6b06e2e1c2f7da1659a1fb430ddf Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 23:53:32 +0200 Subject: [PATCH 061/286] convert PreferenceModel to Java --- .../model/preference/PreferenceModel.java | 646 +++++++++--------- 1 file changed, 341 insertions(+), 305 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java index 6ae9ea80..13700348 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java @@ -13,309 +13,345 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.preference - -import java.io.File -import oracle.javatools.data.HashStructure -import oracle.javatools.data.HashStructureAdapter -import oracle.javatools.data.PropertyStorage -import org.eclipse.xtext.xbase.lib.util.ToStringBuilder - -class PreferenceModel extends HashStructureAdapter { - public static final String DEFAULT_OUTPUT_DIRECTORY = '''«System.getProperty("user.home")»«File.separator»utplsql«File.separator»generated''' - static final String DATA_KEY = "utplsql" - - private new(HashStructure hash) { - super(hash) - } - - def static getInstance(PropertyStorage prefs) { - return new PreferenceModel(findOrCreate(prefs, DATA_KEY)) - } - - static final String KEY_USE_REALTIME_REPORTER = "useRealtimeRorter" - static final String KEY_UNSHARED_WORKSHEET = "unsharedWorksheet" - static final String KEY_RESET_PACKAGE = "resetPackage" - static final String KEY_CLEAR_SCREEN = "clearScreen" - static final String KEY_AUTO_EXECUTE = "autoExecute" - static final String KEY_CHECK_RUN_UTPLSQL_TEST = "checkRunUtplsqlTest" - static final String KEY_USE_SMART_TIMES = "useSmartTimes" - static final String KEY_NUMBER_OF_RUNS_IN_HISTORY = "numberOfRunsInHistory" - static final String KEY_SHOW_DISABLED_COUNTER = "showDisabledCounter" - static final String KEY_SHOW_WARNINGS_COUNTER = "showWarningsCounter" - static final String KEY_SHOW_INFO_COUNTER = "showInfoCounter" - static final String KEY_SHOW_WARNING_INDICATOR = "showWarningIndicator" - static final String KEY_SHOW_INFO_INDICATOR = "showInfoIndicator" - static final String KEY_SHOW_SUCCESSFUL_TESTS = "showSuccessfulTests" - static final String KEY_SHOW_DISABLED_TESTS = "showDisabledTests" - static final String KEY_SHOW_TEST_DESCRIPTION = "showTestDescription" - static final String KEY_SYNC_DETAIL_TAB = "syncDetailTab" - static final String KEY_TEST_PACKAGE_PREFIX = "testPackagePrefix" - static final String KEY_TEST_PACKAGE_SUFFIX = "testPackageSuffix" - static final String KEY_TEST_UNIT_PREFIX = "testUnitPrefix" - static final String KEY_TEST_UNIT_SUFFIX = "testUnitSuffix" - static final String KEY_NUMBER_OF_TESTS_PER_UNIT = "numberOfTestsPerUnit" - static final String KEY_CHECK_GENERATE_UTPLSQL_TEST = "checkGenerateUtplsqlTest" - static final String KEY_GENERATE_COMMENTS = "generateComments" - static final String KEY_DISABLE_TESTS = "disableTests" - static final String KEY_SUITE_PATH="suitePath" - static final String KEY_INDENT_SPACES="indentSpaces" - static final String KEY_GENERATE_FILES="generateFiles" - static final String KEY_OUTPUT_DIRECTORY = "outputDirectory" - static final String KEY_DELETE_EXISTING_FILES="deleteExistingFiles" - static final String KEY_ROOT_FOLDER_IN_ODDGEN_VIEW = "rootFolderInOddgenView" - - def isUseRealtimeReporter() { - return getHashStructure.getBoolean(PreferenceModel.KEY_USE_REALTIME_REPORTER, true) - } - - def setUseRealtimeReporter(boolean useRealtimeReporter) { - getHashStructure.putBoolean(PreferenceModel.KEY_USE_REALTIME_REPORTER, useRealtimeReporter) - } - - def isUnsharedWorksheet() { - return getHashStructure.getBoolean(PreferenceModel.KEY_UNSHARED_WORKSHEET, true) - } - - def setUnsharedWorksheet(boolean unsharedWorksheet) { - getHashStructure.putBoolean(PreferenceModel.KEY_UNSHARED_WORKSHEET, unsharedWorksheet) - } - - def isResetPackage() { - return getHashStructure.getBoolean(PreferenceModel.KEY_RESET_PACKAGE, false) - } - - def setResetPackage(boolean resetPackage) { - getHashStructure.putBoolean(PreferenceModel.KEY_RESET_PACKAGE, resetPackage) - } - - def isClearScreen() { - return getHashStructure.getBoolean(PreferenceModel.KEY_CLEAR_SCREEN, false) - } - - def setClearScreen(boolean clearScreen) { - getHashStructure.putBoolean(PreferenceModel.KEY_CLEAR_SCREEN, clearScreen) - } - - def isAutoExecute() { - return getHashStructure.getBoolean(PreferenceModel.KEY_AUTO_EXECUTE, true) - } - - def setAutoExecute(boolean autoExecute) { - getHashStructure.putBoolean(PreferenceModel.KEY_AUTO_EXECUTE, autoExecute) - } - - def isCheckRunUtplsqlTest() { - return getHashStructure.getBoolean(PreferenceModel.KEY_CHECK_RUN_UTPLSQL_TEST, false) - } - - def setCheckRunUtplsqlTest(boolean checkRunUtplsqlTest) { - getHashStructure.putBoolean(PreferenceModel.KEY_CHECK_RUN_UTPLSQL_TEST, checkRunUtplsqlTest) - } - - def isUseSmartTimes() { - return getHashStructure.getBoolean(PreferenceModel.KEY_USE_SMART_TIMES, false) - } - - def setUseSmartTimes(boolean useSmartTimes) { - getHashStructure.putBoolean(PreferenceModel.KEY_USE_SMART_TIMES, useSmartTimes) - } - - def getNumberOfRunsInHistory() { - return getHashStructure.getInt(PreferenceModel.KEY_NUMBER_OF_RUNS_IN_HISTORY, 10) - } - - def setNumberOfRunsInHistory(int runs) { - getHashStructure.putInt(PreferenceModel.KEY_NUMBER_OF_RUNS_IN_HISTORY, runs) - } - - def isShowDisabledCounter() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SHOW_DISABLED_COUNTER, false) - } - - def setShowDisabledCounter(boolean showDisabledCounter) { - getHashStructure.putBoolean(PreferenceModel.KEY_SHOW_DISABLED_COUNTER, showDisabledCounter) - } - - def isShowWarningsCounter() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SHOW_WARNINGS_COUNTER, false) - } - - def setShowWarningsCounter(boolean showWarningCounter) { - getHashStructure.putBoolean(PreferenceModel.KEY_SHOW_WARNINGS_COUNTER, showWarningCounter) - } - - def isShowInfoCounter() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SHOW_INFO_COUNTER, false) - } - - def setShowInfoCounter(boolean showInfoCounter) { - getHashStructure.putBoolean(PreferenceModel.KEY_SHOW_INFO_COUNTER, showInfoCounter) - } - - def isShowWarningIndicator() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SHOW_WARNING_INDICATOR, false) - } - - def setShowWarningIndicator(boolean showWarningIndicator) { - getHashStructure.putBoolean(PreferenceModel.KEY_SHOW_WARNING_INDICATOR, showWarningIndicator) - } - - def isShowInfoIndicator() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SHOW_INFO_INDICATOR, false) - } - - def setShowInfoIndicator(boolean showInfoIndicator) { - getHashStructure.putBoolean(PreferenceModel.KEY_SHOW_INFO_INDICATOR, showInfoIndicator) - } - - def isShowSuccessfulTests() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SHOW_SUCCESSFUL_TESTS, true) - } - - def setShowSuccessfulTests(boolean showSuccessfulTests) { - getHashStructure.putBoolean(PreferenceModel.KEY_SHOW_SUCCESSFUL_TESTS, showSuccessfulTests) - } - - def isShowDisabledTests() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SHOW_DISABLED_TESTS, true) - } - - def setShowDisabledTests(boolean showDisabledTests) { - getHashStructure.putBoolean(PreferenceModel.KEY_SHOW_DISABLED_TESTS, showDisabledTests) - } - - def isShowTestDescription() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SHOW_TEST_DESCRIPTION, false) - } - - def setShowTestDescription(boolean showTestDescription) { - getHashStructure.putBoolean(PreferenceModel.KEY_SHOW_TEST_DESCRIPTION, showTestDescription) - } - - def isSyncDetailTab() { - return getHashStructure.getBoolean(PreferenceModel.KEY_SYNC_DETAIL_TAB, true) - } - - def setSyncDetailTab(boolean syncDetailTab) { - getHashStructure.putBoolean(PreferenceModel.KEY_SYNC_DETAIL_TAB, syncDetailTab) - } - - def getTestPackagePrefix() { - return getHashStructure.getString(PreferenceModel.KEY_TEST_PACKAGE_PREFIX, "test_") - } - - def setTestPackagePrefix(String testPackagePrefix) { - getHashStructure.putString(PreferenceModel.KEY_TEST_PACKAGE_PREFIX, testPackagePrefix) - } - - def getTestPackageSuffix() { - return getHashStructure.getString(PreferenceModel.KEY_TEST_PACKAGE_SUFFIX, "") - } - - def setTestPackageSuffix(String testPackageSuffix) { - getHashStructure.putString(PreferenceModel.KEY_TEST_PACKAGE_SUFFIX, testPackageSuffix) - } - - def getTestUnitPrefix() { - return getHashStructure.getString(PreferenceModel.KEY_TEST_UNIT_PREFIX, "") - } - - def setTestUnitPrefix(String testUnitPrefix) { - getHashStructure.putString(PreferenceModel.KEY_TEST_UNIT_PREFIX, testUnitPrefix) - } - - def getTestUnitSuffix() { - return getHashStructure.getString(PreferenceModel.KEY_TEST_UNIT_SUFFIX, "") - } - - def setTestUnitSuffix(String testUnitSuffix) { - getHashStructure.putString(PreferenceModel.KEY_TEST_UNIT_SUFFIX, testUnitSuffix) - } - - def getNumberOfTestsPerUnit() { - return getHashStructure.getInt(PreferenceModel.KEY_NUMBER_OF_TESTS_PER_UNIT, 1) - } - - def setNumberOfTestsPerUnit(int numberOfTestsPerUnit) { - getHashStructure.putInt(PreferenceModel.KEY_NUMBER_OF_TESTS_PER_UNIT, numberOfTestsPerUnit) - } - - def isCheckGenerateUtplsqlTest() { - return getHashStructure.getBoolean(PreferenceModel.KEY_CHECK_GENERATE_UTPLSQL_TEST, false) - } - - def setCheckGenerateUtplsqlTest(boolean checkGenerateUtplsqlTest) { - getHashStructure.putBoolean(PreferenceModel.KEY_CHECK_GENERATE_UTPLSQL_TEST, checkGenerateUtplsqlTest) - } - - def isGenerateComments() { - return getHashStructure.getBoolean(PreferenceModel.KEY_GENERATE_COMMENTS, true) - } - - def setGenerateComments(boolean generateComments) { - getHashStructure.putBoolean(PreferenceModel.KEY_GENERATE_COMMENTS, generateComments) - } - - def isDisableTests() { - return getHashStructure.getBoolean(PreferenceModel.KEY_DISABLE_TESTS, false) - } - - def setDisableTests(boolean disableTests) { - getHashStructure.putBoolean(PreferenceModel.KEY_DISABLE_TESTS, disableTests) - } - - def getSuitePath() { - return getHashStructure.getString(PreferenceModel.KEY_SUITE_PATH, "alltests") - } - - def setSuitePath(String suitePath) { - getHashStructure.putString(PreferenceModel.KEY_SUITE_PATH, suitePath) - } - - def getIndentSpaces() { - return getHashStructure.getInt(PreferenceModel.KEY_INDENT_SPACES, 3) - } - - def setIndentSpaces(int indentSpaces) { - getHashStructure.putInt(PreferenceModel.KEY_INDENT_SPACES, indentSpaces) - } - - def isGenerateFiles() { - return getHashStructure.getBoolean(PreferenceModel.KEY_GENERATE_FILES, true) - } - - def setGenerateFiles(boolean generateFiles) { - getHashStructure.putBoolean(PreferenceModel.KEY_GENERATE_FILES, generateFiles) - } - - def getOutputDirectory() { - return getHashStructure.getString(PreferenceModel.KEY_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_DIRECTORY) - } - - def setOutputDirectory(String outputDirectory) { - val dir = if (outputDirectory.empty) {DEFAULT_OUTPUT_DIRECTORY} else {outputDirectory} - getHashStructure.putString(PreferenceModel.KEY_OUTPUT_DIRECTORY, dir) - } - - def isDeleteExistingFiles() { - return getHashStructure.getBoolean(PreferenceModel.KEY_DELETE_EXISTING_FILES, false) - } - - def setDeleteExistingFiles(boolean deleteExistingFiles) { - getHashStructure.putBoolean(PreferenceModel.KEY_DELETE_EXISTING_FILES, deleteExistingFiles) - } - - def getRootFolderInOddgenView() { - return getHashStructure.getString(PreferenceModel.KEY_ROOT_FOLDER_IN_ODDGEN_VIEW, "utPLSQL") - } - - def setRootFolderInOddgenView(String rootFolder) { - val folder = if (rootFolder.empty) {"utPLSQL"} else {rootFolder} - getHashStructure.putString(PreferenceModel.KEY_ROOT_FOLDER_IN_ODDGEN_VIEW, folder) - } - - override toString() { - new ToStringBuilder(this).addAllFields.toString - } +package org.utplsql.sqldev.model.preference; + +import java.io.File; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; + +import oracle.javatools.data.HashStructure; +import oracle.javatools.data.HashStructureAdapter; +import oracle.javatools.data.PropertyStorage; + +public class PreferenceModel extends HashStructureAdapter { + public static final String DEFAULT_OUTPUT_DIRECTORY = System.getProperty("user.home") + File.separator + "utplsql" + File.separator + "generated"; + private static final String DATA_KEY = "utplsql"; + + private PreferenceModel(final HashStructure hash) { + super(hash); + } + + public static PreferenceModel getInstance(final PropertyStorage prefs) { + return new PreferenceModel(findOrCreate(prefs, DATA_KEY)); + } + + private static final String KEY_USE_REALTIME_REPORTER = "useRealtimeRorter"; + private static final String KEY_UNSHARED_WORKSHEET = "unsharedWorksheet"; + private static final String KEY_RESET_PACKAGE = "resetPackage"; + private static final String KEY_CLEAR_SCREEN = "clearScreen"; + private static final String KEY_AUTO_EXECUTE = "autoExecute"; + private static final String KEY_CHECK_RUN_UTPLSQL_TEST = "checkRunUtplsqlTest"; + private static final String KEY_USE_SMART_TIMES = "useSmartTimes"; + private static final String KEY_NUMBER_OF_RUNS_IN_HISTORY = "numberOfRunsInHistory"; + private static final String KEY_SHOW_DISABLED_COUNTER = "showDisabledCounter"; + private static final String KEY_SHOW_WARNINGS_COUNTER = "showWarningsCounter"; + private static final String KEY_SHOW_INFO_COUNTER = "showInfoCounter"; + private static final String KEY_SHOW_WARNING_INDICATOR = "showWarningIndicator"; + private static final String KEY_SHOW_INFO_INDICATOR = "showInfoIndicator"; + private static final String KEY_SHOW_SUCCESSFUL_TESTS = "showSuccessfulTests"; + private static final String KEY_SHOW_DISABLED_TESTS = "showDisabledTests"; + private static final String KEY_SHOW_TEST_DESCRIPTION = "showTestDescription"; + private static final String KEY_SYNC_DETAIL_TAB = "syncDetailTab"; + private static final String KEY_TEST_PACKAGE_PREFIX = "testPackagePrefix"; + private static final String KEY_TEST_PACKAGE_SUFFIX = "testPackageSuffix"; + private static final String KEY_TEST_UNIT_PREFIX = "testUnitPrefix"; + private static final String KEY_TEST_UNIT_SUFFIX = "testUnitSuffix"; + private static final String KEY_NUMBER_OF_TESTS_PER_UNIT = "numberOfTestsPerUnit"; + private static final String KEY_CHECK_GENERATE_UTPLSQL_TEST = "checkGenerateUtplsqlTest"; + private static final String KEY_GENERATE_COMMENTS = "generateComments"; + private static final String KEY_DISABLE_TESTS = "disableTests"; + private static final String KEY_SUITE_PATH = "suitePath"; + private static final String KEY_INDENT_SPACES = "indentSpaces"; + private static final String KEY_GENERATE_FILES = "generateFiles"; + private static final String KEY_OUTPUT_DIRECTORY = "outputDirectory"; + private static final String KEY_DELETE_EXISTING_FILES = "deleteExistingFiles"; + private static final String KEY_ROOT_FOLDER_IN_ODDGEN_VIEW = "rootFolderInOddgenView"; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.STYLER) + .append(KEY_USE_REALTIME_REPORTER, isUseRealtimeReporter()) + .append(KEY_UNSHARED_WORKSHEET, isUnsharedWorksheet()) + .append(KEY_RESET_PACKAGE, isResetPackage()) + .append(KEY_CLEAR_SCREEN, isClearScreen()) + .append(KEY_AUTO_EXECUTE, isAutoExecute()) + .append(KEY_CHECK_RUN_UTPLSQL_TEST, isCheckRunUtplsqlTest()) + .append(KEY_USE_SMART_TIMES, isUseSmartTimes()) + .append(KEY_NUMBER_OF_RUNS_IN_HISTORY, getNumberOfRunsInHistory()) + .append(KEY_SHOW_DISABLED_COUNTER, isShowDisabledCounter()) + .append(KEY_SHOW_WARNINGS_COUNTER, isShowWarningsCounter()) + .append(KEY_SHOW_INFO_COUNTER, isShowInfoCounter()) + .append(KEY_SHOW_WARNING_INDICATOR, isShowWarningIndicator()) + .append(KEY_SHOW_INFO_INDICATOR, isShowInfoIndicator()) + .append(KEY_SHOW_SUCCESSFUL_TESTS, isShowSuccessfulTests()) + .append(KEY_SHOW_DISABLED_TESTS, isShowDisabledTests()) + .append(KEY_SHOW_TEST_DESCRIPTION, isShowTestDescription()) + .append(KEY_SYNC_DETAIL_TAB, isSyncDetailTab()) + .append(KEY_TEST_PACKAGE_PREFIX, getTestPackagePrefix()) + .append(KEY_TEST_PACKAGE_SUFFIX, getTestPackageSuffix()) + .append(KEY_TEST_UNIT_PREFIX, getTestUnitPrefix()) + .append(KEY_TEST_UNIT_SUFFIX, getTestUnitSuffix()) + .append(KEY_NUMBER_OF_TESTS_PER_UNIT, getNumberOfTestsPerUnit()) + .append(KEY_CHECK_GENERATE_UTPLSQL_TEST, isCheckGenerateUtplsqlTest()) + .append(KEY_GENERATE_COMMENTS, isGenerateComments()) + .append(KEY_DISABLE_TESTS, isDisableTests()) + .append(KEY_SUITE_PATH, getSuitePath()) + .append(KEY_INDENT_SPACES, getIndentSpaces()) + .append(KEY_GENERATE_FILES, isGenerateFiles()) + .append(KEY_OUTPUT_DIRECTORY, getOutputDirectory()) + .append(KEY_DELETE_EXISTING_FILES, isDeleteExistingFiles()) + .append(KEY_ROOT_FOLDER_IN_ODDGEN_VIEW, getRootFolderInOddgenView()) + .toString(); + } + + public boolean isUseRealtimeReporter() { + return getHashStructure().getBoolean(KEY_USE_REALTIME_REPORTER, true); + } + + public void setUseRealtimeReporter(final boolean useRealtimeReporter) { + getHashStructure().putBoolean(KEY_USE_REALTIME_REPORTER, useRealtimeReporter); + } + + public boolean isUnsharedWorksheet() { + return getHashStructure().getBoolean(KEY_UNSHARED_WORKSHEET, true); + } + + public void setUnsharedWorksheet(final boolean unsharedWorksheet) { + getHashStructure().putBoolean(KEY_UNSHARED_WORKSHEET, unsharedWorksheet); + } + + public boolean isResetPackage() { + return getHashStructure().getBoolean(KEY_RESET_PACKAGE, false); + } + + public void setResetPackage(final boolean resetPackage) { + getHashStructure().putBoolean(KEY_RESET_PACKAGE, resetPackage); + } + + public boolean isClearScreen() { + return getHashStructure().getBoolean(KEY_CLEAR_SCREEN, false); + } + + public void setClearScreen(final boolean clearScreen) { + getHashStructure().putBoolean(KEY_CLEAR_SCREEN, clearScreen); + } + + public boolean isAutoExecute() { + return getHashStructure().getBoolean(KEY_AUTO_EXECUTE, true); + } + + public void setAutoExecute(final boolean autoExecute) { + getHashStructure().putBoolean(KEY_AUTO_EXECUTE, autoExecute); + } + + public boolean isCheckRunUtplsqlTest() { + return getHashStructure().getBoolean(KEY_CHECK_RUN_UTPLSQL_TEST, false); + } + + public void setCheckRunUtplsqlTest(final boolean checkRunUtplsqlTest) { + getHashStructure().putBoolean(KEY_CHECK_RUN_UTPLSQL_TEST, checkRunUtplsqlTest); + } + + public boolean isUseSmartTimes() { + return getHashStructure().getBoolean(KEY_USE_SMART_TIMES, false); + } + + public void setUseSmartTimes(final boolean useSmartTimes) { + getHashStructure().putBoolean(KEY_USE_SMART_TIMES, useSmartTimes); + } + + public int getNumberOfRunsInHistory() { + return getHashStructure().getInt(KEY_NUMBER_OF_RUNS_IN_HISTORY, 10); + } + + public void setNumberOfRunsInHistory(final int runs) { + getHashStructure().putInt(KEY_NUMBER_OF_RUNS_IN_HISTORY, runs); + } + + public boolean isShowDisabledCounter() { + return getHashStructure().getBoolean(KEY_SHOW_DISABLED_COUNTER, false); + } + + public void setShowDisabledCounter(final boolean showDisabledCounter) { + getHashStructure().putBoolean(KEY_SHOW_DISABLED_COUNTER, showDisabledCounter); + } + + public boolean isShowWarningsCounter() { + return getHashStructure().getBoolean(KEY_SHOW_WARNINGS_COUNTER, false); + } + + public void setShowWarningsCounter(final boolean showWarningCounter) { + getHashStructure().putBoolean(KEY_SHOW_WARNINGS_COUNTER, showWarningCounter); + } + + public boolean isShowInfoCounter() { + return getHashStructure().getBoolean(KEY_SHOW_INFO_COUNTER, false); + } + + public void setShowInfoCounter(final boolean showInfoCounter) { + getHashStructure().putBoolean(KEY_SHOW_INFO_COUNTER, showInfoCounter); + } + + public boolean isShowWarningIndicator() { + return getHashStructure().getBoolean(KEY_SHOW_WARNING_INDICATOR, false); + } + + public void setShowWarningIndicator(final boolean showWarningIndicator) { + getHashStructure().putBoolean(KEY_SHOW_WARNING_INDICATOR, showWarningIndicator); + } + + public boolean isShowInfoIndicator() { + return getHashStructure().getBoolean(KEY_SHOW_INFO_INDICATOR, false); + } + + public void setShowInfoIndicator(final boolean showInfoIndicator) { + getHashStructure().putBoolean(KEY_SHOW_INFO_INDICATOR, showInfoIndicator); + } + + public boolean isShowSuccessfulTests() { + return getHashStructure().getBoolean(KEY_SHOW_SUCCESSFUL_TESTS, true); + } + + public void setShowSuccessfulTests(final boolean showSuccessfulTests) { + getHashStructure().putBoolean(KEY_SHOW_SUCCESSFUL_TESTS, showSuccessfulTests); + } + + public boolean isShowDisabledTests() { + return getHashStructure().getBoolean(KEY_SHOW_DISABLED_TESTS, true); + } + + public void setShowDisabledTests(final boolean showDisabledTests) { + getHashStructure().putBoolean(KEY_SHOW_DISABLED_TESTS, showDisabledTests); + } + + public boolean isShowTestDescription() { + return getHashStructure().getBoolean(KEY_SHOW_TEST_DESCRIPTION, false); + } + + public void setShowTestDescription(final boolean showTestDescription) { + getHashStructure().putBoolean(KEY_SHOW_TEST_DESCRIPTION, showTestDescription); + } + + public boolean isSyncDetailTab() { + return getHashStructure().getBoolean(KEY_SYNC_DETAIL_TAB, true); + } + + public void setSyncDetailTab(final boolean syncDetailTab) { + getHashStructure().putBoolean(KEY_SYNC_DETAIL_TAB, syncDetailTab); + } + + public String getTestPackagePrefix() { + return getHashStructure().getString(KEY_TEST_PACKAGE_PREFIX, "test_"); + } + + public void setTestPackagePrefix(final String testPackagePrefix) { + getHashStructure().putString(KEY_TEST_PACKAGE_PREFIX, testPackagePrefix); + } + + public String getTestPackageSuffix() { + return getHashStructure().getString(KEY_TEST_PACKAGE_SUFFIX, ""); + } + + public void setTestPackageSuffix(final String testPackageSuffix) { + getHashStructure().putString(KEY_TEST_PACKAGE_SUFFIX, testPackageSuffix); + } + + public String getTestUnitPrefix() { + return getHashStructure().getString(KEY_TEST_UNIT_PREFIX, ""); + } + + public void setTestUnitPrefix(final String testUnitPrefix) { + getHashStructure().putString(KEY_TEST_UNIT_PREFIX, testUnitPrefix); + } + + public String getTestUnitSuffix() { + return getHashStructure().getString(KEY_TEST_UNIT_SUFFIX, ""); + } + + public void setTestUnitSuffix(final String testUnitSuffix) { + getHashStructure().putString(KEY_TEST_UNIT_SUFFIX, testUnitSuffix); + } + + public int getNumberOfTestsPerUnit() { + return getHashStructure().getInt(KEY_NUMBER_OF_TESTS_PER_UNIT, 1); + } + + public void setNumberOfTestsPerUnit(final int numberOfTestsPerUnit) { + getHashStructure().putInt(KEY_NUMBER_OF_TESTS_PER_UNIT, numberOfTestsPerUnit); + } + + public boolean isCheckGenerateUtplsqlTest() { + return getHashStructure().getBoolean(KEY_CHECK_GENERATE_UTPLSQL_TEST, false); + } + + public void setCheckGenerateUtplsqlTest(final boolean checkGenerateUtplsqlTest) { + getHashStructure().putBoolean(KEY_CHECK_GENERATE_UTPLSQL_TEST, checkGenerateUtplsqlTest); + } + + public boolean isGenerateComments() { + return getHashStructure().getBoolean(KEY_GENERATE_COMMENTS, true); + } + + public void setGenerateComments(final boolean generateComments) { + getHashStructure().putBoolean(KEY_GENERATE_COMMENTS, generateComments); + } + + public boolean isDisableTests() { + return getHashStructure().getBoolean(KEY_DISABLE_TESTS, false); + } + + public void setDisableTests(final boolean disableTests) { + getHashStructure().putBoolean(KEY_DISABLE_TESTS, disableTests); + } + + public String getSuitePath() { + return getHashStructure().getString(KEY_SUITE_PATH, "alltests"); + } + + public void setSuitePath(final String suitePath) { + getHashStructure().putString(KEY_SUITE_PATH, suitePath); + } + + public int getIndentSpaces() { + return getHashStructure().getInt(KEY_INDENT_SPACES, 3); + } + + public void setIndentSpaces(final int indentSpaces) { + getHashStructure().putInt(KEY_INDENT_SPACES, indentSpaces); + } + + public boolean isGenerateFiles() { + return getHashStructure().getBoolean(KEY_GENERATE_FILES, true); + } + + public void setGenerateFiles(final boolean generateFiles) { + getHashStructure().putBoolean(KEY_GENERATE_FILES, generateFiles); + } + + public String getOutputDirectory() { + return getHashStructure().getString(KEY_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_DIRECTORY); + } + + public void setOutputDirectory(final String outputDirectory) { + final String dir = outputDirectory.isEmpty() ? DEFAULT_OUTPUT_DIRECTORY : outputDirectory; + getHashStructure().putString(KEY_OUTPUT_DIRECTORY, dir); + } + + public boolean isDeleteExistingFiles() { + return getHashStructure().getBoolean(KEY_DELETE_EXISTING_FILES, false); + } + + public void setDeleteExistingFiles(final boolean deleteExistingFiles) { + getHashStructure().putBoolean(KEY_DELETE_EXISTING_FILES, deleteExistingFiles); + } + + public String getRootFolderInOddgenView() { + return getHashStructure().getString(KEY_ROOT_FOLDER_IN_ODDGEN_VIEW, "utPLSQL"); + } + + public void setRootFolderInOddgenView(final String rootFolder) { + final String folder = rootFolder.isEmpty() ? "utPLSQL" : rootFolder; + getHashStructure().putString(KEY_ROOT_FOLDER_IN_ODDGEN_VIEW, folder); + } } From b41166b6d1091d34dc858cde91204718ceae3978 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 23:56:59 +0200 Subject: [PATCH 062/286] rename AbstractModel.xtend to AbstractModel.java --- .../sqldev/model/{AbstractModel.xtend => AbstractModel.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/{AbstractModel.xtend => AbstractModel.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java From a83536c6f615d605a8fe2eee626ca382ec704107 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Sun, 24 May 2020 23:57:25 +0200 Subject: [PATCH 063/286] convert AbstractModel to Java --- .../utplsql/sqldev/model/AbstractModel.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java b/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java index b980872a..86065829 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java @@ -13,17 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model +package org.utplsql.sqldev.model; -import org.eclipse.xtext.xbase.lib.util.ToStringBuilder +import org.springframework.core.style.ToStringStyler; -abstract class AbstractModel { - - override toString() { - new ToStringBuilder(this).addAllFields.toString - } - - def getStyler() { - return UtplsqlToStringStyler.STYLER; - } +public abstract class AbstractModel { + + public ToStringStyler getStyler() { + return UtplsqlToStringStyler.STYLER; + } } From f3bf87571666630570edb27179f1c0bba679035a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 00:01:40 +0200 Subject: [PATCH 064/286] rename OutputLines.xtend to OutputLines.java --- .../sqldev/model/ut/{OutputLines.xtend => OutputLines.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/ut/{OutputLines.xtend => OutputLines.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java From 2808b97314b083e81f7ae7729c640029c17324d2 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 00:02:16 +0200 Subject: [PATCH 065/286] convert OutputLines to Java --- .../utplsql/sqldev/model/ut/OutputLines.java | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java index 7b1c946c..fc203c32 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java @@ -13,13 +13,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.ut +package org.utplsql.sqldev.model.ut; -import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.AbstractModel; -@Accessors -class OutputLines extends AbstractModel { - String[] lines; - Integer numlines; -} \ No newline at end of file +public class OutputLines extends AbstractModel { + private String[] lines; + private Integer numlines; + + @Override + public String toString() { + return new ToStringCreator(this, getStyler()) + .append("lines", lines) + .append("numlines", numlines) + .toString(); + } + + public String[] getLines() { + return this.lines; + } + + public void setLines(final String[] lines) { + this.lines = lines; + } + + public Integer getNumlines() { + return this.numlines; + } + + public void setNumlines(final Integer numlines) { + this.numlines = numlines; + } +} From e788a9a7d3d66505225cfb4dd1177d29c3cd9ad9 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 00:11:09 +0200 Subject: [PATCH 066/286] rename Counter.xtend to Counter.java --- .../utplsql/sqldev/model/runner/{Counter.xtend => Counter.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{Counter.xtend => Counter.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java From 56b3124bae20027ff987340500ec78024309678c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 00:11:32 +0200 Subject: [PATCH 067/286] convert Counter to Java --- .../utplsql/sqldev/model/runner/Counter.java | 76 +++++++++++++++---- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java index 0d496e42..de2a339a 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java @@ -13,16 +13,66 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner - -import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel - -@Accessors -class Counter extends AbstractModel { - Integer disabled - Integer success - Integer failure - Integer error - Integer warning -} \ No newline at end of file +package org.utplsql.sqldev.model.runner; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.AbstractModel; + +public class Counter extends AbstractModel { + private Integer disabled; + private Integer success; + private Integer failure; + private Integer error; + private Integer warning; + + @Override + public String toString() { + return new ToStringCreator(this, getStyler()) + .append("disabled", disabled) + .append("success", success) + .append("failure", failure) + .append("error", error) + .append("warning", warning) + .toString(); + } + + public Integer getDisabled() { + return this.disabled; + } + + public void setDisabled(final Integer disabled) { + this.disabled = disabled; + } + + public Integer getSuccess() { + return this.success; + } + + public void setSuccess(final Integer success) { + this.success = success; + } + + public Integer getFailure() { + return this.failure; + } + + public void setFailure(final Integer failure) { + this.failure = failure; + } + + public Integer getError() { + return this.error; + } + + public void setError(final Integer error) { + this.error = error; + } + + public Integer getWarning() { + return this.warning; + } + + public void setWarning(final Integer warning) { + this.warning = warning; + } +} From a35193ffea3d895418d3cee77e9aac83bb427125 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 00:18:53 +0200 Subject: [PATCH 068/286] rename Item.xtend to Item.java --- .../org/utplsql/sqldev/model/runner/{Item.xtend => Item.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{Item.xtend => Item.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java From 921dbd704c3c85de9c24469f2ab746825a1f43ae Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 00:19:18 +0200 Subject: [PATCH 069/286] convert Item to Java --- .../org/utplsql/sqldev/model/runner/Item.java | 109 +++++++++++++++--- 1 file changed, 93 insertions(+), 16 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java index 01db70a6..18804889 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java @@ -13,19 +13,96 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner - -import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel - -@Accessors -abstract class Item extends AbstractModel { - String id - String startTime - String endTime - Double executionTime - Counter counter - String errorStack - String serverOutput - String warnings -} \ No newline at end of file +package org.utplsql.sqldev.model.runner; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.AbstractModel; + +public abstract class Item extends AbstractModel { + private String id; + private String startTime; + private String endTime; + private Double executionTime; + private Counter counter; + private String errorStack; + private String serverOutput; + private String warnings; + + @Override + public String toString() { + return new ToStringCreator(this, getStyler()) + .append("id", id) + .append("startTime", startTime) + .append("endTime", endTime) + .append("executionTime", executionTime) + .append("counter", counter) + .append("errorStack", errorStack) + .append("serverOutput", serverOutput) + .append("warnings", warnings) + .toString(); + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(final String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(final String endTime) { + this.endTime = endTime; + } + + public Double getExecutionTime() { + return executionTime; + } + + public void setExecutionTime(final Double executionTime) { + this.executionTime = executionTime; + } + + public Counter getCounter() { + return counter; + } + + public void setCounter(final Counter counter) { + this.counter = counter; + } + + public String getErrorStack() { + return errorStack; + } + + public void setErrorStack(final String errorStack) { + this.errorStack = errorStack; + } + + public String getServerOutput() { + return serverOutput; + } + + public void setServerOutput(final String serverOutput) { + this.serverOutput = serverOutput; + } + + public String getWarnings() { + return warnings; + } + + public void setWarnings(final String warnings) { + this.warnings = warnings; + } +} From 483a60e0d9a0547b3fd6865f0b93f19178c95b9a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 00:23:21 +0200 Subject: [PATCH 070/286] simplify, remove unnecessary "this." prefixes --- .../sqldev/model/oddgen/GenContext.java | 24 +++++++++---------- .../sqldev/model/parser/PlsqlObject.java | 8 +++---- .../org/utplsql/sqldev/model/parser/Unit.java | 6 ++--- .../utplsql/sqldev/model/runner/Counter.java | 10 ++++---- .../utplsql/sqldev/model/ut/Annotation.java | 10 ++++---- .../utplsql/sqldev/model/ut/OutputLines.java | 4 ++-- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java index 19a8a0f1..4a0b6936 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java @@ -35,7 +35,7 @@ public class GenContext extends AbstractModel { private int indentSpaces; public Connection getConn() { - return this.conn; + return conn; } @Override @@ -61,7 +61,7 @@ public void setConn(final Connection conn) { } public String getObjectType() { - return this.objectType; + return objectType; } public void setObjectType(final String objectType) { @@ -69,7 +69,7 @@ public void setObjectType(final String objectType) { } public String getObjectName() { - return this.objectName; + return objectName; } public void setObjectName(final String objectName) { @@ -77,7 +77,7 @@ public void setObjectName(final String objectName) { } public String getTestPackagePrefix() { - return this.testPackagePrefix; + return testPackagePrefix; } public void setTestPackagePrefix(final String testPackagePrefix) { @@ -85,7 +85,7 @@ public void setTestPackagePrefix(final String testPackagePrefix) { } public String getTestPackageSuffix() { - return this.testPackageSuffix; + return testPackageSuffix; } public void setTestPackageSuffix(final String testPackageSuffix) { @@ -93,7 +93,7 @@ public void setTestPackageSuffix(final String testPackageSuffix) { } public String getTestUnitPrefix() { - return this.testUnitPrefix; + return testUnitPrefix; } public void setTestUnitPrefix(final String testUnitPrefix) { @@ -101,7 +101,7 @@ public void setTestUnitPrefix(final String testUnitPrefix) { } public String getTestUnitSuffix() { - return this.testUnitSuffix; + return testUnitSuffix; } public void setTestUnitSuffix(final String testUnitSuffix) { @@ -109,7 +109,7 @@ public void setTestUnitSuffix(final String testUnitSuffix) { } public int getNumberOfTestsPerUnit() { - return this.numberOfTestsPerUnit; + return numberOfTestsPerUnit; } public void setNumberOfTestsPerUnit(final int numberOfTestsPerUnit) { @@ -117,7 +117,7 @@ public void setNumberOfTestsPerUnit(final int numberOfTestsPerUnit) { } public boolean isGenerateComments() { - return this.generateComments; + return generateComments; } public void setGenerateComments(final boolean generateComments) { @@ -125,7 +125,7 @@ public void setGenerateComments(final boolean generateComments) { } public boolean isDisableTests() { - return this.disableTests; + return disableTests; } public void setDisableTests(final boolean disableTests) { @@ -133,7 +133,7 @@ public void setDisableTests(final boolean disableTests) { } public String getSuitePath() { - return this.suitePath; + return suitePath; } public void setSuitePath(final String suitePath) { @@ -141,7 +141,7 @@ public void setSuitePath(final String suitePath) { } public int getIndentSpaces() { - return this.indentSpaces; + return indentSpaces; } public void setIndentSpaces(final int indentSpaces) { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java index 8930b038..0d7e845c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java @@ -38,7 +38,7 @@ public String toString() { } public String getName() { - return this.name; + return name; } public void setName(final String name) { @@ -46,7 +46,7 @@ public void setName(final String name) { } public String getType() { - return this.type; + return type; } public void setType(final String type) { @@ -54,7 +54,7 @@ public void setType(final String type) { } public Integer getPosition() { - return this.position; + return position; } public void setPosition(final Integer position) { @@ -62,7 +62,7 @@ public void setPosition(final Integer position) { } public List getAnnotations() { - return this.annotations; + return annotations; } public void setAnnotations(final List annotations) { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java index 0b6a4eba..acc25318 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java @@ -33,7 +33,7 @@ public String toString() { } public String getName() { - return this.name; + return name; } public void setName(final String name) { @@ -41,7 +41,7 @@ public void setName(final String name) { } public Integer getPosition() { - return this.position; + return position; } public void setPosition(final Integer position) { @@ -49,7 +49,7 @@ public void setPosition(final Integer position) { } public Integer getPositionOfName() { - return this.positionOfName; + return positionOfName; } public void setPositionOfName(final Integer positionOfName) { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java index de2a339a..2b5d5645 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java @@ -37,7 +37,7 @@ public String toString() { } public Integer getDisabled() { - return this.disabled; + return disabled; } public void setDisabled(final Integer disabled) { @@ -45,7 +45,7 @@ public void setDisabled(final Integer disabled) { } public Integer getSuccess() { - return this.success; + return success; } public void setSuccess(final Integer success) { @@ -53,7 +53,7 @@ public void setSuccess(final Integer success) { } public Integer getFailure() { - return this.failure; + return failure; } public void setFailure(final Integer failure) { @@ -61,7 +61,7 @@ public void setFailure(final Integer failure) { } public Integer getError() { - return this.error; + return error; } public void setError(final Integer error) { @@ -69,7 +69,7 @@ public void setError(final Integer error) { } public Integer getWarning() { - return this.warning; + return warning; } public void setWarning(final Integer warning) { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java index cd11ce93..addadc6d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java @@ -37,7 +37,7 @@ public String toString() { } public String getObjectOwner() { - return this.objectOwner; + return objectOwner; } public void setObjectOwner(final String objectOwner) { @@ -45,7 +45,7 @@ public void setObjectOwner(final String objectOwner) { } public String getObjectName() { - return this.objectName; + return objectName; } public void setObjectName(final String objectName) { @@ -53,7 +53,7 @@ public void setObjectName(final String objectName) { } public String getName() { - return this.name; + return name; } public void setName(final String name) { @@ -61,7 +61,7 @@ public void setName(final String name) { } public String getText() { - return this.text; + return text; } public void setText(final String text) { @@ -69,7 +69,7 @@ public void setText(final String text) { } public String getSubobjectName() { - return this.subobjectName; + return subobjectName; } public void setSubobjectName(final String subobjectName) { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java index fc203c32..f9d6891e 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java @@ -31,7 +31,7 @@ public String toString() { } public String[] getLines() { - return this.lines; + return lines; } public void setLines(final String[] lines) { @@ -39,7 +39,7 @@ public void setLines(final String[] lines) { } public Integer getNumlines() { - return this.numlines; + return numlines; } public void setNumlines(final Integer numlines) { From a7df2d1d716784099ab9ca804cd8a07ffee180eb Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 08:50:42 +0200 Subject: [PATCH 071/286] rename STYLER to INSTANCE --- .../java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java index 4f8fb079..b538b501 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java @@ -20,7 +20,7 @@ import org.springframework.util.ClassUtils; public class UtplsqlToStringStyler extends DefaultToStringStyler { - public static final ToStringStyler STYLER = new UtplsqlToStringStyler(); + public static final ToStringStyler INSTANCE = new UtplsqlToStringStyler(); public UtplsqlToStringStyler() { super(new UtplsqlValueStyler()); From eb6d31af7a42dde3af426fe852fa4ab19abadfd6 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 08:51:17 +0200 Subject: [PATCH 072/286] remove AbstractModel and use ToStringStyler.INSTANCE --- .../utplsql/sqldev/model/AbstractModel.java | 25 ------------------- .../sqldev/model/oddgen/GenContext.java | 6 ++--- .../sqldev/model/parser/PlsqlObject.java | 6 ++--- .../org/utplsql/sqldev/model/parser/Unit.java | 6 ++--- .../model/preference/PreferenceModel.java | 2 +- .../utplsql/sqldev/model/runner/Counter.java | 6 ++--- .../sqldev/model/runner/Expectation.xtend | 3 +-- .../org/utplsql/sqldev/model/runner/Item.java | 6 ++--- .../model/runner/RealtimeReporterEvent.xtend | 4 +-- .../org/utplsql/sqldev/model/runner/Run.xtend | 3 +-- .../utplsql/sqldev/model/ut/Annotation.java | 6 ++--- .../utplsql/sqldev/model/ut/OutputLines.java | 6 ++--- 12 files changed, 25 insertions(+), 54 deletions(-) delete mode 100644 sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java b/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java deleted file mode 100644 index 86065829..00000000 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/AbstractModel.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2018 Philipp Salvisberg - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.utplsql.sqldev.model; - -import org.springframework.core.style.ToStringStyler; - -public abstract class AbstractModel { - - public ToStringStyler getStyler() { - return UtplsqlToStringStyler.STYLER; - } -} diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java index 4a0b6936..cd13c16c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java @@ -18,9 +18,9 @@ import java.sql.Connection; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.AbstractModel; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -public class GenContext extends AbstractModel { +public class GenContext { private Connection conn; private String objectType; private String objectName; @@ -40,7 +40,7 @@ public Connection getConn() { @Override public String toString() { - return new ToStringCreator(this, getStyler()) + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) .append("conn", conn) .append("objectType", objectType) .append("objectName", objectName) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java index 0d7e845c..316d1af9 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java @@ -18,10 +18,10 @@ import java.util.List; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.AbstractModel; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; import org.utplsql.sqldev.model.ut.Annotation; -public class PlsqlObject extends AbstractModel { +public class PlsqlObject { private String name; private String type; private Integer position; @@ -29,7 +29,7 @@ public class PlsqlObject extends AbstractModel { @Override public String toString() { - return new ToStringCreator(this, getStyler()) + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) .append("name", name) .append("type", type) .append("position", position) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java index acc25318..afd48346 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java @@ -16,16 +16,16 @@ package org.utplsql.sqldev.model.parser; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.AbstractModel; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -public class Unit extends AbstractModel { +public class Unit { private String name; private Integer position; private Integer positionOfName; @Override public String toString() { - return new ToStringCreator(this, getStyler()) + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) .append("name", name) .append("position", position) .append("positionOfName", positionOfName) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java index 13700348..26081163 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java @@ -70,7 +70,7 @@ public static PreferenceModel getInstance(final PropertyStorage prefs) { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.STYLER) + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) .append(KEY_USE_REALTIME_REPORTER, isUseRealtimeReporter()) .append(KEY_UNSHARED_WORKSHEET, isUnsharedWorksheet()) .append(KEY_RESET_PACKAGE, isResetPackage()) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java index 2b5d5645..8ec2c329 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java @@ -16,9 +16,9 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.AbstractModel; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -public class Counter extends AbstractModel { +public class Counter { private Integer disabled; private Integer success; private Integer failure; @@ -27,7 +27,7 @@ public class Counter extends AbstractModel { @Override public String toString() { - return new ToStringCreator(this, getStyler()) + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) .append("disabled", disabled) .append("success", success) .append("failure", failure) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.xtend index 67d7cc19..1e05f5e2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.xtend @@ -17,10 +17,9 @@ package org.utplsql.sqldev.model.runner import java.util.regex.Pattern import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel @Accessors -class Expectation extends AbstractModel { +class Expectation { String description String message String caller diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java index 18804889..b4d81f0b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java @@ -16,9 +16,9 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.AbstractModel; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -public abstract class Item extends AbstractModel { +public abstract class Item { private String id; private String startTime; private String endTime; @@ -30,7 +30,7 @@ public abstract class Item extends AbstractModel { @Override public String toString() { - return new ToStringCreator(this, getStyler()) + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) .append("id", id) .append("startTime", startTime) .append("endTime", endTime) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.xtend index 5b6ec099..97965f6c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.xtend @@ -15,7 +15,5 @@ */ package org.utplsql.sqldev.model.runner -import org.utplsql.sqldev.model.AbstractModel - -abstract class RealtimeReporterEvent extends AbstractModel { +abstract class RealtimeReporterEvent { } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.xtend index 37b11926..b3d30e4f 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.xtend +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.xtend @@ -18,10 +18,9 @@ package org.utplsql.sqldev.model.runner import java.util.LinkedHashMap import java.util.List import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.model.AbstractModel @Accessors -class Run extends AbstractModel { +class Run { String reporterId String connectionName List pathList diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java index addadc6d..cdeff854 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java @@ -16,9 +16,9 @@ package org.utplsql.sqldev.model.ut; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.AbstractModel; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -public class Annotation extends AbstractModel { +public class Annotation { private String objectOwner; private String objectName; private String name; @@ -27,7 +27,7 @@ public class Annotation extends AbstractModel { @Override public String toString() { - return new ToStringCreator(this, getStyler()) + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) .append("objectOwner", objectOwner) .append("objectName", objectName) .append("name", name) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java index f9d6891e..01efa471 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java @@ -16,15 +16,15 @@ package org.utplsql.sqldev.model.ut; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.AbstractModel; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -public class OutputLines extends AbstractModel { +public class OutputLines { private String[] lines; private Integer numlines; @Override public String toString() { - return new ToStringCreator(this, getStyler()) + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) .append("lines", lines) .append("numlines", numlines) .toString(); From 967440434bde16202aedcf8c40bd78e719994c17 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:04:31 +0200 Subject: [PATCH 073/286] rename Expectation.xtend to Expectation.java --- .../sqldev/model/runner/{Expectation.xtend => Expectation.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{Expectation.xtend => Expectation.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java From 1cf53d54fadfbdfd79b6a7b449d0cd0db98a7fef Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:17:33 +0200 Subject: [PATCH 074/286] convert Expectation to Java --- .../sqldev/model/runner/Expectation.java | 120 +++++++++++++----- 1 file changed, 86 insertions(+), 34 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java index 1e05f5e2..041a247d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java @@ -13,37 +13,89 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner - -import java.util.regex.Pattern -import org.eclipse.xtend.lib.annotations.Accessors - -@Accessors -class Expectation { - String description - String message - String caller - - def getFailureText() { - return ''' - «message.trim» - «caller?.trim» - '''.toString.trim - } - - def getShortFailureText() { - return '''«IF description !== null»«description» (line «callerLine»)«ELSE»Line «callerLine»«ENDIF»'''.toString - } - - def getCallerLine() { - var Integer line = null - if (caller !== null) { - val p = Pattern.compile("(?i)\"[^\\\"]+\",\\s+line\\s*([0-9]+)") - val m = p.matcher(caller) - if (m.find) { - line = Integer.valueOf(m.group(1)) - } - } - return line - } -} \ No newline at end of file +package org.utplsql.sqldev.model.runner; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.eclipse.xtend2.lib.StringConcatenation; +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; + +public class Expectation { + private String description; + private String message; + private String caller; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("description", description) + .append("message", message) + .append("caller", caller) + .append("failureText", getFailureText()) + .append("shortFailureText", getShortFailureText()) + .append("callerLine", getCallerLine()) + .toString(); + } + + public String getFailureText() { + final StringBuilder sb = new StringBuilder(); + sb.append(message.trim()); + if (caller != null) { + sb.append('\n'); + sb.append(caller.trim()); + } + return sb.toString(); + } + + public String getShortFailureText() { + final StringConcatenation sb = new StringConcatenation(); + if (description != null) { + sb.append(description); + sb.append(" (line "); + sb.append(getCallerLine()); + sb.append(")"); + } else { + sb.append("Line "); + sb.append(getCallerLine()); + } + return sb.toString(); + } + + public Integer getCallerLine() { + Integer line = null; + if (caller != null) { + final Pattern p = Pattern.compile("(?i)\"[^\\\"]+\",\\s+line\\s*([0-9]+)"); + final Matcher m = p.matcher(caller); + if (m.find()) { + line = Integer.valueOf(m.group(1)); + } + } + return line; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public String getMessage() { + return message; + } + + public void setMessage(final String message) { + this.message = message; + } + + public String getCaller() { + return caller; + } + + public void setCaller(final String caller) { + this.caller = caller; + } +} From 845bcddd8f50a34e1b3899f04558b15814845801 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:22:46 +0200 Subject: [PATCH 075/286] rename PostEvent.xtend to PostEvent.java --- .../sqldev/model/runner/{PostEvent.xtend => PostEvent.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{PostEvent.xtend => PostEvent.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java From 98298fdd3a6c433c155249ed3bf34c630fd50b9c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:23:02 +0200 Subject: [PATCH 076/286] convert PostEvent to Java --- .../sqldev/model/runner/PostEvent.java | 89 +++++++++++++++---- 1 file changed, 71 insertions(+), 18 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java index 67d9c61c..1abcaadc 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java @@ -13,21 +13,74 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner - -import org.eclipse.xtend.lib.annotations.Accessors - -@Accessors -abstract class PostEvent extends RealtimeReporterEvent { - String startTime - String endTime - Double executionTime - Counter counter - String errorStack - String serverOutput - String warnings - - new() { - counter = new Counter - } -} \ No newline at end of file +package org.utplsql.sqldev.model.runner; + +public abstract class PostEvent extends RealtimeReporterEvent { + private String startTime; + private String endTime; + private Double executionTime; + private Counter counter; + private String errorStack; + private String serverOutput; + private String warnings; + + public PostEvent() { + counter = new Counter(); + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(final String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(final String endTime) { + this.endTime = endTime; + } + + public Double getExecutionTime() { + return executionTime; + } + + public void setExecutionTime(final Double executionTime) { + this.executionTime = executionTime; + } + + public Counter getCounter() { + return counter; + } + + public void setCounter(final Counter counter) { + this.counter = counter; + } + + public String getErrorStack() { + return errorStack; + } + + public void setErrorStack(final String errorStack) { + this.errorStack = errorStack; + } + + public String getServerOutput() { + return serverOutput; + } + + public void setServerOutput(final String serverOutput) { + this.serverOutput = serverOutput; + } + + public String getWarnings() { + return warnings; + } + + public void setWarnings(final String warnings) { + this.warnings = warnings; + } +} From ada80ad66371649b9e3835bc771aea2223015ac8 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:24:53 +0200 Subject: [PATCH 077/286] rename PostRunEvent.xtend to PostRunEvent.java --- .../sqldev/model/runner/{PostRunEvent.xtend => PostRunEvent.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{PostRunEvent.xtend => PostRunEvent.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java From 514d05e3ed9cdbc84c9f0e493055953be968aae4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:25:13 +0200 Subject: [PATCH 078/286] convert PostRunEvent to Java --- .../java/org/utplsql/sqldev/model/runner/PostRunEvent.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java index ee5edc30..a6184738 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java @@ -13,10 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner +package org.utplsql.sqldev.model.runner; -import org.eclipse.xtend.lib.annotations.Accessors - -@Accessors -class PostRunEvent extends PostEvent { +public class PostRunEvent extends PostEvent { } From 3e9873f7094af792af3a79648275d8f09ca9b382 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:31:06 +0200 Subject: [PATCH 079/286] rename PostSuiteEvent.xtend to PostSuiteEvent.java --- .../model/runner/{PostSuiteEvent.xtend => PostSuiteEvent.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{PostSuiteEvent.xtend => PostSuiteEvent.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java From e6e73015de32b23641424259e619d3d6791935aa Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:31:26 +0200 Subject: [PATCH 080/286] convert PostSuiteEvent to Java --- .../sqldev/model/runner/PostSuiteEvent.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java index 10a674ed..8d561fde 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java @@ -13,11 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner +package org.utplsql.sqldev.model.runner; -import org.eclipse.xtend.lib.annotations.Accessors +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -@Accessors -class PostSuiteEvent extends PostEvent { - String id -} \ No newline at end of file +public class PostSuiteEvent extends PostEvent { + private String id; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("id", id) + .toString(); + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } +} From 817dd1d3a176f7a6a99b9febb9c513a2c0f92f34 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:33:31 +0200 Subject: [PATCH 081/286] add toString() method --- .../utplsql/sqldev/model/runner/PostEvent.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java index 1abcaadc..4055a1ac 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java @@ -15,6 +15,9 @@ */ package org.utplsql.sqldev.model.runner; +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; + public abstract class PostEvent extends RealtimeReporterEvent { private String startTime; private String endTime; @@ -24,6 +27,19 @@ public abstract class PostEvent extends RealtimeReporterEvent { private String serverOutput; private String warnings; + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("startTime", startTime) + .append("endTime", endTime) + .append("executionTime", executionTime) + .append("counter", counter) + .append("errorStack", errorStack) + .append("serverOutput", serverOutput) + .append("warnings", warnings) + .toString(); + } + public PostEvent() { counter = new Counter(); } From 99c58e497950b12b3f25e0a98e060e9593a7eb81 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:42:55 +0200 Subject: [PATCH 082/286] rename PostTestEvent.xtend to PostTestEvent.java --- .../model/runner/{PostTestEvent.xtend => PostTestEvent.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{PostTestEvent.xtend => PostTestEvent.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java From 5d0386df1436d6182fd6ba9fb9b24bbb5aca1770 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:43:18 +0200 Subject: [PATCH 083/286] convert PostTestEvent to Java --- .../sqldev/model/runner/PostTestEvent.java | 77 +++++++++++++++---- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java index bd28ab6c..6b251ba2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java @@ -13,20 +13,63 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner - -import java.util.ArrayList -import java.util.List -import org.eclipse.xtend.lib.annotations.Accessors - -@Accessors -class PostTestEvent extends PostEvent { - String id - Integer testNumber - Integer totalNumberOfTests - List failedExpectations - - new() { - failedExpectations = new ArrayList - } -} \ No newline at end of file +package org.utplsql.sqldev.model.runner; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; + +public class PostTestEvent extends PostEvent { + private String id; + private Integer testNumber; + private Integer totalNumberOfTests; + private List failedExpectations; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("id", id) + .append("testNumber", testNumber) + .append("totalNumberOfTests", totalNumberOfTests) + .append("failedExpectations", failedExpectations) + .toString(); + } + + public PostTestEvent() { + failedExpectations = new ArrayList<>(); + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + + public Integer getTestNumber() { + return testNumber; + } + + public void setTestNumber(final Integer testNumber) { + this.testNumber = testNumber; + } + + public Integer getTotalNumberOfTests() { + return totalNumberOfTests; + } + + public void setTotalNumberOfTests(final Integer totalNumberOfTests) { + this.totalNumberOfTests = totalNumberOfTests; + } + + public List getFailedExpectations() { + return failedExpectations; + } + + public void setFailedExpectations(final List failedExpectations) { + this.failedExpectations = failedExpectations; + } +} From 282309e3f27f7f0ebe9b057a0310adee0affa114 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:47:50 +0200 Subject: [PATCH 084/286] rename PreRunEvent.xtend to PreRunEvent.java --- .../sqldev/model/runner/{PreRunEvent.xtend => PreRunEvent.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{PreRunEvent.xtend => PreRunEvent.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java From 5ff89db33f0e759351398e6042fcbe17ae9a7c00 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:48:10 +0200 Subject: [PATCH 085/286] convert PreRunEvent to Java --- .../sqldev/model/runner/PreRunEvent.java | 49 ++++++++++++++----- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java index 5750cd8e..db68f264 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java @@ -13,18 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner +package org.utplsql.sqldev.model.runner; -import java.util.ArrayList -import java.util.List -import org.eclipse.xtend.lib.annotations.Accessors +import java.util.ArrayList; +import java.util.List; -@Accessors -class PreRunEvent extends RealtimeReporterEvent { - List items - Integer totalNumberOfTests +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; - new() { - items = new ArrayList - } -} \ No newline at end of file +public class PreRunEvent extends RealtimeReporterEvent { + private List items; + private Integer totalNumberOfTests; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("items", items) + .append("totalNumberOfTests", totalNumberOfTests) + .toString(); + } + + public PreRunEvent() { + items = new ArrayList<>(); + } + + public List getItems() { + return items; + } + + public void setItems(final List items) { + this.items = items; + } + + public Integer getTotalNumberOfTests() { + return totalNumberOfTests; + } + + public void setTotalNumberOfTests(final Integer totalNumberOfTests) { + this.totalNumberOfTests = totalNumberOfTests; + } +} From 00cd3c0ca7e04a7752ebfc274ca1397887ff0a24 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:50:47 +0200 Subject: [PATCH 086/286] rename PreSuiteEvent.xtend to PreSuiteEvent.java --- .../model/runner/{PreSuiteEvent.xtend => PreSuiteEvent.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{PreSuiteEvent.xtend => PreSuiteEvent.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java From 9677f9c669b598262369017e553c5c3967af2c03 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:51:04 +0200 Subject: [PATCH 087/286] convert PreSuiteEvent to Java --- .../sqldev/model/runner/PreSuiteEvent.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java index 0304f071..c1abf6fb 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java @@ -13,11 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner +package org.utplsql.sqldev.model.runner; -import org.eclipse.xtend.lib.annotations.Accessors +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -@Accessors -class PreSuiteEvent extends RealtimeReporterEvent { - String id -} \ No newline at end of file +public class PreSuiteEvent extends RealtimeReporterEvent { + private String id; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("id", id) + .toString(); + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } +} From ffa0b9bbff1391c6915c220ca269cf4f9fe5176c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:53:59 +0200 Subject: [PATCH 088/286] rename PreTestEvent.xtend to PreTestEvent.java --- .../sqldev/model/runner/{PreTestEvent.xtend => PreTestEvent.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{PreTestEvent.xtend => PreTestEvent.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java From e5540bb2eea21df62bc0ae363d1dbbc98c584a44 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:54:18 +0200 Subject: [PATCH 089/286] convert PreTestEvent to Java --- .../sqldev/model/runner/PreTestEvent.java | 49 ++++++++++++++++--- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java index a54e3c5e..9d4643c9 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java @@ -13,13 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner +package org.utplsql.sqldev.model.runner; -import org.eclipse.xtend.lib.annotations.Accessors +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; -@Accessors -class PreTestEvent extends RealtimeReporterEvent { - String id - Integer testNumber - Integer totalNumberOfTests -} \ No newline at end of file +public class PreTestEvent extends RealtimeReporterEvent { + private String id; + private Integer testNumber; + private Integer totalNumberOfTests; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("id", id) + .append("testNumber", testNumber) + .append("totalNumberOfTests", totalNumberOfTests) + .toString(); + } + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + + public Integer getTestNumber() { + return testNumber; + } + + public void setTestNumber(final Integer testNumber) { + this.testNumber = testNumber; + } + + public Integer getTotalNumberOfTests() { + return totalNumberOfTests; + } + + public void setTotalNumberOfTests(final Integer totalNumberOfTests) { + this.totalNumberOfTests = totalNumberOfTests; + } +} From 72b284052276f28c55c511c6d036804a1dea3b30 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:56:28 +0200 Subject: [PATCH 090/286] rename RealtimeReporterEvent.xtend to RealtimeReporterEvent.java --- .../{RealtimeReporterEvent.xtend => RealtimeReporterEvent.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{RealtimeReporterEvent.xtend => RealtimeReporterEvent.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.java From 295b9a79f4030a67279558e3f7c246f87c063d10 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 09:56:46 +0200 Subject: [PATCH 091/286] convert PreTestEvent to Java --- .../utplsql/sqldev/model/runner/RealtimeReporterEvent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.java index 97965f6c..3f7d7d1d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/RealtimeReporterEvent.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner +package org.utplsql.sqldev.model.runner; -abstract class RealtimeReporterEvent { +public abstract class RealtimeReporterEvent { } From 19efd63742dbe4700a13576b1a71c78ec608ac91 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 10:01:59 +0200 Subject: [PATCH 092/286] rename Run.xtend to Run.java --- .../java/org/utplsql/sqldev/model/runner/{Run.xtend => Run.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{Run.xtend => Run.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java From 67013ea3fe4c0f001066bba6755c1d29564780ae Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 10:19:09 +0200 Subject: [PATCH 093/286] convert Run to Java --- .../org/utplsql/sqldev/model/runner/Run.java | 279 ++++++++++++++---- 1 file changed, 216 insertions(+), 63 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java index b3d30e4f..7b733322 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java @@ -13,67 +13,220 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner - -import java.util.LinkedHashMap -import java.util.List -import org.eclipse.xtend.lib.annotations.Accessors - -@Accessors -class Run { - String reporterId - String connectionName - List pathList - Integer currentTestNumber - Test currentTest - Integer totalNumberOfTests - String startTime - String endTime - Double executionTime - Counter counter - Integer infoCount - String errorStack - String serverOutput - LinkedHashMap tests - String status - Long start - - new(String reporterId, String connectionName, List pathList) { - this.reporterId = reporterId - this.connectionName = connectionName - this.pathList = pathList - this.counter = new Counter - this.tests = new LinkedHashMap - } - - def void setStartTime(String startTime) { - this.startTime = startTime - start = System.currentTimeMillis - } - - def getName() { - val time = startTime.substring(11,19) - val conn = connectionName?.substring(15) - return '''«time» («conn»)''' - } - - def void put(List items) { - for (item : items) { - if (item instanceof Test) { - this.tests.put(item.id, item) - } - if (item instanceof Suite) { - item.items.put - } - } - } - - def getTest(String id) { - return tests.get(id) - } - - def getTotalNumberOfCompletedTests() { - return counter.disabled + counter.success + counter.failure + counter.error - } - +package org.utplsql.sqldev.model.runner; + +import java.util.LinkedHashMap; +import java.util.List; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; + +public class Run { + private String reporterId; + private String connectionName; + private List pathList; + private Integer currentTestNumber; + private Test currentTest; + private Integer totalNumberOfTests; + private String startTime; + private String endTime; + private Double executionTime; + private Counter counter; + private Integer infoCount; + private String errorStack; + private String serverOutput; + private LinkedHashMap tests; + private String status; + private Long start; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("reporterId", reporterId) + .append("connectionName", connectionName) + .append("pathList", pathList) + .append("currentTestNumber", currentTestNumber) + .append("currentTest", currentTest) + .append("totalNumberOfTests", totalNumberOfTests) + .append("startTime", startTime) + .append("endTime", endTime) + .append("executionTime", executionTime) + .append("counter", counter) + .append("infoCount", infoCount) + .append("errorStack", errorStack) + .append("serverOutput", serverOutput) + .append("tests", tests) + .append("status", status) + .append("start", start) + .append("endTime", endTime) + .append("totalNumberOfCompletedTests", getTotalNumberOfCompletedTests()) + .toString(); + } + + public Run(final String reporterId, final String connectionName, final List pathList) { + this.reporterId = reporterId; + this.connectionName = connectionName; + this.pathList = pathList; + counter = new Counter(); + tests = new LinkedHashMap<>(); + } + + public void setStartTime(final String startTime) { + this.startTime = startTime; + start = Long.valueOf(System.currentTimeMillis()); + } + + public String getName() { + final String time = startTime.substring(11, 19); + final String conn = connectionName != null ? connectionName.substring(15) : null; + final StringBuilder sb = new StringBuilder(); + sb.append(time); + sb.append(" ("); + sb.append(conn); + sb.append(")"); + return sb.toString(); + } + + public void put(final List items) { + for (final Item item : items) { + if (item instanceof Test) { + tests.put(((Test) item).getId(), (Test) item); + } + if (item instanceof Suite) { + put(((Suite) item).getItems()); + } + } + } + + public Test getTest(final String id) { + return tests.get(id); + } + + public int getTotalNumberOfCompletedTests() { + return counter.getDisabled() + counter.getSuccess() + counter.getFailure() + counter.getError(); + } + + public String getReporterId() { + return reporterId; + } + + public void setReporterId(final String reporterId) { + this.reporterId = reporterId; + } + + public String getConnectionName() { + return connectionName; + } + + public void setConnectionName(final String connectionName) { + this.connectionName = connectionName; + } + + public List getPathList() { + return pathList; + } + + public void setPathList(final List pathList) { + this.pathList = pathList; + } + + public Integer getCurrentTestNumber() { + return currentTestNumber; + } + + public void setCurrentTestNumber(final Integer currentTestNumber) { + this.currentTestNumber = currentTestNumber; + } + + public Test getCurrentTest() { + return currentTest; + } + + public void setCurrentTest(final Test currentTest) { + this.currentTest = currentTest; + } + + public Integer getTotalNumberOfTests() { + return totalNumberOfTests; + } + + public void setTotalNumberOfTests(final Integer totalNumberOfTests) { + this.totalNumberOfTests = totalNumberOfTests; + } + + public String getStartTime() { + return startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(final String endTime) { + this.endTime = endTime; + } + + public Double getExecutionTime() { + return executionTime; + } + + public void setExecutionTime(final Double executionTime) { + this.executionTime = executionTime; + } + + public Counter getCounter() { + return counter; + } + + public void setCounter(final Counter counter) { + this.counter = counter; + } + + public Integer getInfoCount() { + return infoCount; + } + + public void setInfoCount(final Integer infoCount) { + this.infoCount = infoCount; + } + + public String getErrorStack() { + return errorStack; + } + + public void setErrorStack(final String errorStack) { + this.errorStack = errorStack; + } + + public String getServerOutput() { + return serverOutput; + } + + public void setServerOutput(final String serverOutput) { + this.serverOutput = serverOutput; + } + + public LinkedHashMap getTests() { + return tests; + } + + public void setTests(final LinkedHashMap tests) { + this.tests = tests; + } + + public String getStatus() { + return status; + } + + public void setStatus(final String status) { + this.status = status; + } + + public Long getStart() { + return start; + } + + public void setStart(final Long start) { + this.start = start; + } } From d22d0c6ceb9113cc0d8fba66b89b6d71391e4707 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 10:26:00 +0200 Subject: [PATCH 094/286] rename Suite.xtend to Suite.java --- .../org/utplsql/sqldev/model/runner/{Suite.xtend => Suite.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{Suite.xtend => Suite.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java From 1b665fba60a8cc94cd8e63552010a97240a47fed Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 10:26:17 +0200 Subject: [PATCH 095/286] convert Suite to Java --- .../utplsql/sqldev/model/runner/Suite.java | 66 ++++++++++++++----- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java index d75efadc..0ebbdbff 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java @@ -13,19 +13,53 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner - -import java.util.ArrayList -import java.util.List -import org.eclipse.xtend.lib.annotations.Accessors - -@Accessors -class Suite extends Item { - String name - String description - List items - - new() { - items = new ArrayList - } -} \ No newline at end of file +package org.utplsql.sqldev.model.runner; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; + +public class Suite extends Item { + private String name; + private String description; + private List items; + + public Suite() { + items = new ArrayList<>(); + } + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + .append("name", name) + .append("description", description) + .append("items", items) + .toString(); + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public List getItems() { + return items; + } + + public void setItems(final List items) { + this.items = items; + } +} From 8afb3ed69698747d16c64db5fbb14d33fdfe1336 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 11:44:13 +0200 Subject: [PATCH 096/286] rename Test.xtend to Test.java --- .../org/utplsql/sqldev/model/runner/{Test.xtend => Test.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/runner/{Test.xtend => Test.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java From d8d163a02e0bcea8db0ebed0eb7f69430e916ea9 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 12:10:41 +0200 Subject: [PATCH 097/286] convert Test to Java --- .../org/utplsql/sqldev/model/runner/Test.java | 214 +++++++++++++----- 1 file changed, 157 insertions(+), 57 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java index 30070e85..2255b5ec 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java @@ -13,60 +13,160 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.model.runner - -import java.util.List -import javax.swing.Icon -import org.eclipse.xtend.lib.annotations.Accessors -import org.utplsql.sqldev.resources.UtplsqlResources - -@Accessors -class Test extends Item { - String executableType - String ownerName - String objectName - String procedureName - Boolean disabled - String name - String description - Integer testNumber - List failedExpectations - - def getStatusIcon() { - var Icon icon = null - if (startTime !== null && endTime === null ) { - icon = UtplsqlResources.getIcon("PROGRESS_ICON") - } else { - if (counter !== null) { - if (counter.success > 0) { - icon = UtplsqlResources.getIcon("SUCCESS_ICON") - } else if (counter.error > 0) { - icon = UtplsqlResources.getIcon("ERROR_ICON") - } else if (counter.failure > 0) { - icon = UtplsqlResources.getIcon("FAILURE_ICON") - } else if (counter.disabled > 0) { - icon = UtplsqlResources.getIcon("DISABLED_ICON") - } - } - } - return icon - } - - def getWarningIcon() { - var Icon icon = null - if (counter !== null) { - if (counter.warning > 0) { - icon = UtplsqlResources.getIcon("WARNING_ICON") - } - } - return icon - } - - def getInfoIcon() { - var Icon icon = null - if (serverOutput !== null && serverOutput.length > 0) { - icon = UtplsqlResources.getIcon("INFO_ICON") - } - return icon - } -} \ No newline at end of file +package org.utplsql.sqldev.model.runner; + +import java.util.List; + +import javax.swing.Icon; + +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.resources.UtplsqlResources; + +public class Test extends Item { + private String executableType; + private String ownerName; + private String objectName; + private String procedureName; + private Boolean disabled; + private String name; + private String description; + private Integer testNumber; + private List failedExpectations; + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + // ancestor + .append("id", getId()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("executionTime", getExecutionTime()) + .append("counter", getCounter()) + .append("errorStack", getErrorStack()) + .append("serverOutput", getServerOutput()) + .append("warnings", getWarnings()) + // local + .append("executableType", executableType) + .append("ownerName", ownerName) + .append("objectName", objectName) + .append("procedureName", procedureName) + .append("disabled", disabled) + .append("name", name) + .append("description", description) + .append("testNumber", testNumber) + .append("failedExpectations", failedExpectations) + .append("statusIcon", getStatusIcon()) + .append("warningIcon", getWarningIcon()) + .append("infoIcon", getInfoIcon()) + .toString(); + } + + public Icon getStatusIcon() { + Icon icon = null; + if (getStartTime() != null && getEndTime() == null) { + icon = UtplsqlResources.getIcon("PROGRESS_ICON"); + } else { + if (getCounter() != null) { + if (getCounter().getSuccess() > 0) { + icon = UtplsqlResources.getIcon("SUCCESS_ICON"); + } else if (getCounter().getError() > 0) { + icon = UtplsqlResources.getIcon("ERROR_ICON"); + } else if (getCounter().getFailure() > 0) { + icon = UtplsqlResources.getIcon("FAILURE_ICON"); + } else if (getCounter().getDisabled() > 0) { + icon = UtplsqlResources.getIcon("DISABLED_ICON"); + } + } + } + return icon; + } + + public Icon getWarningIcon() { + Icon icon = null; + if (getCounter() != null && getCounter().getWarning() > 0) { + icon = UtplsqlResources.getIcon("WARNING_ICON"); + } + return icon; + } + + public Icon getInfoIcon() { + Icon icon = null; + if (getServerOutput() != null && getServerOutput().length() > 0) { + icon = UtplsqlResources.getIcon("INFO_ICON"); + } + return icon; + } + + public String getExecutableType() { + return executableType; + } + + public void setExecutableType(final String executableType) { + this.executableType = executableType; + } + + public String getOwnerName() { + return ownerName; + } + + public void setOwnerName(final String ownerName) { + this.ownerName = ownerName; + } + + public String getObjectName() { + return objectName; + } + + public void setObjectName(final String objectName) { + this.objectName = objectName; + } + + public String getProcedureName() { + return procedureName; + } + + public void setProcedureName(final String procedureName) { + this.procedureName = procedureName; + } + + public Boolean getDisabled() { + return disabled; + } + + public void setDisabled(final Boolean disabled) { + this.disabled = disabled; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public Integer getTestNumber() { + return testNumber; + } + + public void setTestNumber(final Integer testNumber) { + this.testNumber = testNumber; + } + + public List getFailedExpectations() { + return failedExpectations; + } + + public void setFailedExpectations(final List failedExpectations) { + this.failedExpectations = failedExpectations; + } +} From 824d1faf00fbd8377c147c3139a1901c352f0deb Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 12:23:46 +0200 Subject: [PATCH 098/286] add properties of ancestor in toString() method --- .../sqldev/model/runner/PostRunEvent.java | 17 +++++++++++++++++ .../sqldev/model/runner/PostSuiteEvent.java | 9 +++++++++ .../sqldev/model/runner/PostTestEvent.java | 9 +++++++++ .../org/utplsql/sqldev/model/runner/Suite.java | 10 ++++++++++ 4 files changed, 45 insertions(+) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java index a6184738..1e4f43c6 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java @@ -15,5 +15,22 @@ */ package org.utplsql.sqldev.model.runner; +import org.springframework.core.style.ToStringCreator; +import org.utplsql.sqldev.model.UtplsqlToStringStyler; + public class PostRunEvent extends PostEvent { + + @Override + public String toString() { + return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + // ancestor + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("executionTime", getExecutionTime()) + .append("counter", getCounter()) + .append("errorStack", getErrorStack()) + .append("serverOutput", getServerOutput()) + .append("warnings", getWarnings()) + .toString(); + } } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java index 8d561fde..9d757391 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java @@ -24,6 +24,15 @@ public class PostSuiteEvent extends PostEvent { @Override public String toString() { return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + // ancestor + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("executionTime", getExecutionTime()) + .append("counter", getCounter()) + .append("errorStack", getErrorStack()) + .append("serverOutput", getServerOutput()) + .append("warnings", getWarnings()) + // local .append("id", id) .toString(); } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java index 6b251ba2..84c3c2ff 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java @@ -30,6 +30,15 @@ public class PostTestEvent extends PostEvent { @Override public String toString() { return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + // ancestor + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("executionTime", getExecutionTime()) + .append("counter", getCounter()) + .append("errorStack", getErrorStack()) + .append("serverOutput", getServerOutput()) + .append("warnings", getWarnings()) + // local .append("id", id) .append("testNumber", testNumber) .append("totalNumberOfTests", totalNumberOfTests) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java index 0ebbdbff..e9ac19b0 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java @@ -33,6 +33,16 @@ public Suite() { @Override public String toString() { return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + // ancestor + .append("id", getId()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("executionTime", getExecutionTime()) + .append("counter", getCounter()) + .append("errorStack", getErrorStack()) + .append("serverOutput", getServerOutput()) + .append("warnings", getWarnings()) + // local .append("name", name) .append("description", description) .append("items", items) From 4b5eb7fe5eb643020589222fd3313f5c7132c43f Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 12:34:40 +0200 Subject: [PATCH 099/286] rename RunGenerator.xtend to RunGenerator.java --- .../sqldev/oddgen/{RunGenerator.xtend => RunGenerator.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/oddgen/{RunGenerator.xtend => RunGenerator.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.xtend b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java From cd989615755a471ee9e837091a3c62b1bd0cabf1 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 13:52:59 +0200 Subject: [PATCH 100/286] add getCSV variant passing indent as String --- .../java/org/utplsql/sqldev/model/StringTools.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java index 8951a3d2..5d47beed 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java @@ -23,10 +23,9 @@ public class StringTools { private StringTools() { super(); } - - public static String getCSV(List list, int indentSpaces) { + + public static String getCSV(List list, String indent) { final StringBuilder sb = new StringBuilder(); - final String indent = String.join("", Collections.nCopies(indentSpaces, " ")); for (final String item : list) { if (sb.length() > 0) { sb.append(",\n"); @@ -40,6 +39,11 @@ public static String getCSV(List list, int indentSpaces) { return sb.toString(); } + public static String getCSV(List list, int indentSpaces) { + final String indent = String.join("", Collections.nCopies(indentSpaces, " ")); + return getCSV(list, indent); + } + public static String getSimpleCSV(List list) { final StringBuilder sb = new StringBuilder(); for (final String item : list) { @@ -50,4 +54,5 @@ public static String getSimpleCSV(List list) { } return sb.toString(); } + } From 1689fa1c3e91c8af6977f50b70c0ea13d3365933 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 13:53:29 +0200 Subject: [PATCH 101/286] convert RunGenerator to Java --- .../utplsql/sqldev/oddgen/RunGenerator.java | 355 ++++++++++-------- 1 file changed, 192 insertions(+), 163 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java index b321b77f..b6625054 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java @@ -13,167 +13,196 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.oddgen - -import java.sql.Connection -import java.util.ArrayList -import java.util.HashMap -import java.util.HashSet -import java.util.LinkedHashMap -import java.util.List -import oracle.ide.config.Preferences -import org.oddgen.sqldev.generators.OddgenGenerator2 -import org.oddgen.sqldev.generators.model.Node -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.model.preference.PreferenceModel -import org.utplsql.sqldev.resources.UtplsqlResources - -class RunGenerator implements OddgenGenerator2 { - - public static val YES = "Yes" - public static val NO = "No" - - public static var RESET_PACKAGE = UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL") - public static var CLEAR_SCREEN = UtplsqlResources.getString("PREF_CLEAR_SCREEN_LABEL") - public static var INDENT_SPACES = UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL") - - // oddgen node cache - var List runnables = null; - - override isSupported(Connection conn) { - var ret = false - if (conn !== null) { - if (conn.metaData.databaseProductName.startsWith("Oracle")) { - if (conn.metaData.databaseMajorVersion == 11) { - if (conn.metaData.databaseMinorVersion >= 2) { - ret = true - } - } else if (conn.metaData.databaseMajorVersion > 11) { - ret = true - } - } - } - return ret - } - - override getName(Connection conn) { - return "Run test" - } - - override getDescription(Connection conn) { - return "Runs utPLSQL test packages in the current user." - } - - override getFolders(Connection conn) { - val preferences = PreferenceModel.getInstance(Preferences.preferences) - val folders = new ArrayList - for (f : preferences.rootFolderInOddgenView.split(",").filter[!it.empty]) { - folders.add(f.trim) - } - return folders - } - - override getHelp(Connection conn) { - return "

not yet available

" - } - - override getNodes(Connection conn, String parentNodeId) { - // oddgen asks for children for each parent node, regardless of load strategy (eager/lazy) - // oddgen does not know about the load strategy, hence caching is the responsibility of the generator - if (runnables === null) { - val preferences = PreferenceModel.getInstance(Preferences.preferences) - val params = new LinkedHashMap() - params.put(RESET_PACKAGE, if (preferences.resetPackage) {YES} else {NO}) - params.put(CLEAR_SCREEN, if (preferences.clearScreen) {YES} else {NO}) - params.put(INDENT_SPACES, String.valueOf(preferences.indentSpaces)) - val UtplsqlDao dao = new UtplsqlDao(conn) - // load node tree eagerly (all nodes in one go) - runnables = dao.runnables - for (node : runnables) { - node.params = params - } - } - return runnables - } - - override getLov(Connection conn, LinkedHashMap params, List nodes) { - val lov = new HashMap>() - lov.put(RESET_PACKAGE, #[YES, NO]) - lov.put(CLEAR_SCREEN, #[YES, NO]) - lov.put(INDENT_SPACES, #["1", "2", "3", "4", "5", "6", "7", "8"]) - return lov - } - - override getParamStates(Connection conn, LinkedHashMap params, List nodes) { - return new HashMap - } - - private def getPath(Node node, Connection conn) { - if (node.id == "SUITE" || node.id == "SUITEPATH") { - return conn.metaData.userName - } else { - return node.id - } - } - - private def replaceTabsWithSpaces(CharSequence input, int indentSpaces) { - val spaces = String.format("%1$"+indentSpaces+"s", "") - return input.toString.replace("\t", spaces) - } - - def dedup(List nodes) { - val set = new HashSet - for (node : nodes) { - set.add(node.id) - } - val ret = new ArrayList - for (node : nodes) { - if (!set.contains(node.parentId)) { - ret.add(node) - } - } - return ret - } - - override generateProlog(Connection conn, List nodes) { - val dedupNodes = nodes.dedup - val params = dedupNodes.get(0).params - val ret = ''' - «IF params.get(RESET_PACKAGE) == YES» - EXECUTE dbms_session.reset_package; - «ENDIF» - SET SERVEROUTPUT ON SIZE UNLIMITED - «IF params.get(CLEAR_SCREEN) == YES» - CLEAR SCREEN - «ENDIF» - «IF dedupNodes.size == 1» - EXECUTE ut.run('«dedupNodes.get(0).getPath(conn)»'); - «ELSE» - BEGIN - ut.run( - ut_varchar2_list( - «FOR node : dedupNodes SEPARATOR ","» - '«node.getPath(conn)»' - «ENDFOR» - ) - ); - END; - / - «ENDIF» - ''' - return ret.replaceTabsWithSpaces(Integer.valueOf(params.get(INDENT_SPACES))) - } - - override generateSeparator(Connection conn) { - return "" - } - - override generateEpilog(Connection conn, List nodes) { - return "" - } - - override generate(Connection conn, Node node) { - return "" - } - +package org.utplsql.sqldev.oddgen; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.logging.Logger; +import java.util.stream.Collectors; + +import org.oddgen.sqldev.generators.OddgenGenerator2; +import org.oddgen.sqldev.generators.model.Node; +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.StringTools; +import org.utplsql.sqldev.model.preference.PreferenceModel; +import org.utplsql.sqldev.resources.UtplsqlResources; + +import oracle.ide.config.Preferences; + +public class RunGenerator implements OddgenGenerator2 { + private static final Logger logger = Logger.getLogger(RunGenerator.class.getName()); + + public static final String YES = "Yes"; + public static final String NO = "No"; + public static final String RESET_PACKAGE = UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL"); + public static final String CLEAR_SCREEN = UtplsqlResources.getString("PREF_CLEAR_SCREEN_LABEL"); + public static final String INDENT_SPACES = UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL"); + + // oddgen node cache + private List runnables = null; + + @Override + public boolean isSupported(final Connection conn) { + try { + boolean ret = false; + if (conn != null && conn.getMetaData().getDatabaseProductName().startsWith("Oracle") + && (conn.getMetaData().getDatabaseMajorVersion() == 11 + && conn.getMetaData().getDatabaseMinorVersion() >= 2 + || conn.getMetaData().getDatabaseMajorVersion() > 11)) { + ret = true; + } + return ret; + } catch (SQLException e) { + final String msg = "SQLException during connection check due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); + } + } + + @Override + public String getName(final Connection conn) { + return "Run test"; + } + + @Override + public String getDescription(final Connection conn) { + return "Runs utPLSQL test packages in the current user."; + } + + @Override + public List getFolders(final Connection conn) { + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + final ArrayList folders = new ArrayList<>(); + for (String f : preferences.getRootFolderInOddgenView().split(",")) { + if (f != null) { + folders.add(f.trim()); + } + } + return folders; + } + + @Override + public String getHelp(final Connection conn) { + return "

not yet available

"; + } + + @Override + public List getNodes(final Connection conn, final String parentNodeId) { + // oddgen asks for children for each parent node, regardless of load strategy (eager/lazy) + // oddgen does not know about the load strategy, hence caching is the responsibility of the generator + if (runnables == null) { + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + final LinkedHashMap params = new LinkedHashMap<>(); + params.put(RESET_PACKAGE, preferences.isResetPackage() ? "YES" : "NO"); + params.put(CLEAR_SCREEN, preferences.isClearScreen() ? "YES" : "NO"); + params.put(INDENT_SPACES, String.valueOf(preferences.getIndentSpaces())); + final UtplsqlDao dao = new UtplsqlDao(conn); + // load node tree eagerly (all nodes in one go) + runnables = dao.runnables(); + for (final Node node : runnables) { + node.setParams(params); + } + } + return runnables; + } + + @Override + public HashMap> getLov(final Connection conn, final LinkedHashMap params, final List nodes) { + final HashMap> lov = new HashMap<>(); + lov.put(RESET_PACKAGE, Arrays.asList(YES, NO)); + lov.put(CLEAR_SCREEN, Arrays.asList(YES, NO)); + lov.put(INDENT_SPACES, Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8")); + return lov; + } + + @Override + public HashMap getParamStates(final Connection conn, final LinkedHashMap params, final List nodes) { + return new HashMap<>(); + } + + private String getPath(final Node node, final Connection conn) { + if ("SUITE".equals(node.getId()) || "SUITEPATH".equals(node.getId())) { + try { + return conn.getMetaData().getUserName(); + } catch (SQLException e) { + final String msg = "SQLException during getUserName() due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); + } + } else { + return node.getId(); + } + } + + private String replaceTabsWithSpaces(final CharSequence input, final int indentSpaces) { + final String spaces = String.format((("%1$" + Integer.valueOf(indentSpaces)) + "s"), ""); + return input.toString().replace("\t", spaces); + } + + public ArrayList dedup(final List nodes) { + final HashSet set = new HashSet<>(); + for (final Node node : nodes) { + set.add(node.getId()); + } + final ArrayList ret = new ArrayList<>(); + for (final Node node : nodes) { + if (!set.contains(node.getParentId())) { + ret.add(node); + } + } + return ret; + } + + @Override + public String generateProlog(final Connection conn, final List nodes) { + final ArrayList dedupNodes = dedup(nodes); + final LinkedHashMap params = dedupNodes.get(0).getParams(); + final StringBuilder sb = new StringBuilder(); + if ("YES".equals(params.get(RESET_PACKAGE))) { + sb.append("EXECUTE dbms_session.reset_package;\n"); + } + sb.append("SET SERVEROUTPUT ON SIZE UNLIMITED\n"); + if ("YES".equals(params.get(CLEAR_SCREEN))) { + sb.append("CLEAR SCREEN\n"); + } + if (dedupNodes.size() == 1) { + sb.append("EXECUTE ut.run('"); + sb.append(getPath(dedupNodes.get(0), conn)); + sb.append("');\n"); + } else { + final List paths = nodes.stream().map(node -> getPath(node, conn)).collect(Collectors.toList()); + sb.append("BEGIN\n"); + sb.append("\tut.run(\n"); + sb.append("\t\tut_varchar2_list(\n"); + sb.append(StringTools.getCSV(paths, "\t\t\t")); + sb.append("\t\t)\n"); + sb.append("\t);\n"); + sb.append("END;\n"); + sb.append("/\n"); + } + final String ret = sb.toString(); + return replaceTabsWithSpaces(ret, (Integer.valueOf(params.get(INDENT_SPACES)))); + } + + @Override + public String generateSeparator(final Connection conn) { + return ""; + } + + @Override + public String generateEpilog(final Connection conn, final List nodes) { + return ""; + } + + @Override + public String generate(final Connection conn, final Node node) { + return ""; + } } From cfbd79721307cef59ff42c79d766eca4ad22a4ba Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 14:19:49 +0200 Subject: [PATCH 102/286] use deduplicated nodes to generate test runs --- .../src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java index b6625054..ba22d9c1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java @@ -177,7 +177,7 @@ public String generateProlog(final Connection conn, final List nodes) { sb.append(getPath(dedupNodes.get(0), conn)); sb.append("');\n"); } else { - final List paths = nodes.stream().map(node -> getPath(node, conn)).collect(Collectors.toList()); + final List paths = dedupNodes.stream().map(node -> getPath(node, conn)).collect(Collectors.toList()); sb.append("BEGIN\n"); sb.append("\tut.run(\n"); sb.append("\t\tut_varchar2_list(\n"); From 752f370fe55c4f6d0991d7ae2e2e532246b7b691 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 14:27:57 +0200 Subject: [PATCH 103/286] rename TestGenerator.xtend to TestGenerator.java --- .../sqldev/oddgen/{TestGenerator.xtend => TestGenerator.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/oddgen/{TestGenerator.xtend => TestGenerator.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.xtend b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java From 42728a984c6e1746d8524cf318820fc595e9baff Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 14:34:06 +0200 Subject: [PATCH 104/286] use constants for YES and NO --- .../main/java/org/utplsql/sqldev/oddgen/RunGenerator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java index ba22d9c1..e718eadd 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java @@ -100,8 +100,8 @@ public List getNodes(final Connection conn, final String parentNodeId) { if (runnables == null) { final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); final LinkedHashMap params = new LinkedHashMap<>(); - params.put(RESET_PACKAGE, preferences.isResetPackage() ? "YES" : "NO"); - params.put(CLEAR_SCREEN, preferences.isClearScreen() ? "YES" : "NO"); + params.put(RESET_PACKAGE, preferences.isResetPackage() ? YES : NO); + params.put(CLEAR_SCREEN, preferences.isClearScreen() ? YES : NO); params.put(INDENT_SPACES, String.valueOf(preferences.getIndentSpaces())); final UtplsqlDao dao = new UtplsqlDao(conn); // load node tree eagerly (all nodes in one go) @@ -165,11 +165,11 @@ public String generateProlog(final Connection conn, final List nodes) { final ArrayList dedupNodes = dedup(nodes); final LinkedHashMap params = dedupNodes.get(0).getParams(); final StringBuilder sb = new StringBuilder(); - if ("YES".equals(params.get(RESET_PACKAGE))) { + if (YES.equals(params.get(RESET_PACKAGE))) { sb.append("EXECUTE dbms_session.reset_package;\n"); } sb.append("SET SERVEROUTPUT ON SIZE UNLIMITED\n"); - if ("YES".equals(params.get(CLEAR_SCREEN))) { + if (YES.equals(params.get(CLEAR_SCREEN))) { sb.append("CLEAR SCREEN\n"); } if (dedupNodes.size() == 1) { From 65711fde3109b99199e153543a954e55f366a666 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 15:59:40 +0200 Subject: [PATCH 105/286] convert TestGenerator to Java --- .../utplsql/sqldev/oddgen/TestGenerator.java | 537 ++++++++++-------- 1 file changed, 285 insertions(+), 252 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java index 1393cc3e..32ef3c23 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java @@ -13,272 +13,305 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.oddgen +package org.utplsql.sqldev.oddgen; -import java.io.File -import java.sql.Connection -import java.util.ArrayList -import java.util.HashMap -import java.util.LinkedHashMap -import java.util.List -import java.util.logging.Logger -import oracle.ide.config.Preferences -import org.oddgen.sqldev.generators.OddgenGenerator2 -import org.oddgen.sqldev.generators.model.Node -import org.oddgen.sqldev.generators.model.NodeTools -import org.oddgen.sqldev.plugin.templates.TemplateTools -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.model.oddgen.GenContext -import org.utplsql.sqldev.model.preference.PreferenceModel -import org.utplsql.sqldev.resources.UtplsqlResources +import java.io.File; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.logging.Logger; -class TestGenerator implements OddgenGenerator2 { - static final Logger logger = Logger.getLogger(TestGenerator.name); +import org.oddgen.sqldev.generators.OddgenGenerator2; +import org.oddgen.sqldev.generators.model.Node; +import org.oddgen.sqldev.generators.model.NodeTools; +import org.oddgen.sqldev.plugin.templates.TemplateTools; +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.oddgen.GenContext; +import org.utplsql.sqldev.model.preference.PreferenceModel; +import org.utplsql.sqldev.resources.UtplsqlResources; - public static val YES = "Yes" - public static val NO = "No" - - public static var GENERATE_FILES = UtplsqlResources.getString("PREF_GENERATE_FILES_LABEL") - public static var OUTPUT_DIRECTORY = UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL") - public static var DELETE_EXISTING_FILES = UtplsqlResources.getString("PREF_DELETE_EXISTING_FILES_LABEL") - public static var TEST_PACKAGE_PREFIX = UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL") - public static var TEST_PACKAGE_SUFFIX = UtplsqlResources.getString("PREF_TEST_PACKAGE_SUFFIX_LABEL") - public static var TEST_UNIT_PREFIX = UtplsqlResources.getString("PREF_TEST_UNIT_PREFIX_LABEL") - public static var TEST_UNIT_SUFFIX = UtplsqlResources.getString("PREF_TEST_UNIT_SUFFIX_LABEL") - public static var NUMBER_OF_TESTS_PER_UNIT = UtplsqlResources.getString("PREF_NUMBER_OF_TESTS_PER_UNIT_LABEL") - public static var GENERATE_COMMENTS = UtplsqlResources.getString("PREF_GENERATE_COMMENTS_LABEL") - public static var DISABLE_TESTS = UtplsqlResources.getString("PREF_DISABLE_TESTS_LABEL") - public static var SUITE_PATH = UtplsqlResources.getString("PREF_SUITE_PATH_LABEL") - public static var INDENT_SPACES = UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL") - - val extension NodeTools nodeTools = new NodeTools - val extension TemplateTools templateTools = new TemplateTools - val consoleOutput = new ArrayList(); +import oracle.ide.config.Preferences; - private def toContext(Node node) { - val context = new GenContext() - context.objectType = node.toObjectType - context.objectName = node.toObjectName - context.testPackagePrefix = node.params.get(TEST_PACKAGE_PREFIX).toLowerCase - context.testPackageSuffix = node.params.get(TEST_PACKAGE_SUFFIX).toLowerCase - context.testUnitPrefix = node.params.get(TEST_UNIT_PREFIX).toLowerCase - context.testUnitSuffix = node.params.get(TEST_UNIT_SUFFIX).toLowerCase - context.numberOfTestsPerUnit = Integer.valueOf(node.params.get(NUMBER_OF_TESTS_PER_UNIT)) - context.generateComments = node.params.get(GENERATE_COMMENTS) == YES - context.disableTests = node.params.get(DISABLE_TESTS) == YES - context.suitePath = node.params.get(SUITE_PATH).toLowerCase - context.indentSpaces = Integer.valueOf(node.params.get(INDENT_SPACES)) - return context - } +public class TestGenerator implements OddgenGenerator2 { + private static final Logger logger = Logger.getLogger(TestGenerator.class.getName()); - private def void resetConsoleOutput() { - consoleOutput.clear - } + public static final String YES = "Yes"; + public static final String NO = "No"; - private def void saveConsoleOutput(String s) { - if (s !== null) { - for (line : s.split("[\\n\\r]+")) { - consoleOutput.add(line) - } - } - } - - private def void logConsoleOutput() { - for (line : consoleOutput) { - if (line.contains("error") || line.startsWith("Cannot")) { - logger.severe(line) - } else { - logger.fine(line) - } - } - } - - private def String deleteFile(File file) { - var String ret - try { - if (file.delete) { - ret = '''«file.absoluteFile» deleted.''' - } else { - ret = '''Cannot delete file «file.absoluteFile».''' - } - } catch (Exception e) { - ret = '''Cannot delete file «file.absoluteFile». Got the following error message: «e.message».''' - } - return ret - } - - private def deleteFiles(String directory) ''' - «val dir = new File(directory)» - «FOR file: dir.listFiles» - «IF !file.directory» - «IF file.name.endsWith(".pks") || file.name.endsWith(".pkb")» - «file.deleteFile» - «ENDIF» - «ENDIF» - «ENDFOR» - ''' + public static final String GENERATE_FILES = UtplsqlResources.getString("PREF_GENERATE_FILES_LABEL"); + public static final String OUTPUT_DIRECTORY = UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL"); + public static final String DELETE_EXISTING_FILES = UtplsqlResources.getString("PREF_DELETE_EXISTING_FILES_LABEL"); + public static final String TEST_PACKAGE_PREFIX = UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL"); + public static final String TEST_PACKAGE_SUFFIX = UtplsqlResources.getString("PREF_TEST_PACKAGE_SUFFIX_LABEL"); + public static final String TEST_UNIT_PREFIX = UtplsqlResources.getString("PREF_TEST_UNIT_PREFIX_LABEL"); + public static final String TEST_UNIT_SUFFIX = UtplsqlResources.getString("PREF_TEST_UNIT_SUFFIX_LABEL"); + public static final String NUMBER_OF_TESTS_PER_UNIT = UtplsqlResources.getString("PREF_NUMBER_OF_TESTS_PER_UNIT_LABEL"); + public static final String GENERATE_COMMENTS = UtplsqlResources.getString("PREF_GENERATE_COMMENTS_LABEL"); + public static final String DISABLE_TESTS = UtplsqlResources.getString("PREF_DISABLE_TESTS_LABEL"); + public static final String SUITE_PATH = UtplsqlResources.getString("PREF_SUITE_PATH_LABEL"); + public static final String INDENT_SPACES = UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL"); - override isSupported(Connection conn) { - var ret = false - if (conn !== null) { - if (conn.metaData.databaseProductName.startsWith("Oracle")) { - if (conn.metaData.databaseMajorVersion == 11) { - if (conn.metaData.databaseMinorVersion >= 2) { - ret = true - } - } else if (conn.metaData.databaseMajorVersion > 11) { - ret = true - } - } - } - return ret - } + private final NodeTools nodeTools = new NodeTools(); + private final TemplateTools templateTools = new TemplateTools(); + private final ArrayList consoleOutput = new ArrayList<>(); - override getName(Connection conn) { - return "Generate test" - } + private GenContext toContext(final Node node) { + final GenContext context = new GenContext(); + context.setObjectType(nodeTools.toObjectType(node)); + context.setObjectName(nodeTools.toObjectName(node)); + context.setTestPackagePrefix(node.getParams().get(TEST_PACKAGE_PREFIX).toLowerCase()); + context.setTestPackageSuffix(node.getParams().get(TEST_PACKAGE_SUFFIX).toLowerCase()); + context.setTestUnitPrefix(node.getParams().get(TEST_UNIT_PREFIX).toLowerCase()); + context.setTestUnitSuffix(node.getParams().get(TEST_UNIT_SUFFIX).toLowerCase()); + context.setNumberOfTestsPerUnit((Integer.valueOf(node.getParams().get(NUMBER_OF_TESTS_PER_UNIT))).intValue()); + context.setGenerateComments(YES.equals(node.getParams().get(GENERATE_COMMENTS))); + context.setDisableTests(YES.equals(node.getParams().get(DISABLE_TESTS))); + context.setSuitePath(node.getParams().get(SUITE_PATH).toLowerCase()); + context.setIndentSpaces((Integer.valueOf(node.getParams().get(INDENT_SPACES))).intValue()); + return context; + } - override getDescription(Connection conn) { - return "Generates utPLSQL test packages for public units in packages, types, functions and procedures found in the current schema." - } + private void resetConsoleOutput() { + consoleOutput.clear(); + } - override getFolders(Connection conn) { - val preferences = PreferenceModel.getInstance(Preferences.preferences) - val folders = new ArrayList - for (f : preferences.rootFolderInOddgenView.split(",").filter[!it.empty]) { - folders.add(f.trim) - } - return folders - } + private void saveConsoleOutput(final String s) { + if (s != null) { + for (final String line : s.split("[\\n\\r]+")) { + consoleOutput.add(line); + } + } + } - override getHelp(Connection conn) { - return "

not yet available

" - } - - override getNodes(Connection conn, String parentNodeId) { - val preferences = PreferenceModel.getInstance(Preferences.preferences) - val params = new LinkedHashMap() - params.put(GENERATE_FILES, if (preferences.generateFiles) {YES} else {NO}) - params.put(OUTPUT_DIRECTORY, preferences.outputDirectory) - params.put(DELETE_EXISTING_FILES, if (preferences.deleteExistingFiles) {YES} else {NO}) - params.put(TEST_PACKAGE_PREFIX, preferences.testPackagePrefix) - params.put(TEST_PACKAGE_SUFFIX, preferences.testPackageSuffix) - params.put(TEST_UNIT_PREFIX, preferences.testUnitPrefix) - params.put(TEST_UNIT_SUFFIX, preferences.testUnitSuffix) - params.put(NUMBER_OF_TESTS_PER_UNIT, String.valueOf(preferences.numberOfTestsPerUnit)) - params.put(GENERATE_COMMENTS, if(preferences.generateComments) {YES} else {NO}) - params.put(DISABLE_TESTS, if (preferences.disableTests) {YES} else {NO}) - params.put(SUITE_PATH, preferences.suitePath) - params.put(INDENT_SPACES, String.valueOf(preferences.indentSpaces)) - if (parentNodeId === null || parentNodeId.empty) { - val packageNode = new Node - packageNode.id = "PACKAGE" - packageNode.params = params - packageNode.leaf = false - packageNode.generatable = true - packageNode.multiselectable = true - val typeNode = new Node - typeNode.id = "TYPE" - typeNode.params = params - typeNode.leaf = false - typeNode.generatable = true - typeNode.multiselectable = true - val functionNode = new Node - functionNode.id = "FUNCTION" - functionNode.params = params - functionNode.leaf = false - functionNode.generatable = true - functionNode.multiselectable = true - val procedureNode = new Node - procedureNode.id = "PROCEDURE" - procedureNode.params = params - procedureNode.leaf = false - procedureNode.generatable = true - procedureNode.multiselectable = true - return #[packageNode, typeNode, functionNode, procedureNode] - } else { - val UtplsqlDao dao = new UtplsqlDao(conn) - val nodes = dao.testables(parentNodeId) - for (node : nodes) { - node.params = params - } - return nodes - } - } + private void logConsoleOutput() { + for (final String line : consoleOutput) { + if ((line.contains("error") || line.startsWith("Cannot"))) { + logger.severe(line); + } else { + logger.fine(line); + } + } + } - override getLov(Connection conn, LinkedHashMap params, List nodes) { - val lov = new HashMap>() - lov.put(NUMBER_OF_TESTS_PER_UNIT, #["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]) - lov.put(INDENT_SPACES, #["1", "2", "3", "4", "5", "6", "7", "8"]) - lov.put(GENERATE_COMMENTS, #[YES, NO]) - lov.put(DISABLE_TESTS, #[YES, NO]) - lov.put(GENERATE_FILES, #[YES, NO]) - lov.put(DELETE_EXISTING_FILES, #[YES, NO]) - return lov - } + private String deleteFile(final File file) { + String ret = null; + if (file.delete()) { + StringBuilder sb = new StringBuilder(); + sb.append(file.getAbsoluteFile()); + sb.append(" deleted."); + ret = sb.toString(); + } else { + StringBuilder sb = new StringBuilder(); + sb.append("Cannot delete file "); + sb.append(file.getAbsoluteFile()); + sb.append("."); + ret = sb.toString(); + } + return ret; + } - override getParamStates(Connection conn, LinkedHashMap params, List nodes) { - val paramStates = new HashMap - paramStates.put(OUTPUT_DIRECTORY, params.get(GENERATE_FILES) == YES) - paramStates.put(DELETE_EXISTING_FILES, params.get(GENERATE_FILES) == YES) - return paramStates - } - - override generateProlog(Connection conn, List nodes) ''' - «val generateFiles = nodes.get(0).params.get(GENERATE_FILES) == YES» - «val outputDirectory = nodes.get(0).params.get(OUTPUT_DIRECTORY)» - «val deleteExistingfiles = nodes.get(0).params.get(DELETE_EXISTING_FILES) == YES» - «IF generateFiles» - «resetConsoleOutput» - «outputDirectory.mkdirs.saveConsoleOutput» - «IF deleteExistingfiles» - «deleteFiles(outputDirectory).toString.saveConsoleOutput» - «ENDIF» - -- - -- install generated utPLSQL test packages - -- - «ENDIF» - «FOR node : nodes» - «val context = node.toContext» - «context.conn = conn» - «val testTemplate = new TestTemplate(context)» - «IF generateFiles» - «val packageName = '''«context.testPackagePrefix»«node.toObjectName»«context.testPackageSuffix»'''» - «writeToFile('''«outputDirectory»«File.separator»«packageName».pks'''.toString,testTemplate.generateSpec).saveConsoleOutput» - «writeToFile('''«outputDirectory»«File.separator»«packageName».pkb'''.toString,testTemplate.generateBody).saveConsoleOutput» - @«outputDirectory»«File.separator»«packageName».pks - @«outputDirectory»«File.separator»«packageName».pkb - «ELSE» - «testTemplate.generate» + private CharSequence deleteFiles(final String directory) { + StringBuilder sb = new StringBuilder(); + final File dir = new File(directory); + for (final File file : dir.listFiles()) { + if (!file.isDirectory() && (file.getName().endsWith(".pks") || file.getName().endsWith(".pkb"))) { + sb.append(deleteFile(file)); + sb.append('\n'); + } + } + return sb; + } - «ENDIF» - «ENDFOR» - «logConsoleOutput» - «IF generateFiles && consoleOutput.findFirst[it.contains("error")] !== null» + @Override + public boolean isSupported(final Connection conn) { + try { + boolean ret = false; + if (conn != null && conn.getMetaData().getDatabaseProductName().startsWith("Oracle") + && (conn.getMetaData().getDatabaseMajorVersion() == 11 + && conn.getMetaData().getDatabaseMinorVersion() >= 2 + || conn.getMetaData().getDatabaseMajorVersion() > 11)) { + ret = true; + } + return ret; + } catch (SQLException e) { + final String msg = "SQLException during connection check due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); + } + } - -- - -- console output produced during the generation of this script (errors found) - -- - /* - - «FOR line : consoleOutput» - «line» - «ENDFOR» - - */ - «ENDIF» - ''' + @Override + public String getName(final Connection conn) { + return "Generate test"; + } - override generateSeparator(Connection conn) { - return "" - } - - override generateEpilog(Connection conn, List nodes) { - return "" - } - - override generate(Connection conn, Node node) { - return "" - } - + @Override + public String getDescription(final Connection conn) { + return "Generates utPLSQL test packages for public units in packages, types, functions and procedures found in the current schema."; + } + + @Override + public List getFolders(final Connection conn) { + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + final ArrayList folders = new ArrayList<>(); + for (String f : preferences.getRootFolderInOddgenView().split(",")) { + if (f != null) { + folders.add(f.trim()); + } + } + return folders; + } + + @Override + public String getHelp(final Connection conn) { + return "

not yet available

"; + } + + @Override + public List getNodes(final Connection conn, final String parentNodeId) { + final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + final LinkedHashMap params = new LinkedHashMap<>(); + params.put(GENERATE_FILES, preferences.isGenerateFiles() ? YES : NO); + params.put(OUTPUT_DIRECTORY, preferences.getOutputDirectory()); + params.put(DELETE_EXISTING_FILES, preferences.isDeleteExistingFiles() ? YES : NO); + params.put(TEST_PACKAGE_PREFIX, preferences.getTestPackagePrefix()); + params.put(TEST_PACKAGE_SUFFIX, preferences.getTestPackageSuffix()); + params.put(TEST_UNIT_PREFIX, preferences.getTestUnitPrefix()); + params.put(TEST_UNIT_SUFFIX, preferences.getTestUnitSuffix()); + params.put(NUMBER_OF_TESTS_PER_UNIT, String.valueOf(preferences.getNumberOfTestsPerUnit())); + params.put(GENERATE_COMMENTS, preferences.isGenerateComments() ? YES : NO); + params.put(DISABLE_TESTS, preferences.isDisableTests() ? YES : NO); + params.put(SUITE_PATH, preferences.getSuitePath()); + params.put(INDENT_SPACES, String.valueOf(preferences.getIndentSpaces())); + if (parentNodeId == null || parentNodeId.isEmpty()) { + final Node packageNode = new Node(); + packageNode.setId("PACKAGE"); + packageNode.setParams(params); + packageNode.setLeaf(Boolean.valueOf(false)); + packageNode.setGeneratable(Boolean.valueOf(true)); + packageNode.setMultiselectable(Boolean.valueOf(true)); + final Node typeNode = new Node(); + typeNode.setId("TYPE"); + typeNode.setParams(params); + typeNode.setLeaf(Boolean.valueOf(false)); + typeNode.setGeneratable(Boolean.valueOf(true)); + typeNode.setMultiselectable(Boolean.valueOf(true)); + final Node functionNode = new Node(); + functionNode.setId("FUNCTION"); + functionNode.setParams(params); + functionNode.setLeaf(Boolean.valueOf(false)); + functionNode.setGeneratable(Boolean.valueOf(true)); + functionNode.setMultiselectable(Boolean.valueOf(true)); + final Node procedureNode = new Node(); + procedureNode.setId("PROCEDURE"); + procedureNode.setParams(params); + procedureNode.setLeaf(Boolean.valueOf(false)); + procedureNode.setGeneratable(Boolean.valueOf(true)); + procedureNode.setMultiselectable(Boolean.valueOf(true)); + return Arrays.asList(packageNode, typeNode, functionNode, procedureNode); + } else { + final UtplsqlDao dao = new UtplsqlDao(conn); + final List nodes = dao.testables(parentNodeId); + for (final Node node : nodes) { + node.setParams(params); + } + return nodes; + } + } + + @Override + public HashMap> getLov(final Connection conn, final LinkedHashMap params, + final List nodes) { + final HashMap> lov = new HashMap<>(); + lov.put(NUMBER_OF_TESTS_PER_UNIT, Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")); + lov.put(INDENT_SPACES, Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8")); + lov.put(GENERATE_COMMENTS, Arrays.asList(YES, NO)); + lov.put(DISABLE_TESTS, Arrays.asList(YES, NO)); + lov.put(GENERATE_FILES, Arrays.asList(YES, NO)); + lov.put(DELETE_EXISTING_FILES, Arrays.asList(YES, NO)); + return lov; + } + + @Override + public HashMap getParamStates(final Connection conn, final LinkedHashMap params, + final List nodes) { + final HashMap paramStates = new HashMap<>(); + paramStates.put(OUTPUT_DIRECTORY, YES.equals(params.get(GENERATE_FILES))); + paramStates.put(DELETE_EXISTING_FILES, YES.equals(params.get(GENERATE_FILES))); + return paramStates; + } + + @Override + public String generateProlog(final Connection conn, final List nodes) { + StringBuilder sb = new StringBuilder(); + final boolean generateFiles = YES.equals(nodes.get(0).getParams().get(GENERATE_FILES)); + final String outputDirectory = nodes.get(0).getParams().get(OUTPUT_DIRECTORY); + final boolean deleteExistingfiles = YES.equals(nodes.get(0).getParams().get(DELETE_EXISTING_FILES)); + if (generateFiles) { + resetConsoleOutput(); + saveConsoleOutput(templateTools.mkdirs(outputDirectory)); + if (deleteExistingfiles) { + saveConsoleOutput(deleteFiles(outputDirectory).toString()); + } + sb.append("--\n"); + sb.append("-- install generated utPLSQL test packages\n"); + sb.append("--\n"); + } + for (final Node node : nodes) { + final GenContext context = toContext(node); + context.setConn(conn); + final TestTemplate testTemplate = new TestTemplate(context); + if (generateFiles) { + final String packageName = context.getTestPackagePrefix() + nodeTools.toObjectName(node) + + context.getTestPackageSuffix(); + final String packagePath = outputDirectory + File.separator + packageName; + saveConsoleOutput(templateTools.writeToFile(packagePath + ".pks", testTemplate.generateSpec())); + saveConsoleOutput(templateTools.writeToFile(packagePath + ".pkb", testTemplate.generateBody())); + sb.append('@'); + sb.append(packagePath); + sb.append(".pks\n"); + sb.append('@'); + sb.append(packagePath); + sb.append(".pkb\n"); + } else { + sb.append(testTemplate.generate()); + sb.append('\n'); + } + } + logConsoleOutput(); + if (generateFiles && consoleOutput.stream().anyMatch(it -> it.contains("error"))) { + sb.append('\n'); + sb.append("--\n"); + sb.append("-- console output produced during the generation of this script (errors found)\n"); + sb.append("--\n"); + sb.append("/*\n\n"); + for (final String line : consoleOutput) { + sb.append(line); + sb.append('\n'); + } + sb.append('\n'); + sb.append("*/\n"); + } + return sb.toString(); + } + + @Override + public String generateSeparator(final Connection conn) { + return ""; + } + + @Override + public String generateEpilog(final Connection conn, final List nodes) { + return ""; + } + + @Override + public String generate(final Connection conn, final Node node) { + return ""; + } } From e7bf4275cbbd5e41bca90a64adb0f5d9735970a2 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 16:03:11 +0200 Subject: [PATCH 106/286] rename TestTemplate.xtend to TestTemplate.java --- .../sqldev/oddgen/{TestTemplate.xtend => TestTemplate.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/oddgen/{TestTemplate.xtend => TestTemplate.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.xtend b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java From ff5faa2ee7361add3eae6e41c4facdb811cbe4f7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 16:27:13 +0200 Subject: [PATCH 107/286] add methods repeat and replaceTabsWithSpaces for consistent usage across the project --- .../java/org/utplsql/sqldev/model/StringTools.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java index 5d47beed..ce9a86dd 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java @@ -40,8 +40,7 @@ public static String getCSV(List list, String indent) { } public static String getCSV(List list, int indentSpaces) { - final String indent = String.join("", Collections.nCopies(indentSpaces, " ")); - return getCSV(list, indent); + return getCSV(list, repeat(" ", indentSpaces)); } public static String getSimpleCSV(List list) { @@ -55,4 +54,12 @@ public static String getSimpleCSV(List list) { return sb.toString(); } + public static String repeat(String s, int times) { + return String.join("", Collections.nCopies(times, s)); + } + + public static String replaceTabsWithSpaces(final CharSequence input, int indentSpaces) { + final String spaces = StringTools.repeat(" ", indentSpaces); + return input.toString().replace("\t", spaces); + } } From 448dbd4344f0578b63f9509e0fc159863ed2b053 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 16:27:52 +0200 Subject: [PATCH 108/286] use replaceTabsWithSpaces from StringTools --- .../main/java/org/utplsql/sqldev/oddgen/RunGenerator.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java index e718eadd..15191fbc 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java @@ -141,11 +141,6 @@ private String getPath(final Node node, final Connection conn) { } } - private String replaceTabsWithSpaces(final CharSequence input, final int indentSpaces) { - final String spaces = String.format((("%1$" + Integer.valueOf(indentSpaces)) + "s"), ""); - return input.toString().replace("\t", spaces); - } - public ArrayList dedup(final List nodes) { final HashSet set = new HashSet<>(); for (final Node node : nodes) { @@ -188,7 +183,7 @@ public String generateProlog(final Connection conn, final List nodes) { sb.append("/\n"); } final String ret = sb.toString(); - return replaceTabsWithSpaces(ret, (Integer.valueOf(params.get(INDENT_SPACES)))); + return StringTools.replaceTabsWithSpaces(ret, Integer.valueOf(params.get(INDENT_SPACES))); } @Override From 64945f007b65744570630d89640ad816451fae72 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 17:48:31 +0200 Subject: [PATCH 109/286] convert TestTemplate to Java --- .../utplsql/sqldev/oddgen/TestTemplate.java | 249 ++++++++++-------- 1 file changed, 142 insertions(+), 107 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java index 62b79555..036b5995 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestTemplate.java @@ -13,117 +13,152 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.oddgen +package org.utplsql.sqldev.oddgen; -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter -import java.util.List -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.model.oddgen.GenContext +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; -class TestTemplate { - var GenContext context - var UtplsqlDao dao - var List units - var dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - var today = dateTimeFormatter.format(LocalDateTime.now()) - - new(GenContext context) { - this.context = context - dao = new UtplsqlDao(context.conn) - units = dao.units(context.objectType, context.objectName) - } +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.model.StringTools; +import org.utplsql.sqldev.model.oddgen.GenContext; - def replaceTabsWithSpaces(CharSequence input) { - val spaces = String.format("%1$"+context.indentSpaces+"s", "") - return input.toString.replace("\t", spaces) - } - - def generateSpec() { - val ret = ''' - «val objectName = context.objectName.toLowerCase» - «val packageName = '''«context.testPackagePrefix»«objectName»«context.testPackageSuffix»'''» - CREATE OR REPLACE PACKAGE «packageName» IS - - «IF context.generateComments» - /* generated by utPLSQL for SQL Developer on «today» */ +public class TestTemplate { + private GenContext context; + private UtplsqlDao dao; + private List units; + private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private String today = dateTimeFormatter.format(LocalDateTime.now()); - «ENDIF» - --%suite(«packageName») - «IF !context.suitePath.empty» - --%suitepath(«context.suitePath») - «ENDIF» - - «FOR u : units» - «val unit = u.toLowerCase» - «IF context.numberOfTestsPerUnit > 1 && (context.objectType == "PACKAGE" || context.objectType == "TYPE")» - --%context(«unit») + public TestTemplate(final GenContext context) { + this.context = context; + dao = new UtplsqlDao(context.getConn()); + units = dao.units(context.getObjectType(), context.getObjectName()); + } - «ENDIF» - «FOR i : 1 .. context.numberOfTestsPerUnit» - --%test - «IF context.disableTests» - --%disabled - «ENDIF» - PROCEDURE «context.testUnitPrefix»«unit»«context.testUnitSuffix»«IF context.numberOfTestsPerUnit > 1»«i»«ENDIF»; + public String generateSpec() { + final StringBuilder sb = new StringBuilder(); + final String objectName = context.getObjectName().toLowerCase(); + final String packageName = context.getTestPackagePrefix() + objectName + context.getTestPackageSuffix(); + sb.append("CREATE OR REPLACE PACKAGE "); + sb.append(packageName); + sb.append(" IS\n\n"); + if (context.isGenerateComments()) { + sb.append("\t/* generated by utPLSQL for SQL Developer on "); + sb.append(today); + sb.append(" */\n\n"); + } + sb.append("\t--%suite("); + sb.append(packageName); + sb.append(")\n"); + if (!context.getSuitePath().isEmpty()) { + sb.append("\t--%suitepath("); + sb.append(context.getSuitePath()); + sb.append(")\n\n"); + } + for (final String u : units) { + final String unit = u.toLowerCase(); + if (context.getNumberOfTestsPerUnit() > 1 + && ("PACKAGE".equals(context.getObjectType()) || "TYPE".equals(context.getObjectType()))) { + sb.append("\t--%context("); + sb.append(unit); + sb.append(")\n\n"); + } + for (int i=1; i <= context.getNumberOfTestsPerUnit(); i++) { + sb.append("\t--%test\n"); + if (context.isDisableTests()) { + sb.append("\t--%disabled\n"); + } + sb.append("\tPROCEDURE "); + sb.append(context.getTestUnitPrefix()); + sb.append(unit); + sb.append(context.getTestUnitSuffix()); + if (context.getNumberOfTestsPerUnit() > 1) { + sb.append(i); + } + sb.append(";\n\n"); + } + if (context.getNumberOfTestsPerUnit() > 1 + && ("PACKAGE".equals(context.getObjectType()) || "TYPE".equals(context.getObjectType()))) { + sb.append("\t--%endcontext\n\n"); + } + } + sb.append("END "); + sb.append(packageName); + sb.append(";\n"); + sb.append("/"); + final String ret = sb.toString(); + return StringTools.replaceTabsWithSpaces(ret, context.getIndentSpaces()); + } - «ENDFOR» - «IF context.numberOfTestsPerUnit > 1 && (context.objectType == "PACKAGE" || context.objectType == "TYPE")» - --%endcontext + public String generateBody() { + StringBuilder sb = new StringBuilder(); + final String objectName = context.getObjectName().toLowerCase(); + sb.append("CREATE OR REPLACE PACKAGE BODY "); + sb.append(context.getTestPackagePrefix()); + sb.append(objectName); + sb.append(context.getTestPackageSuffix()); + sb.append(" IS\n\n"); + if (context.isGenerateComments()) { + sb.append("\t/* generated by utPLSQL for SQL Developer on "); + sb.append(today); + sb.append(" */\n\n"); + } + for (final String u : units) { + final String unit = u.toLowerCase(); + for (int i=1; i <= context.getNumberOfTestsPerUnit(); i++) { + final String procedureName = context.getTestUnitPrefix() + unit + context.getTestUnitSuffix() + + (context.getNumberOfTestsPerUnit() > 1 ? String.valueOf(i) : ""); + if (context.isGenerateComments()) { + sb.append("\t--\n"); + sb.append("\t-- test "); + sb.append(unit); + if (context.getNumberOfTestsPerUnit() > 1) { + sb.append(" case "); + sb.append(i); + sb.append(": ...\n"); + } + sb.append("\t--\n"); + } + sb.append("\tPROCEDURE "); + sb.append(procedureName); + sb.append(" IS\n"); + sb.append("\t\tl_actual INTEGER := 0;\n"); + sb.append("\t\tl_expected INTEGER := 1;\n"); + sb.append("\tBEGIN\n"); + if (context.isGenerateComments()) { + sb.append("\t\t-- populate actual\n"); + sb.append("\t\t-- "); + sb.append(objectName); + sb.append("."); + sb.append(unit); + sb.append(";\n\n"); + sb.append("\t\t-- populate expected\n"); + sb.append("\t\t-- ...\n\n"); + sb.append("\t\t-- assert\n"); + } + sb.append("\t\tut.expect(l_actual).to_equal(l_expected);\n"); + sb.append("\tEND "); + sb.append(procedureName); + sb.append(";\n\n"); + } + } + sb.append("END "); + sb.append(context.getTestPackagePrefix()); + sb.append(objectName); + sb.append(context.getTestPackageSuffix()); + sb.append(";\n"); + sb.append("/"); + final String ret = sb.toString(); + return StringTools.replaceTabsWithSpaces(ret, context.getIndentSpaces()); + } - «ENDIF» - «ENDFOR» - END «packageName»; - / - ''' - return ret.replaceTabsWithSpaces - } - - def generateBody() { - val ret = ''' - «val objectName = context.objectName.toLowerCase» - CREATE OR REPLACE PACKAGE BODY «context.testPackagePrefix»«objectName»«context.testPackageSuffix» IS - - «IF context.generateComments» - /* generated by utPLSQL for SQL Developer on «today» */ - - «ENDIF» - «FOR u : units» - «val unit = u.toLowerCase» - «FOR i : 1 .. context.numberOfTestsPerUnit» - «val procedureName = '''«context.testUnitPrefix»«unit»«context.testUnitSuffix»«IF context.numberOfTestsPerUnit > 1»«i»«ENDIF»'''» - «IF context.generateComments» - -- - -- test «unit»«IF context.numberOfTestsPerUnit > 0» case «i»: ...«ENDIF» - -- - «ENDIF» - PROCEDURE «procedureName» IS - l_actual INTEGER := 0; - l_expected INTEGER := 1; - BEGIN - «IF context.generateComments» - -- populate actual - -- «objectName».«unit»; - - -- populate expected - -- ... - - -- assert - «ENDIF» - ut.expect(l_actual).to_equal(l_expected); - END «procedureName»; - - «ENDFOR» - «ENDFOR» - END «context.testPackagePrefix»«objectName»«context.testPackageSuffix»; - / - ''' - return ret.replaceTabsWithSpaces - } - - def generate() ''' - «generateSpec» - - «generateBody» - ''' -} \ No newline at end of file + public CharSequence generate() { + StringBuilder sb = new StringBuilder(); + sb.append(generateSpec()); + sb.append("\n\n"); + sb.append(generateBody()); + sb.append('\n'); + return sb; + } +} From 37439312e73ecf2027aff3f1b3bf0cf9a26c446a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 17:52:34 +0200 Subject: [PATCH 110/286] rename SqlDevParser.xtend to SqlDevParser.java --- .../sqldev/parser/{SqlDevParser.xtend => SqlDevParser.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/parser/{SqlDevParser.xtend => SqlDevParser.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/parser/SqlDevParser.xtend b/sqldev/src/main/java/org/utplsql/sqldev/parser/SqlDevParser.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/parser/SqlDevParser.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/parser/SqlDevParser.java From 4bf6d20752f6ef410aaf4a26f574fb75db683b38 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Mon, 25 May 2020 18:45:42 +0200 Subject: [PATCH 111/286] convert SqlDevParser to Java --- .../utplsql/sqldev/parser/SqlDevParser.java | 84 ++++++++++--------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/parser/SqlDevParser.java b/sqldev/src/main/java/org/utplsql/sqldev/parser/SqlDevParser.java index 3eb38765..4bda72a6 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/parser/SqlDevParser.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/parser/SqlDevParser.java @@ -1,4 +1,5 @@ -/* Copyright 2018 Philipp Salvisberg +/* + * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,49 +13,56 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.parser +package org.utplsql.sqldev.parser; + +import java.util.List; +import java.util.Optional; +import java.util.Set; -import oracle.dbtools.parser.LexerToken -import oracle.dbtools.raptor.navigator.plsql.PlSqlArguments -import oracle.dbtools.raptor.navigator.plsql.PlsqlStructureParser +import oracle.dbtools.parser.LexerToken; +import oracle.dbtools.raptor.navigator.plsql.Member; +import oracle.dbtools.raptor.navigator.plsql.PlSqlArguments; +import oracle.dbtools.raptor.navigator.plsql.PlsqlStructureParser; /* * Cannot use this class within SQL Developer because the * package oracle.dbtools.parser is not exported in sqldeveloper OSGI bundle (extension) * (throws ClassNotFoundException at runtime). * - * The dbtools-common.jar contains the necessary packages, - * but it cannot be distributed with the utPLSQL extension + * The dbtools-common.jar contains the necessary packages, + * but it cannot be distributed with the utPLSQL extension * without violating the Oracle license agreement. */ -class SqlDevParser { - def getMembers(String plsql) { - val tokens = LexerToken.parse(plsql) - val parser = new PlsqlStructureParser - parser.parse(tokens, PlSqlArguments.sort) - return parser.children - } - - private def getStartLine(String plsql, int offset) { - var int line = 1 - for (var i = 0; i < plsql.length; i++) { - val c = plsql.substring(i, i+1) - if (i > offset) { - return line - } else if (c == '\n') { - line = line + 1 - } - } - return line - } - - def getMemberStartLine(String plsql, String memberName) { - val members = plsql.members - val member = members.findFirst[it.name.equalsIgnoreCase(memberName)] - if (member !== null) { - return getStartLine(plsql, member.codeOffset) - } else { - 1 - } - } -} \ No newline at end of file +public class SqlDevParser { + + @SuppressWarnings("unchecked") + public Set getMembers(final String plsql) { + final List tokens = LexerToken.parse(plsql); + final PlsqlStructureParser parser = new PlsqlStructureParser(); + parser.parse(tokens, PlSqlArguments.getSort()); + return parser.children; + } + + private int getStartLine(final String plsql, final int offset) { + int line = 1; + for (int i = 0; i < plsql.length(); i++) { + final String c = plsql.substring(i, i + 1); + if (i > offset) { + return line; + } else if ("\n".equals(c)) { + line = line + 1; + } + } + return line; + } + + public int getMemberStartLine(final String plsql, final String memberName) { + final Set members = this.getMembers(plsql); + final Optional member = members.stream().filter(it -> it.name.equalsIgnoreCase(memberName)).findFirst(); + if (member.isPresent()) { + return this.getStartLine(plsql, member.get().codeOffset); + } else { + return 1; + } + } +} From e9e410184d5669bb203b60992ee4520a5d9064c9 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 07:37:35 +0200 Subject: [PATCH 112/286] rename UtplsqlParser.xtend to UtplsqlParser.java --- .../sqldev/parser/{UtplsqlParser.xtend => UtplsqlParser.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/parser/{UtplsqlParser.xtend => UtplsqlParser.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.xtend b/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java From a1c4fe9ff17b17fb6e0fec31beaa0883f1b8daab Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 09:33:59 +0200 Subject: [PATCH 113/286] convert UtplsqlParser to Java --- .../utplsql/sqldev/parser/UtplsqlParser.java | 516 ++++++++++-------- 1 file changed, 276 insertions(+), 240 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java b/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java index 736be98e..4bdc897a 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java @@ -1,4 +1,5 @@ -/* Copyright 2018 Philipp Salvisberg +/* + * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,242 +13,277 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.parser - -import java.sql.Connection -import java.util.ArrayList -import java.util.Arrays -import java.util.regex.Pattern -import javax.swing.text.JTextComponent -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.model.parser.PlsqlObject -import org.utplsql.sqldev.model.parser.Unit - -class UtplsqlParser { - String owner - String plsql - String plsqlReduced - ArrayList objects = new ArrayList - ArrayList units = new ArrayList - - new(String plsql, Connection conn, String owner) { - setPlsql(plsql) - setPlsqlReduced - populateObjects - populateUnits - processAnnotations(conn, owner) - } - - new(String plsql) { - this(plsql, null, null) - } - - /** - * JTextComponents uses one position for EOL (end-of-line), - * even on Windows platforms were it is two characters (CR/LF). - * To simplify position calculations and subsequent regular expressions - * all new lines are replaced with LF on Windows platforms. - */ - private def setPlsql(String plsql) { - val lineSep = System.getProperty("line.separator") - if (lineSep.length > 0) { - // replace CR/LF with LF on Windows platforms - this.plsql = plsql.replace(lineSep, "\n") - } else { - this.plsql = plsql - } - } - - /** - * replace the following expressions with space to simplify - * and improve performance of subsequent regular expressions: - * - multi-line PL/SQL comments - * - single-line PL/SQL comments - * - string literals - * the result is not valid PL/SQL anymore, but good enough - * to find PL/SQL objects and units - */ - private def setPlsqlReduced() { - val sb = new StringBuffer - val p = Pattern.compile("(/\\*(.|[\\n])*?\\*/)|(--[^\\n]*\\n)|('([^']|[\\n])*?')") - val m = p.matcher(plsql) - var pos = 0 - while (m.find) { - if (pos < m.start) { - sb.append(plsql.substring(pos, m.start)) - } - for (var i=m.start; i pos) { - sb.append(plsql.substring(pos, plsql.length)) - } - plsqlReduced=sb.toString - } - - private def populateObjects() { - val p = Pattern.compile("(?i)(\\s*)(create(\\s+or\\s+replace)?\\s+(package|type|function|procedure)\\s+(body\\s+)?)([^\\s]+)(\\s+)") - val m = p.matcher(plsqlReduced) - while (m.find) { - val o = new PlsqlObject - o.type = m.group(4).toUpperCase - o.name = m.group(6) - o.position = m.start - objects.add(o) - } - } - private def populateUnits() { - val p = Pattern.compile("(?i)(\\s*)(procedure)(\\s+)([^\\s\\(;]+)") - val m = p.matcher(plsqlReduced) - while (m.find) { - val u = new Unit - u.name = m.group(4) - u.position = m.start - u.positionOfName = m.start(4) - units.add(u) - } - } - - private def processAnnotations(Connection conn, String owner) { - this.owner = owner - if (conn !== null) { - val dao = new UtplsqlDao(conn) - if (dao.utAnnotationManagerInstalled) { - for (o : objects) { - val segments = Arrays.asList(o.name.fixName.split("\\.")) - val annotations = dao.annotations(if (owner !== null) {owner} else {conn.schema}, segments.last.toUpperCase) - if (annotations.findFirst[it.name == "suite"] !== null) { - o.annotations = annotations - } - } - val fixedUnits = new ArrayList - for (u : units) { - val o = getObjectAt(u.position) - if (o?.annotations !== null && o.annotations.findFirst [ - it.name == "test" && it.subobjectName.equalsIgnoreCase(u.name.fixName) - ] !== null) { - fixedUnits.add(u) - } - } - units = fixedUnits - val fixedObjects = new ArrayList - for (o : objects) { - if (o.annotations !== null) { - fixedObjects.add(o) - } - } - objects = fixedObjects - } - } - } - - /** - * gets the PL/SQL object based on the current editor position - * - * @param position the absolute position as used in {@link JTextComponent#getCaretPosition()} - * @return the PL/SQL object - */ - def getObjectAt(int position) { - var PlsqlObject obj - for (o : objects) { - if (o.position <= position) { - obj = o - } - } - return obj - } - - /** - * converts a line and column to a postion as used in as used in {@link JTextComponent#getCaretPosition()} - * used for testing purposes only - * - * @param line the line as used in SQL Developer, starting with 1 - * @param column the column as used in SQL Developer, starting with 1 - * @return the position - */ - def toPosition(int line, int column) { - var lines=0 - for (var i=0; i position) { - return line - } else if (c == '\n') { - line = line + 1 - } - } - return line - } - - /** - * get the line of a PL/SQL package unit - * - * @param unitName name of the unit. Only procedures are supported - * @return the line where the procedure is defined - */ - def getLineOf(String unitName) { - for (u : units) { - if (u.name.equalsIgnoreCase(unitName)) { - return u.positionOfName.startLine - } - } - return 1 - } -} \ No newline at end of file +package org.utplsql.sqldev.parser; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.swing.text.JTextComponent; + +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.parser.PlsqlObject; +import org.utplsql.sqldev.model.parser.Unit; +import org.utplsql.sqldev.model.ut.Annotation; + +public class UtplsqlParser { + private String owner; + private String plsql; + private String plsqlReduced; + private ArrayList objects = new ArrayList<>(); + private ArrayList units = new ArrayList<>(); + + public UtplsqlParser(final String plsql, final Connection conn, final String owner) { + setPlsql(plsql); + setPlsqlReduced(); + populateObjects(); + populateUnits(); + processAnnotations(conn, owner); + } + + public UtplsqlParser(final String plsql) { + this(plsql, null, null); + } + + /** + * JTextComponents uses one position for EOL (end-of-line), + * even on Windows platforms were it is two characters (CR/LF). + * To simplify position calculations and subsequent regular expressions + * all new lines are replaced with LF on Windows platforms. + */ + private void setPlsql(final String plsql) { + final String lineSep = System.getProperty("line.separator"); + if (!"\n".equals(lineSep)) { + // replace CR/LF with LF on Windows platforms + this.plsql = plsql.replace(lineSep, "\n"); + } else { + this.plsql = plsql; + } + } + + /** + * replace the following expressions with space to simplify + * and improve performance of subsequent regular expressions: + * - multi-line PL/SQL comments + * - single-line PL/SQL comments + * - string literals + * the result is not valid PL/SQL anymore, but good enough + * to find PL/SQL objects and units + */ + private void setPlsqlReduced() { + final StringBuilder sb = new StringBuilder(); + final Pattern p = Pattern.compile("(/\\*(.|[\\n])*?\\*/)|(--[^\\n]*\\n)|(\'([^\']|[\\n])*?\')"); + final Matcher m = p.matcher(plsql); + int pos = 0; + while (m.find()) { + if (pos < m.start()) { + sb.append(plsql.substring(pos, m.start())); + } + for (int i = m.start(); i < m.end(); i++) { + final String c = plsql.substring(i, i + 1); + if ("\n".equals(c) || "\r".equals(c)) { + sb.append(c); + } else { + sb.append(' '); + } + } + pos = m.end(); + } + if (plsql.length() > pos) { + sb.append(plsql.substring(pos, plsql.length())); + } + plsqlReduced=sb.toString(); + } + + private void populateObjects() { + final Pattern p = Pattern.compile( + "(?i)(\\s*)(create(\\s+or\\s+replace)?\\s+(package|type|function|procedure)\\s+(body\\s+)?)([^\\s]+)(\\s+)"); + final Matcher m = p.matcher(plsqlReduced); + while (m.find()) { + final PlsqlObject o = new PlsqlObject(); + o.setType(m.group(4).toUpperCase()); + o.setName(m.group(6)); + o.setPosition(Integer.valueOf(m.start())); + objects.add(o); + } + } + + private void populateUnits() { + final Pattern p = Pattern.compile("(?i)(\\s*)(procedure)(\\s+)([^\\s\\(;]+)"); + final Matcher m = p.matcher(plsqlReduced); + while (m.find()) { + final Unit u = new Unit(); + u.setName(m.group(4)); + u.setPosition(m.start()); + u.setPositionOfName(m.start(4)); + units.add(u); + } + } + + private String getSchema(Connection conn) { + try { + return conn.getSchema(); + } catch (SQLException e) { + throw new GenericDatabaseAccessException("getSchema failed", e); + } + } + + private void processAnnotations(final Connection conn, final String owner) { + this.owner = owner; + if (conn != null) { + final UtplsqlDao dao = new UtplsqlDao(conn); + if (dao.isUtAnnotationManagerInstalled()) { + for (final PlsqlObject o : objects) { + final List segments = Arrays.asList(fixName(o.getName()).split("\\.")); + final String schema = owner != null ? owner : getSchema(conn); + final List annotations = dao.annotations(schema, + segments.get(segments.size() - 1).toUpperCase()); + if (annotations.stream().anyMatch(it -> it.getName().equals("suite"))) { + o.setAnnotations(annotations); + } + } + final ArrayList fixedUnits = new ArrayList<>(); + for (final Unit u : units) { + final PlsqlObject o = getObjectAt(u.getPosition()); + if (o != null && o.getAnnotations() != null + && o.getAnnotations().stream().anyMatch(it -> "test".equals(it.getName()) + && it.getSubobjectName().equalsIgnoreCase(fixName(u.getName())))) { + fixedUnits.add(u); + } + } + units = fixedUnits; + final ArrayList fixedObjects = new ArrayList<>(); + for (final PlsqlObject o : objects) { + if (o.getAnnotations() != null) { + fixedObjects.add(o); + } + } + objects = fixedObjects; + } + } + } + + /** + * gets the PL/SQL object based on the current editor position + * + * @param position + * the absolute position as used in + * {@link JTextComponent#getCaretPosition()} + * @return the PL/SQL object + */ + public PlsqlObject getObjectAt(final int position) { + PlsqlObject obj = null; + for (final PlsqlObject o : objects) { + if (o.getPosition() <= position) { + obj = o; + } + } + return obj; + } + + /** + * converts a line and column to a postion as used in as used in + * {@link JTextComponent#getCaretPosition()} used for testing purposes only + * + * @param line + * the line as used in SQL Developer, starting with 1 + * @param column + * the column as used in SQL Developer, starting with 1 + * @return the position + */ + public int toPosition(final int line, final int column) { + int lines = 0; + for (int i = 0; i < plsql.length(); i++) { + if ("\n".equals(plsql.substring(i, i + 1))) { + lines++; + if (lines == line - 1) { + return i + column; + } + } + } + throw new GenericRuntimeException("Line " + line + " not found."); + } + + private String getUnitNameAt(final int position) { + String name = ""; + for (final Unit u : units) { + if (u.getPosition() <= position) { + name = u.getName(); + } + } + return name; + } + + private String fixName(final String name) { + return name.replace("\"", ""); + } + + public List getObjects() { + return objects; + } + + public List getUnits() { + return units; + } + + /** + * gets the utPLSQL path based on the current editor position + * + * @param position + * the absolute position as used in + * {@link JTextComponent#getCaretPosition()} + * @return the utPLSQL path + */ + public String getPathAt(final int position) { + final StringBuilder sb = new StringBuilder(); + final PlsqlObject object = getObjectAt(position); + if (object != null && "PACKAGE".equals(object.getType())) { + final String unitName = getUnitNameAt(position); + if (owner != null) { + sb.append(owner); + sb.append("."); + } + sb.append(fixName(object.getName())); + if (!unitName.isEmpty()) { + sb.append("."); + sb.append(fixName(unitName)); + } + } + return sb.toString(); + } + + private int getStartLine(final int position) { + int line = 1; + for (int i = 0; i < plsql.length(); i++) { + final String c = plsql.substring(i, i + 1); + if (i > position) { + return line; + } else if ("\n".equals(c)) { + line++; + } + } + return line; + } + + /** + * get the line of a PL/SQL package unit + * + * @param unitName + * name of the unit. Only procedures are supported + * @return the line where the procedure is defined + */ + public int getLineOf(final String unitName) { + for (final Unit u : units) { + if (u.getName().equalsIgnoreCase(unitName)) { + return getStartLine(u.getPositionOfName()); + } + } + return 1; + } +} From e8989c558ab118835ac085fb3d185e05feb341b7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 09:36:16 +0200 Subject: [PATCH 114/286] rename UtplsqlResources.xtend to UtplsqlResources.java --- .../resources/{UtplsqlResources.xtend => UtplsqlResources.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/resources/{UtplsqlResources.xtend => UtplsqlResources.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/resources/UtplsqlResources.xtend b/sqldev/src/main/java/org/utplsql/sqldev/resources/UtplsqlResources.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/resources/UtplsqlResources.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/resources/UtplsqlResources.java From 27a62ccc5998243196ed90c118a18503767338f7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 09:39:47 +0200 Subject: [PATCH 115/286] convert UtplsqlResources to Java --- .../sqldev/resources/UtplsqlResources.java | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/resources/UtplsqlResources.java b/sqldev/src/main/java/org/utplsql/sqldev/resources/UtplsqlResources.java index 07c2534b..1bd9936e 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/resources/UtplsqlResources.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/resources/UtplsqlResources.java @@ -13,40 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.resources +package org.utplsql.sqldev.resources; -import oracle.dbtools.raptor.utils.MessagesBase +import java.awt.Image; -class UtplsqlResources extends MessagesBase { - static final ClassLoader CLASS_LOADER = UtplsqlResources.classLoader - static final String CLASS_NAME = UtplsqlResources.canonicalName - static final UtplsqlResources INSTANCE = new UtplsqlResources() +import javax.swing.Icon; - private new() { - super(CLASS_NAME, CLASS_LOADER) - } +import oracle.dbtools.raptor.utils.MessagesBase; - def static getString(String paramString) { - return INSTANCE.getStringImpl(paramString) - } +public class UtplsqlResources extends MessagesBase { + private static final ClassLoader CLASS_LOADER = UtplsqlResources.class.getClassLoader(); + private static final String CLASS_NAME = UtplsqlResources.class.getCanonicalName(); + private static final UtplsqlResources INSTANCE = new UtplsqlResources(); - def static get(String paramString) { - return getString(paramString) - } + private UtplsqlResources() { + super(CLASS_NAME, CLASS_LOADER); + } - def static getImage(String paramString) { - return INSTANCE.getImageImpl(paramString) - } + public static String getString(final String paramString) { + return INSTANCE.getStringImpl(paramString); + } - def static format(String paramString, Object... paramVarArgs) { - return INSTANCE.formatImpl(paramString, paramVarArgs) - } + public static String get(final String paramString) { + return getString(paramString); + } - def static getIcon(String paramString) { - return INSTANCE.getIconImpl(paramString) - } + public static Image getImage(final String paramString) { + return INSTANCE.getImageImpl(paramString); + } - def static getInteger(String paramString) { - return INSTANCE.getIntegerImpl(paramString) - } -} \ No newline at end of file + public static String format(final String paramString, final Object... paramVarArgs) { + return INSTANCE.formatImpl(paramString, paramVarArgs); + } + + public static Icon getIcon(final String paramString) { + return INSTANCE.getIconImpl(paramString); + } + + public static Integer getInteger(final String paramString) { + return INSTANCE.getIntegerImpl(paramString); + } +} From 91d23e51f23d260401d11c426e297771476bc667 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 10:04:44 +0200 Subject: [PATCH 116/286] rename UtplsqlRunner.xtend to UtplsqlRunner.java --- .../sqldev/runner/{UtplsqlRunner.xtend => UtplsqlRunner.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/runner/{UtplsqlRunner.xtend => UtplsqlRunner.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java From e27f83762862d3b8f380908932f2e513a0c2d7af Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 15:01:21 +0200 Subject: [PATCH 117/286] convert UtplsqlRunner to Java --- .../utplsql/sqldev/runner/UtplsqlRunner.java | 600 ++++++++++-------- 1 file changed, 322 insertions(+), 278 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java index 23eec363..cbbf1458 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java @@ -13,297 +13,341 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.runner +package org.utplsql.sqldev.runner; -import java.awt.Dimension -import java.awt.Toolkit -import java.sql.Connection -import java.text.SimpleDateFormat -import java.util.Date -import java.util.List -import java.util.UUID -import java.util.logging.Logger -import javax.swing.JFrame -import oracle.dbtools.raptor.utils.Connections -import org.utplsql.sqldev.dal.RealtimeReporterDao -import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer -import org.utplsql.sqldev.model.runner.PostRunEvent -import org.utplsql.sqldev.model.runner.PostSuiteEvent -import org.utplsql.sqldev.model.runner.PostTestEvent -import org.utplsql.sqldev.model.runner.PreRunEvent -import org.utplsql.sqldev.model.runner.PreSuiteEvent -import org.utplsql.sqldev.model.runner.PreTestEvent -import org.utplsql.sqldev.model.runner.RealtimeReporterEvent -import org.utplsql.sqldev.model.runner.Run -import org.utplsql.sqldev.resources.UtplsqlResources -import org.utplsql.sqldev.ui.runner.RunnerFactory -import org.utplsql.sqldev.ui.runner.RunnerPanel -import org.utplsql.sqldev.ui.runner.RunnerView +import java.awt.Dimension; +import java.awt.Toolkit; +import java.sql.Connection; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.UUID; +import java.util.logging.Logger; -class UtplsqlRunner implements RealtimeReporterEventConsumer { +import javax.swing.JFrame; - static val Logger logger = Logger.getLogger(UtplsqlRunner.name); +import org.utplsql.sqldev.dal.RealtimeReporterDao; +import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer; +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.runner.PostRunEvent; +import org.utplsql.sqldev.model.runner.PostSuiteEvent; +import org.utplsql.sqldev.model.runner.PostTestEvent; +import org.utplsql.sqldev.model.runner.PreRunEvent; +import org.utplsql.sqldev.model.runner.PreSuiteEvent; +import org.utplsql.sqldev.model.runner.PreTestEvent; +import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; +import org.utplsql.sqldev.model.runner.Run; +import org.utplsql.sqldev.model.runner.Test; +import org.utplsql.sqldev.resources.UtplsqlResources; +import org.utplsql.sqldev.ui.runner.RunnerFactory; +import org.utplsql.sqldev.ui.runner.RunnerPanel; +import org.utplsql.sqldev.ui.runner.RunnerView; - var List pathList - var String connectionName - var Connection producerConn - var Connection consumerConn - val String reporterId = UUID.randomUUID().toString.replace("-", "") - var Run run - var RunnerPanel panel - var Thread producerThread - var Thread consumerThread +import oracle.dbtools.raptor.utils.Connections; +import oracle.javatools.db.DBException; +import oracle.jdeveloper.db.ConnectionException; - new(List pathList, String connectionName) { - this.pathList = pathList - setConnection(connectionName) - } +public class UtplsqlRunner implements RealtimeReporterEventConsumer { + private static final Logger logger = Logger.getLogger(UtplsqlRunner.class.getName()); - /** - * this constructor is intended for tests only - */ - new(List pathList, Connection producerConn, Connection consumerConn) { - this.pathList = pathList - this.producerConn = producerConn - this.consumerConn = consumerConn - } + private List pathList; + private String connectionName; + private Connection producerConn; + private Connection consumerConn; + private final String reporterId = UUID.randomUUID().toString().replace("-", ""); + private Run run; + private RunnerPanel panel; + private Thread producerThread; + private Thread consumerThread; - private def setConnection(String connectionName) { - if (connectionName === null) { - throw new RuntimeException("Cannot initialize a RealtimeConsumer without a ConnectionName") - } else { - this.producerConn = Connections.instance.cloneConnection(Connections.instance.getConnection(connectionName)) - this.consumerConn = Connections.instance.cloneConnection(Connections.instance.getConnection(connectionName)) - } - this.connectionName = connectionName - } - - def dispose() { - // running in SQL Developer - if (!producerConn.closed) { - producerConn.close; - } - if (!consumerConn.closed) { - consumerConn.close; - } - } - - override void process(RealtimeReporterEvent event) { - logger.fine(event.toString) - event.doProcess - } - - private def getSysdate() { - val dateTime = new Date(System.currentTimeMillis); - val df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'000'"); - return df.format(dateTime) - - } - - private def initRun() { - run = new Run(reporterId, connectionName, pathList) - run.startTime = sysdate - run.counter.disabled = 0 - run.counter.success = 0 - run.counter.failure = 0 - run.counter.error = 0 - run.counter.warning = 0 - run.infoCount = 0 - run.totalNumberOfTests = -1 - run.currentTestNumber = 0 - run.status = UtplsqlResources.getString("RUNNER_INITIALIZING_TEXT") - panel.model = run - panel.update(reporterId) - } - - private def dispatch doProcess(PreRunEvent event) { - run.totalNumberOfTests = event.totalNumberOfTests - run.put(event.items) - run.status = UtplsqlResources.getString("RUNNER_RUNNING_TEXT") - panel.update(reporterId) - } + public UtplsqlRunner(final List pathList, final String connectionName) { + this.pathList = pathList; + setConnection(connectionName); + } - private def dispatch doProcess(PostRunEvent event) { - run.startTime = event.startTime - run.endTime = event.endTime - run.executionTime = event.executionTime - run.errorStack = event.errorStack - run.serverOutput = event.serverOutput - run.status = UtplsqlResources.getString("RUNNER_FINNISHED_TEXT") - panel.update(reporterId) - } - - private def dispatch doProcess(PreSuiteEvent event) { - // ignore - } - - private def dispatch doProcess(PostSuiteEvent event) { - val test = run.currentTest - // Errors on suite levels are reported as warnings by the utPLSQL framework, - // since an error on suite level does not affect a status of a test. - // It is possible that the test is OK, but contains error messages on suite level(s) - // Populating test.errorStack would be a) wrong and b) redundant - if (event.warnings !== null) { - if (test.counter.warning == 0) { - test.counter.warning = 1 - run.counter.warning = run.counter.warning + 1 - } - test.warnings = ''' - «IF test.warnings !== null» - «test.warnings» + /** + * this constructor is intended for tests only + */ + public UtplsqlRunner(final List pathList, final Connection producerConn, final Connection consumerConn) { + this.pathList = pathList; + this.producerConn = producerConn; + this.consumerConn = consumerConn; + } - «ENDIF» - For suite «event.id»: + private void setConnection(final String connectionName) { + if (connectionName == null) { + throw new NullPointerException("Cannot initialize a RealtimeConsumer without a ConnectionName"); + } else { + try { + producerConn = Connections.getInstance() + .cloneConnection(Connections.getInstance().getConnection(connectionName)); + consumerConn = Connections.getInstance() + .cloneConnection(Connections.getInstance().getConnection(connectionName)); + } catch (ConnectionException | DBException e) { + final String msg = "Error creating producer and consumer connections due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); + } + } + this.connectionName = connectionName; + } + + private void closeConnection(Connection conn) { + try { + if (!conn.isClosed()) { + conn.close(); + } + } catch (SQLException e) { + logger.warning(() -> "could not close connection"); + } + } - «event.warnings» - '''.toString.trim - } - if (event.serverOutput !== null) { - if (test.serverOutput === null) { - run.infoCount = run.infoCount + 1 - } - test.serverOutput = ''' - «IF test.serverOutput !== null» - «test.serverOutput» + public void dispose() { + // running in SQL Developer + closeConnection(producerConn); + closeConnection(consumerConn); + } - «ENDIF» - For suite «event.id»: + @Override + public void process(final RealtimeReporterEvent event) { + logger.fine(() -> event.toString()); + // dynamic dispatching code originally generated by Xtend + if (event instanceof PostRunEvent) { + doProcess((PostRunEvent) event); + } else if (event instanceof PostSuiteEvent) { + doProcess((PostSuiteEvent) event); + } else if (event instanceof PostTestEvent) { + doProcess((PostTestEvent) event); + } else if (event instanceof PreRunEvent) { + doProcess((PreRunEvent) event); + } else if (event instanceof PreSuiteEvent) { + doProcess((PreSuiteEvent) event); + } else if (event instanceof PreTestEvent) { + doProcess((PreTestEvent) event); + } else { + throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.asList(event).toString()); + } + } - «event.serverOutput» - '''.toString.trim - } - panel.update(reporterId) - } - - private def dispatch doProcess(PreTestEvent event) { - val test = run.getTest(event.id) - if (test === null) { - logger.severe('''Could not find test id "«event.id»" when processing PreTestEvent «event.toString».''') - } else { - test.startTime = sysdate - } - run.status = '''«event.id»...''' - run.currentTestNumber = event.testNumber - run.currentTest = test - panel.update(reporterId) - } + private String getSysdate() { + final Date dateTime = new Date(System.currentTimeMillis()); + final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'000'"); + return df.format(dateTime); + } - private def dispatch doProcess(PostTestEvent event) { - val test = run.getTest(event.id) - if (test === null) { - logger.severe('''Could not find test id "«event.id»"" when processing PostTestEvent «event.toString».''') - } else { - test.startTime = event.startTime - test.endTime = event.endTime - test.executionTime = event.executionTime - test.counter = event.counter - test.errorStack = event.errorStack - test.serverOutput = event.serverOutput - if (test.serverOutput !== null) { - run.infoCount = run.infoCount + 1 - } - test.failedExpectations = event.failedExpectations - test.warnings = event.warnings - if (test.warnings !== null) { - // it does not matter how many rows are used by utPLSQL to store a warning event - test.counter.warning = 1 - } else { - test.counter.warning = 0 - } - } - run.counter.disabled = run.counter.disabled + event.counter.disabled - run.counter.success = run.counter.success + event.counter.success - run.counter.failure = run.counter.failure + event.counter.failure - run.counter.error = run.counter.error + event.counter.error - run.counter.warning = run.counter.warning + test.counter.warning - panel.update(reporterId) - } + private void initRun() { + run = new Run(reporterId, connectionName, pathList); + run.setStartTime(getSysdate()); + run.getCounter().setDisabled(0); + run.getCounter().setSuccess(0); + run.getCounter().setFailure(0); + run.getCounter().setError(0); + run.getCounter().setWarning(0); + run.setInfoCount(0); + run.setTotalNumberOfTests(-1); + run.setCurrentTestNumber(0); + run.setStatus(UtplsqlResources.getString("RUNNER_INITIALIZING_TEXT")); + panel.setModel(run); + panel.update(reporterId); + } + + private Object doProcess(final PreRunEvent event) { + run.setTotalNumberOfTests(event.getTotalNumberOfTests()); + run.put(event.getItems()); + run.setStatus(UtplsqlResources.getString("RUNNER_RUNNING_TEXT")); + panel.update(reporterId); + return null; + } - private def void produce() { - try { - logger.fine('''Running utPLSQL tests and producing events via reporter id «reporterId»...''') - val dao = new RealtimeReporterDao(producerConn) - dao.produceReport(reporterId, pathList) - logger.fine('''All events produced for reporter id «reporterId».''') - } catch (Exception e) { - logger.severe('''Error while producing events for reporter id «reporterId»: «e?.message»''') - } - } + private Object doProcess(final PostRunEvent event) { + run.setStartTime(event.getStartTime()); + run.setEndTime(event.getEndTime()); + run.setExecutionTime(event.getExecutionTime()); + run.setErrorStack(event.getErrorStack()); + run.setServerOutput(event.getServerOutput()); + run.setStatus(UtplsqlResources.getString("RUNNER_FINNISHED_TEXT")); + panel.update(reporterId); + return null; + } - private def void consume() { - try { - logger.fine('''Consuming events from reporter id «reporterId» in realtime...''') - val dao = new RealtimeReporterDao(consumerConn) - dao.consumeReport(reporterId, this) - logger.fine('''All events consumed.''') - } catch (Exception e) { - logger.severe('''Error while consuming events for reporter id «reporterId»: «e?.message»''') - } - if (run.totalNumberOfTests < 0) { - run.status = UtplsqlResources.getString("RUNNER_NO_TESTS_FOUND_TEXT") - run.executionTime = new Double(System.currentTimeMillis - run.start)/1000 - run.endTime = sysdate - run.totalNumberOfTests = 0 - panel.update(reporterId) - } - if (isRunningInSqlDeveloper) { - dispose - } - } - - private def isRunningInSqlDeveloper() { - return connectionName !== null - } - - private def initGUI() { - var RunnerView dockable = null - if (runningInSqlDeveloper && (dockable = RunnerFactory.dockable) === null) { - logger.severe('''Error getting utPLSQL dockable. Cannot run utPLSQL test.''') - return false - } else { - if (runningInSqlDeveloper) { - RunnerFactory.showDockable; - panel = dockable.runnerPanel - } else { - val frame = new JFrame("utPLSQL Runner Panel") - frame.defaultCloseOperation = JFrame.EXIT_ON_CLOSE; - panel = new RunnerPanel - frame.add(panel.getGUI) - frame.preferredSize = new Dimension(600, 800) - frame.pack - val dim = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2); - frame.setVisible(true) - } - initRun - } - return true - } - - def runTestAsync() { - // start tests when the GUI has been successfully initialized. - if (initGUI) { - // the consumer - val Runnable consumer = [|consume] - consumerThread = new Thread(consumer) - consumerThread.name = "realtime consumer" - consumerThread.start - // avoid concurrency on output header table to fix issue #80 - Thread.sleep(100) - // the producer - val Runnable producer = [|produce] - producerThread = new Thread(producer) - producerThread.name = "realtime producer" - producerThread.start - } - } - - def getProducerThread() { - return producerThread - } - - def getConsumerThread() { - return consumerThread - } - + private void doProcess(final PreSuiteEvent event) { + // ignore + } + + private void doProcess(final PostSuiteEvent event) { + final Test test = run.getCurrentTest(); + // Errors on suite levels are reported as warnings by the utPLSQL framework, + // since an error on suite level does not affect a status of a test. + // It is possible that the test is OK, but contains error messages on suite level(s) + // Populating test.errorStack would be a) wrong and b) redundant + if (event.getWarnings() != null) { + if (test.getCounter().getWarning() == 0) { + test.getCounter().setWarning(1); + test.getCounter().setWarning(run.getCounter().getWarning() + 1); + } + StringBuilder sb = new StringBuilder(); + if (test.getWarnings() != null) { + sb.append(test.getWarnings()); + sb.append("\n\n"); + } + sb.append("For suite "); + sb.append(event.getId()); + sb.append(":\n\n"); + sb.append(event.getWarnings()); + test.setWarnings(sb.toString()); + } + if (event.getServerOutput() != null) { + if (test.getServerOutput() == null) { + run.setInfoCount(run.getInfoCount() + 1); + } + StringBuilder sb = new StringBuilder(); + if (test.getServerOutput() != null) { + sb.append(test.getServerOutput()); + sb.append("\n\n"); + } + sb.append("For suite "); + sb.append(event.getId()); + sb.append(":\n\n"); + sb.append(event.getServerOutput()); + test.setServerOutput(sb.toString()); + } + panel.update(reporterId); + } + + private void doProcess(final PreTestEvent event) { + final Test test = run.getTest(event.getId()); + if (test == null) { + logger.severe(() -> "Could not find test id \"" + event.getId() + "\" when processing PreTestEvent " + + event.toString() + "."); + } else { + test.setStartTime(getSysdate()); + } + run.setStatus(event.getId() + "..."); + run.setCurrentTestNumber(event.getTestNumber()); + run.setCurrentTest(test); + panel.update(reporterId); + } + + private void doProcess(final PostTestEvent event) { + final Test test = run.getTest(event.getId()); + if (test == null) { + logger.severe(() -> "Could not find test id \"" + event.getId() + "\" when processing PostTestEvent " + + event.toString() + "."); + } else { + test.setStartTime(event.getStartTime()); + test.setEndTime(event.getEndTime()); + test.setExecutionTime(event.getExecutionTime()); + test.setCounter(event.getCounter()); + test.setErrorStack(event.getErrorStack()); + test.setServerOutput(event.getServerOutput()); + if (test.getServerOutput() != null) { + run.setInfoCount(run.getInfoCount() + 1); + } + test.setFailedExpectations(event.getFailedExpectations()); + test.setWarnings(event.getWarnings()); + if (test.getWarnings() != null) { + test.getCounter().setWarning(1); + } else { + test.getCounter().setWarning(0); + } + run.getCounter().setWarning(run.getCounter().getWarning() + test.getCounter().getWarning()); + } + run.getCounter().setDisabled(run.getCounter().getDisabled() + event.getCounter().getDisabled()); + run.getCounter().setSuccess(run.getCounter().getSuccess() + event.getCounter().getSuccess()); + run.getCounter().setFailure(run.getCounter().getFailure() + event.getCounter().getFailure()); + run.getCounter().setError(run.getCounter().getError() + event.getCounter().getError()); + panel.update(reporterId); + } + + private void produce() { + try { + logger.fine(() -> "Running utPLSQL tests and producing events via reporter id " + reporterId + "..."); + final RealtimeReporterDao dao = new RealtimeReporterDao(producerConn); + dao.produceReport(reporterId, pathList); + logger.fine(() -> "All events produced for reporter id " + reporterId + "."); + } catch (Exception e) { + logger.severe(() -> "Error while producing events for reporter id " + reporterId + ": " + e != null ? e.getMessage() : ""); + } + } + + private void consume() { + try { + logger.fine(() -> "Consuming events from reporter id " + reporterId + " in realtime..."); + final RealtimeReporterDao dao = new RealtimeReporterDao(consumerConn); + dao.consumeReport(reporterId, this); + logger.fine(() -> "All events consumed."); + } catch (final Exception e) { + logger.severe(() -> "Error while consuming events for reporter id " + reporterId + ": " + e != null ? e.getMessage() : ""); + } + if (run.getTotalNumberOfTests() < 0) { + run.setStatus(UtplsqlResources.getString("RUNNER_NO_TESTS_FOUND_TEXT")); + run.setExecutionTime(new Double(System.currentTimeMillis() - run.getStart()) / 1000); + run.setEndTime(getSysdate()); + run.setTotalNumberOfTests(0); + panel.update(reporterId); + } + if (isRunningInSqlDeveloper()) { + dispose(); + } + } + + private boolean isRunningInSqlDeveloper() { + return (connectionName != null); + } + + private boolean initGUI() { + RunnerView dockable = null; + if (isRunningInSqlDeveloper() && (dockable = RunnerFactory.getDockable()) == null) { + logger.severe(() -> "Error getting utPLSQL dockable. Cannot run utPLSQL test."); + return false; + } else { + if (isRunningInSqlDeveloper() && dockable != null) { + RunnerFactory.showDockable(); + panel = dockable.getRunnerPanel(); + } else { + final JFrame frame = new JFrame("utPLSQL Runner Panel"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + panel = new RunnerPanel(); + frame.add(panel.getGUI()); + frame.setPreferredSize(new Dimension(600, 800)); + frame.pack(); + final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setLocation(dim.width / 2 - frame.getSize().width / 2, + dim.height / 2 - frame.getSize().height / 2); + frame.setVisible(true); + } + initRun(); + return true; + } + } + + public void runTestAsync() { + // start tests when the GUI has been successfully initialized. + if (initGUI()) { + // the consumer + consumerThread = new Thread(() -> consume()); + consumerThread.setName("realtime consumer"); + consumerThread.start(); + // avoid concurrency on output header table to fix issue #80 + try { + Thread.sleep(100); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + // the producer + producerThread = new Thread(() -> produce()); + producerThread.setName("realtime producer"); + producerThread.start(); + } + } + + public Thread getProducerThread() { + return producerThread; + } + + public Thread getConsumerThread() { + return consumerThread; + } } From 36934be845a02024e617147c2df34d672c8e0351 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 15:12:01 +0200 Subject: [PATCH 118/286] use Double.valueOf() instead of new Double() --- .../src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java index cbbf1458..1bd22da8 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java @@ -283,7 +283,7 @@ private void consume() { } if (run.getTotalNumberOfTests() < 0) { run.setStatus(UtplsqlResources.getString("RUNNER_NO_TESTS_FOUND_TEXT")); - run.setExecutionTime(new Double(System.currentTimeMillis() - run.getStart()) / 1000); + run.setExecutionTime(Double.valueOf(System.currentTimeMillis() - Double.valueOf(run.getStart())) / 1000); run.setEndTime(getSysdate()); run.setTotalNumberOfTests(0); panel.update(reporterId); From 2bccdc7d710d19ec0ecef908aabc1b4fb55ee235 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 15:14:23 +0200 Subject: [PATCH 119/286] rename UtplsqlWorksheetRunner.xtend to UtplsqlWorksheetRunner.java --- .../{UtplsqlWorksheetRunner.xtend => UtplsqlWorksheetRunner.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/runner/{UtplsqlWorksheetRunner.xtend => UtplsqlWorksheetRunner.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.xtend b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java From 83704785129bc92d16b1b104ee4a34706b904766 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 16:36:22 +0200 Subject: [PATCH 120/286] convert UtplsqlWorksheetRunner to Java --- .../sqldev/runner/UtplsqlWorksheetRunner.java | 239 ++++++++++-------- 1 file changed, 139 insertions(+), 100 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java index bd03229a..7b492e52 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java @@ -13,116 +13,155 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.runner +package org.utplsql.sqldev.runner; -import java.util.List -import java.util.logging.Logger -import javax.swing.JSplitPane -import oracle.dbtools.raptor.utils.Connections -import oracle.dbtools.worksheet.editor.OpenWorksheetWizard -import oracle.dbtools.worksheet.editor.Worksheet -import oracle.dbtools.worksheet.utils.WorksheetUtil -import oracle.ide.Ide -import oracle.ide.config.Preferences -import oracle.ide.controller.IdeAction -import org.utplsql.sqldev.model.preference.PreferenceModel -import org.utplsql.sqldev.resources.UtplsqlResources +import java.awt.Container; +import java.util.List; +import java.util.logging.Logger; -class UtplsqlWorksheetRunner { - static val Logger logger = Logger.getLogger(UtplsqlWorksheetRunner.name); +import javax.swing.JSplitPane; - var PreferenceModel preferences - var String connectionName - var List pathList +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.StringTools; +import org.utplsql.sqldev.model.preference.PreferenceModel; +import org.utplsql.sqldev.resources.UtplsqlResources; - new(List pathList, String connectionName) { - this.pathList = pathList - this.preferences = PreferenceModel.getInstance(Preferences.preferences); - setConnection(connectionName) - } +import oracle.dbtools.raptor.utils.Connections; +import oracle.dbtools.worksheet.WorksheetResultPanel; +import oracle.dbtools.worksheet.editor.OpenWorksheetWizard; +import oracle.dbtools.worksheet.editor.Worksheet; +import oracle.dbtools.worksheet.utils.WorksheetUtil; +import oracle.ide.Ide; +import oracle.ide.config.Preferences; +import oracle.ide.controller.IdeAction; +import oracle.jdeveloper.db.ConnectionException; - private def setConnection(String connectionName) { - if (connectionName !== null && preferences.unsharedWorksheet) { - // fix for issue #47 - private connections are not closed in SQLDev >= 17.4.0 - try { - // temporary connection is closed when worksheet is closed, but requires SQLDev >= 17.4.0 - this.connectionName = Connections.instance.createTemporaryConnection(connectionName) - } catch (Throwable e) { - // private connection is closed when worksheet is closed in SQLDev < 17.4.0 - this.connectionName = Connections.instance.createPrivateConnection(connectionName) - } - } else { - this.connectionName = connectionName; - } - } - - private def getCode() ''' - «IF preferences.resetPackage» - EXECUTE dbms_session.reset_package; - «ENDIF» - SET SERVEROUTPUT ON SIZE UNLIMITED - «IF preferences.clearScreen» - CLEAR SCREEN - «ENDIF» - «val paths = pathList» - «IF paths.size == 1» - EXECUTE ut.run('«paths.get(0)»'); - «ELSE» - EXECUTE ut.run(ut_varchar2_list(«FOR path : paths SEPARATOR ', '»'«path»'«ENDFOR»)); - «ENDIF» - ''' +public class UtplsqlWorksheetRunner { + private static final Logger logger = Logger.getLogger(UtplsqlWorksheetRunner.class.getName()); - private def openWorksheet() { - val worksheet = OpenWorksheetWizard.openNewTempWorksheet(connectionName, code.toString) as Worksheet - if (connectionName === null) { - worksheet.comboConnection = null - } - WorksheetUtil.setWorksheetTabName(worksheet.context.node.URL, UtplsqlResources.getString("WORKSHEET_TITLE")) - worksheet.context.node.markDirty(false) - return worksheet - } + private PreferenceModel preferences; + private String connectionName; + private List pathList; - private def resizeResultPanel(Worksheet worksheet) { - Thread.sleep(200) // give script runner time to initiate result panel - val splitPane = worksheet.selectedResultPanel?.GUI?.parent?.parent?.parent - if (splitPane instanceof JSplitPane) { - splitPane.dividerLocation = 0.15 // 15% for Worksheet, 85% for Script Output - } else { - logger. - severe('''Could not adjust size of worksheet. Expected JSplitPane but got «splitPane?.class?.name».''') - } - } + public UtplsqlWorksheetRunner(final List pathList, final String connectionName) { + this.pathList = pathList; + preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + setConnection(connectionName); + } - private def runScript(Worksheet worksheet) { - if (preferences.autoExecute) { - Thread.sleep(100) // give worksheet time to initialize - val action = Ide.getIdeActionMap.get(Ide.findCmdID("Worksheet.RunScript")) as IdeAction - if (action !== null) { - action.performAction(worksheet.context) - worksheet.resizeResultPanel - } - } - } + private void setConnection(final String connectionName) { + if (connectionName != null && preferences.isUnsharedWorksheet()) { + // fix for issue #47 - private connections are not closed in SQLDev >= 17.4.0 + try { + this.connectionName = Connections.getInstance().createTemporaryConnection(connectionName); + } catch (Throwable t) { + // private connection is closed when worksheet is closed in SQLDev < 17.4.0 + try { + this.connectionName = Connections.getInstance().createPrivateConnection(connectionName); + } catch (ConnectionException e) { + final String msg = "failed to create private connection due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); + } + } + } else { + this.connectionName = connectionName; + } + } - private def runTest() { - val worksheet = openWorksheet - worksheet.runScript - logger.fine('''utPLSQL test called for «pathList» in «connectionName».''') - } + private CharSequence getCode() { + StringBuilder sb = new StringBuilder(); + if (preferences.isResetPackage()) { + sb.append("EXECUTE dbms_session.reset_package;\n"); + } + sb.append("SET SERVEROUTPUT ON SIZE UNLIMITED\n"); + if (preferences.isClearScreen()) { + sb.append("CLEAR SCREEN\n"); + } + final List paths = pathList; + if (paths.size() == 1) { + sb.append("EXECUTE ut.run('"); + sb.append(paths.get(0)); + sb.append("');\n"); + } else { + // we want a horizontal dense output because we resize the worksheet to fit the command in common cases + sb.append("EXECUTE ut.run(ut_varchar2_list("); + sb.append(StringTools.getCSV(pathList, "").replace("\n","")); + sb.append("));\n"); + } + return sb; + } - def runTestAsync() { - val Runnable runnable = [|runTest] - val thread = new Thread(runnable) - thread.name = "utPLSQL run test" - thread.start - } + private Worksheet openWorksheet() { + final Worksheet worksheet = (Worksheet) OpenWorksheetWizard.openNewTempWorksheet(connectionName, + getCode().toString()); + if (connectionName == null) { + worksheet.setComboConnection(null); + } + WorksheetUtil.setWorksheetTabName(worksheet.getContext().getNode().getURL(), + UtplsqlResources.getString("WORKSHEET_TITLE")); + worksheet.getContext().getNode().markDirty(false); + return worksheet; + } + + private void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } - static def void openWithCode(String code, String connectionName) { - val worksheet = OpenWorksheetWizard.openNewTempWorksheet(connectionName, code) as Worksheet - if (connectionName === null) { - worksheet.comboConnection = null - } - WorksheetUtil.setWorksheetTabName(worksheet.context.node.URL, UtplsqlResources.getString("WORKSHEET_TITLE")) - } + private void resizeResultPanel(final Worksheet worksheet) { + sleep(200); + Container splitPane = null; + WorksheetResultPanel selectedResultPanel = worksheet.getSelectedResultPanel(); + if (selectedResultPanel != null && selectedResultPanel.getGUI() != null && selectedResultPanel.getGUI().getParent() != null + && selectedResultPanel.getGUI().getParent().getParent() != null && selectedResultPanel.getGUI().getParent().getParent().getParent() != null) { + splitPane = selectedResultPanel.getGUI().getParent().getParent().getParent(); + } + if ((splitPane instanceof JSplitPane)) { + ((JSplitPane) splitPane).setDividerLocation(0.15); + } else { + final String msg = "Could not adjust size of worksheet. Expected JSplitPane but got " + + (splitPane != null ? splitPane.getClass().getName() : "null") + "."; + logger.severe(msg); + } + } + private void runScript(final Worksheet worksheet) { + if (preferences.isAutoExecute()) { + sleep(100); + final IdeAction action = ((IdeAction) Ide.getIdeActionMap().get(Ide.findCmdID("Worksheet.RunScript"))); + if ((action != null)) { + try { + action.performAction(worksheet.getContext()); + } catch (Exception e) { + logger.severe(() -> "Could not run script due to " + (e != null ? e.getMessage() : "???") + "."); + } + resizeResultPanel(worksheet); + } + } + } + + private void runTest() { + final Worksheet worksheet = openWorksheet(); + runScript(worksheet); + logger.fine(() -> "utPLSQL test called for " + pathList + " in " + connectionName + "."); + } + + public void runTestAsync() { + final Thread thread = new Thread(() -> runTest()); + thread.setName("utPLSQL run test"); + thread.start(); + } + + public static void openWithCode(final String code, final String connectionName) { + final Worksheet worksheet = (Worksheet) OpenWorksheetWizard.openNewTempWorksheet(connectionName, code); + if (connectionName == null) { + worksheet.setComboConnection(null); + } + WorksheetUtil.setWorksheetTabName(worksheet.getContext().getNode().getURL(), + UtplsqlResources.getString("WORKSHEET_TITLE")); + } } From 7287089c581b394081f62a488b56477c9729cbaa Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 16:37:02 +0200 Subject: [PATCH 121/286] end message with period --- .../main/java/org/utplsql/sqldev/menu/UtplsqlController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java index 6da01c2f..01b4cea5 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java @@ -92,7 +92,7 @@ public boolean handleEvent(final IdeAction action, final Context context) { return true; } } catch (Exception e) { - final String msg = "Failed to handle event due to exception " + e != null ? e.getMessage() : ""; + final String msg = "Failed to handle event due to exception " + (e != null ? e.getMessage() : "") + "."; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } From e9fc29c6565f6af8f49a76be6d61d147603656a9 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 16:38:25 +0200 Subject: [PATCH 122/286] add parenthesis to conditional expression and format log messages --- .../main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java index 1bd22da8..54c61635 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java @@ -268,7 +268,8 @@ private void produce() { dao.produceReport(reporterId, pathList); logger.fine(() -> "All events produced for reporter id " + reporterId + "."); } catch (Exception e) { - logger.severe(() -> "Error while producing events for reporter id " + reporterId + ": " + e != null ? e.getMessage() : ""); + logger.severe(() -> "Error while producing events for reporter id " + reporterId + ": " + + (e != null ? e.getMessage() : "")); } } @@ -279,7 +280,8 @@ private void consume() { dao.consumeReport(reporterId, this); logger.fine(() -> "All events consumed."); } catch (final Exception e) { - logger.severe(() -> "Error while consuming events for reporter id " + reporterId + ": " + e != null ? e.getMessage() : ""); + logger.severe(() -> "Error while consuming events for reporter id " + reporterId + ": " + + (e != null ? e.getMessage() : "")); } if (run.getTotalNumberOfTests() < 0) { run.setStatus(UtplsqlResources.getString("RUNNER_NO_TESTS_FOUND_TEXT")); From 00f59dd31d196a76ee1e1ca45531a850ac51bf81 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 16:51:40 +0200 Subject: [PATCH 123/286] rename SnippetMerger.xtend to SnippetMerger.java --- .../sqldev/snippet/{SnippetMerger.xtend => SnippetMerger.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/snippet/{SnippetMerger.xtend => SnippetMerger.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.xtend b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java From 1909da414878939d61bba40eacee167d0792ddcd Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 16:52:33 +0200 Subject: [PATCH 124/286] add SnippetMerger.java generated by Xtend 2.20.0 --- .../utplsql/sqldev/snippet/SnippetMerger.java | 197 +++++++++++------- 1 file changed, 123 insertions(+), 74 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java index af3a7bb7..9ae4828b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,78 +13,127 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.snippet +package org.utplsql.sqldev.snippet; -import java.io.BufferedReader -import java.io.File -import java.io.IOException -import java.io.InputStreamReader -import java.io.StringReader -import java.nio.charset.Charset -import java.nio.file.Files -import java.nio.file.Paths -import java.util.stream.Collectors -import javax.xml.parsers.DocumentBuilderFactory -import oracle.dbtools.util.Resource -import org.utplsql.sqldev.model.XMLTools -import org.xml.sax.InputSource +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Collectors; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import oracle.dbtools.util.Resource; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.ExclusiveRange; +import org.eclipse.xtext.xbase.lib.Extension; +import org.utplsql.sqldev.model.XMLTools; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; -class SnippetMerger { - val extension XMLTools xmlTools = new XMLTools - File userSnippetsFile - String utplsqlSnippets - - def getUtplsqlSnippetsAsString() throws IOException { - val stream = class.getResourceAsStream("/org/utplsql/sqldev/resources/UtplsqlSnippets.xml") - val reader = new BufferedReader(new InputStreamReader(stream, Charset.defaultCharset)) - return reader.lines.collect(Collectors.joining(System.lineSeparator)) - } - - new() { - // works in SQL Developer only, otherwise a ExceptionInInitializerError is thrown - this (new File(Resource.RAPTOR_USER.absolutePath + File.separator + "UserSnippets.xml")) - } - - new(File file) { - utplsqlSnippets = utplsqlSnippetsAsString - userSnippetsFile = file - } - - def merge() { - var String result - if (userSnippetsFile.exists) { - // file exists, proper merge required - val userSnippets = new String(Files.readAllBytes(Paths.get(userSnippetsFile.absolutePath))) - val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder() - val userSnippetsDoc = docBuilder.parse(new InputSource(new StringReader(userSnippets))) - val userSnippetsGroups = userSnippetsDoc.getNodeList('''/snippets/group[not(@category="utPLSQL Annotations" or @category="utPLSQL Expectations")]''') - val utplsqlSnippetsDoc = docBuilder.parse(new InputSource(new StringReader(utplsqlSnippets))) - val utplsqlSnippetsGroups = utplsqlSnippetsDoc.getNodeList('''/snippets/group''') - result = ''' - - - «FOR i : 0 ..< userSnippetsGroups.length» - «userSnippetsGroups.item(i).nodeToString("code")» - «ENDFOR» - «FOR i : 0 ..< utplsqlSnippetsGroups.length» - «utplsqlSnippetsGroups.item(i).nodeToString("code")» - «ENDFOR» - - ''' - } else { - // just copy - result = utplsqlSnippets - - } - Files.write(Paths.get(userSnippetsFile.absolutePath), result.bytes) - } - - def getTemplate() { - return utplsqlSnippets - } - - def getFile() { - return userSnippetsFile - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class SnippetMerger { + @Extension + private final XMLTools xmlTools = new XMLTools(); + + private File userSnippetsFile; + + private String utplsqlSnippets; + + public String getUtplsqlSnippetsAsString() throws IOException { + final InputStream stream = this.getClass().getResourceAsStream("/org/utplsql/sqldev/resources/UtplsqlSnippets.xml"); + Charset _defaultCharset = Charset.defaultCharset(); + InputStreamReader _inputStreamReader = new InputStreamReader(stream, _defaultCharset); + final BufferedReader reader = new BufferedReader(_inputStreamReader); + return reader.lines().collect(Collectors.joining(System.lineSeparator())); + } + + public SnippetMerger() { + this(new File(((Resource.RAPTOR_USER.getAbsolutePath() + File.separator) + "UserSnippets.xml"))); + } + + public SnippetMerger(final File file) { + try { + this.utplsqlSnippets = this.getUtplsqlSnippetsAsString(); + this.userSnippetsFile = file; + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + public Path merge() { + try { + Path _xblockexpression = null; + { + String result = null; + boolean _exists = this.userSnippetsFile.exists(); + if (_exists) { + byte[] _readAllBytes = Files.readAllBytes(Paths.get(this.userSnippetsFile.getAbsolutePath())); + final String userSnippets = new String(_readAllBytes); + final DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + StringReader _stringReader = new StringReader(userSnippets); + InputSource _inputSource = new InputSource(_stringReader); + final Document userSnippetsDoc = docBuilder.parse(_inputSource); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("/snippets/group[not(@category=\"utPLSQL Annotations\" or @category=\"utPLSQL Expectations\")]"); + final NodeList userSnippetsGroups = this.xmlTools.getNodeList(userSnippetsDoc, _builder.toString()); + StringReader _stringReader_1 = new StringReader(this.utplsqlSnippets); + InputSource _inputSource_1 = new InputSource(_stringReader_1); + final Document utplsqlSnippetsDoc = docBuilder.parse(_inputSource_1); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("/snippets/group"); + final NodeList utplsqlSnippetsGroups = this.xmlTools.getNodeList(utplsqlSnippetsDoc, _builder_1.toString()); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append(""); + _builder_2.newLine(); + _builder_2.append(""); + _builder_2.newLine(); + { + int _length = userSnippetsGroups.getLength(); + ExclusiveRange _doubleDotLessThan = new ExclusiveRange(0, _length, true); + for(final Integer i : _doubleDotLessThan) { + _builder_2.append(" "); + String _nodeToString = this.xmlTools.nodeToString(userSnippetsGroups.item((i).intValue()), "code"); + _builder_2.append(_nodeToString, " "); + _builder_2.newLineIfNotEmpty(); + } + } + { + int _length_1 = utplsqlSnippetsGroups.getLength(); + ExclusiveRange _doubleDotLessThan_1 = new ExclusiveRange(0, _length_1, true); + for(final Integer i_1 : _doubleDotLessThan_1) { + _builder_2.append(" "); + String _nodeToString_1 = this.xmlTools.nodeToString(utplsqlSnippetsGroups.item((i_1).intValue()), "code"); + _builder_2.append(_nodeToString_1, " "); + _builder_2.newLineIfNotEmpty(); + } + } + _builder_2.append(""); + _builder_2.newLine(); + result = _builder_2.toString(); + } else { + result = this.utplsqlSnippets; + } + _xblockexpression = Files.write(Paths.get(this.userSnippetsFile.getAbsolutePath()), result.getBytes()); + } + return _xblockexpression; + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + public String getTemplate() { + return this.utplsqlSnippets; + } + + public File getFile() { + return this.userSnippetsFile; + } +} From 3c8305201d1ab1bf8a810e79edc198693fca1308 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Tue, 26 May 2020 21:28:54 +0200 Subject: [PATCH 125/286] convert SnippetMerger to Java, removing Xtend dependencies --- .../utplsql/sqldev/snippet/SnippetMerger.java | 204 +++++++++--------- 1 file changed, 108 insertions(+), 96 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java index 9ae4828b..f3873b20 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,115 +25,127 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.logging.Logger; import java.util.stream.Collectors; + +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import oracle.dbtools.util.Resource; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.ExclusiveRange; -import org.eclipse.xtext.xbase.lib.Extension; +import javax.xml.parsers.ParserConfigurationException; + +import org.utplsql.sqldev.exception.GenericRuntimeException; import org.utplsql.sqldev.model.XMLTools; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import oracle.dbtools.util.Resource; -@SuppressWarnings("all") public class SnippetMerger { - @Extension - private final XMLTools xmlTools = new XMLTools(); - - private File userSnippetsFile; - - private String utplsqlSnippets; - - public String getUtplsqlSnippetsAsString() throws IOException { - final InputStream stream = this.getClass().getResourceAsStream("/org/utplsql/sqldev/resources/UtplsqlSnippets.xml"); - Charset _defaultCharset = Charset.defaultCharset(); - InputStreamReader _inputStreamReader = new InputStreamReader(stream, _defaultCharset); - final BufferedReader reader = new BufferedReader(_inputStreamReader); - return reader.lines().collect(Collectors.joining(System.lineSeparator())); - } - - public SnippetMerger() { - this(new File(((Resource.RAPTOR_USER.getAbsolutePath() + File.separator) + "UserSnippets.xml"))); - } - - public SnippetMerger(final File file) { - try { - this.utplsqlSnippets = this.getUtplsqlSnippetsAsString(); - this.userSnippetsFile = file; - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + private static final Logger logger = Logger.getLogger(SnippetMerger.class.getName()); + + private final XMLTools xmlTools = new XMLTools(); + private File userSnippetsFile; + private String utplsqlSnippets; + + public String getUtplsqlSnippetsAsString() { + final InputStream stream = getClass() + .getResourceAsStream("/org/utplsql/sqldev/resources/UtplsqlSnippets.xml"); + final BufferedReader reader = new BufferedReader(new InputStreamReader(stream, Charset.defaultCharset())); + return reader.lines().collect(Collectors.joining(System.lineSeparator())); + } + + public SnippetMerger() { + // works in SQL Developer only, otherwise a ExceptionInInitializerError is thrown + this(new File(Resource.RAPTOR_USER.getAbsolutePath() + File.separator + "UserSnippets.xml")); + } + + public SnippetMerger(final File file) { + utplsqlSnippets = getUtplsqlSnippetsAsString(); + userSnippetsFile = file; + } + + private byte[] readFile(Path path) { + try { + return Files.readAllBytes(path); + } catch (IOException e) { + final String msg = "Cannot read file " + path.toString() + " due to " + e.getMessage() + "."; + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + private void writeFile(Path path, byte[] bytes) { + try { + Files.write(path, bytes); + } catch (IOException e) { + final String msg = "Cannot write file " + path.toString() + " due to " + e.getMessage() + "."; + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + private DocumentBuilder createDocumentBuilder() { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); + return factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + final String msg = "Could not create no document builder due to " + e.getMessage() + "."; + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + private Document parse(final DocumentBuilder builder, final InputSource inputSource) { + try { + return builder.parse(inputSource); + } catch (SAXException | IOException e) { + final String msg = "Could not parse XML input due to " + e.getMessage() + "."; + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } } - } - - public Path merge() { - try { - Path _xblockexpression = null; - { + + public void merge() { String result = null; - boolean _exists = this.userSnippetsFile.exists(); - if (_exists) { - byte[] _readAllBytes = Files.readAllBytes(Paths.get(this.userSnippetsFile.getAbsolutePath())); - final String userSnippets = new String(_readAllBytes); - final DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - StringReader _stringReader = new StringReader(userSnippets); - InputSource _inputSource = new InputSource(_stringReader); - final Document userSnippetsDoc = docBuilder.parse(_inputSource); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("/snippets/group[not(@category=\"utPLSQL Annotations\" or @category=\"utPLSQL Expectations\")]"); - final NodeList userSnippetsGroups = this.xmlTools.getNodeList(userSnippetsDoc, _builder.toString()); - StringReader _stringReader_1 = new StringReader(this.utplsqlSnippets); - InputSource _inputSource_1 = new InputSource(_stringReader_1); - final Document utplsqlSnippetsDoc = docBuilder.parse(_inputSource_1); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("/snippets/group"); - final NodeList utplsqlSnippetsGroups = this.xmlTools.getNodeList(utplsqlSnippetsDoc, _builder_1.toString()); - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append(""); - _builder_2.newLine(); - _builder_2.append(""); - _builder_2.newLine(); - { - int _length = userSnippetsGroups.getLength(); - ExclusiveRange _doubleDotLessThan = new ExclusiveRange(0, _length, true); - for(final Integer i : _doubleDotLessThan) { - _builder_2.append(" "); - String _nodeToString = this.xmlTools.nodeToString(userSnippetsGroups.item((i).intValue()), "code"); - _builder_2.append(_nodeToString, " "); - _builder_2.newLineIfNotEmpty(); + if (userSnippetsFile.exists()) { + // file exists, proper merge required + final String userSnippets = new String(readFile(Paths.get(userSnippetsFile.getAbsolutePath()))); + final DocumentBuilder docBuilder = createDocumentBuilder(); + final Document userSnippetsDoc = parse(docBuilder, new InputSource(new StringReader(userSnippets))); + final NodeList userSnippetsGroups = xmlTools.getNodeList(userSnippetsDoc, + "/snippets/group[not(@category=\"utPLSQL Annotations\" or @category=\"utPLSQL Expectations\")]"); + final Document utplsqlSnippetsDoc = parse(docBuilder, new InputSource(new StringReader(utplsqlSnippets))); + final NodeList utplsqlSnippetsGroups = xmlTools.getNodeList(utplsqlSnippetsDoc, "/snippets/group"); + StringBuilder sb = new StringBuilder(); + sb.append("\n"); + sb.append("\n"); + for (int i = 0; i < userSnippetsGroups.getLength(); i++) { + sb.append(" "); + sb.append(xmlTools.nodeToString(userSnippetsGroups.item(i), "code")); + sb.append('\n'); } - } - { - int _length_1 = utplsqlSnippetsGroups.getLength(); - ExclusiveRange _doubleDotLessThan_1 = new ExclusiveRange(0, _length_1, true); - for(final Integer i_1 : _doubleDotLessThan_1) { - _builder_2.append(" "); - String _nodeToString_1 = this.xmlTools.nodeToString(utplsqlSnippetsGroups.item((i_1).intValue()), "code"); - _builder_2.append(_nodeToString_1, " "); - _builder_2.newLineIfNotEmpty(); + for (int i = 0; i < utplsqlSnippetsGroups.getLength(); i ++) { + sb.append(" "); + sb.append(xmlTools.nodeToString(utplsqlSnippetsGroups.item(i), "code")); + sb.append('\n'); } - } - _builder_2.append(""); - _builder_2.newLine(); - result = _builder_2.toString(); + sb.append("\n"); + result = sb.toString(); } else { - result = this.utplsqlSnippets; + // just copy + result = utplsqlSnippets; } - _xblockexpression = Files.write(Paths.get(this.userSnippetsFile.getAbsolutePath()), result.getBytes()); - } - return _xblockexpression; - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + writeFile(Paths.get(userSnippetsFile.getAbsolutePath()), result.getBytes()); + } + + public String getTemplate() { + return utplsqlSnippets; + } + + public File getFile() { + return userSnippetsFile; } - } - - public String getTemplate() { - return this.utplsqlSnippets; - } - - public File getFile() { - return this.userSnippetsFile; - } } From e78202e9401e0d615f8f89b3844e1f721cc5e542 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 08:47:37 +0200 Subject: [PATCH 126/286] rename DirectoryChooser.xtend to DirectoryChooser.java --- .../ui/common/{DirectoryChooser.xtend => DirectoryChooser.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/common/{DirectoryChooser.xtend => DirectoryChooser.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java From 57238b3dc5180233bd5e5511bfd6e142b617f8ab Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 08:48:06 +0200 Subject: [PATCH 127/286] add DirectoryChooser.java generated by Xtend 2.20.0 --- .../sqldev/ui/common/DirectoryChooser.java | 69 ++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java index adc057a2..0bbdd8fb 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,36 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.common +package org.utplsql.sqldev.ui.common; -import java.io.File -import java.util.logging.Logger -import javax.swing.JFileChooser -import javax.swing.JFrame -import javax.swing.JTextField - -class DirectoryChooser { - val static Logger logger = Logger.getLogger(DirectoryChooser.name) - - def static choose (JFrame parentFrame, String title, String initialDirectory) { - logger.finest('''parantFrame: «parentFrame»''') - var String ret = null - val chooser = new JFileChooser() - chooser.currentDirectory = new File(initialDirectory) - chooser.dialogTitle = title - chooser.fileSelectionMode = JFileChooser.DIRECTORIES_ONLY - chooser.acceptAllFileFilterUsed = false - if (chooser.showOpenDialog(parentFrame) == JFileChooser.APPROVE_OPTION) { - ret = chooser.selectedFile.absolutePath - } - return ret - } - - def static void choose (JFrame parentFrame, String title, JTextField textField) { - val dir = choose(parentFrame, title, textField.text) - if (dir !== null) { - textField.text = dir - } - } +import java.io.File; +import java.util.logging.Logger; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JTextField; +import org.eclipse.xtend2.lib.StringConcatenation; +@SuppressWarnings("all") +public class DirectoryChooser { + private static final Logger logger = Logger.getLogger(DirectoryChooser.class.getName()); + + public static String choose(final JFrame parentFrame, final String title, final String initialDirectory) { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("parantFrame: "); + _builder.append(parentFrame); + DirectoryChooser.logger.finest(_builder.toString()); + String ret = null; + final JFileChooser chooser = new JFileChooser(); + File _file = new File(initialDirectory); + chooser.setCurrentDirectory(_file); + chooser.setDialogTitle(title); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setAcceptAllFileFilterUsed(false); + int _showOpenDialog = chooser.showOpenDialog(parentFrame); + boolean _equals = (_showOpenDialog == JFileChooser.APPROVE_OPTION); + if (_equals) { + ret = chooser.getSelectedFile().getAbsolutePath(); + } + return ret; + } + + public static void choose(final JFrame parentFrame, final String title, final JTextField textField) { + final String dir = DirectoryChooser.choose(parentFrame, title, textField.getText()); + if ((dir != null)) { + textField.setText(dir); + } + } } From 88234f7738deca40e243c1e1a0d928a5589c335c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 08:54:56 +0200 Subject: [PATCH 128/286] convert DirectoryChooser to Java, removing Xtend dependencies --- .../sqldev/ui/common/DirectoryChooser.java | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java index 0bbdd8fb..2d2fc8e9 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/common/DirectoryChooser.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,39 +17,37 @@ import java.io.File; import java.util.logging.Logger; + import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JTextField; -import org.eclipse.xtend2.lib.StringConcatenation; -@SuppressWarnings("all") public class DirectoryChooser { - private static final Logger logger = Logger.getLogger(DirectoryChooser.class.getName()); - - public static String choose(final JFrame parentFrame, final String title, final String initialDirectory) { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("parantFrame: "); - _builder.append(parentFrame); - DirectoryChooser.logger.finest(_builder.toString()); - String ret = null; - final JFileChooser chooser = new JFileChooser(); - File _file = new File(initialDirectory); - chooser.setCurrentDirectory(_file); - chooser.setDialogTitle(title); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - chooser.setAcceptAllFileFilterUsed(false); - int _showOpenDialog = chooser.showOpenDialog(parentFrame); - boolean _equals = (_showOpenDialog == JFileChooser.APPROVE_OPTION); - if (_equals) { - ret = chooser.getSelectedFile().getAbsolutePath(); + private static final Logger logger = Logger.getLogger(DirectoryChooser.class.getName()); + + // do not instantiate this class + private DirectoryChooser() { + super(); } - return ret; - } - - public static void choose(final JFrame parentFrame, final String title, final JTextField textField) { - final String dir = DirectoryChooser.choose(parentFrame, title, textField.getText()); - if ((dir != null)) { - textField.setText(dir); + + public static String choose(final JFrame parentFrame, final String title, final String initialDirectory) { + logger.finest(() -> "parantFrame: " + parentFrame); + String ret = null; + final JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new File(initialDirectory)); + chooser.setDialogTitle(title); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setAcceptAllFileFilterUsed(false); + if (chooser.showOpenDialog(parentFrame) == JFileChooser.APPROVE_OPTION) { + ret = chooser.getSelectedFile().getAbsolutePath(); + } + return ret; + } + + public static void choose(final JFrame parentFrame, final String title, final JTextField textField) { + final String dir = choose(parentFrame, title, textField.getText()); + if (dir != null) { + textField.setText(dir); + } } - } } From a99fd8c6938067d3fb22cd93c61e1dd8caf8abc8 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 08:56:22 +0200 Subject: [PATCH 129/286] rename CodeCoverageReporterDialog.xtend to CodeCoverageReporterDialog.java --- ...verageReporterDialog.xtend => CodeCoverageReporterDialog.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/{CodeCoverageReporterDialog.xtend => CodeCoverageReporterDialog.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java From af9c23739d24b3ee7bfa91a476df6109039c6ac4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 08:56:48 +0200 Subject: [PATCH 130/286] add CodeCoverageReporterDialog.java generated by Xtend 2.20.0 --- .../coverage/CodeCoverageReporterDialog.java | 470 ++++++++++-------- 1 file changed, 269 insertions(+), 201 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java index 1c57eb6e..46f4aafe 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,205 +13,273 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.coverage +package org.utplsql.sqldev.ui.coverage; -import java.awt.Component -import java.awt.Dimension -import java.awt.GridBagConstraints -import java.awt.GridBagLayout -import java.awt.Insets -import java.awt.Rectangle -import java.awt.Toolkit -import java.awt.event.ActionEvent -import java.awt.event.ActionListener -import java.awt.event.FocusEvent -import java.awt.event.FocusListener -import java.awt.event.WindowEvent -import javax.swing.BorderFactory -import javax.swing.JButton -import javax.swing.JFrame -import javax.swing.JLabel -import javax.swing.JPanel -import javax.swing.JScrollPane -import javax.swing.JTextArea -import javax.swing.JTextField -import javax.swing.ScrollPaneConstants -import javax.swing.SwingUtilities -import org.springframework.core.task.SimpleAsyncTaskExecutor -import org.utplsql.sqldev.coverage.CodeCoverageReporter -import org.utplsql.sqldev.resources.UtplsqlResources +import com.google.common.base.Objects; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.WindowEvent; +import java.sql.Connection; +import java.util.List; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JRootPane; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.JViewport; +import javax.swing.ScrollPaneConstants; +import javax.swing.SwingUtilities; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.springframework.core.task.SimpleAsyncTaskExecutor; +import org.utplsql.sqldev.coverage.CodeCoverageReporter; +import org.utplsql.sqldev.resources.UtplsqlResources; -class CodeCoverageReporterDialog extends JFrame implements ActionListener, FocusListener { - - var CodeCoverageReporter reporter - var JButton runButton - var JButton cancelButton - var JPanel paneParams; - var int paramPos = -1; - val pathsTextArea = new JTextArea() - val schemasTextField = new JTextField() - val includeObjectsTextArea = new JTextArea() - val excludeObjectsTextArea = new JTextArea() - - def static createAndShow(CodeCoverageReporter reporter) { - SwingUtilities.invokeLater(new Runnable() { - override run() { - CodeCoverageReporterDialog.createAndShowWithinEventThread(reporter); - } - }); - } - - private def static createAndShowWithinEventThread(CodeCoverageReporter reporter) { - // create and layout the dialog - val frame = new CodeCoverageReporterDialog(reporter) - reporter.frame = frame - frame.pack - // center dialog - val dim = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2); - frame.alwaysOnTop = true - frame.visible = true - } - - new(CodeCoverageReporter reporter) { - super(UtplsqlResources.getString("WINDOW_CODE_COVERAGE_REPORT_LABEL")) - this.reporter = reporter - val pane = getContentPane(); - pane.setLayout(new GridBagLayout()); - val c = new GridBagConstraints(); - - // parameters pane - paneParams = new JPanel(new GridBagLayout()) - pathsTextArea.editable = false - pathsTextArea.enabled = false - addParam(UtplsqlResources.getString("WINDOW_PATHS_LABEL"), '''«FOR path : reporter.pathList SEPARATOR ", "»«path»«ENDFOR»''', pathsTextArea, 50, 2) - addParam(UtplsqlResources.getString("WINDOW_SCHEMAS_LABEL"), "", schemasTextField, 0, 0); - addParam(UtplsqlResources.getString("WINDOW_INCLUDE_OBJECS_LABEL"), '''«FOR i : reporter.includeObjectList SEPARATOR ", "»«i»«ENDFOR»''', includeObjectsTextArea, 66, 4); - addParam(UtplsqlResources.getString("WINDOW_EXCLUDE_OBJECS_LABEL"), "", excludeObjectsTextArea, 34, 1); - val scrollPane = new JScrollPane(paneParams) - scrollPane.verticalScrollBarPolicy = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED - scrollPane.horizontalScrollBarPolicy = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER - scrollPane.border = BorderFactory.createEmptyBorder; - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 2; - c.insets = new Insets(10, 10, 0, 10); // top, left, bottom, right - c.anchor = GridBagConstraints.NORTH; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.weighty = 1; - pane.add(scrollPane, c) - - // Buttons pane - val panelButtons = new JPanel(new GridBagLayout()) - runButton = new JButton(UtplsqlResources.getString("WINDOW_RUN_BUTTON")) - runButton.addActionListener(this); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - c.insets = new Insets(0, 0, 0, 0); // top, left, bottom, right - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - panelButtons.add(runButton, c); - cancelButton = new JButton(UtplsqlResources.getString("WINDOW_CANCEL_BUTTON")); - cancelButton.addActionListener(this); - c.gridx = 1; - c.insets = new Insets(0, 10, 0, 0); // top, left, bottom, right - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - panelButtons.add(cancelButton, c); - c.gridx = 1; - c.gridy = 1; - c.gridwidth = 1; - c.insets = new Insets(30, 10, 10, 10); // top, left, bottom, right - c.anchor = GridBagConstraints.EAST - c.fill = GridBagConstraints.NONE - c.weightx = 0; - c.weighty = 0; - pane.add(panelButtons, c); - pane.setPreferredSize(new Dimension(500, 320)); - SwingUtilities.getRootPane(runButton).defaultButton = runButton - } - - private def addParam(String label, String text, Component component, int height, double weighty) { - paramPos++ - val c = new GridBagConstraints(); - val paramLabel = new JLabel(label) - c.gridx = 0 - c.gridy = paramPos - c.gridwidth = 1 - c.insets = new Insets(10, 10, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints.NORTHWEST - c.fill = GridBagConstraints.HORIZONTAL - c.weightx = 0 - c.weighty = 0 - paneParams.add(paramLabel, c); - c.gridx = 1 - c.gridwidth = GridBagConstraints.REMAINDER - c.anchor = GridBagConstraints.WEST - c.fill = GridBagConstraints.BOTH - c.insets = new Insets(10, 10, 0, 10); // top, left, bottom, right - c.weightx = 1 - c.weighty = weighty - if (component instanceof JTextField) { - component.text = text - paneParams.add(component, c) - } else if (component instanceof JTextArea) { - component.text = text - component.lineWrap = true - component.wrapStyleWord = true - var scrollPane = new JScrollPane(component); - scrollPane.viewport.preferredSize = new Dimension(200, height) - paneParams.add(scrollPane, c) - } - component.addFocusListener(this) - } - - def exit() { - dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); - } - - override actionPerformed(ActionEvent e) { - if (e.getSource == runButton) { - reporter.schemas = schemasTextField.text - reporter.includeObjects = includeObjectsTextArea.text - reporter.excludeObjects = excludeObjectsTextArea.text - schemasTextField.setEnabled(false) - includeObjectsTextArea.setEnabled(false) - excludeObjectsTextArea.setEnabled(false) - runButton.setEnabled(false) - reporter.runAsync - } else if (e.getSource == cancelButton) { - if (runButton.enabled) { - // report is not yet started, just close the window - exit - } else { - // report is being created... - // frame will close as soon as the connection is technically aborted - // database session is not cancelled. This is not a bug. - // to cancel the session you have to kill it via "ALTER SYSTEM KILL SESSION". - // However, the abort frees all resources on the client side. - reporter.connection.abort(new SimpleAsyncTaskExecutor) - } - } - } - - override focusGained(FocusEvent e) { - if (paneParams.isAncestorOf(e.component)) { - // make component at cursor position is visible - val x = e.component.getLocationOnScreen.x - paneParams.getLocationOnScreen.x - val y = e.component.getLocationOnScreen.y - paneParams.getLocationOnScreen.y - val width = e.component.getBounds.width - val height = e.component.getBounds.height - val rect = new Rectangle(x, y, width, height) - paneParams.scrollRectToVisible(rect) - } - } - - override focusLost(FocusEvent e) { - // ignore - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class CodeCoverageReporterDialog extends JFrame implements ActionListener, FocusListener { + private CodeCoverageReporter reporter; + + private JButton runButton; + + private JButton cancelButton; + + private JPanel paneParams; + + private int paramPos = (-1); + + private final JTextArea pathsTextArea = new JTextArea(); + + private final JTextField schemasTextField = new JTextField(); + + private final JTextArea includeObjectsTextArea = new JTextArea(); + + private final JTextArea excludeObjectsTextArea = new JTextArea(); + + public static void createAndShow(final CodeCoverageReporter reporter) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + CodeCoverageReporterDialog.createAndShowWithinEventThread(reporter); + } + }); + } + + private static void createAndShowWithinEventThread(final CodeCoverageReporter reporter) { + final CodeCoverageReporterDialog frame = new CodeCoverageReporterDialog(reporter); + reporter.setFrame(frame); + frame.pack(); + final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setLocation(((dim.width / 2) - (frame.getSize().width / 2)), ((dim.height / 2) - (frame.getSize().height / 2))); + frame.setAlwaysOnTop(true); + frame.setVisible(true); + } + + public CodeCoverageReporterDialog(final CodeCoverageReporter reporter) { + super(UtplsqlResources.getString("WINDOW_CODE_COVERAGE_REPORT_LABEL")); + this.reporter = reporter; + final Container pane = this.getContentPane(); + GridBagLayout _gridBagLayout = new GridBagLayout(); + pane.setLayout(_gridBagLayout); + final GridBagConstraints c = new GridBagConstraints(); + GridBagLayout _gridBagLayout_1 = new GridBagLayout(); + JPanel _jPanel = new JPanel(_gridBagLayout_1); + this.paneParams = _jPanel; + this.pathsTextArea.setEditable(false); + this.pathsTextArea.setEnabled(false); + String _string = UtplsqlResources.getString("WINDOW_PATHS_LABEL"); + StringConcatenation _builder = new StringConcatenation(); + { + List _pathList = reporter.getPathList(); + boolean _hasElements = false; + for(final String path : _pathList) { + if (!_hasElements) { + _hasElements = true; + } else { + _builder.appendImmediate(", ", ""); + } + _builder.append(path); + } + } + this.addParam(_string, _builder.toString(), this.pathsTextArea, 50, 2); + this.addParam(UtplsqlResources.getString("WINDOW_SCHEMAS_LABEL"), "", this.schemasTextField, 0, 0); + String _string_1 = UtplsqlResources.getString("WINDOW_INCLUDE_OBJECS_LABEL"); + StringConcatenation _builder_1 = new StringConcatenation(); + { + List _includeObjectList = reporter.getIncludeObjectList(); + boolean _hasElements_1 = false; + for(final String i : _includeObjectList) { + if (!_hasElements_1) { + _hasElements_1 = true; + } else { + _builder_1.appendImmediate(", ", ""); + } + _builder_1.append(i); + } + } + this.addParam(_string_1, _builder_1.toString(), this.includeObjectsTextArea, 66, 4); + this.addParam(UtplsqlResources.getString("WINDOW_EXCLUDE_OBJECS_LABEL"), "", this.excludeObjectsTextArea, 34, 1); + final JScrollPane scrollPane = new JScrollPane(this.paneParams); + scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + scrollPane.setBorder(BorderFactory.createEmptyBorder()); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 2; + Insets _insets = new Insets(10, 10, 0, 10); + c.insets = _insets; + c.anchor = GridBagConstraints.NORTH; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + pane.add(scrollPane, c); + GridBagLayout _gridBagLayout_2 = new GridBagLayout(); + final JPanel panelButtons = new JPanel(_gridBagLayout_2); + String _string_2 = UtplsqlResources.getString("WINDOW_RUN_BUTTON"); + JButton _jButton = new JButton(_string_2); + this.runButton = _jButton; + this.runButton.addActionListener(this); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + Insets _insets_1 = new Insets(0, 0, 0, 0); + c.insets = _insets_1; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + panelButtons.add(this.runButton, c); + String _string_3 = UtplsqlResources.getString("WINDOW_CANCEL_BUTTON"); + JButton _jButton_1 = new JButton(_string_3); + this.cancelButton = _jButton_1; + this.cancelButton.addActionListener(this); + c.gridx = 1; + Insets _insets_2 = new Insets(0, 10, 0, 0); + c.insets = _insets_2; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + panelButtons.add(this.cancelButton, c); + c.gridx = 1; + c.gridy = 1; + c.gridwidth = 1; + Insets _insets_3 = new Insets(30, 10, 10, 10); + c.insets = _insets_3; + c.anchor = GridBagConstraints.EAST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + pane.add(panelButtons, c); + Dimension _dimension = new Dimension(500, 320); + pane.setPreferredSize(_dimension); + JRootPane _rootPane = SwingUtilities.getRootPane(this.runButton); + _rootPane.setDefaultButton(this.runButton); + } + + private void addParam(final String label, final String text, final Component component, final int height, final double weighty) { + this.paramPos++; + final GridBagConstraints c = new GridBagConstraints(); + final JLabel paramLabel = new JLabel(label); + c.gridx = 0; + c.gridy = this.paramPos; + c.gridwidth = 1; + Insets _insets = new Insets(10, 10, 0, 0); + c.insets = _insets; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 0; + c.weighty = 0; + this.paneParams.add(paramLabel, c); + c.gridx = 1; + c.gridwidth = GridBagConstraints.REMAINDER; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + Insets _insets_1 = new Insets(10, 10, 0, 10); + c.insets = _insets_1; + c.weightx = 1; + c.weighty = weighty; + if ((component instanceof JTextField)) { + ((JTextField)component).setText(text); + this.paneParams.add(component, c); + } else { + if ((component instanceof JTextArea)) { + ((JTextArea)component).setText(text); + ((JTextArea)component).setLineWrap(true); + ((JTextArea)component).setWrapStyleWord(true); + JScrollPane scrollPane = new JScrollPane(component); + JViewport _viewport = scrollPane.getViewport(); + Dimension _dimension = new Dimension(200, height); + _viewport.setPreferredSize(_dimension); + this.paneParams.add(scrollPane, c); + } + } + component.addFocusListener(this); + } + + public void exit() { + WindowEvent _windowEvent = new WindowEvent(this, WindowEvent.WINDOW_CLOSING); + this.dispatchEvent(_windowEvent); + } + + @Override + public void actionPerformed(final ActionEvent e) { + try { + Object _source = e.getSource(); + boolean _equals = Objects.equal(_source, this.runButton); + if (_equals) { + this.reporter.setSchemas(this.schemasTextField.getText()); + this.reporter.setIncludeObjects(this.includeObjectsTextArea.getText()); + this.reporter.setExcludeObjects(this.excludeObjectsTextArea.getText()); + this.schemasTextField.setEnabled(false); + this.includeObjectsTextArea.setEnabled(false); + this.excludeObjectsTextArea.setEnabled(false); + this.runButton.setEnabled(false); + this.reporter.runAsync(); + } else { + Object _source_1 = e.getSource(); + boolean _equals_1 = Objects.equal(_source_1, this.cancelButton); + if (_equals_1) { + boolean _isEnabled = this.runButton.isEnabled(); + if (_isEnabled) { + this.exit(); + } else { + Connection _connection = this.reporter.getConnection(); + SimpleAsyncTaskExecutor _simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor(); + _connection.abort(_simpleAsyncTaskExecutor); + } + } + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Override + public void focusGained(final FocusEvent e) { + boolean _isAncestorOf = this.paneParams.isAncestorOf(e.getComponent()); + if (_isAncestorOf) { + final int x = (e.getComponent().getLocationOnScreen().x - this.paneParams.getLocationOnScreen().x); + final int y = (e.getComponent().getLocationOnScreen().y - this.paneParams.getLocationOnScreen().y); + final int width = e.getComponent().getBounds().width; + final int height = e.getComponent().getBounds().height; + final Rectangle rect = new Rectangle(x, y, width, height); + this.paneParams.scrollRectToVisible(rect); + } + } + + @Override + public void focusLost(final FocusEvent e) { + } +} From b76064479acae1a0ceb0222c6f0662c8a27313f0 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 09:52:47 +0200 Subject: [PATCH 131/286] convert CodeCoverageReporterDialog to Java, removing Xtend dependencies --- .../coverage/CodeCoverageReporterDialog.java | 413 ++++++++---------- 1 file changed, 183 insertions(+), 230 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java index 46f4aafe..1a97b012 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java @@ -15,7 +15,6 @@ */ package org.utplsql.sqldev.ui.coverage; -import com.google.common.base.Objects; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; @@ -30,256 +29,210 @@ import java.awt.event.FocusListener; import java.awt.event.WindowEvent; import java.sql.Connection; -import java.util.List; +import java.sql.SQLException; +import java.util.logging.Logger; + import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; -import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; -import javax.swing.JViewport; import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.Exceptions; + import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.utplsql.sqldev.coverage.CodeCoverageReporter; +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.StringTools; import org.utplsql.sqldev.resources.UtplsqlResources; -@SuppressWarnings("all") public class CodeCoverageReporterDialog extends JFrame implements ActionListener, FocusListener { - private CodeCoverageReporter reporter; - - private JButton runButton; - - private JButton cancelButton; - - private JPanel paneParams; - - private int paramPos = (-1); - - private final JTextArea pathsTextArea = new JTextArea(); - - private final JTextField schemasTextField = new JTextField(); - - private final JTextArea includeObjectsTextArea = new JTextArea(); - - private final JTextArea excludeObjectsTextArea = new JTextArea(); - - public static void createAndShow(final CodeCoverageReporter reporter) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - CodeCoverageReporterDialog.createAndShowWithinEventThread(reporter); - } - }); - } - - private static void createAndShowWithinEventThread(final CodeCoverageReporter reporter) { - final CodeCoverageReporterDialog frame = new CodeCoverageReporterDialog(reporter); - reporter.setFrame(frame); - frame.pack(); - final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(((dim.width / 2) - (frame.getSize().width / 2)), ((dim.height / 2) - (frame.getSize().height / 2))); - frame.setAlwaysOnTop(true); - frame.setVisible(true); - } - - public CodeCoverageReporterDialog(final CodeCoverageReporter reporter) { - super(UtplsqlResources.getString("WINDOW_CODE_COVERAGE_REPORT_LABEL")); - this.reporter = reporter; - final Container pane = this.getContentPane(); - GridBagLayout _gridBagLayout = new GridBagLayout(); - pane.setLayout(_gridBagLayout); - final GridBagConstraints c = new GridBagConstraints(); - GridBagLayout _gridBagLayout_1 = new GridBagLayout(); - JPanel _jPanel = new JPanel(_gridBagLayout_1); - this.paneParams = _jPanel; - this.pathsTextArea.setEditable(false); - this.pathsTextArea.setEnabled(false); - String _string = UtplsqlResources.getString("WINDOW_PATHS_LABEL"); - StringConcatenation _builder = new StringConcatenation(); - { - List _pathList = reporter.getPathList(); - boolean _hasElements = false; - for(final String path : _pathList) { - if (!_hasElements) { - _hasElements = true; - } else { - _builder.appendImmediate(", ", ""); + private static final long serialVersionUID = 5503685225300993401L; + private static final Logger logger = Logger.getLogger(CodeCoverageReporterDialog.class.getName()); + + private CodeCoverageReporter reporter; + private JButton runButton; + private JButton cancelButton; + private JPanel paneParams; + private int paramPos = (-1); + private final JTextArea pathsTextArea = new JTextArea(); + private final JTextField schemasTextField = new JTextField(); + private final JTextArea includeObjectsTextArea = new JTextArea(); + private final JTextArea excludeObjectsTextArea = new JTextArea(); + + public static void createAndShow(final CodeCoverageReporter reporter) { + SwingUtilities.invokeLater(() -> CodeCoverageReporterDialog.createAndShowWithinEventThread(reporter)); + } + + private static void createAndShowWithinEventThread(final CodeCoverageReporter reporter) { + // create and layout the dialog + final CodeCoverageReporterDialog frame = new CodeCoverageReporterDialog(reporter); + reporter.setFrame(frame); + frame.pack(); + // center dialog + final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2); + frame.setAlwaysOnTop(true); + frame.setVisible(true); + } + + public CodeCoverageReporterDialog(final CodeCoverageReporter reporter) { + super(UtplsqlResources.getString("WINDOW_CODE_COVERAGE_REPORT_LABEL")); + this.reporter = reporter; + final Container pane = getContentPane(); + pane.setLayout(new GridBagLayout()); + final GridBagConstraints c = new GridBagConstraints(); + + // parameters pane + paneParams = new JPanel(new GridBagLayout()); + pathsTextArea.setEditable(false); + pathsTextArea.setEnabled(false); + addParam(UtplsqlResources.getString("WINDOW_PATHS_LABEL"), StringTools.getSimpleCSV(reporter.getPathList()), pathsTextArea, 50, 2); + addParam(UtplsqlResources.getString("WINDOW_SCHEMAS_LABEL"), "", schemasTextField, 0, 0); + addParam(UtplsqlResources.getString("WINDOW_INCLUDE_OBJECS_LABEL"), StringTools.getSimpleCSV(reporter.getIncludeObjectList()), includeObjectsTextArea, 66, 4); + addParam(UtplsqlResources.getString("WINDOW_EXCLUDE_OBJECS_LABEL"), "", excludeObjectsTextArea, 34, 1); + final JScrollPane scrollPane = new JScrollPane(paneParams); + scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + scrollPane.setBorder(BorderFactory.createEmptyBorder()); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 2; + c.insets = new Insets(10, 10, 0, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.NORTH; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + pane.add(scrollPane, c); + + // Buttons pane + final JPanel panelButtons = new JPanel(new GridBagLayout()); + runButton = new JButton(UtplsqlResources.getString("WINDOW_RUN_BUTTON")); + runButton.addActionListener(this); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.insets = new Insets(0, 0, 0, 0); // top, left, bottom, right + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + panelButtons.add(runButton, c); + cancelButton = new JButton(UtplsqlResources.getString("WINDOW_CANCEL_BUTTON")); + cancelButton.addActionListener(this); + c.gridx = 1; + c.insets = new Insets(0, 10, 0, 0); // top, left, bottom, right + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + panelButtons.add(cancelButton, c); + c.gridx = 1; + c.gridy = 1; + c.gridwidth = 1; + c.insets = new Insets(30, 10, 10, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.EAST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + pane.add(panelButtons, c); + pane.setPreferredSize(new Dimension(500, 320)); + SwingUtilities.getRootPane(runButton).setDefaultButton(runButton); + } + + private void addParam(final String label, final String text, final Component component, final int height, + final double weighty) { + paramPos++; + final GridBagConstraints c = new GridBagConstraints(); + final JLabel paramLabel = new JLabel(label); + c.gridx = 0; + c.gridy = paramPos; + c.gridwidth = 1; + c.insets = new Insets(10, 10, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 0; + c.weighty = 0; + paneParams.add(paramLabel, c); + c.gridx = 1; + c.gridwidth = GridBagConstraints.REMAINDER; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.insets = new Insets(10, 10, 0, 10); // top, left, bottom, right + c.weightx = 1; + c.weighty = weighty; + if (component instanceof JTextField) { + ((JTextField) component).setText(text); + paneParams.add(component, c); + } else if (component instanceof JTextArea) { + ((JTextArea) component).setText(text); + ((JTextArea) component).setLineWrap(true); + ((JTextArea) component).setWrapStyleWord(true); + JScrollPane scrollPane = new JScrollPane(component); + scrollPane.getViewport().setPreferredSize(new Dimension(200, height)); + paneParams.add(scrollPane, c); } - _builder.append(path); - } + component.addFocusListener(this); } - this.addParam(_string, _builder.toString(), this.pathsTextArea, 50, 2); - this.addParam(UtplsqlResources.getString("WINDOW_SCHEMAS_LABEL"), "", this.schemasTextField, 0, 0); - String _string_1 = UtplsqlResources.getString("WINDOW_INCLUDE_OBJECS_LABEL"); - StringConcatenation _builder_1 = new StringConcatenation(); - { - List _includeObjectList = reporter.getIncludeObjectList(); - boolean _hasElements_1 = false; - for(final String i : _includeObjectList) { - if (!_hasElements_1) { - _hasElements_1 = true; - } else { - _builder_1.appendImmediate(", ", ""); + + public void exit() { + dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); + } + + private void abortConnection(final Connection conn, final SimpleAsyncTaskExecutor taskExecutor) { + try { + conn.abort(taskExecutor); + } catch (SQLException e) { + final String msg = "Error aborting connection due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); } - _builder_1.append(i); - } } - this.addParam(_string_1, _builder_1.toString(), this.includeObjectsTextArea, 66, 4); - this.addParam(UtplsqlResources.getString("WINDOW_EXCLUDE_OBJECS_LABEL"), "", this.excludeObjectsTextArea, 34, 1); - final JScrollPane scrollPane = new JScrollPane(this.paneParams); - scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setBorder(BorderFactory.createEmptyBorder()); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 2; - Insets _insets = new Insets(10, 10, 0, 10); - c.insets = _insets; - c.anchor = GridBagConstraints.NORTH; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.weighty = 1; - pane.add(scrollPane, c); - GridBagLayout _gridBagLayout_2 = new GridBagLayout(); - final JPanel panelButtons = new JPanel(_gridBagLayout_2); - String _string_2 = UtplsqlResources.getString("WINDOW_RUN_BUTTON"); - JButton _jButton = new JButton(_string_2); - this.runButton = _jButton; - this.runButton.addActionListener(this); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - Insets _insets_1 = new Insets(0, 0, 0, 0); - c.insets = _insets_1; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - panelButtons.add(this.runButton, c); - String _string_3 = UtplsqlResources.getString("WINDOW_CANCEL_BUTTON"); - JButton _jButton_1 = new JButton(_string_3); - this.cancelButton = _jButton_1; - this.cancelButton.addActionListener(this); - c.gridx = 1; - Insets _insets_2 = new Insets(0, 10, 0, 0); - c.insets = _insets_2; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - panelButtons.add(this.cancelButton, c); - c.gridx = 1; - c.gridy = 1; - c.gridwidth = 1; - Insets _insets_3 = new Insets(30, 10, 10, 10); - c.insets = _insets_3; - c.anchor = GridBagConstraints.EAST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - pane.add(panelButtons, c); - Dimension _dimension = new Dimension(500, 320); - pane.setPreferredSize(_dimension); - JRootPane _rootPane = SwingUtilities.getRootPane(this.runButton); - _rootPane.setDefaultButton(this.runButton); - } - - private void addParam(final String label, final String text, final Component component, final int height, final double weighty) { - this.paramPos++; - final GridBagConstraints c = new GridBagConstraints(); - final JLabel paramLabel = new JLabel(label); - c.gridx = 0; - c.gridy = this.paramPos; - c.gridwidth = 1; - Insets _insets = new Insets(10, 10, 0, 0); - c.insets = _insets; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 0; - c.weighty = 0; - this.paneParams.add(paramLabel, c); - c.gridx = 1; - c.gridwidth = GridBagConstraints.REMAINDER; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - Insets _insets_1 = new Insets(10, 10, 0, 10); - c.insets = _insets_1; - c.weightx = 1; - c.weighty = weighty; - if ((component instanceof JTextField)) { - ((JTextField)component).setText(text); - this.paneParams.add(component, c); - } else { - if ((component instanceof JTextArea)) { - ((JTextArea)component).setText(text); - ((JTextArea)component).setLineWrap(true); - ((JTextArea)component).setWrapStyleWord(true); - JScrollPane scrollPane = new JScrollPane(component); - JViewport _viewport = scrollPane.getViewport(); - Dimension _dimension = new Dimension(200, height); - _viewport.setPreferredSize(_dimension); - this.paneParams.add(scrollPane, c); - } + + @Override + public void actionPerformed(final ActionEvent e) { + if (e.getSource() == runButton) { + reporter.setSchemas(schemasTextField.getText()); + reporter.setIncludeObjects(includeObjectsTextArea.getText()); + reporter.setExcludeObjects(excludeObjectsTextArea.getText()); + schemasTextField.setEnabled(false); + includeObjectsTextArea.setEnabled(false); + excludeObjectsTextArea.setEnabled(false); + runButton.setEnabled(false); + reporter.runAsync(); + } else { + if (e.getSource() == cancelButton) { + if (runButton.isEnabled()) { + // report is not yet started, just close the window + exit(); + } else { + // report is being created... + // frame will close as soon as the connection is technically aborted + // database session is not cancelled. This is not a bug. + // to cancel the session you have to kill it via "ALTER SYSTEM KILL SESSION". + // However, the abort frees all resources on the client side. + abortConnection(reporter.getConnection(), new SimpleAsyncTaskExecutor()); + } + } + } } - component.addFocusListener(this); - } - - public void exit() { - WindowEvent _windowEvent = new WindowEvent(this, WindowEvent.WINDOW_CLOSING); - this.dispatchEvent(_windowEvent); - } - - @Override - public void actionPerformed(final ActionEvent e) { - try { - Object _source = e.getSource(); - boolean _equals = Objects.equal(_source, this.runButton); - if (_equals) { - this.reporter.setSchemas(this.schemasTextField.getText()); - this.reporter.setIncludeObjects(this.includeObjectsTextArea.getText()); - this.reporter.setExcludeObjects(this.excludeObjectsTextArea.getText()); - this.schemasTextField.setEnabled(false); - this.includeObjectsTextArea.setEnabled(false); - this.excludeObjectsTextArea.setEnabled(false); - this.runButton.setEnabled(false); - this.reporter.runAsync(); - } else { - Object _source_1 = e.getSource(); - boolean _equals_1 = Objects.equal(_source_1, this.cancelButton); - if (_equals_1) { - boolean _isEnabled = this.runButton.isEnabled(); - if (_isEnabled) { - this.exit(); - } else { - Connection _connection = this.reporter.getConnection(); - SimpleAsyncTaskExecutor _simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor(); - _connection.abort(_simpleAsyncTaskExecutor); - } + + @Override + public void focusGained(final FocusEvent e) { + if (paneParams.isAncestorOf(e.getComponent())) { + // make component at cursor position is visible + final int x = e.getComponent().getLocationOnScreen().x - paneParams.getLocationOnScreen().x; + final int y = e.getComponent().getLocationOnScreen().y - paneParams.getLocationOnScreen().y; + final int width = e.getComponent().getBounds().width; + final int height = e.getComponent().getBounds().height; + final Rectangle rect = new Rectangle(x, y, width, height); + paneParams.scrollRectToVisible(rect); } - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); } - } - - @Override - public void focusGained(final FocusEvent e) { - boolean _isAncestorOf = this.paneParams.isAncestorOf(e.getComponent()); - if (_isAncestorOf) { - final int x = (e.getComponent().getLocationOnScreen().x - this.paneParams.getLocationOnScreen().x); - final int y = (e.getComponent().getLocationOnScreen().y - this.paneParams.getLocationOnScreen().y); - final int width = e.getComponent().getBounds().width; - final int height = e.getComponent().getBounds().height; - final Rectangle rect = new Rectangle(x, y, width, height); - this.paneParams.scrollRectToVisible(rect); + + @Override + public void focusLost(final FocusEvent e) { + // ignore } - } - - @Override - public void focusLost(final FocusEvent e) { - } } From 1716ff5f5bfc26432a6d09c0c927b63d288ee9ca Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 10:02:20 +0200 Subject: [PATCH 132/286] rename PreferencePanel.xtend to PreferencePanel.java --- .../ui/preference/{PreferencePanel.xtend => PreferencePanel.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/preference/{PreferencePanel.xtend => PreferencePanel.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java From ef507872338e18c67d70662cfc42d7d638c0dd0d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 10:02:45 +0200 Subject: [PATCH 133/286] add PreferencePanel.java generated by Xtend 2.20.0 --- .../sqldev/ui/preference/PreferencePanel.java | 1001 ++++++++++------- 1 file changed, 598 insertions(+), 403 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java index 9abbf9f1..d2868005 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,408 +13,603 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.preference +package org.utplsql.sqldev.ui.preference; -import java.awt.event.ActionEvent -import java.awt.event.ActionListener -import java.util.Map -import javax.swing.JButton -import javax.swing.JCheckBox -import javax.swing.JOptionPane -import javax.swing.JPanel -import javax.swing.JSpinner -import javax.swing.JTabbedPane -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 org.utplsql.sqldev.snippet.SnippetMerger -import org.utplsql.sqldev.ui.common.DirectoryChooser +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Map; +import java.util.Set; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JSpinner; +import javax.swing.JTabbedPane; +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.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.IntegerRange; +import org.utplsql.sqldev.model.preference.PreferenceModel; +import org.utplsql.sqldev.resources.UtplsqlResources; +import org.utplsql.sqldev.snippet.SnippetMerger; +import org.utplsql.sqldev.ui.common.DirectoryChooser; -class PreferencePanel extends DefaultTraversablePanel { - val JPanel runTestPanel = new JPanel(); - val JCheckBox useRealtimeReporterCheckBox = new JCheckBox - val JCheckBox unsharedWorksheetCheckBox = new JCheckBox - val JCheckBox resetPackageCheckBox = new JCheckBox - val JCheckBox clearScreenCheckBox = new JCheckBox - val JCheckBox autoExecuteCheckBox = new JCheckBox - val JCheckBox checkRunUtplsqlTestCheckBox = new JCheckBox - val JCheckBox useSmartTimesCheckBox = new JCheckBox - val JButton importSnippetsButton = new JButton(UtplsqlResources.getString("PREF_IMPORT_SNIPPETS_BUTTON_LABEL")) - val JPanel realtimeReporterPanel = new JPanel - val SpinnerNumberModel numberOfRunsInHistoryModel = new SpinnerNumberModel(1, 1, 100, 1); - val JSpinner numberOfRunsInHistorySpinner = new JSpinner(numberOfRunsInHistoryModel); - val JCheckBox showDisabledCounterCheckBox = new JCheckBox - val JCheckBox showWarningsCounterCheckBox = new JCheckBox - val JCheckBox showInfoCounterCheckBox = new JCheckBox - val JCheckBox showWarningIndicatorCheckBox = new JCheckBox - val JCheckBox showInfoIndicatorCheckBox = new JCheckBox - val JCheckBox showSuccessfulTestsCheckBox = new JCheckBox - val JCheckBox showDisabledTestsCheckBox = new JCheckBox - val JCheckBox showTestDescriptionCheckBox = new JCheckBox - val JCheckBox syncDetailTabCheckBox = new JCheckBox - val JPanel generateTestPanel = new JPanel(); - val JTextField testPackagePrefixTextField = new JTextField - val JTextField testPackageSuffixTextField = new JTextField - val JTextField testUnitPrefixTextField = new JTextField - val JTextField testUnitSuffixTextField = new JTextField - 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 - val SpinnerNumberModel indentSpacesModel = new SpinnerNumberModel(1, 1, 8, 1); - val JSpinner indentSpacesSpinner = new JSpinner(indentSpacesModel); - val JPanel oddgenPanel = new JPanel(); - val JTextField rootFolderInOddgenViewTextField = new JTextField - val JCheckBox generateFilesCheckBox = new JCheckBox - val JTextField outputDirectoryTextField = new JTextField - val JButton outputDirectoryBrowse = new JButton() - val JCheckBox deleteExistingFilesCheckBox = new JCheckBox - - new() { - layoutControls() - } - - private def layoutControls() { - // run test group - val FieldLayoutBuilder runTab = new FieldLayoutBuilder(runTestPanel) - runTab.alignLabelsLeft = true - runTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_USE_REALTIME_REPORTER_LABEL")).component( - useRealtimeReporterCheckBox).withHint(UtplsqlResources.getString("PREF_USE_REALTIME_REPORTER_HINT"))) - runTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_UNSHARED_WORKSHEET_LABEL")).component( - unsharedWorksheetCheckBox)) - runTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL")).component( - resetPackageCheckBox)) - runTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_CLEAR_SCREEN_LABEL")).component( - clearScreenCheckBox)) - runTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_AUTO_EXECUTE_LABEL")).component( - autoExecuteCheckBox)) - runTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_CHECK_RUN_UTPLSQL_TEST_LABEL")).component( - checkRunUtplsqlTestCheckBox)) - runTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_USE_SMART_TIMES_LABEL")).component( - useSmartTimesCheckBox)) - runTab.addVerticalGap - runTab.addRow(importSnippetsButton) - runTab.addVerticalSpring - - // realtime reporter group - val FieldLayoutBuilder rrTab = new FieldLayoutBuilder(realtimeReporterPanel) - rrTab.alignLabelsLeft = true - - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_NUMBER_OF_RUNS_IN_HISTORY_LABEL")).component( - numberOfRunsInHistorySpinner)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL")).component( - showDisabledCounterCheckBox)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL")).component( - showWarningsCounterCheckBox)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL")).component( - showInfoCounterCheckBox)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL")).component( - showWarningIndicatorCheckBox)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL")).component( - showInfoIndicatorCheckBox)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL")).component( - showSuccessfulTestsCheckBox)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL")).component( - showDisabledTestsCheckBox)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL")).component( - showTestDescriptionCheckBox)) - rrTab.add( - runTab.field.label.withText(UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL")).component( - syncDetailTabCheckBox)) - rrTab.addVerticalSpring - - // generate test group - val FieldLayoutBuilder generateTab = new FieldLayoutBuilder(generateTestPanel) - generateTab.alignLabelsLeft = true - generateTab.stretchComponentsWithNoButton = true - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL")).component( - testPackagePrefixTextField)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_SUFFIX_LABEL")).component( - testPackageSuffixTextField)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_TEST_UNIT_PREFIX_LABEL")).component( - testUnitPrefixTextField)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_TEST_UNIT_SUFFIX_LABEL")).component( - testUnitSuffixTextField)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_NUMBER_OF_TESTS_PER_UNIT_LABEL")).component( - numberOfTestsPerUnitSpinner)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_GENERATE_COMMENTS_LABEL")).component( - generateCommentsCheckBox)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_DISABLE_TESTS_LABEL")).component( - disableTestsCheckBox)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_SUITE_PATH_LABEL")).component( - suitePathTextField)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL")).component( - indentSpacesSpinner)) - generateTab.add( - generateTab.field.label.withText(UtplsqlResources.getString("PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL")).component( - checkGenerateUtplsqlTestCheckBox).button(createCodeTemplatesButton).withText( - UtplsqlResources.getString("PREF_CREATE_CODE_TEMPLATES_BUTTON_LABEL"))) - generateTab.addVerticalSpring - - // oddgen group - val FieldLayoutBuilder oddgenTab = new FieldLayoutBuilder(oddgenPanel) - oddgenTab.alignLabelsLeft = true - oddgenTab.stretchComponentsWithNoButton = true - oddgenTab.add( - oddgenTab.field.label.withText(UtplsqlResources.getString("PREF_ROOT_FOLDER_IN_ODDGEN_VIEW_LABEL")).component( - rootFolderInOddgenViewTextField)) - oddgenTab.add( - oddgenTab.field.label.withText(UtplsqlResources.getString("PREF_GENERATE_FILES_LABEL")).component( - generateFilesCheckBox)) - oddgenTab.add( - oddgenTab.field.label.withText(UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL")).component( - outputDirectoryTextField).button(outputDirectoryBrowse).withText( - UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_BUTTON_LABEL"))) - oddgenTab.add( - oddgenTab.field.label.withText(UtplsqlResources.getString("PREF_DELETE_EXISTING_FILES_LABEL")).component( - deleteExistingFilesCheckBox)) - oddgenTab.addVerticalSpring - - // putting groups into tabbed panes - val tabbedPane = new JTabbedPane() - tabbedPane.add(UtplsqlResources.getString("MENU_RUN_TEST_LABEL"), runTestPanel) - tabbedPane.add(UtplsqlResources.getString("MENU_REALTIME_REPORTER_LABEL"), realtimeReporterPanel) - tabbedPane.add(UtplsqlResources.getString("MENU_GENERATE_TEST_LABEL"), generateTestPanel) - tabbedPane.add("oddgen", oddgenPanel) - val FieldLayoutBuilder builder = new FieldLayoutBuilder(this) - builder.alignLabelsLeft = true - builder.addVerticalField("", tabbedPane) - builder.addVerticalSpring - - // register action listener for import snippets button - importSnippetsButton.addActionListener(new ActionListener() { - override actionPerformed(ActionEvent event) { - importSnippets - } - }) - - // 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) { - DirectoryChooser.choose(null, UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL"), - outputDirectoryTextField) - } - }) - } - - private def importSnippets() { - val snippetMerger = new SnippetMerger - snippetMerger.merge - val file = snippetMerger.file.absolutePath - val message = String.format(UtplsqlResources.getString("PREF_CONFIRM_IMPORT_MESSAGE"), file) - JOptionPane.showMessageDialog(null, message, UtplsqlResources.getString("PREF_CONFIRM_IMPORT_TITLE"), - JOptionPane.INFORMATION_MESSAGE); - } - - 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 - useRealtimeReporterCheckBox.selected = info.useRealtimeReporter - unsharedWorksheetCheckBox.selected = info.unsharedWorksheet - resetPackageCheckBox.selected = info.resetPackage - clearScreenCheckBox.selected = info.clearScreen - autoExecuteCheckBox.selected = info.autoExecute - checkRunUtplsqlTestCheckBox.selected = info.checkRunUtplsqlTest - useSmartTimesCheckBox.selected = info.useSmartTimes - numberOfRunsInHistorySpinner.value = info.numberOfRunsInHistory - showDisabledCounterCheckBox.selected = info.showDisabledCounter - showWarningsCounterCheckBox.selected = info.showWarningsCounter - showInfoCounterCheckBox.selected = info.showInfoCounter - showWarningIndicatorCheckBox.selected = info.showWarningIndicator - showInfoIndicatorCheckBox.selected = info.showInfoIndicator - showSuccessfulTestsCheckBox.selected = info.showSuccessfulTests - showDisabledTestsCheckBox.selected = info.showDisabledTests - showTestDescriptionCheckBox.selected = info.showTestDescription - syncDetailTabCheckBox.selected = info.syncDetailTab - testPackagePrefixTextField.text = info.testPackagePrefix - testPackageSuffixTextField.text = info.testPackageSuffix - testUnitPrefixTextField.text = info.testUnitPrefix - 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 - indentSpacesSpinner.value = info.indentSpaces - rootFolderInOddgenViewTextField.text = info.rootFolderInOddgenView - generateFilesCheckBox.selected = info.generateFiles - outputDirectoryTextField.text = info.outputDirectory - deleteExistingFilesCheckBox.selected = info.deleteExistingFiles - super.onEntry(traversableContext) - } - - override onExit(TraversableContext traversableContext) throws TraversalException { - var PreferenceModel info = traversableContext.userInformation - info.useRealtimeReporter = useRealtimeReporterCheckBox.selected - info.unsharedWorksheet = unsharedWorksheetCheckBox.selected - info.resetPackage = resetPackageCheckBox.selected - info.clearScreen = clearScreenCheckBox.selected - info.autoExecute = autoExecuteCheckBox.selected - info.numberOfRunsInHistory = numberOfRunsInHistorySpinner.value as Integer - info.checkRunUtplsqlTest = checkRunUtplsqlTestCheckBox.selected - info.useSmartTimes = useSmartTimesCheckBox.selected - info.showDisabledCounter = showDisabledCounterCheckBox.selected - info.showWarningsCounter = showWarningsCounterCheckBox.selected - info.showInfoCounter = showInfoCounterCheckBox.selected - info.showWarningIndicator = showWarningIndicatorCheckBox.selected - info.showInfoIndicator = showInfoIndicatorCheckBox.selected - info.showSuccessfulTests = showSuccessfulTestsCheckBox.selected - info.showDisabledTests = showDisabledTestsCheckBox.selected - info.showTestDescription = showTestDescriptionCheckBox.selected - info.syncDetailTab = syncDetailTabCheckBox.selected - info.testPackagePrefix = testPackagePrefixTextField.text - info.testPackageSuffix = testPackageSuffixTextField.text - info.testUnitPrefix = testUnitPrefixTextField.text - info.testUnitSuffix = testUnitSuffixTextField.text - info.numberOfTestsPerUnit = numberOfTestsPerUnitSpinner.value as Integer - info.checkGenerateUtplsqlTest = checkGenerateUtplsqlTestCheckBox.selected - info.generateComments = generateCommentsCheckBox.selected - info.disableTests = disableTestsCheckBox.selected - info.suitePath = suitePathTextField.text - info.indentSpaces = indentSpacesSpinner.value as Integer - info.rootFolderInOddgenView = rootFolderInOddgenViewTextField.text - info.generateFiles = generateFilesCheckBox.selected - info.outputDirectory = outputDirectoryTextField.text - info.deleteExistingFiles = deleteExistingFilesCheckBox.selected - super.onExit(traversableContext) - } - - private def static PreferenceModel getUserInformation(TraversableContext tc) { - return PreferenceModel.getInstance(tc.propertyStorage) - } +@SuppressWarnings("all") +public class PreferencePanel extends DefaultTraversablePanel { + private final JPanel runTestPanel = new JPanel(); + + private final JCheckBox useRealtimeReporterCheckBox = new JCheckBox(); + + private final JCheckBox unsharedWorksheetCheckBox = new JCheckBox(); + + private final JCheckBox resetPackageCheckBox = new JCheckBox(); + + private final JCheckBox clearScreenCheckBox = new JCheckBox(); + + private final JCheckBox autoExecuteCheckBox = new JCheckBox(); + + private final JCheckBox checkRunUtplsqlTestCheckBox = new JCheckBox(); + + private final JCheckBox useSmartTimesCheckBox = new JCheckBox(); + + private final JButton importSnippetsButton = new JButton(UtplsqlResources.getString("PREF_IMPORT_SNIPPETS_BUTTON_LABEL")); + + private final JPanel realtimeReporterPanel = new JPanel(); + + private final SpinnerNumberModel numberOfRunsInHistoryModel = new SpinnerNumberModel(1, 1, 100, 1); + + private final JSpinner numberOfRunsInHistorySpinner = new JSpinner(this.numberOfRunsInHistoryModel); + + private final JCheckBox showDisabledCounterCheckBox = new JCheckBox(); + + private final JCheckBox showWarningsCounterCheckBox = new JCheckBox(); + + private final JCheckBox showInfoCounterCheckBox = new JCheckBox(); + + private final JCheckBox showWarningIndicatorCheckBox = new JCheckBox(); + + private final JCheckBox showInfoIndicatorCheckBox = new JCheckBox(); + + private final JCheckBox showSuccessfulTestsCheckBox = new JCheckBox(); + + private final JCheckBox showDisabledTestsCheckBox = new JCheckBox(); + + private final JCheckBox showTestDescriptionCheckBox = new JCheckBox(); + + private final JCheckBox syncDetailTabCheckBox = new JCheckBox(); + + private final JPanel generateTestPanel = new JPanel(); + + private final JTextField testPackagePrefixTextField = new JTextField(); + + private final JTextField testPackageSuffixTextField = new JTextField(); + + private final JTextField testUnitPrefixTextField = new JTextField(); + + private final JTextField testUnitSuffixTextField = new JTextField(); + + private final SpinnerNumberModel numberOfTestsPerUnitModel = new SpinnerNumberModel(1, 1, 10, 1); + + private final JSpinner numberOfTestsPerUnitSpinner = new JSpinner(this.numberOfTestsPerUnitModel); + + private final JCheckBox checkGenerateUtplsqlTestCheckBox = new JCheckBox(); + + private final DefaultTableModel codeTemplatesModel = new DefaultTableModel(new Object[] { "Id", "Template" }, 0); + + private final JButton createCodeTemplatesButton = new JButton(); + + private final JCheckBox generateCommentsCheckBox = new JCheckBox(); + + private final JCheckBox disableTestsCheckBox = new JCheckBox(); + + private final JTextField suitePathTextField = new JTextField(); + + private final SpinnerNumberModel indentSpacesModel = new SpinnerNumberModel(1, 1, 8, 1); + + private final JSpinner indentSpacesSpinner = new JSpinner(this.indentSpacesModel); + + private final JPanel oddgenPanel = new JPanel(); + + private final JTextField rootFolderInOddgenViewTextField = new JTextField(); + + private final JCheckBox generateFilesCheckBox = new JCheckBox(); + + private final JTextField outputDirectoryTextField = new JTextField(); + + private final JButton outputDirectoryBrowse = new JButton(); + + private final JCheckBox deleteExistingFilesCheckBox = new JCheckBox(); + + public PreferencePanel() { + this.layoutControls(); + } + + private void layoutControls() { + final FieldLayoutBuilder runTab = new FieldLayoutBuilder(this.runTestPanel); + runTab.setAlignLabelsLeft(true); + runTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_USE_REALTIME_REPORTER_LABEL")).component( + this.useRealtimeReporterCheckBox).withHint(UtplsqlResources.getString("PREF_USE_REALTIME_REPORTER_HINT"))); + runTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_UNSHARED_WORKSHEET_LABEL")).component( + this.unsharedWorksheetCheckBox)); + runTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL")).component( + this.resetPackageCheckBox)); + runTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_CLEAR_SCREEN_LABEL")).component( + this.clearScreenCheckBox)); + runTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_AUTO_EXECUTE_LABEL")).component( + this.autoExecuteCheckBox)); + runTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_CHECK_RUN_UTPLSQL_TEST_LABEL")).component( + this.checkRunUtplsqlTestCheckBox)); + runTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_USE_SMART_TIMES_LABEL")).component( + this.useSmartTimesCheckBox)); + runTab.addVerticalGap(); + runTab.addRow(this.importSnippetsButton); + runTab.addVerticalSpring(); + final FieldLayoutBuilder rrTab = new FieldLayoutBuilder(this.realtimeReporterPanel); + rrTab.setAlignLabelsLeft(true); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_NUMBER_OF_RUNS_IN_HISTORY_LABEL")).component( + this.numberOfRunsInHistorySpinner)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL")).component( + this.showDisabledCounterCheckBox)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL")).component( + this.showWarningsCounterCheckBox)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL")).component( + this.showInfoCounterCheckBox)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL")).component( + this.showWarningIndicatorCheckBox)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL")).component( + this.showInfoIndicatorCheckBox)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL")).component( + this.showSuccessfulTestsCheckBox)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL")).component( + this.showDisabledTestsCheckBox)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL")).component( + this.showTestDescriptionCheckBox)); + rrTab.add( + runTab.field().label().withText(UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL")).component( + this.syncDetailTabCheckBox)); + rrTab.addVerticalSpring(); + final FieldLayoutBuilder generateTab = new FieldLayoutBuilder(this.generateTestPanel); + generateTab.setAlignLabelsLeft(true); + generateTab.setStretchComponentsWithNoButton(true); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL")).component( + this.testPackagePrefixTextField)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_SUFFIX_LABEL")).component( + this.testPackageSuffixTextField)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_UNIT_PREFIX_LABEL")).component( + this.testUnitPrefixTextField)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_UNIT_SUFFIX_LABEL")).component( + this.testUnitSuffixTextField)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_NUMBER_OF_TESTS_PER_UNIT_LABEL")).component( + this.numberOfTestsPerUnitSpinner)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_GENERATE_COMMENTS_LABEL")).component( + this.generateCommentsCheckBox)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_DISABLE_TESTS_LABEL")).component( + this.disableTestsCheckBox)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_SUITE_PATH_LABEL")).component( + this.suitePathTextField)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL")).component( + this.indentSpacesSpinner)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL")).component( + this.checkGenerateUtplsqlTestCheckBox).button(this.createCodeTemplatesButton).withText( + UtplsqlResources.getString("PREF_CREATE_CODE_TEMPLATES_BUTTON_LABEL"))); + generateTab.addVerticalSpring(); + final FieldLayoutBuilder oddgenTab = new FieldLayoutBuilder(this.oddgenPanel); + oddgenTab.setAlignLabelsLeft(true); + oddgenTab.setStretchComponentsWithNoButton(true); + oddgenTab.add( + oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_ROOT_FOLDER_IN_ODDGEN_VIEW_LABEL")).component( + this.rootFolderInOddgenViewTextField)); + oddgenTab.add( + oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_GENERATE_FILES_LABEL")).component( + this.generateFilesCheckBox)); + oddgenTab.add( + oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL")).component( + this.outputDirectoryTextField).button(this.outputDirectoryBrowse).withText( + UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_BUTTON_LABEL"))); + oddgenTab.add( + oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_DELETE_EXISTING_FILES_LABEL")).component( + this.deleteExistingFilesCheckBox)); + oddgenTab.addVerticalSpring(); + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.add(UtplsqlResources.getString("MENU_RUN_TEST_LABEL"), this.runTestPanel); + tabbedPane.add(UtplsqlResources.getString("MENU_REALTIME_REPORTER_LABEL"), this.realtimeReporterPanel); + tabbedPane.add(UtplsqlResources.getString("MENU_GENERATE_TEST_LABEL"), this.generateTestPanel); + tabbedPane.add("oddgen", this.oddgenPanel); + final FieldLayoutBuilder builder = new FieldLayoutBuilder(this); + builder.setAlignLabelsLeft(true); + builder.addVerticalField("", tabbedPane); + builder.addVerticalSpring(); + this.importSnippetsButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent event) { + PreferencePanel.this.importSnippets(); + } + }); + this.createCodeTemplatesButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent event) { + PreferencePanel.this.saveCodeTemplates(); + } + }); + this.outputDirectoryBrowse.addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent event) { + DirectoryChooser.choose(null, UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL"), + PreferencePanel.this.outputDirectoryTextField); + } + }); + } + + private void importSnippets() { + final SnippetMerger snippetMerger = new SnippetMerger(); + snippetMerger.merge(); + final String file = snippetMerger.getFile().getAbsolutePath(); + final String message = String.format(UtplsqlResources.getString("PREF_CONFIRM_IMPORT_MESSAGE"), file); + JOptionPane.showMessageDialog(null, message, UtplsqlResources.getString("PREF_CONFIRM_IMPORT_TITLE"), + JOptionPane.INFORMATION_MESSAGE); + } + + private void loadCodeTemplates() { + final Map map = CodeTemplateUtil.loadFiles(); + Set _keySet = map.keySet(); + for (final String key : _keySet) { + String _get = map.get(key); + this.codeTemplatesModel.addRow(new Object[] { key, _get }); + } + } + + private void saveCodeTemplates() { + String _replaceTabsWithSpaces = this.replaceTabsWithSpaces(this.utSpecTemplate()); + this.codeTemplatesModel.addRow(new Object[] { "ut_spec", _replaceTabsWithSpaces }); + String _trimPlusNewLine = this.trimPlusNewLine(this.replaceTabsWithSpaces(this.utSpecProcTemplate())); + this.codeTemplatesModel.addRow(new Object[] { "ut_spec_proc", _trimPlusNewLine }); + String _replaceTabsWithSpaces_1 = this.replaceTabsWithSpaces(this.utBodyTemplate()); + this.codeTemplatesModel.addRow(new Object[] { "ut_body", _replaceTabsWithSpaces_1 }); + String _trimPlusNewLine_1 = this.trimPlusNewLine(this.replaceTabsWithSpaces(this.utBodyProcTemplate())); + this.codeTemplatesModel.addRow(new Object[] { "ut_body_proc", _trimPlusNewLine_1 }); + CodeTemplateUtil.save(this.codeTemplatesModel); + } + + private String replaceTabsWithSpaces(final CharSequence input) { + Object _value = this.indentSpacesSpinner.getValue(); + String _plus = ("%1$" + _value); + String _plus_1 = (_plus + "s"); + final String spaces = String.format(_plus_1, ""); + return input.toString().replace("\t", spaces); + } + + private String trimPlusNewLine(final String input) { + String _trim = input.trim(); + String _lineSeparator = System.lineSeparator(); + return (_trim + _lineSeparator); + } + + private CharSequence utSpecTemplate() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE "); + String _text = this.testPackagePrefixTextField.getText(); + _builder.append(_text); + _builder.append("[package_name]"); + String _text_1 = this.testPackageSuffixTextField.getText(); + _builder.append(_text_1); + _builder.append(" IS"); + _builder.newLineIfNotEmpty(); + _builder.newLine(); + _builder.append("\t"); + _builder.append("--%suite"); + _builder.newLine(); + { + boolean _isEmpty = this.suitePathTextField.getText().isEmpty(); + boolean _not = (!_isEmpty); + if (_not) { + _builder.append("\t"); + _builder.append("--%suitepath("); + String _text_2 = this.suitePathTextField.getText(); + _builder.append(_text_2, "\t"); + _builder.append(")"); + _builder.newLineIfNotEmpty(); + } + } + _builder.newLine(); + _builder.append("\t"); + CharSequence _utSpecProcTemplate = this.utSpecProcTemplate(); + _builder.append(_utSpecProcTemplate, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("END "); + String _text_3 = this.testPackagePrefixTextField.getText(); + _builder.append(_text_3); + _builder.append("[package_name]"); + String _text_4 = this.testPackageSuffixTextField.getText(); + _builder.append(_text_4); + _builder.append(";"); + _builder.newLineIfNotEmpty(); + _builder.append("/"); + _builder.newLine(); + return _builder; + } + + private CharSequence utSpecProcTemplate() { + StringConcatenation _builder = new StringConcatenation(); + Object _value = this.numberOfTestsPerUnitModel.getValue(); + final boolean withContext = ((((Integer) _value)).intValue() > 1); + _builder.newLineIfNotEmpty(); + { + if (withContext) { + _builder.append("--%context([procedure_name])"); + _builder.newLine(); + _builder.newLine(); + } + } + { + Object _value_1 = this.numberOfTestsPerUnitModel.getValue(); + IntegerRange _upTo = new IntegerRange(1, (((Integer) _value_1)).intValue()); + for(final Integer i : _upTo) { + _builder.append("--%test"); + _builder.newLine(); + { + boolean _isSelected = this.disableTestsCheckBox.isSelected(); + if (_isSelected) { + _builder.append("--%disabled"); + _builder.newLine(); + } + } + _builder.append("PROCEDURE "); + String _text = this.testUnitPrefixTextField.getText(); + _builder.append(_text); + _builder.append("[procedure_name]"); + String _text_1 = this.testUnitSuffixTextField.getText(); + _builder.append(_text_1); + { + if (withContext) { + _builder.append(i); + } + } + _builder.append(";"); + _builder.newLineIfNotEmpty(); + _builder.newLine(); + } + } + { + if (withContext) { + _builder.append("--%endcontext"); + _builder.newLine(); + _builder.newLine(); + } + } + return _builder; + } + + private CharSequence utBodyTemplate() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE BODY "); + String _text = this.testPackagePrefixTextField.getText(); + _builder.append(_text); + _builder.append("[package_name]"); + String _text_1 = this.testPackageSuffixTextField.getText(); + _builder.append(_text_1); + _builder.append(" IS"); + _builder.newLineIfNotEmpty(); + _builder.newLine(); + _builder.append("\t"); + CharSequence _utBodyProcTemplate = this.utBodyProcTemplate(); + _builder.append(_utBodyProcTemplate, "\t"); + _builder.newLineIfNotEmpty(); + _builder.append("END "); + String _text_2 = this.testPackagePrefixTextField.getText(); + _builder.append(_text_2); + _builder.append("[package_name]"); + String _text_3 = this.testPackageSuffixTextField.getText(); + _builder.append(_text_3); + _builder.append(";"); + _builder.newLineIfNotEmpty(); + _builder.append("/"); + _builder.newLine(); + return _builder; + } + + private CharSequence utBodyProcTemplate() { + StringConcatenation _builder = new StringConcatenation(); + Object _value = this.numberOfTestsPerUnitModel.getValue(); + final boolean withContext = ((((Integer) _value)).intValue() > 1); + _builder.newLineIfNotEmpty(); + { + Object _value_1 = this.numberOfTestsPerUnitModel.getValue(); + IntegerRange _upTo = new IntegerRange(1, (((Integer) _value_1)).intValue()); + for(final Integer i : _upTo) { + { + boolean _isSelected = this.generateCommentsCheckBox.isSelected(); + if (_isSelected) { + _builder.append("--"); + _builder.newLine(); + _builder.append("-- test"); + { + if (withContext) { + _builder.append(" [procedure_name] case "); + _builder.append(i); + _builder.append(": ..."); + } + } + _builder.newLineIfNotEmpty(); + _builder.append("--"); + _builder.newLine(); + } + } + _builder.append("PROCEDURE "); + String _text = this.testUnitPrefixTextField.getText(); + _builder.append(_text); + _builder.append("[procedure_name]"); + String _text_1 = this.testUnitSuffixTextField.getText(); + _builder.append(_text_1); + { + if (withContext) { + _builder.append(i); + } + } + _builder.append(" IS"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append("l_actual INTEGER := 0;"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("l_expected INTEGER := 1;"); + _builder.newLine(); + _builder.append("BEGIN"); + _builder.newLine(); + { + boolean _isSelected_1 = this.generateCommentsCheckBox.isSelected(); + if (_isSelected_1) { + _builder.append("\t"); + _builder.append("-- populate actual"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("-- ..."); + _builder.newLine(); + _builder.newLine(); + _builder.append("\t"); + _builder.append("-- populate expected"); + _builder.newLine(); + _builder.append("\t"); + _builder.append("-- ..."); + _builder.newLine(); + _builder.newLine(); + _builder.append("\t"); + _builder.append("-- assert"); + _builder.newLine(); + } + } + _builder.append("\t"); + _builder.append("ut.expect(l_actual).to_equal(l_expected);"); + _builder.newLine(); + _builder.append("END "); + String _text_2 = this.testUnitPrefixTextField.getText(); + _builder.append(_text_2); + _builder.append("[procedure_name]"); + String _text_3 = this.testUnitSuffixTextField.getText(); + _builder.append(_text_3); + { + if (withContext) { + _builder.append(i); + } + } + _builder.append(";"); + _builder.newLineIfNotEmpty(); + _builder.newLine(); + } + } + return _builder; + } + + @Override + public void onEntry(final TraversableContext traversableContext) { + PreferenceModel info = PreferencePanel.getUserInformation(traversableContext); + this.useRealtimeReporterCheckBox.setSelected(info.isUseRealtimeReporter()); + this.unsharedWorksheetCheckBox.setSelected(info.isUnsharedWorksheet()); + this.resetPackageCheckBox.setSelected(info.isResetPackage()); + this.clearScreenCheckBox.setSelected(info.isClearScreen()); + this.autoExecuteCheckBox.setSelected(info.isAutoExecute()); + this.checkRunUtplsqlTestCheckBox.setSelected(info.isCheckRunUtplsqlTest()); + this.useSmartTimesCheckBox.setSelected(info.isUseSmartTimes()); + this.numberOfRunsInHistorySpinner.setValue(Integer.valueOf(info.getNumberOfRunsInHistory())); + this.showDisabledCounterCheckBox.setSelected(info.isShowDisabledCounter()); + this.showWarningsCounterCheckBox.setSelected(info.isShowWarningsCounter()); + this.showInfoCounterCheckBox.setSelected(info.isShowInfoCounter()); + this.showWarningIndicatorCheckBox.setSelected(info.isShowWarningIndicator()); + this.showInfoIndicatorCheckBox.setSelected(info.isShowInfoIndicator()); + this.showSuccessfulTestsCheckBox.setSelected(info.isShowSuccessfulTests()); + this.showDisabledTestsCheckBox.setSelected(info.isShowDisabledTests()); + this.showTestDescriptionCheckBox.setSelected(info.isShowTestDescription()); + this.syncDetailTabCheckBox.setSelected(info.isSyncDetailTab()); + this.testPackagePrefixTextField.setText(info.getTestPackagePrefix()); + this.testPackageSuffixTextField.setText(info.getTestPackageSuffix()); + this.testUnitPrefixTextField.setText(info.getTestUnitPrefix()); + this.testUnitSuffixTextField.setText(info.getTestUnitSuffix()); + this.numberOfTestsPerUnitSpinner.setValue(Integer.valueOf(info.getNumberOfTestsPerUnit())); + this.checkGenerateUtplsqlTestCheckBox.setSelected(info.isCheckGenerateUtplsqlTest()); + this.loadCodeTemplates(); + this.generateCommentsCheckBox.setSelected(info.isGenerateComments()); + this.disableTestsCheckBox.setSelected(info.isDisableTests()); + this.suitePathTextField.setText(info.getSuitePath()); + this.indentSpacesSpinner.setValue(Integer.valueOf(info.getIndentSpaces())); + this.rootFolderInOddgenViewTextField.setText(info.getRootFolderInOddgenView()); + this.generateFilesCheckBox.setSelected(info.isGenerateFiles()); + this.outputDirectoryTextField.setText(info.getOutputDirectory()); + this.deleteExistingFilesCheckBox.setSelected(info.isDeleteExistingFiles()); + super.onEntry(traversableContext); + } + + @Override + public void onExit(final TraversableContext traversableContext) throws TraversalException { + PreferenceModel info = PreferencePanel.getUserInformation(traversableContext); + info.setUseRealtimeReporter(this.useRealtimeReporterCheckBox.isSelected()); + info.setUnsharedWorksheet(this.unsharedWorksheetCheckBox.isSelected()); + info.setResetPackage(this.resetPackageCheckBox.isSelected()); + info.setClearScreen(this.clearScreenCheckBox.isSelected()); + info.setAutoExecute(this.autoExecuteCheckBox.isSelected()); + Object _value = this.numberOfRunsInHistorySpinner.getValue(); + info.setNumberOfRunsInHistory((((Integer) _value)).intValue()); + info.setCheckRunUtplsqlTest(this.checkRunUtplsqlTestCheckBox.isSelected()); + info.setUseSmartTimes(this.useSmartTimesCheckBox.isSelected()); + info.setShowDisabledCounter(this.showDisabledCounterCheckBox.isSelected()); + info.setShowWarningsCounter(this.showWarningsCounterCheckBox.isSelected()); + info.setShowInfoCounter(this.showInfoCounterCheckBox.isSelected()); + info.setShowWarningIndicator(this.showWarningIndicatorCheckBox.isSelected()); + info.setShowInfoIndicator(this.showInfoIndicatorCheckBox.isSelected()); + info.setShowSuccessfulTests(this.showSuccessfulTestsCheckBox.isSelected()); + info.setShowDisabledTests(this.showDisabledTestsCheckBox.isSelected()); + info.setShowTestDescription(this.showTestDescriptionCheckBox.isSelected()); + info.setSyncDetailTab(this.syncDetailTabCheckBox.isSelected()); + info.setTestPackagePrefix(this.testPackagePrefixTextField.getText()); + info.setTestPackageSuffix(this.testPackageSuffixTextField.getText()); + info.setTestUnitPrefix(this.testUnitPrefixTextField.getText()); + info.setTestUnitSuffix(this.testUnitSuffixTextField.getText()); + Object _value_1 = this.numberOfTestsPerUnitSpinner.getValue(); + info.setNumberOfTestsPerUnit((((Integer) _value_1)).intValue()); + info.setCheckGenerateUtplsqlTest(this.checkGenerateUtplsqlTestCheckBox.isSelected()); + info.setGenerateComments(this.generateCommentsCheckBox.isSelected()); + info.setDisableTests(this.disableTestsCheckBox.isSelected()); + info.setSuitePath(this.suitePathTextField.getText()); + Object _value_2 = this.indentSpacesSpinner.getValue(); + info.setIndentSpaces((((Integer) _value_2)).intValue()); + info.setRootFolderInOddgenView(this.rootFolderInOddgenViewTextField.getText()); + info.setGenerateFiles(this.generateFilesCheckBox.isSelected()); + info.setOutputDirectory(this.outputDirectoryTextField.getText()); + info.setDeleteExistingFiles(this.deleteExistingFilesCheckBox.isSelected()); + super.onExit(traversableContext); + } + + private static PreferenceModel getUserInformation(final TraversableContext tc) { + return PreferenceModel.getInstance(tc.getPropertyStorage()); + } } From 5ed7fa80f1ca7bc10b0dc5d6d4e3afa283106fd7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:23:26 +0200 Subject: [PATCH 134/286] convert PreferencePanel to Java, removing Xtend dependencies --- .../sqldev/ui/preference/PreferencePanel.java | 963 +++++++----------- 1 file changed, 393 insertions(+), 570 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java index d2868005..1285ba3b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,10 +15,8 @@ */ package org.utplsql.sqldev.ui.preference; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.Map; -import java.util.Set; + import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JOptionPane; @@ -28,588 +26,413 @@ import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; import javax.swing.table.DefaultTableModel; + +import org.utplsql.sqldev.model.StringTools; +import org.utplsql.sqldev.model.preference.PreferenceModel; +import org.utplsql.sqldev.resources.UtplsqlResources; +import org.utplsql.sqldev.snippet.SnippetMerger; +import org.utplsql.sqldev.ui.common.DirectoryChooser; + 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.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.IntegerRange; -import org.utplsql.sqldev.model.preference.PreferenceModel; -import org.utplsql.sqldev.resources.UtplsqlResources; -import org.utplsql.sqldev.snippet.SnippetMerger; -import org.utplsql.sqldev.ui.common.DirectoryChooser; -@SuppressWarnings("all") public class PreferencePanel extends DefaultTraversablePanel { - private final JPanel runTestPanel = new JPanel(); - - private final JCheckBox useRealtimeReporterCheckBox = new JCheckBox(); - - private final JCheckBox unsharedWorksheetCheckBox = new JCheckBox(); - - private final JCheckBox resetPackageCheckBox = new JCheckBox(); - - private final JCheckBox clearScreenCheckBox = new JCheckBox(); - - private final JCheckBox autoExecuteCheckBox = new JCheckBox(); - - private final JCheckBox checkRunUtplsqlTestCheckBox = new JCheckBox(); - - private final JCheckBox useSmartTimesCheckBox = new JCheckBox(); - - private final JButton importSnippetsButton = new JButton(UtplsqlResources.getString("PREF_IMPORT_SNIPPETS_BUTTON_LABEL")); - - private final JPanel realtimeReporterPanel = new JPanel(); - - private final SpinnerNumberModel numberOfRunsInHistoryModel = new SpinnerNumberModel(1, 1, 100, 1); - - private final JSpinner numberOfRunsInHistorySpinner = new JSpinner(this.numberOfRunsInHistoryModel); - - private final JCheckBox showDisabledCounterCheckBox = new JCheckBox(); - - private final JCheckBox showWarningsCounterCheckBox = new JCheckBox(); - - private final JCheckBox showInfoCounterCheckBox = new JCheckBox(); - - private final JCheckBox showWarningIndicatorCheckBox = new JCheckBox(); - - private final JCheckBox showInfoIndicatorCheckBox = new JCheckBox(); - - private final JCheckBox showSuccessfulTestsCheckBox = new JCheckBox(); - - private final JCheckBox showDisabledTestsCheckBox = new JCheckBox(); - - private final JCheckBox showTestDescriptionCheckBox = new JCheckBox(); - - private final JCheckBox syncDetailTabCheckBox = new JCheckBox(); - - private final JPanel generateTestPanel = new JPanel(); - - private final JTextField testPackagePrefixTextField = new JTextField(); - - private final JTextField testPackageSuffixTextField = new JTextField(); - - private final JTextField testUnitPrefixTextField = new JTextField(); - - private final JTextField testUnitSuffixTextField = new JTextField(); - - private final SpinnerNumberModel numberOfTestsPerUnitModel = new SpinnerNumberModel(1, 1, 10, 1); - - private final JSpinner numberOfTestsPerUnitSpinner = new JSpinner(this.numberOfTestsPerUnitModel); - - private final JCheckBox checkGenerateUtplsqlTestCheckBox = new JCheckBox(); - - private final DefaultTableModel codeTemplatesModel = new DefaultTableModel(new Object[] { "Id", "Template" }, 0); - - private final JButton createCodeTemplatesButton = new JButton(); - - private final JCheckBox generateCommentsCheckBox = new JCheckBox(); - - private final JCheckBox disableTestsCheckBox = new JCheckBox(); - - private final JTextField suitePathTextField = new JTextField(); - - private final SpinnerNumberModel indentSpacesModel = new SpinnerNumberModel(1, 1, 8, 1); - - private final JSpinner indentSpacesSpinner = new JSpinner(this.indentSpacesModel); - - private final JPanel oddgenPanel = new JPanel(); - - private final JTextField rootFolderInOddgenViewTextField = new JTextField(); - - private final JCheckBox generateFilesCheckBox = new JCheckBox(); - - private final JTextField outputDirectoryTextField = new JTextField(); - - private final JButton outputDirectoryBrowse = new JButton(); - - private final JCheckBox deleteExistingFilesCheckBox = new JCheckBox(); - - public PreferencePanel() { - this.layoutControls(); - } - - private void layoutControls() { - final FieldLayoutBuilder runTab = new FieldLayoutBuilder(this.runTestPanel); - runTab.setAlignLabelsLeft(true); - runTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_USE_REALTIME_REPORTER_LABEL")).component( - this.useRealtimeReporterCheckBox).withHint(UtplsqlResources.getString("PREF_USE_REALTIME_REPORTER_HINT"))); - runTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_UNSHARED_WORKSHEET_LABEL")).component( - this.unsharedWorksheetCheckBox)); - runTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL")).component( - this.resetPackageCheckBox)); - runTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_CLEAR_SCREEN_LABEL")).component( - this.clearScreenCheckBox)); - runTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_AUTO_EXECUTE_LABEL")).component( - this.autoExecuteCheckBox)); - runTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_CHECK_RUN_UTPLSQL_TEST_LABEL")).component( - this.checkRunUtplsqlTestCheckBox)); - runTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_USE_SMART_TIMES_LABEL")).component( - this.useSmartTimesCheckBox)); - runTab.addVerticalGap(); - runTab.addRow(this.importSnippetsButton); - runTab.addVerticalSpring(); - final FieldLayoutBuilder rrTab = new FieldLayoutBuilder(this.realtimeReporterPanel); - rrTab.setAlignLabelsLeft(true); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_NUMBER_OF_RUNS_IN_HISTORY_LABEL")).component( - this.numberOfRunsInHistorySpinner)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL")).component( - this.showDisabledCounterCheckBox)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL")).component( - this.showWarningsCounterCheckBox)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL")).component( - this.showInfoCounterCheckBox)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL")).component( - this.showWarningIndicatorCheckBox)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL")).component( - this.showInfoIndicatorCheckBox)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL")).component( - this.showSuccessfulTestsCheckBox)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL")).component( - this.showDisabledTestsCheckBox)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL")).component( - this.showTestDescriptionCheckBox)); - rrTab.add( - runTab.field().label().withText(UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL")).component( - this.syncDetailTabCheckBox)); - rrTab.addVerticalSpring(); - final FieldLayoutBuilder generateTab = new FieldLayoutBuilder(this.generateTestPanel); - generateTab.setAlignLabelsLeft(true); - generateTab.setStretchComponentsWithNoButton(true); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL")).component( - this.testPackagePrefixTextField)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_SUFFIX_LABEL")).component( - this.testPackageSuffixTextField)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_UNIT_PREFIX_LABEL")).component( - this.testUnitPrefixTextField)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_UNIT_SUFFIX_LABEL")).component( - this.testUnitSuffixTextField)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_NUMBER_OF_TESTS_PER_UNIT_LABEL")).component( - this.numberOfTestsPerUnitSpinner)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_GENERATE_COMMENTS_LABEL")).component( - this.generateCommentsCheckBox)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_DISABLE_TESTS_LABEL")).component( - this.disableTestsCheckBox)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_SUITE_PATH_LABEL")).component( - this.suitePathTextField)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL")).component( - this.indentSpacesSpinner)); - generateTab.add( - generateTab.field().label().withText(UtplsqlResources.getString("PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL")).component( - this.checkGenerateUtplsqlTestCheckBox).button(this.createCodeTemplatesButton).withText( - UtplsqlResources.getString("PREF_CREATE_CODE_TEMPLATES_BUTTON_LABEL"))); - generateTab.addVerticalSpring(); - final FieldLayoutBuilder oddgenTab = new FieldLayoutBuilder(this.oddgenPanel); - oddgenTab.setAlignLabelsLeft(true); - oddgenTab.setStretchComponentsWithNoButton(true); - oddgenTab.add( - oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_ROOT_FOLDER_IN_ODDGEN_VIEW_LABEL")).component( - this.rootFolderInOddgenViewTextField)); - oddgenTab.add( - oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_GENERATE_FILES_LABEL")).component( - this.generateFilesCheckBox)); - oddgenTab.add( - oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL")).component( - this.outputDirectoryTextField).button(this.outputDirectoryBrowse).withText( - UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_BUTTON_LABEL"))); - oddgenTab.add( - oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_DELETE_EXISTING_FILES_LABEL")).component( - this.deleteExistingFilesCheckBox)); - oddgenTab.addVerticalSpring(); - final JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.add(UtplsqlResources.getString("MENU_RUN_TEST_LABEL"), this.runTestPanel); - tabbedPane.add(UtplsqlResources.getString("MENU_REALTIME_REPORTER_LABEL"), this.realtimeReporterPanel); - tabbedPane.add(UtplsqlResources.getString("MENU_GENERATE_TEST_LABEL"), this.generateTestPanel); - tabbedPane.add("oddgen", this.oddgenPanel); - final FieldLayoutBuilder builder = new FieldLayoutBuilder(this); - builder.setAlignLabelsLeft(true); - builder.addVerticalField("", tabbedPane); - builder.addVerticalSpring(); - this.importSnippetsButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent event) { - PreferencePanel.this.importSnippets(); - } - }); - this.createCodeTemplatesButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent event) { - PreferencePanel.this.saveCodeTemplates(); - } - }); - this.outputDirectoryBrowse.addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent event) { - DirectoryChooser.choose(null, UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL"), - PreferencePanel.this.outputDirectoryTextField); - } - }); - } - - private void importSnippets() { - final SnippetMerger snippetMerger = new SnippetMerger(); - snippetMerger.merge(); - final String file = snippetMerger.getFile().getAbsolutePath(); - final String message = String.format(UtplsqlResources.getString("PREF_CONFIRM_IMPORT_MESSAGE"), file); - JOptionPane.showMessageDialog(null, message, UtplsqlResources.getString("PREF_CONFIRM_IMPORT_TITLE"), - JOptionPane.INFORMATION_MESSAGE); - } - - private void loadCodeTemplates() { - final Map map = CodeTemplateUtil.loadFiles(); - Set _keySet = map.keySet(); - for (final String key : _keySet) { - String _get = map.get(key); - this.codeTemplatesModel.addRow(new Object[] { key, _get }); + private static final long serialVersionUID = -2583957375062007813L; + private final JPanel runTestPanel = new JPanel(); + private final JCheckBox useRealtimeReporterCheckBox = new JCheckBox(); + private final JCheckBox unsharedWorksheetCheckBox = new JCheckBox(); + private final JCheckBox resetPackageCheckBox = new JCheckBox(); + private final JCheckBox clearScreenCheckBox = new JCheckBox(); + private final JCheckBox autoExecuteCheckBox = new JCheckBox(); + private final JCheckBox checkRunUtplsqlTestCheckBox = new JCheckBox(); + private final JCheckBox useSmartTimesCheckBox = new JCheckBox(); + private final JButton importSnippetsButton = new JButton( + UtplsqlResources.getString("PREF_IMPORT_SNIPPETS_BUTTON_LABEL")); + private final JPanel realtimeReporterPanel = new JPanel(); + private final SpinnerNumberModel numberOfRunsInHistoryModel = new SpinnerNumberModel(1, 1, 100, 1); + private final JSpinner numberOfRunsInHistorySpinner = new JSpinner(numberOfRunsInHistoryModel); + private final JCheckBox showDisabledCounterCheckBox = new JCheckBox(); + private final JCheckBox showWarningsCounterCheckBox = new JCheckBox(); + private final JCheckBox showInfoCounterCheckBox = new JCheckBox(); + private final JCheckBox showWarningIndicatorCheckBox = new JCheckBox(); + private final JCheckBox showInfoIndicatorCheckBox = new JCheckBox(); + private final JCheckBox showSuccessfulTestsCheckBox = new JCheckBox(); + private final JCheckBox showDisabledTestsCheckBox = new JCheckBox(); + private final JCheckBox showTestDescriptionCheckBox = new JCheckBox(); + private final JCheckBox syncDetailTabCheckBox = new JCheckBox(); + private final JPanel generateTestPanel = new JPanel(); + private final JTextField testPackagePrefixTextField = new JTextField(); + private final JTextField testPackageSuffixTextField = new JTextField(); + private final JTextField testUnitPrefixTextField = new JTextField(); + private final JTextField testUnitSuffixTextField = new JTextField(); + private final SpinnerNumberModel numberOfTestsPerUnitModel = new SpinnerNumberModel(1, 1, 10, 1); + private final JSpinner numberOfTestsPerUnitSpinner = new JSpinner(numberOfTestsPerUnitModel); + private final JCheckBox checkGenerateUtplsqlTestCheckBox = new JCheckBox(); + private final DefaultTableModel codeTemplatesModel = new DefaultTableModel(new Object[] { "Id", "Template" }, 0); + private final JButton createCodeTemplatesButton = new JButton(); + private final JCheckBox generateCommentsCheckBox = new JCheckBox(); + private final JCheckBox disableTestsCheckBox = new JCheckBox(); + private final JTextField suitePathTextField = new JTextField(); + private final SpinnerNumberModel indentSpacesModel = new SpinnerNumberModel(1, 1, 8, 1); + private final JSpinner indentSpacesSpinner = new JSpinner(indentSpacesModel); + private final JPanel oddgenPanel = new JPanel(); + private final JTextField rootFolderInOddgenViewTextField = new JTextField(); + private final JCheckBox generateFilesCheckBox = new JCheckBox(); + private final JTextField outputDirectoryTextField = new JTextField(); + private final JButton outputDirectoryBrowse = new JButton(); + private final JCheckBox deleteExistingFilesCheckBox = new JCheckBox(); + + public PreferencePanel() { + layoutControls(); } - } - - private void saveCodeTemplates() { - String _replaceTabsWithSpaces = this.replaceTabsWithSpaces(this.utSpecTemplate()); - this.codeTemplatesModel.addRow(new Object[] { "ut_spec", _replaceTabsWithSpaces }); - String _trimPlusNewLine = this.trimPlusNewLine(this.replaceTabsWithSpaces(this.utSpecProcTemplate())); - this.codeTemplatesModel.addRow(new Object[] { "ut_spec_proc", _trimPlusNewLine }); - String _replaceTabsWithSpaces_1 = this.replaceTabsWithSpaces(this.utBodyTemplate()); - this.codeTemplatesModel.addRow(new Object[] { "ut_body", _replaceTabsWithSpaces_1 }); - String _trimPlusNewLine_1 = this.trimPlusNewLine(this.replaceTabsWithSpaces(this.utBodyProcTemplate())); - this.codeTemplatesModel.addRow(new Object[] { "ut_body_proc", _trimPlusNewLine_1 }); - CodeTemplateUtil.save(this.codeTemplatesModel); - } - - private String replaceTabsWithSpaces(final CharSequence input) { - Object _value = this.indentSpacesSpinner.getValue(); - String _plus = ("%1$" + _value); - String _plus_1 = (_plus + "s"); - final String spaces = String.format(_plus_1, ""); - return input.toString().replace("\t", spaces); - } - - private String trimPlusNewLine(final String input) { - String _trim = input.trim(); - String _lineSeparator = System.lineSeparator(); - return (_trim + _lineSeparator); - } - - private CharSequence utSpecTemplate() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE "); - String _text = this.testPackagePrefixTextField.getText(); - _builder.append(_text); - _builder.append("[package_name]"); - String _text_1 = this.testPackageSuffixTextField.getText(); - _builder.append(_text_1); - _builder.append(" IS"); - _builder.newLineIfNotEmpty(); - _builder.newLine(); - _builder.append("\t"); - _builder.append("--%suite"); - _builder.newLine(); - { - boolean _isEmpty = this.suitePathTextField.getText().isEmpty(); - boolean _not = (!_isEmpty); - if (_not) { - _builder.append("\t"); - _builder.append("--%suitepath("); - String _text_2 = this.suitePathTextField.getText(); - _builder.append(_text_2, "\t"); - _builder.append(")"); - _builder.newLineIfNotEmpty(); - } + + private void layoutControls() { + // run test group + final FieldLayoutBuilder runTab = new FieldLayoutBuilder(runTestPanel); + runTab.setAlignLabelsLeft(true); + runTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_USE_REALTIME_REPORTER_LABEL")) + .component(useRealtimeReporterCheckBox) + .withHint(UtplsqlResources.getString("PREF_USE_REALTIME_REPORTER_HINT"))); + runTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_UNSHARED_WORKSHEET_LABEL")) + .component(unsharedWorksheetCheckBox)); + runTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL")) + .component(resetPackageCheckBox)); + runTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_CLEAR_SCREEN_LABEL")) + .component(clearScreenCheckBox)); + runTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_AUTO_EXECUTE_LABEL")) + .component(autoExecuteCheckBox)); + runTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_CHECK_RUN_UTPLSQL_TEST_LABEL")) + .component(checkRunUtplsqlTestCheckBox)); + runTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_USE_SMART_TIMES_LABEL")) + .component(useSmartTimesCheckBox)); + runTab.addVerticalGap(); + runTab.addRow(importSnippetsButton); + runTab.addVerticalSpring(); + + // realtime reporter group + final FieldLayoutBuilder rrTab = new FieldLayoutBuilder(realtimeReporterPanel); + rrTab.setAlignLabelsLeft(true); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_NUMBER_OF_RUNS_IN_HISTORY_LABEL")) + .component(numberOfRunsInHistorySpinner)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL")) + .component(showDisabledCounterCheckBox)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL")) + .component(showWarningsCounterCheckBox)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL")) + .component(showInfoCounterCheckBox)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL")) + .component(showWarningIndicatorCheckBox)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL")) + .component(showInfoIndicatorCheckBox)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL")) + .component(showSuccessfulTestsCheckBox)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL")) + .component(showDisabledTestsCheckBox)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL")) + .component(showTestDescriptionCheckBox)); + rrTab.add(runTab.field().label().withText(UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL")) + .component(syncDetailTabCheckBox)); + rrTab.addVerticalSpring(); + + // generate test group + final FieldLayoutBuilder generateTab = new FieldLayoutBuilder(generateTestPanel); + generateTab.setAlignLabelsLeft(true); + generateTab.setStretchComponentsWithNoButton(true); + generateTab + .add(generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_PREFIX_LABEL")) + .component(testPackagePrefixTextField)); + generateTab + .add(generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_PACKAGE_SUFFIX_LABEL")) + .component(testPackageSuffixTextField)); + generateTab.add(generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_UNIT_PREFIX_LABEL")) + .component(testUnitPrefixTextField)); + generateTab.add(generateTab.field().label().withText(UtplsqlResources.getString("PREF_TEST_UNIT_SUFFIX_LABEL")) + .component(testUnitSuffixTextField)); + generateTab.add( + generateTab.field().label().withText(UtplsqlResources.getString("PREF_NUMBER_OF_TESTS_PER_UNIT_LABEL")) + .component(numberOfTestsPerUnitSpinner)); + generateTab.add(generateTab.field().label().withText(UtplsqlResources.getString("PREF_GENERATE_COMMENTS_LABEL")) + .component(generateCommentsCheckBox)); + generateTab.add(generateTab.field().label().withText(UtplsqlResources.getString("PREF_DISABLE_TESTS_LABEL")) + .component(disableTestsCheckBox)); + generateTab.add(generateTab.field().label().withText(UtplsqlResources.getString("PREF_SUITE_PATH_LABEL")) + .component(suitePathTextField)); + generateTab.add(generateTab.field().label().withText(UtplsqlResources.getString("PREF_INDENT_SPACES_LABEL")) + .component(indentSpacesSpinner)); + generateTab.add(generateTab.field().label() + .withText(UtplsqlResources.getString("PREF_CHECK_GENERATE_UTPLSQL_TEST_LABEL")) + .component(checkGenerateUtplsqlTestCheckBox).button(createCodeTemplatesButton) + .withText(UtplsqlResources.getString("PREF_CREATE_CODE_TEMPLATES_BUTTON_LABEL"))); + generateTab.addVerticalSpring(); + + // oddgen group + final FieldLayoutBuilder oddgenTab = new FieldLayoutBuilder(oddgenPanel); + oddgenTab.setAlignLabelsLeft(true); + oddgenTab.setStretchComponentsWithNoButton(true); + oddgenTab.add( + oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_ROOT_FOLDER_IN_ODDGEN_VIEW_LABEL")) + .component(rootFolderInOddgenViewTextField)); + oddgenTab.add(oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_GENERATE_FILES_LABEL")) + .component(generateFilesCheckBox)); + oddgenTab.add(oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL")) + .component(outputDirectoryTextField).button(outputDirectoryBrowse) + .withText(UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_BUTTON_LABEL"))); + oddgenTab.add(oddgenTab.field().label().withText(UtplsqlResources.getString("PREF_DELETE_EXISTING_FILES_LABEL")) + .component(deleteExistingFilesCheckBox)); + oddgenTab.addVerticalSpring(); + + // putting groups into tabbed panes + final JTabbedPane tabbedPane = new JTabbedPane(); + tabbedPane.add(UtplsqlResources.getString("MENU_RUN_TEST_LABEL"), runTestPanel); + tabbedPane.add(UtplsqlResources.getString("MENU_REALTIME_REPORTER_LABEL"), realtimeReporterPanel); + tabbedPane.add(UtplsqlResources.getString("MENU_GENERATE_TEST_LABEL"), generateTestPanel); + tabbedPane.add("oddgen", oddgenPanel); + final FieldLayoutBuilder builder = new FieldLayoutBuilder(this); + builder.setAlignLabelsLeft(true); + builder.addVerticalField("", tabbedPane); + builder.addVerticalSpring(); + + // register action listener for import snippets button + importSnippetsButton.addActionListener(event -> importSnippets()); + + // register action listener for create code template button + createCodeTemplatesButton.addActionListener(event -> saveCodeTemplates()); + + // register action listener for directory chooser + outputDirectoryBrowse.addActionListener(event -> DirectoryChooser.choose(null, + UtplsqlResources.getString("PREF_OUTPUT_DIRECTORY_LABEL"), outputDirectoryTextField)); } - _builder.newLine(); - _builder.append("\t"); - CharSequence _utSpecProcTemplate = this.utSpecProcTemplate(); - _builder.append(_utSpecProcTemplate, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("END "); - String _text_3 = this.testPackagePrefixTextField.getText(); - _builder.append(_text_3); - _builder.append("[package_name]"); - String _text_4 = this.testPackageSuffixTextField.getText(); - _builder.append(_text_4); - _builder.append(";"); - _builder.newLineIfNotEmpty(); - _builder.append("/"); - _builder.newLine(); - return _builder; - } - - private CharSequence utSpecProcTemplate() { - StringConcatenation _builder = new StringConcatenation(); - Object _value = this.numberOfTestsPerUnitModel.getValue(); - final boolean withContext = ((((Integer) _value)).intValue() > 1); - _builder.newLineIfNotEmpty(); - { - if (withContext) { - _builder.append("--%context([procedure_name])"); - _builder.newLine(); - _builder.newLine(); - } + + private void importSnippets() { + final SnippetMerger snippetMerger = new SnippetMerger(); + snippetMerger.merge(); + final String file = snippetMerger.getFile().getAbsolutePath(); + final String message = String.format(UtplsqlResources.getString("PREF_CONFIRM_IMPORT_MESSAGE"), file); + JOptionPane.showMessageDialog(null, message, UtplsqlResources.getString("PREF_CONFIRM_IMPORT_TITLE"), + JOptionPane.INFORMATION_MESSAGE); } - { - Object _value_1 = this.numberOfTestsPerUnitModel.getValue(); - IntegerRange _upTo = new IntegerRange(1, (((Integer) _value_1)).intValue()); - for(final Integer i : _upTo) { - _builder.append("--%test"); - _builder.newLine(); - { - boolean _isSelected = this.disableTestsCheckBox.isSelected(); - if (_isSelected) { - _builder.append("--%disabled"); - _builder.newLine(); - } - } - _builder.append("PROCEDURE "); - String _text = this.testUnitPrefixTextField.getText(); - _builder.append(_text); - _builder.append("[procedure_name]"); - String _text_1 = this.testUnitSuffixTextField.getText(); - _builder.append(_text_1); - { - if (withContext) { - _builder.append(i); - } + + private void loadCodeTemplates() { + final Map map = CodeTemplateUtil.loadFiles(); + for (final Map.Entry entry : map.entrySet()) { + codeTemplatesModel.addRow(new Object[] { entry.getKey(), entry.getValue() }); } - _builder.append(";"); - _builder.newLineIfNotEmpty(); - _builder.newLine(); - } } - { - if (withContext) { - _builder.append("--%endcontext"); - _builder.newLine(); - _builder.newLine(); - } + + private void saveCodeTemplates() { + Integer indentSpaces = (Integer) indentSpacesSpinner.getValue(); + codeTemplatesModel + .addRow(new Object[] { "ut_spec", StringTools.replaceTabsWithSpaces(utSpecTemplate(), indentSpaces) }); + codeTemplatesModel.addRow(new Object[] { "ut_spec_proc", + trimPlusNewLine(StringTools.replaceTabsWithSpaces(utSpecProcTemplate(), indentSpaces)) }); + codeTemplatesModel + .addRow(new Object[] { "ut_body", StringTools.replaceTabsWithSpaces(utBodyTemplate(), indentSpaces) }); + codeTemplatesModel.addRow(new Object[] { "ut_body_proc", + trimPlusNewLine(StringTools.replaceTabsWithSpaces(utBodyProcTemplate(), indentSpaces)) }); + CodeTemplateUtil.save(codeTemplatesModel); } - return _builder; - } - - private CharSequence utBodyTemplate() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE BODY "); - String _text = this.testPackagePrefixTextField.getText(); - _builder.append(_text); - _builder.append("[package_name]"); - String _text_1 = this.testPackageSuffixTextField.getText(); - _builder.append(_text_1); - _builder.append(" IS"); - _builder.newLineIfNotEmpty(); - _builder.newLine(); - _builder.append("\t"); - CharSequence _utBodyProcTemplate = this.utBodyProcTemplate(); - _builder.append(_utBodyProcTemplate, "\t"); - _builder.newLineIfNotEmpty(); - _builder.append("END "); - String _text_2 = this.testPackagePrefixTextField.getText(); - _builder.append(_text_2); - _builder.append("[package_name]"); - String _text_3 = this.testPackageSuffixTextField.getText(); - _builder.append(_text_3); - _builder.append(";"); - _builder.newLineIfNotEmpty(); - _builder.append("/"); - _builder.newLine(); - return _builder; - } - - private CharSequence utBodyProcTemplate() { - StringConcatenation _builder = new StringConcatenation(); - Object _value = this.numberOfTestsPerUnitModel.getValue(); - final boolean withContext = ((((Integer) _value)).intValue() > 1); - _builder.newLineIfNotEmpty(); - { - Object _value_1 = this.numberOfTestsPerUnitModel.getValue(); - IntegerRange _upTo = new IntegerRange(1, (((Integer) _value_1)).intValue()); - for(final Integer i : _upTo) { - { - boolean _isSelected = this.generateCommentsCheckBox.isSelected(); - if (_isSelected) { - _builder.append("--"); - _builder.newLine(); - _builder.append("-- test"); - { - if (withContext) { - _builder.append(" [procedure_name] case "); - _builder.append(i); - _builder.append(": ..."); - } - } - _builder.newLineIfNotEmpty(); - _builder.append("--"); - _builder.newLine(); - } + + private String trimPlusNewLine(final String input) { + return input.trim() + System.lineSeparator(); + } + + private CharSequence utSpecTemplate() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE "); + sb.append(testPackagePrefixTextField.getText()); + sb.append("[package_name]"); + sb.append(testPackageSuffixTextField.getText()); + sb.append(" IS\n\n"); + sb.append("\t--%suite\n"); + if (!suitePathTextField.getText().isEmpty()) { + sb.append("\t--%suitepath("); + sb.append(suitePathTextField.getText()); + sb.append(")\n"); } - _builder.append("PROCEDURE "); - String _text = this.testUnitPrefixTextField.getText(); - _builder.append(_text); - _builder.append("[procedure_name]"); - String _text_1 = this.testUnitSuffixTextField.getText(); - _builder.append(_text_1); - { - if (withContext) { - _builder.append(i); - } + sb.append('\n'); + sb.append('\t'); + sb.append(utSpecProcTemplate()); + sb.append("END "); + sb.append(testPackagePrefixTextField.getText()); + sb.append("[package_name]"); + sb.append(testPackageSuffixTextField.getText()); + sb.append(";\n"); + sb.append("/\n"); + return sb; + } + + private CharSequence utSpecProcTemplate() { + StringBuilder sb = new StringBuilder(); + final Integer numberOfTestsPerUnit = (Integer) numberOfTestsPerUnitModel.getValue(); + final boolean withContext = numberOfTestsPerUnit > 1; + if (withContext) { + sb.append("--%context([procedure_name])\n\n"); + } + for (int i = 0; i < numberOfTestsPerUnit; i ++) { + sb.append("--%test\n"); + if (disableTestsCheckBox.isSelected()) { + sb.append("--%disabled\n"); + } + sb.append("PROCEDURE "); + sb.append(testUnitPrefixTextField.getText()); + sb.append("[procedure_name]"); + sb.append(testUnitSuffixTextField.getText()); + if (withContext) { + sb.append(i); + } + sb.append(";\n\n"); } - _builder.append(" IS"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append("l_actual INTEGER := 0;"); - _builder.newLine(); - _builder.append("\t"); - _builder.append("l_expected INTEGER := 1;"); - _builder.newLine(); - _builder.append("BEGIN"); - _builder.newLine(); - { - boolean _isSelected_1 = this.generateCommentsCheckBox.isSelected(); - if (_isSelected_1) { - _builder.append("\t"); - _builder.append("-- populate actual"); - _builder.newLine(); - _builder.append("\t"); - _builder.append("-- ..."); - _builder.newLine(); - _builder.newLine(); - _builder.append("\t"); - _builder.append("-- populate expected"); - _builder.newLine(); - _builder.append("\t"); - _builder.append("-- ..."); - _builder.newLine(); - _builder.newLine(); - _builder.append("\t"); - _builder.append("-- assert"); - _builder.newLine(); - } + if (withContext) { + sb.append("--%endcontext\n\n"); } - _builder.append("\t"); - _builder.append("ut.expect(l_actual).to_equal(l_expected);"); - _builder.newLine(); - _builder.append("END "); - String _text_2 = this.testUnitPrefixTextField.getText(); - _builder.append(_text_2); - _builder.append("[procedure_name]"); - String _text_3 = this.testUnitSuffixTextField.getText(); - _builder.append(_text_3); - { - if (withContext) { - _builder.append(i); - } + return sb; + } + + private CharSequence utBodyTemplate() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE BODY "); + sb.append(testPackagePrefixTextField.getText()); + sb.append("[package_name]"); + sb.append(testPackageSuffixTextField.getText()); + sb.append(" IS\n\n"); + sb.append('\t'); + sb.append(utBodyProcTemplate()); + sb.append('\n'); + sb.append("END "); + sb.append(testPackagePrefixTextField.getText()); + sb.append("[package_name]"); + sb.append(testPackageSuffixTextField.getText()); + sb.append(";\n"); + sb.append("/\n"); + return sb; + } + + private CharSequence utBodyProcTemplate() { + StringBuilder sb = new StringBuilder(); + final Integer numberOfTestsPerUnit = (Integer) numberOfTestsPerUnitModel.getValue(); + final boolean withContext = numberOfTestsPerUnit > 1; + for (int i = 0; i < numberOfTestsPerUnit; i++) { + if (generateCommentsCheckBox.isSelected()) { + sb.append("--\n"); + sb.append("-- test"); + if (withContext) { + sb.append(" [procedure_name] case "); + sb.append(i); + sb.append(": ..."); + } + sb.append('\n'); + sb.append("--\n"); + } + sb.append("PROCEDURE "); + sb.append(testUnitPrefixTextField.getText()); + sb.append("[procedure_name]"); + sb.append(testUnitSuffixTextField.getText()); + if (withContext) { + sb.append(i); + } + sb.append(" IS\n"); + sb.append("\tl_actual INTEGER := 0;\n"); + sb.append("\tl_expected INTEGER := 1;\n"); + sb.append("BEGIN\n"); + if (generateCommentsCheckBox.isSelected()) { + sb.append("\t-- populate actual\n"); + sb.append("\t-- ...\n\n"); + sb.append("\t-- populate expected\n"); + sb.append("\t-- ...\n\n"); + sb.append("\t-- assert\n"); + } + sb.append("\tut.expect(l_actual).to_equal(l_expected);"); + sb.append("END "); + sb.append(testUnitPrefixTextField.getText()); + sb.append("[procedure_name]"); + sb.append(testUnitSuffixTextField.getText()); + if (withContext) { + sb.append(i); + } + sb.append(";\n\n"); } - _builder.append(";"); - _builder.newLineIfNotEmpty(); - _builder.newLine(); - } + return sb; + } + + @Override + public void onEntry(final TraversableContext traversableContext) { + PreferenceModel info = getUserInformation(traversableContext); + useRealtimeReporterCheckBox.setSelected(info.isUseRealtimeReporter()); + unsharedWorksheetCheckBox.setSelected(info.isUnsharedWorksheet()); + resetPackageCheckBox.setSelected(info.isResetPackage()); + clearScreenCheckBox.setSelected(info.isClearScreen()); + autoExecuteCheckBox.setSelected(info.isAutoExecute()); + checkRunUtplsqlTestCheckBox.setSelected(info.isCheckRunUtplsqlTest()); + useSmartTimesCheckBox.setSelected(info.isUseSmartTimes()); + numberOfRunsInHistorySpinner.setValue(Integer.valueOf(info.getNumberOfRunsInHistory())); + showDisabledCounterCheckBox.setSelected(info.isShowDisabledCounter()); + showWarningsCounterCheckBox.setSelected(info.isShowWarningsCounter()); + showInfoCounterCheckBox.setSelected(info.isShowInfoCounter()); + showWarningIndicatorCheckBox.setSelected(info.isShowWarningIndicator()); + showInfoIndicatorCheckBox.setSelected(info.isShowInfoIndicator()); + showSuccessfulTestsCheckBox.setSelected(info.isShowSuccessfulTests()); + showDisabledTestsCheckBox.setSelected(info.isShowDisabledTests()); + showTestDescriptionCheckBox.setSelected(info.isShowTestDescription()); + syncDetailTabCheckBox.setSelected(info.isSyncDetailTab()); + testPackagePrefixTextField.setText(info.getTestPackagePrefix()); + testPackageSuffixTextField.setText(info.getTestPackageSuffix()); + testUnitPrefixTextField.setText(info.getTestUnitPrefix()); + testUnitSuffixTextField.setText(info.getTestUnitSuffix()); + numberOfTestsPerUnitSpinner.setValue(Integer.valueOf(info.getNumberOfTestsPerUnit())); + checkGenerateUtplsqlTestCheckBox.setSelected(info.isCheckGenerateUtplsqlTest()); + loadCodeTemplates(); + generateCommentsCheckBox.setSelected(info.isGenerateComments()); + disableTestsCheckBox.setSelected(info.isDisableTests()); + suitePathTextField.setText(info.getSuitePath()); + indentSpacesSpinner.setValue(Integer.valueOf(info.getIndentSpaces())); + rootFolderInOddgenViewTextField.setText(info.getRootFolderInOddgenView()); + generateFilesCheckBox.setSelected(info.isGenerateFiles()); + outputDirectoryTextField.setText(info.getOutputDirectory()); + deleteExistingFilesCheckBox.setSelected(info.isDeleteExistingFiles()); + super.onEntry(traversableContext); + } + + @Override + public void onExit(final TraversableContext traversableContext) throws TraversalException { + PreferenceModel info = getUserInformation(traversableContext); + info.setUseRealtimeReporter(useRealtimeReporterCheckBox.isSelected()); + info.setUnsharedWorksheet(unsharedWorksheetCheckBox.isSelected()); + info.setResetPackage(resetPackageCheckBox.isSelected()); + info.setClearScreen(clearScreenCheckBox.isSelected()); + info.setAutoExecute(autoExecuteCheckBox.isSelected()); + info.setNumberOfRunsInHistory((Integer) numberOfRunsInHistorySpinner.getValue()); + info.setCheckRunUtplsqlTest(checkRunUtplsqlTestCheckBox.isSelected()); + info.setUseSmartTimes(useSmartTimesCheckBox.isSelected()); + info.setShowDisabledCounter(showDisabledCounterCheckBox.isSelected()); + info.setShowWarningsCounter(showWarningsCounterCheckBox.isSelected()); + info.setShowInfoCounter(showInfoCounterCheckBox.isSelected()); + info.setShowWarningIndicator(showWarningIndicatorCheckBox.isSelected()); + info.setShowInfoIndicator(showInfoIndicatorCheckBox.isSelected()); + info.setShowSuccessfulTests(showSuccessfulTestsCheckBox.isSelected()); + info.setShowDisabledTests(showDisabledTestsCheckBox.isSelected()); + info.setShowTestDescription(showTestDescriptionCheckBox.isSelected()); + info.setSyncDetailTab(syncDetailTabCheckBox.isSelected()); + info.setTestPackagePrefix(testPackagePrefixTextField.getText()); + info.setTestPackageSuffix(testPackageSuffixTextField.getText()); + info.setTestUnitPrefix(testUnitPrefixTextField.getText()); + info.setTestUnitSuffix(testUnitSuffixTextField.getText()); + info.setNumberOfTestsPerUnit((Integer) numberOfTestsPerUnitSpinner.getValue()); + info.setCheckGenerateUtplsqlTest(checkGenerateUtplsqlTestCheckBox.isSelected()); + info.setGenerateComments(generateCommentsCheckBox.isSelected()); + info.setDisableTests(disableTestsCheckBox.isSelected()); + info.setSuitePath(suitePathTextField.getText()); + info.setIndentSpaces((Integer) indentSpacesSpinner.getValue()); + info.setRootFolderInOddgenView(rootFolderInOddgenViewTextField.getText()); + info.setGenerateFiles(generateFilesCheckBox.isSelected()); + info.setOutputDirectory(outputDirectoryTextField.getText()); + info.setDeleteExistingFiles(deleteExistingFilesCheckBox.isSelected()); + super.onExit(traversableContext); + } + + private static PreferenceModel getUserInformation(final TraversableContext tc) { + return PreferenceModel.getInstance(tc.getPropertyStorage()); } - return _builder; - } - - @Override - public void onEntry(final TraversableContext traversableContext) { - PreferenceModel info = PreferencePanel.getUserInformation(traversableContext); - this.useRealtimeReporterCheckBox.setSelected(info.isUseRealtimeReporter()); - this.unsharedWorksheetCheckBox.setSelected(info.isUnsharedWorksheet()); - this.resetPackageCheckBox.setSelected(info.isResetPackage()); - this.clearScreenCheckBox.setSelected(info.isClearScreen()); - this.autoExecuteCheckBox.setSelected(info.isAutoExecute()); - this.checkRunUtplsqlTestCheckBox.setSelected(info.isCheckRunUtplsqlTest()); - this.useSmartTimesCheckBox.setSelected(info.isUseSmartTimes()); - this.numberOfRunsInHistorySpinner.setValue(Integer.valueOf(info.getNumberOfRunsInHistory())); - this.showDisabledCounterCheckBox.setSelected(info.isShowDisabledCounter()); - this.showWarningsCounterCheckBox.setSelected(info.isShowWarningsCounter()); - this.showInfoCounterCheckBox.setSelected(info.isShowInfoCounter()); - this.showWarningIndicatorCheckBox.setSelected(info.isShowWarningIndicator()); - this.showInfoIndicatorCheckBox.setSelected(info.isShowInfoIndicator()); - this.showSuccessfulTestsCheckBox.setSelected(info.isShowSuccessfulTests()); - this.showDisabledTestsCheckBox.setSelected(info.isShowDisabledTests()); - this.showTestDescriptionCheckBox.setSelected(info.isShowTestDescription()); - this.syncDetailTabCheckBox.setSelected(info.isSyncDetailTab()); - this.testPackagePrefixTextField.setText(info.getTestPackagePrefix()); - this.testPackageSuffixTextField.setText(info.getTestPackageSuffix()); - this.testUnitPrefixTextField.setText(info.getTestUnitPrefix()); - this.testUnitSuffixTextField.setText(info.getTestUnitSuffix()); - this.numberOfTestsPerUnitSpinner.setValue(Integer.valueOf(info.getNumberOfTestsPerUnit())); - this.checkGenerateUtplsqlTestCheckBox.setSelected(info.isCheckGenerateUtplsqlTest()); - this.loadCodeTemplates(); - this.generateCommentsCheckBox.setSelected(info.isGenerateComments()); - this.disableTestsCheckBox.setSelected(info.isDisableTests()); - this.suitePathTextField.setText(info.getSuitePath()); - this.indentSpacesSpinner.setValue(Integer.valueOf(info.getIndentSpaces())); - this.rootFolderInOddgenViewTextField.setText(info.getRootFolderInOddgenView()); - this.generateFilesCheckBox.setSelected(info.isGenerateFiles()); - this.outputDirectoryTextField.setText(info.getOutputDirectory()); - this.deleteExistingFilesCheckBox.setSelected(info.isDeleteExistingFiles()); - super.onEntry(traversableContext); - } - - @Override - public void onExit(final TraversableContext traversableContext) throws TraversalException { - PreferenceModel info = PreferencePanel.getUserInformation(traversableContext); - info.setUseRealtimeReporter(this.useRealtimeReporterCheckBox.isSelected()); - info.setUnsharedWorksheet(this.unsharedWorksheetCheckBox.isSelected()); - info.setResetPackage(this.resetPackageCheckBox.isSelected()); - info.setClearScreen(this.clearScreenCheckBox.isSelected()); - info.setAutoExecute(this.autoExecuteCheckBox.isSelected()); - Object _value = this.numberOfRunsInHistorySpinner.getValue(); - info.setNumberOfRunsInHistory((((Integer) _value)).intValue()); - info.setCheckRunUtplsqlTest(this.checkRunUtplsqlTestCheckBox.isSelected()); - info.setUseSmartTimes(this.useSmartTimesCheckBox.isSelected()); - info.setShowDisabledCounter(this.showDisabledCounterCheckBox.isSelected()); - info.setShowWarningsCounter(this.showWarningsCounterCheckBox.isSelected()); - info.setShowInfoCounter(this.showInfoCounterCheckBox.isSelected()); - info.setShowWarningIndicator(this.showWarningIndicatorCheckBox.isSelected()); - info.setShowInfoIndicator(this.showInfoIndicatorCheckBox.isSelected()); - info.setShowSuccessfulTests(this.showSuccessfulTestsCheckBox.isSelected()); - info.setShowDisabledTests(this.showDisabledTestsCheckBox.isSelected()); - info.setShowTestDescription(this.showTestDescriptionCheckBox.isSelected()); - info.setSyncDetailTab(this.syncDetailTabCheckBox.isSelected()); - info.setTestPackagePrefix(this.testPackagePrefixTextField.getText()); - info.setTestPackageSuffix(this.testPackageSuffixTextField.getText()); - info.setTestUnitPrefix(this.testUnitPrefixTextField.getText()); - info.setTestUnitSuffix(this.testUnitSuffixTextField.getText()); - Object _value_1 = this.numberOfTestsPerUnitSpinner.getValue(); - info.setNumberOfTestsPerUnit((((Integer) _value_1)).intValue()); - info.setCheckGenerateUtplsqlTest(this.checkGenerateUtplsqlTestCheckBox.isSelected()); - info.setGenerateComments(this.generateCommentsCheckBox.isSelected()); - info.setDisableTests(this.disableTestsCheckBox.isSelected()); - info.setSuitePath(this.suitePathTextField.getText()); - Object _value_2 = this.indentSpacesSpinner.getValue(); - info.setIndentSpaces((((Integer) _value_2)).intValue()); - info.setRootFolderInOddgenView(this.rootFolderInOddgenViewTextField.getText()); - info.setGenerateFiles(this.generateFilesCheckBox.isSelected()); - info.setOutputDirectory(this.outputDirectoryTextField.getText()); - info.setDeleteExistingFiles(this.deleteExistingFilesCheckBox.isSelected()); - super.onExit(traversableContext); - } - - private static PreferenceModel getUserInformation(final TraversableContext tc) { - return PreferenceModel.getInstance(tc.getPropertyStorage()); - } } From 023289f91fd507a5e0de2d2d1f1f01c880fd3539 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:24:48 +0200 Subject: [PATCH 135/286] rename ComboBoxItem.xtend to ComboBoxItem.java --- .../sqldev/ui/runner/{ComboBoxItem.xtend => ComboBoxItem.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{ComboBoxItem.xtend => ComboBoxItem.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java From c6f2b3d9a5a8109c7f8ffde87547971aa56873e7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:25:09 +0200 Subject: [PATCH 136/286] add ComboBoxItem.java generated by Xtend 2.20.0 --- .../sqldev/ui/runner/ComboBoxItem.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java index f78658a3..6b6175b2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,16 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.util.AbstractMap +import java.util.AbstractMap; -class ComboBoxItem extends AbstractMap.SimpleEntry { - new(K key, V value) { - super(key, value) - } - - override toString() { - return value.toString - } +@SuppressWarnings("all") +public class ComboBoxItem extends AbstractMap.SimpleEntry { + public ComboBoxItem(final K key, final V value) { + super(key, value); + } + + @Override + public String toString() { + return this.getValue().toString(); + } } From 78589fae810a1c9410db292db8948acc242d55cd Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:26:54 +0200 Subject: [PATCH 137/286] convert ComboBoxItem to Java, removing Xtend dependencies --- .../sqldev/ui/runner/ComboBoxItem.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java index 6b6175b2..ac8f701b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ComboBoxItem.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,14 +17,15 @@ import java.util.AbstractMap; -@SuppressWarnings("all") public class ComboBoxItem extends AbstractMap.SimpleEntry { - public ComboBoxItem(final K key, final V value) { - super(key, value); - } - - @Override - public String toString() { - return this.getValue().toString(); - } + private static final long serialVersionUID = 7869442222989031548L; + + public ComboBoxItem(final K key, final V value) { + super(key, value); + } + + @Override + public String toString() { + return this.getValue().toString(); + } } From 4245dba006e830d8543dfdd64582fbe21fdd1e6d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:28:58 +0200 Subject: [PATCH 138/286] rename FailuresTableModel.xtend to FailuresTableModel.java --- .../runner/{FailuresTableModel.xtend => FailuresTableModel.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{FailuresTableModel.xtend => FailuresTableModel.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java From 475e52e4121dae4b1d59986b40b3e11d8dfa043e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:29:18 +0200 Subject: [PATCH 139/286] add FailuresTableModel.java generated by Xtend 2.20.0 --- .../sqldev/ui/runner/FailuresTableModel.java | 146 +++++++++--------- 1 file changed, 75 insertions(+), 71 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java index acd9418b..52712668 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,76 +13,80 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.util.List -import javax.swing.table.DefaultTableModel -import org.utplsql.sqldev.model.runner.Expectation -import org.utplsql.sqldev.resources.UtplsqlResources +import java.util.Collections; +import java.util.List; +import javax.swing.table.DefaultTableModel; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.utplsql.sqldev.model.runner.Expectation; +import org.utplsql.sqldev.resources.UtplsqlResources; -class FailuresTableModel extends DefaultTableModel { - List failedExpectations - - new() { - super() - } - - def setModel(List failedExpectations) { - this.failedExpectations = failedExpectations - } - - def getExpectation(int row) { - return failedExpectations.get(row) - } - - override getRowCount() { - if (failedExpectations === null) { - return 0 - } - return failedExpectations.size() - } - - override getColumnCount() { - return 2 - } - - override getValueAt(int row, int col) { - val expectation = failedExpectations.get(row) - if (expectation === null) { - return null - } - switch (col) { - case 0: { - return row + 1 - } - case 1: { - return expectation.shortFailureText - } - default: { - return null - } - } - } - - override getColumnName(int col) { - return #["#", UtplsqlResources.getString("RUNNER_ASSERT_DESCRIPTION_COLUMN")].get(col) - } - - override isCellEditable(int row, int column) { - return false - } - - override getColumnClass(int col) { - switch (col) { - case 0: { - return Integer - } - case 1: { - return String - } - default: { - return String - } - } - } +@SuppressWarnings("all") +public class FailuresTableModel extends DefaultTableModel { + private List failedExpectations; + + public FailuresTableModel() { + super(); + } + + public List setModel(final List failedExpectations) { + return this.failedExpectations = failedExpectations; + } + + public Expectation getExpectation(final int row) { + return this.failedExpectations.get(row); + } + + @Override + public int getRowCount() { + if ((this.failedExpectations == null)) { + return 0; + } + return this.failedExpectations.size(); + } + + @Override + public int getColumnCount() { + return 2; + } + + @Override + public Object getValueAt(final int row, final int col) { + final Expectation expectation = this.failedExpectations.get(row); + if ((expectation == null)) { + return null; + } + switch (col) { + case 0: + return Integer.valueOf((row + 1)); + case 1: + return expectation.getShortFailureText(); + default: + return null; + } + } + + @Override + public String getColumnName(final int col) { + String _string = UtplsqlResources.getString("RUNNER_ASSERT_DESCRIPTION_COLUMN"); + return Collections.unmodifiableList(CollectionLiterals.newArrayList("#", _string)).get(col); + } + + @Override + public boolean isCellEditable(final int row, final int column) { + return false; + } + + @Override + public Class getColumnClass(final int col) { + switch (col) { + case 0: + return Integer.class; + case 1: + return String.class; + default: + return String.class; + } + } } From 8e1070d2fa39f862d702f223edcf03e73dd40671 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:43:06 +0200 Subject: [PATCH 140/286] convert FailuresTableModel to Java, removing Xtend dependencies --- .../sqldev/ui/runner/FailuresTableModel.java | 131 +++++++++--------- 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java index 52712668..3acf505c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/FailuresTableModel.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,78 +15,79 @@ */ package org.utplsql.sqldev.ui.runner; -import java.util.Collections; +import java.util.Arrays; import java.util.List; + import javax.swing.table.DefaultTableModel; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; + import org.utplsql.sqldev.model.runner.Expectation; import org.utplsql.sqldev.resources.UtplsqlResources; -@SuppressWarnings("all") public class FailuresTableModel extends DefaultTableModel { - private List failedExpectations; - - public FailuresTableModel() { - super(); - } - - public List setModel(final List failedExpectations) { - return this.failedExpectations = failedExpectations; - } - - public Expectation getExpectation(final int row) { - return this.failedExpectations.get(row); - } - - @Override - public int getRowCount() { - if ((this.failedExpectations == null)) { - return 0; + private static final long serialVersionUID = 8119453059788497567L; + private List failedExpectations; + private List columnNames = Arrays.asList("#", UtplsqlResources.getString("RUNNER_ASSERT_DESCRIPTION_COLUMN")); + + public FailuresTableModel() { + super(); + } + + public void setModel(final List failedExpectations) { + this.failedExpectations = failedExpectations; + } + + public Expectation getExpectation(final int row) { + return failedExpectations.get(row); + } + + @Override + public int getRowCount() { + if (failedExpectations == null) { + return 0; + } + return failedExpectations.size(); + } + + @Override + public int getColumnCount() { + return 2; + } + + @Override + public Object getValueAt(final int row, final int col) { + final Expectation expectation = failedExpectations.get(row); + if (expectation == null) { + return null; + } + switch (col) { + case 0: + return row + 1; + case 1: + return expectation.getShortFailureText(); + default: + return null; + } } - return this.failedExpectations.size(); - } - - @Override - public int getColumnCount() { - return 2; - } - - @Override - public Object getValueAt(final int row, final int col) { - final Expectation expectation = this.failedExpectations.get(row); - if ((expectation == null)) { - return null; + + @Override + public String getColumnName(final int col) { + return columnNames.get(col); } - switch (col) { - case 0: - return Integer.valueOf((row + 1)); - case 1: - return expectation.getShortFailureText(); - default: - return null; + + @Override + public boolean isCellEditable(final int row, final int column) { + return false; } - } - - @Override - public String getColumnName(final int col) { - String _string = UtplsqlResources.getString("RUNNER_ASSERT_DESCRIPTION_COLUMN"); - return Collections.unmodifiableList(CollectionLiterals.newArrayList("#", _string)).get(col); - } - - @Override - public boolean isCellEditable(final int row, final int column) { - return false; - } - - @Override - public Class getColumnClass(final int col) { - switch (col) { - case 0: - return Integer.class; - case 1: - return String.class; - default: - return String.class; + + @Override + public Class getColumnClass(final int col) { + switch (col) { + case 0: + return Integer.class; + case 1: + return String.class; + default: + return String.class; + } } - } } From 5873dc495892d0185116e45d8f482b6268e47b44 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:48:30 +0200 Subject: [PATCH 141/286] rename GradientToolbar.xtend to GradientToolbar.java --- .../ui/runner/{GradientToolbar.xtend => GradientToolbar.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{GradientToolbar.xtend => GradientToolbar.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java From a05f01c3e3b1bed76c39673c9f8769281457b577 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:48:55 +0200 Subject: [PATCH 142/286] add GradientToolbar.java generated by Xtend 2.20.0 --- .../sqldev/ui/runner/GradientToolbar.java | 148 ++++++++++-------- 1 file changed, 79 insertions(+), 69 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java index 8c04e7b5..2495e721 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,73 +13,83 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.awt.Color -import java.awt.GradientPaint -import java.awt.Graphics -import java.awt.Graphics2D -import java.awt.Insets -import javax.swing.JToolBar -import javax.swing.UIManager -import javax.swing.border.BevelBorder -import javax.swing.border.EmptyBorder +import com.google.common.base.Objects; +import java.awt.Color; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import javax.swing.JToolBar; +import javax.swing.LookAndFeel; +import javax.swing.UIManager; +import javax.swing.border.BevelBorder; +import javax.swing.border.EmptyBorder; -class GradientToolbar extends JToolBar { - - private def isOracleLookAndFeel() { - val laf = UIManager.lookAndFeel?.name - if (laf == "Oracle Look and Feel version 2") { - return true - } else { - return false - } - } - - new() { - super() - if (oracleLookAndFeel) { - this.border = new EmptyBorder(new Insets(2, 2, 2, 2)) // top, left, bottom, right - } else { - this.border = new BevelBorder(BevelBorder.RAISED) - } - } - - override paintComponent(Graphics g) { - if (oracleLookAndFeel) { - // emulate Oracle toolbar - // 1. default for non-opaque components - if (!opaque) { - super.paintComponent(g) - return - } - - // 2. paint gradient background from top to bottom with separator line at the bottom - val g2d = g as Graphics2D - val w = width - val h = height - 1 - val int h2 = height / 2 - val colorTop = new Color(237, 237, 237) - val colorMiddle = new Color(244, 244, 244) - val colorBottom = new Color(254, 254, 254) - val colorBottomLine = Color.LIGHT_GRAY - val gp1 = new GradientPaint(0, 0, colorTop, 0, h2, colorMiddle) - g2d.paint = gp1 - g2d.fillRect(0, 0, w, h2) - val gp2 = new GradientPaint(0, h2, colorMiddle, 0, h, colorBottom) - g2d.paint = gp2 - g2d.fillRect(0, h2, w, h) - g2d.paint = colorBottomLine - g2d.fillRect(0, h, w, h+1) - - // 3. do rest, changing opaque to ensure background is not overwritten - setOpaque(false) - super.paintComponent(g) - setOpaque(true) - } else { - // default logic - super.paintComponent(g) - } - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class GradientToolbar extends JToolBar { + private boolean isOracleLookAndFeel() { + LookAndFeel _lookAndFeel = UIManager.getLookAndFeel(); + String _name = null; + if (_lookAndFeel!=null) { + _name=_lookAndFeel.getName(); + } + final String laf = _name; + boolean _equals = Objects.equal(laf, "Oracle Look and Feel version 2"); + if (_equals) { + return true; + } else { + return false; + } + } + + public GradientToolbar() { + super(); + boolean _isOracleLookAndFeel = this.isOracleLookAndFeel(); + if (_isOracleLookAndFeel) { + Insets _insets = new Insets(2, 2, 2, 2); + EmptyBorder _emptyBorder = new EmptyBorder(_insets); + this.setBorder(_emptyBorder); + } else { + BevelBorder _bevelBorder = new BevelBorder(BevelBorder.RAISED); + this.setBorder(_bevelBorder); + } + } + + @Override + public void paintComponent(final Graphics g) { + boolean _isOracleLookAndFeel = this.isOracleLookAndFeel(); + if (_isOracleLookAndFeel) { + boolean _isOpaque = this.isOpaque(); + boolean _not = (!_isOpaque); + if (_not) { + super.paintComponent(g); + return; + } + final Graphics2D g2d = ((Graphics2D) g); + final int w = this.getWidth(); + int _height = this.getHeight(); + final int h = (_height - 1); + int _height_1 = this.getHeight(); + final int h2 = (_height_1 / 2); + final Color colorTop = new Color(237, 237, 237); + final Color colorMiddle = new Color(244, 244, 244); + final Color colorBottom = new Color(254, 254, 254); + final Color colorBottomLine = Color.LIGHT_GRAY; + final GradientPaint gp1 = new GradientPaint(0, 0, colorTop, 0, h2, colorMiddle); + g2d.setPaint(gp1); + g2d.fillRect(0, 0, w, h2); + final GradientPaint gp2 = new GradientPaint(0, h2, colorMiddle, 0, h, colorBottom); + g2d.setPaint(gp2); + g2d.fillRect(0, h2, w, h); + g2d.setPaint(colorBottomLine); + g2d.fillRect(0, h, w, (h + 1)); + this.setOpaque(false); + super.paintComponent(g); + this.setOpaque(true); + } else { + super.paintComponent(g); + } + } +} From d561b70670a049f36b17f0bea407ef64c7e19ec4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 11:59:03 +0200 Subject: [PATCH 143/286] convert GradientToolbar to Java, removing Xtend dependencies --- .../sqldev/ui/runner/GradientToolbar.java | 116 ++++++++---------- 1 file changed, 53 insertions(+), 63 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java index 2495e721..6f163124 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,81 +15,71 @@ */ package org.utplsql.sqldev.ui.runner; -import com.google.common.base.Objects; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; + import javax.swing.JToolBar; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.border.BevelBorder; import javax.swing.border.EmptyBorder; -@SuppressWarnings("all") public class GradientToolbar extends JToolBar { - private boolean isOracleLookAndFeel() { - LookAndFeel _lookAndFeel = UIManager.getLookAndFeel(); - String _name = null; - if (_lookAndFeel!=null) { - _name=_lookAndFeel.getName(); - } - final String laf = _name; - boolean _equals = Objects.equal(laf, "Oracle Look and Feel version 2"); - if (_equals) { - return true; - } else { - return false; + private static final long serialVersionUID = 6128707792081725058L; + + private boolean isOracleLookAndFeel() { + LookAndFeel laf = UIManager.getLookAndFeel(); + final String lafName = laf != null ? laf.getName() : null; + return "Oracle Look and Feel version 2".equals(lafName); } - } - - public GradientToolbar() { - super(); - boolean _isOracleLookAndFeel = this.isOracleLookAndFeel(); - if (_isOracleLookAndFeel) { - Insets _insets = new Insets(2, 2, 2, 2); - EmptyBorder _emptyBorder = new EmptyBorder(_insets); - this.setBorder(_emptyBorder); - } else { - BevelBorder _bevelBorder = new BevelBorder(BevelBorder.RAISED); - this.setBorder(_bevelBorder); + + public GradientToolbar() { + super(); + if (isOracleLookAndFeel()) { + setBorder(new EmptyBorder(new Insets(2, 2, 2, 2))); // insets: top, left, bottom, right + } else { + setBorder(new BevelBorder(BevelBorder.RAISED)); + } } - } - - @Override - public void paintComponent(final Graphics g) { - boolean _isOracleLookAndFeel = this.isOracleLookAndFeel(); - if (_isOracleLookAndFeel) { - boolean _isOpaque = this.isOpaque(); - boolean _not = (!_isOpaque); - if (_not) { - super.paintComponent(g); - return; - } - final Graphics2D g2d = ((Graphics2D) g); - final int w = this.getWidth(); - int _height = this.getHeight(); - final int h = (_height - 1); - int _height_1 = this.getHeight(); - final int h2 = (_height_1 / 2); - final Color colorTop = new Color(237, 237, 237); - final Color colorMiddle = new Color(244, 244, 244); - final Color colorBottom = new Color(254, 254, 254); - final Color colorBottomLine = Color.LIGHT_GRAY; - final GradientPaint gp1 = new GradientPaint(0, 0, colorTop, 0, h2, colorMiddle); - g2d.setPaint(gp1); - g2d.fillRect(0, 0, w, h2); - final GradientPaint gp2 = new GradientPaint(0, h2, colorMiddle, 0, h, colorBottom); - g2d.setPaint(gp2); - g2d.fillRect(0, h2, w, h); - g2d.setPaint(colorBottomLine); - g2d.fillRect(0, h, w, (h + 1)); - this.setOpaque(false); - super.paintComponent(g); - this.setOpaque(true); - } else { - super.paintComponent(g); + + @Override + public void paintComponent(final Graphics g) { + if (isOracleLookAndFeel()) { + // emulate Oracle toolbar + // 1. default for non-opaque components + if (!isOpaque()) { + super.paintComponent(g); + return; + } + + // 2. paint gradient background from top to bottom with separator line at the bottom + final Graphics2D g2d = ((Graphics2D) g); + final int w = getWidth(); + final int h = (getHeight() - 1); + final int h2 = (getHeight() / 2); + final Color colorTop = new Color(237, 237, 237); + final Color colorMiddle = new Color(244, 244, 244); + final Color colorBottom = new Color(254, 254, 254); + final Color colorBottomLine = Color.LIGHT_GRAY; + final GradientPaint gp1 = new GradientPaint(0, 0, colorTop, 0, h2, colorMiddle); + g2d.setPaint(gp1); + g2d.fillRect(0, 0, w, h2); + final GradientPaint gp2 = new GradientPaint(0, h2, colorMiddle, 0, h, colorBottom); + g2d.setPaint(gp2); + g2d.fillRect(0, h2, w, h); + g2d.setPaint(colorBottomLine); + g2d.fillRect(0, h, w, (h + 1)); + + // 3. do rest, changing opaque to ensure background is not overwritten + setOpaque(false); + super.paintComponent(g); + setOpaque(true); + } else { + // default logic + super.paintComponent(g); + } } - } } From 61f91366bfd6cbecc5e4f86604691a8544b50004 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 12:00:21 +0200 Subject: [PATCH 144/286] rename RunnerFactory.xtend to RunnerFactory.java --- .../sqldev/ui/runner/{RunnerFactory.xtend => RunnerFactory.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{RunnerFactory.xtend => RunnerFactory.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java From 4498c417ca4d6711de813ed805edd158004036bd Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 12:00:38 +0200 Subject: [PATCH 145/286] add RunnerFactory.java generated by Xtend 2.20.0 --- .../sqldev/ui/runner/RunnerFactory.java | 96 ++++++++++--------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java index 61915559..5e168388 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,49 +13,55 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import oracle.ide.docking.DockStation -import oracle.ide.docking.DockableFactory -import oracle.ide.docking.DockingParam -import oracle.ide.layout.ViewId +import oracle.ide.docking.DockStation; +import oracle.ide.docking.Dockable; +import oracle.ide.docking.DockableFactory; +import oracle.ide.docking.DockingParam; +import oracle.ide.layout.ViewId; +import org.utplsql.sqldev.ui.runner.RunnerView; -class RunnerFactory implements DockableFactory { - public static val FACTORY_NAME = "UTPLSQL_RUNNER_FACTORY" - - var RunnerView dockable - - override install() { - val dockStation = DockStation.getDockStation(); - val dp = new DockingParam(); - val referencedViewId = new ViewId("DatabaseNavigatorWindow", "DatabaseNavigatorWindow") - val referencedDockable = dockStation.findDockable(referencedViewId) - dp.tabbedWith = referencedDockable - dockStation.dock(getLocalDockable(), dp); - } - - override getDockable(ViewId viewId) { - if (viewId === RunnerView.VIEW_ID) { - return localDockable - } - return null - } - - private def getLocalDockable() { - if (dockable === null) { - dockable = new RunnerView - } - return dockable - } - - static def getDockable() { - val dockStation = DockStation.dockStation - val dockable = dockStation.findDockable(RunnerView.VIEW_ID) - return dockable as RunnerView - } - - static def void showDockable() { - val dockStation = DockStation.dockStation - dockStation.setDockableVisible(getDockable(), true) - } -} \ No newline at end of file +@SuppressWarnings("all") +public class RunnerFactory implements DockableFactory { + public static final String FACTORY_NAME = "UTPLSQL_RUNNER_FACTORY"; + + private RunnerView dockable; + + @Override + public void install() { + final DockStation dockStation = DockStation.getDockStation(); + final DockingParam dp = new DockingParam(); + final ViewId referencedViewId = new ViewId("DatabaseNavigatorWindow", "DatabaseNavigatorWindow"); + final Dockable referencedDockable = dockStation.findDockable(referencedViewId); + dp.setTabbedWith(referencedDockable); + dockStation.dock(this.getLocalDockable(), dp); + } + + @Override + public Dockable getDockable(final ViewId viewId) { + if ((viewId == RunnerView.VIEW_ID)) { + return this.getLocalDockable(); + } + return null; + } + + private RunnerView getLocalDockable() { + if ((this.dockable == null)) { + RunnerView _runnerView = new RunnerView(); + this.dockable = _runnerView; + } + return this.dockable; + } + + public static RunnerView getDockable() { + final DockStation dockStation = DockStation.getDockStation(); + final Dockable dockable = dockStation.findDockable(RunnerView.VIEW_ID); + return ((RunnerView) dockable); + } + + public static void showDockable() { + final DockStation dockStation = DockStation.getDockStation(); + dockStation.setDockableVisible(RunnerFactory.getDockable(), true); + } +} From e6970ab6124dc11368c377050c7cc211caa01746 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 12:03:26 +0200 Subject: [PATCH 146/286] convert RunnerFactory to Java, removing Xtend dependencies --- .../sqldev/ui/runner/RunnerFactory.java | 79 +++++++++---------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java index 5e168388..72483953 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerFactory.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,48 +20,45 @@ import oracle.ide.docking.DockableFactory; import oracle.ide.docking.DockingParam; import oracle.ide.layout.ViewId; -import org.utplsql.sqldev.ui.runner.RunnerView; -@SuppressWarnings("all") public class RunnerFactory implements DockableFactory { - public static final String FACTORY_NAME = "UTPLSQL_RUNNER_FACTORY"; - - private RunnerView dockable; - - @Override - public void install() { - final DockStation dockStation = DockStation.getDockStation(); - final DockingParam dp = new DockingParam(); - final ViewId referencedViewId = new ViewId("DatabaseNavigatorWindow", "DatabaseNavigatorWindow"); - final Dockable referencedDockable = dockStation.findDockable(referencedViewId); - dp.setTabbedWith(referencedDockable); - dockStation.dock(this.getLocalDockable(), dp); - } - - @Override - public Dockable getDockable(final ViewId viewId) { - if ((viewId == RunnerView.VIEW_ID)) { - return this.getLocalDockable(); + public static final String FACTORY_NAME = "UTPLSQL_RUNNER_FACTORY"; + + private RunnerView dockable; + + @Override + public void install() { + final DockStation dockStation = DockStation.getDockStation(); + final DockingParam dp = new DockingParam(); + final ViewId referencedViewId = new ViewId("DatabaseNavigatorWindow", "DatabaseNavigatorWindow"); + final Dockable referencedDockable = dockStation.findDockable(referencedViewId); + dp.setTabbedWith(referencedDockable); + dockStation.dock(getLocalDockable(), dp); } - return null; - } - - private RunnerView getLocalDockable() { - if ((this.dockable == null)) { - RunnerView _runnerView = new RunnerView(); - this.dockable = _runnerView; + + @Override + public Dockable getDockable(final ViewId viewId) { + if (viewId == RunnerView.VIEW_ID) { + return getLocalDockable(); + } + return null; + } + + private RunnerView getLocalDockable() { + if (dockable == null) { + dockable = new RunnerView(); + } + return dockable; + } + + public static RunnerView getDockable() { + final DockStation dockStation = DockStation.getDockStation(); + final Dockable dockable = dockStation.findDockable(RunnerView.VIEW_ID); + return (RunnerView) dockable; + } + + public static void showDockable() { + final DockStation dockStation = DockStation.getDockStation(); + dockStation.setDockableVisible(getDockable(), true); } - return this.dockable; - } - - public static RunnerView getDockable() { - final DockStation dockStation = DockStation.getDockStation(); - final Dockable dockable = dockStation.findDockable(RunnerView.VIEW_ID); - return ((RunnerView) dockable); - } - - public static void showDockable() { - final DockStation dockStation = DockStation.getDockStation(); - dockStation.setDockableVisible(RunnerFactory.getDockable(), true); - } } From 2e1c838a6dbef659ff4541a5bdca378062f87330 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 12:04:58 +0200 Subject: [PATCH 147/286] rename RunnerPanel.xtend to RunnerPanel.java --- .../sqldev/ui/runner/{RunnerPanel.xtend => RunnerPanel.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{RunnerPanel.xtend => RunnerPanel.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java From 331fe3807e9a0d0efae17d2ac0fec7fdc402bccf Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 12:05:16 +0200 Subject: [PATCH 148/286] add RunnerPanel.java generated by Xtend 2.20.0 --- .../utplsql/sqldev/ui/runner/RunnerPanel.java | 3211 ++++++++++------- 1 file changed, 1897 insertions(+), 1314 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java index 37a4f699..289d2c7f 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,1318 +13,1901 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.awt.Color -import java.awt.Component -import java.awt.Dimension -import java.awt.FlowLayout -import java.awt.GridBagConstraints -import java.awt.GridBagLayout -import java.awt.Insets -import java.awt.event.ActionEvent -import java.awt.event.ActionListener -import java.awt.event.MouseEvent -import java.awt.event.MouseListener -import java.util.ArrayList -import java.util.regex.Pattern -import javax.swing.BorderFactory -import javax.swing.Box -import javax.swing.DefaultComboBoxModel -import javax.swing.JCheckBoxMenuItem -import javax.swing.JComboBox -import javax.swing.JComponent -import javax.swing.JLabel -import javax.swing.JMenuItem -import javax.swing.JPanel -import javax.swing.JPopupMenu -import javax.swing.JProgressBar -import javax.swing.JScrollPane -import javax.swing.JSeparator -import javax.swing.JSplitPane -import javax.swing.JTabbedPane -import javax.swing.JTable -import javax.swing.RepaintManager -import javax.swing.RowFilter -import javax.swing.SwingConstants -import javax.swing.Timer -import javax.swing.UIManager -import javax.swing.border.EmptyBorder -import javax.swing.event.HyperlinkEvent -import javax.swing.event.HyperlinkListener -import javax.swing.event.ListSelectionEvent -import javax.swing.event.ListSelectionListener -import javax.swing.plaf.basic.BasicProgressBarUI -import javax.swing.table.DefaultTableCellRenderer -import javax.swing.table.TableRowSorter -import oracle.dbtools.raptor.controls.grid.DefaultDrillLink -import oracle.dbtools.raptor.utils.Connections -import oracle.ide.config.Preferences -import oracle.javatools.ui.table.ToolbarButton -import org.springframework.web.util.HtmlUtils -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.model.LimitedLinkedHashMap -import org.utplsql.sqldev.model.preference.PreferenceModel -import org.utplsql.sqldev.model.runner.Run -import org.utplsql.sqldev.model.runner.Test -import org.utplsql.sqldev.parser.UtplsqlParser -import org.utplsql.sqldev.resources.UtplsqlResources -import org.utplsql.sqldev.runner.UtplsqlRunner -import org.utplsql.sqldev.runner.UtplsqlWorksheetRunner +import com.google.common.base.Objects; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.sql.Connection; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.DefaultComboBoxModel; +import javax.swing.Icon; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JProgressBar; +import javax.swing.JScrollPane; +import javax.swing.JSeparator; +import javax.swing.JSplitPane; +import javax.swing.JTabbedPane; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.LookAndFeel; +import javax.swing.RepaintManager; +import javax.swing.RowFilter; +import javax.swing.RowSorter; +import javax.swing.SwingConstants; +import javax.swing.Timer; +import javax.swing.UIManager; +import javax.swing.border.Border; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.plaf.basic.BasicProgressBarUI; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableModel; +import javax.swing.table.TableRowSorter; +import oracle.dbtools.raptor.controls.grid.DefaultDrillLink; +import oracle.dbtools.raptor.utils.Connections; +import oracle.ide.config.Preferences; +import oracle.javatools.ui.table.ToolbarButton; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Conversions; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.springframework.web.util.HtmlUtils; +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.model.LimitedLinkedHashMap; +import org.utplsql.sqldev.model.preference.PreferenceModel; +import org.utplsql.sqldev.model.runner.Counter; +import org.utplsql.sqldev.model.runner.Expectation; +import org.utplsql.sqldev.model.runner.Run; +import org.utplsql.sqldev.model.runner.Test; +import org.utplsql.sqldev.parser.UtplsqlParser; +import org.utplsql.sqldev.resources.UtplsqlResources; +import org.utplsql.sqldev.runner.UtplsqlRunner; +import org.utplsql.sqldev.runner.UtplsqlWorksheetRunner; +import org.utplsql.sqldev.ui.runner.ComboBoxItem; +import org.utplsql.sqldev.ui.runner.FailuresTableModel; +import org.utplsql.sqldev.ui.runner.GradientToolbar; +import org.utplsql.sqldev.ui.runner.RunnerTextArea; +import org.utplsql.sqldev.ui.runner.RunnerTextField; +import org.utplsql.sqldev.ui.runner.RunnerTextPane; +import org.utplsql.sqldev.ui.runner.ScrollablePanel; +import org.utplsql.sqldev.ui.runner.SmartTime; +import org.utplsql.sqldev.ui.runner.TestOverviewTableModel; +import org.utplsql.sqldev.ui.runner.WrapLayout; -class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener { - static val GREEN = new Color(0, 153, 0) - static val RED = new Color(153, 0, 0) - static val INDICATOR_WIDTH = 20 - static val OVERVIEW_TABLE_ROW_HEIGHT = 20 - static val TEXTPANE_DIM = new Dimension(100, 100) - static var boolean useSmartTimes - LimitedLinkedHashMap runs = new LimitedLinkedHashMap(10) - Run currentRun - JPanel basePanel - ToolbarButton refreshButton - ToolbarButton rerunButton - ToolbarButton rerunWorksheetButton - DefaultComboBoxModel> runComboBoxModel - ToolbarButton clearButton - JComboBox> runComboBox - JLabel statusLabel - JLabel elapsedTimeLabel - Timer elapsedTimeTimer - JLabel testCounterValueLabel - JLabel errorCounterValueLabel - JLabel failureCounterValueLabel - JLabel disabledCounterValueLabel - JLabel warningsCounterValueLabel - JLabel infoCounterValueLabel - JCheckBoxMenuItem showDisabledCounterCheckBoxMenuItem - JCheckBoxMenuItem showWarningsCounterCheckBoxMenuItem - JCheckBoxMenuItem showInfoCounterCheckBoxMenuItem - JProgressBar progressBar; - TestOverviewTableModel testOverviewTableModel - JTable testOverviewTable - JMenuItem testOverviewRunMenuItem - JMenuItem testOverviewRunWorksheetMenuItem - JCheckBoxMenuItem showTestDescriptionCheckBoxMenuItem - JCheckBoxMenuItem showWarningIndicatorCheckBoxMenuItem - JCheckBoxMenuItem showInfoIndicatorCheckBoxMenuItem - JCheckBoxMenuItem showSuccessfulTestsCheckBoxMenuItem - JCheckBoxMenuItem showDisabledTestsCheckBoxMenuItem - JCheckBoxMenuItem syncDetailTabCheckBoxMenuItem - RunnerTextField testOwnerTextField - RunnerTextField testPackageTextField - RunnerTextField testProcedureTextField - RunnerTextArea testDescriptionTextArea - RunnerTextArea testIdTextArea - RunnerTextField testStartTextField - FailuresTableModel failuresTableModel - JTable failuresTable - RunnerTextPane testFailureMessageTextPane - RunnerTextPane testErrorStackTextPane - RunnerTextPane testWarningsTextPane - RunnerTextPane testServerOutputTextPane - JTabbedPane testDetailTabbedPane - - def Component getGUI() { - if (basePanel === null) { - initializeGUI() - } - if (!basePanel.showing) { - applyPreferences - } - return basePanel - } - - private def resetDerived() { - testOverviewTable.rowSorter.sortKeys = null - testOverviewRunMenuItem.enabled = false - testOverviewRunWorksheetMenuItem.enabled = false - testIdTextArea.text = null - testOwnerTextField.text = null - testPackageTextField.text = null - testProcedureTextField.text = null - testDescriptionTextArea.text = null - testStartTextField.text = null - failuresTableModel.model = null - failuresTableModel.fireTableDataChanged - testFailureMessageTextPane.text = null - testErrorStackTextPane.text = null - testWarningsTextPane.text = null - testServerOutputTextPane.text = null - } - - private def refreshRunsComboBox() { - if (runs.size > 0) { - runComboBox.removeActionListener(this) - runComboBoxModel.removeAllElements - for (var i = runs.size - 1 ; i >= 0; i--) { - val entry = runs.entrySet.get(i) - val item = new ComboBoxItem(entry.key, entry.value.name) - runComboBoxModel.addElement(item) - } - runComboBox.selectedIndex = 0 - runComboBox.addActionListener(this) - } - } - - private def applyShowNumberOfRunsInHistory(int maxRuns) { - if (maxRuns != runs.maxEntries) { - val newRuns = new LimitedLinkedHashMap(maxRuns) - for (entry : runs.entrySet) { - newRuns.put(entry.key, entry.value) - } - runs = newRuns - } - } - - private def applyShowDisabledCounter(boolean show) { - disabledCounterValueLabel.parent.visible = showDisabledCounterCheckBoxMenuItem.selected - } - - private def applyShowWarningsCounter(boolean show) { - warningsCounterValueLabel.parent.visible = showWarningsCounterCheckBoxMenuItem.selected - } - - private def applyShowInfoCounter(boolean show) { - infoCounterValueLabel.parent.visible = showInfoCounterCheckBoxMenuItem.selected - } - - private def applyShowTestDescription(boolean show) { - testOverviewTableModel.updateModel(showTestDescriptionCheckBoxMenuItem.selected) - val idColumn = testOverviewTable.columnModel.getColumn(3) - idColumn.headerValue = testOverviewTableModel.testIdColumnName - testOverviewTable.tableHeader.repaint - } - - private def applyShowWarningIndicator(boolean show) { - val col = testOverviewTable.columnModel.getColumn(1) - if (show) { - col.width = INDICATOR_WIDTH - col.minWidth = INDICATOR_WIDTH - col.maxWidth = INDICATOR_WIDTH - col.preferredWidth = INDICATOR_WIDTH - } else { - col.width = 0 - col.minWidth = 0 - col.maxWidth = 0 - col.preferredWidth = 0 - } - } - - private def applyShowInfoIndicator(boolean show) { - val col = testOverviewTable.columnModel.getColumn(2) - if (show) { - col.width = INDICATOR_WIDTH - col.minWidth = INDICATOR_WIDTH - col.maxWidth = INDICATOR_WIDTH - col.preferredWidth = INDICATOR_WIDTH - } else { - col.width = 0 - col.minWidth = 0 - col.maxWidth = 0 - col.preferredWidth = 0 - } - } - - private def applyFilter(boolean showSuccessfulTests, boolean showDisabledTests) { - val sorter = testOverviewTable.rowSorter as TableRowSorter - val filter = new RowFilter() { - override include(Entry entry) { - val test = entry.model.getTest(entry.identifier) - val counter = test.counter - if (counter !== null) { - if (counter.success > 0) { - if (!showSuccessfulTests) { - return false - } - } - if (counter.disabled > 0) { - if (!showDisabledTests) { - return false - } - } - } - return true - } - } - sorter.rowFilter = filter - } - - private def openTest(Test test) { - val dao = new UtplsqlDao(Connections.instance.getConnection(currentRun.connectionName)) - val source = dao.getSource(test.ownerName, "PACKAGE", test.objectName.toUpperCase).trim - val parser = new UtplsqlParser(source) - val line = parser.getLineOf(test.procedureName) - openEditor(test.ownerName, "PACKAGE", test.objectName.toUpperCase, line, 1) - } - - private def openSelectedTest() { - val rowIndex = testOverviewTable.selectedRow - if (rowIndex != -1) { - val row = testOverviewTable.convertRowIndexToModel(rowIndex) - val test = testOverviewTableModel.getTest(row) - openTest(test) - } - } - - private def openSelectedFailure() { - val rowIndex = failuresTable.selectedRow - if (rowIndex != -1) { - val row = failuresTable.convertRowIndexToModel(rowIndex) - val expectation = failuresTableModel.getExpectation(row) - val test = testOverviewTableModel.getTest(testOverviewTable.convertRowIndexToModel(testOverviewTable.selectedRow)) - val callerLine = expectation.callerLine - if (callerLine !== null) { - openEditor(test.ownerName, "PACKAGE BODY", test.objectName.toUpperCase, expectation.callerLine, 1) - } else { - openTest(test) - } - } - } - - private def getHtml(String text) { - val html = ''' - - - - - - «getLinkedAndFormattedText(text)» - - - ''' - return html - } - - private def openLink(String link) { - val parts = link.split("/") - val type = parts.get(0) - val ownerName = parts.get(1) - val objectName = parts.get(2) - var line = Integer.parseInt(parts.get(3)) - val dao = new UtplsqlDao(Connections.instance.getConnection(currentRun.connectionName)) - val objectType = if (type=="UNKNOWN") {dao.getObjectType(ownerName, objectName)} else {type} - if (parts.size == 5) { - val procedureName = parts.get(4) - val source = dao.getSource(ownerName, objectType, objectName).trim - val parser = new UtplsqlParser(source) - line = parser.getLineOf(procedureName) - } - openEditor(ownerName, objectType, objectName.toUpperCase, line, 1) - } - - private def openEditor(String owner, String type, String name, int line, int col) { - var drillLink = new DefaultDrillLink - drillLink.connName = currentRun.connectionName - // argument order is based on SQLDEV:LINK that can be used in SQL query result tables (editors, reports) - drillLink.args = #[owner, type, name, String.valueOf(line), String.valueOf(col), "OpenEditor", "oracle.dbtools.raptor.controls.grid.DefaultDrillLink"] - drillLink.performDrill - } - - private def syncDetailTab() { - if (syncDetailTabCheckBoxMenuItem.selected) { - val rowIndex = testOverviewTable.selectedRow - if (rowIndex != -1) { - val row = testOverviewTable.convertRowIndexToModel(rowIndex) - val test = testOverviewTableModel.getTest(row) - var int tabIndex - if (test.counter?.failure !== null && test.counter.failure > 0) { - tabIndex = 1 - } else if (test.counter?.error !== null && test.counter.error > 0) { - tabIndex = 2 - } else if (test.counter?.warning !== null && test.counter.warning > 0) { - tabIndex = 3 - } else if (test.serverOutput !== null && test.serverOutput.length > 0) { - tabIndex = 4 - } else { - tabIndex = 0 - } - testDetailTabbedPane.selectedIndex = tabIndex - } - } - } - - private def getPreferenceModel() { - var PreferenceModel preferences - try { - preferences = PreferenceModel.getInstance(Preferences.preferences) - } catch (NoClassDefFoundError e) { - preferences = PreferenceModel.getInstance(null) - } - return preferences - } - - private def applyPreferences() { - val PreferenceModel preferences = preferenceModel - applyShowNumberOfRunsInHistory(preferences.numberOfRunsInHistory) - showDisabledCounterCheckBoxMenuItem.selected = preferences.showDisabledCounter - applyShowDisabledCounter(showDisabledCounterCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showDisabledCounterCheckBoxMenuItem) - showWarningsCounterCheckBoxMenuItem.selected = preferences.showWarningsCounter - applyShowWarningsCounter(showWarningsCounterCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showWarningsCounterCheckBoxMenuItem) - showInfoCounterCheckBoxMenuItem.selected = preferences.showInfoCounter - applyShowInfoCounter(showInfoCounterCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showInfoCounterCheckBoxMenuItem) - showTestDescriptionCheckBoxMenuItem.selected = preferences.showTestDescription - applyShowTestDescription(showTestDescriptionCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showTestDescriptionCheckBoxMenuItem) - showWarningIndicatorCheckBoxMenuItem.selected = preferences.showWarningIndicator - applyShowWarningIndicator(showWarningIndicatorCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showWarningIndicatorCheckBoxMenuItem) - showInfoIndicatorCheckBoxMenuItem.selected = preferences.showInfoIndicator - applyShowInfoIndicator(showInfoIndicatorCheckBoxMenuItem.selected) - showSuccessfulTestsCheckBoxMenuItem.selected = preferences.showSuccessfulTests - fixCheckBoxMenuItem(showSuccessfulTestsCheckBoxMenuItem) - showDisabledTestsCheckBoxMenuItem.selected = preferences.showDisabledTests - fixCheckBoxMenuItem(showDisabledTestsCheckBoxMenuItem) - applyFilter(showSuccessfulTestsCheckBoxMenuItem.selected, showDisabledTestsCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showInfoIndicatorCheckBoxMenuItem) - syncDetailTabCheckBoxMenuItem.selected = preferences.syncDetailTab - fixCheckBoxMenuItem(syncDetailTabCheckBoxMenuItem) - useSmartTimes = preferences.useSmartTimes - } - - def setModel(Run run) { - runs.put(run.reporterId, run) - refreshRunsComboBox - setCurrentRun(run) - } - - private def setCurrentRun(Run run) { - if (run !== currentRun) { - currentRun = run - testOverviewTableModel.setModel(run.tests, showTestDescriptionCheckBoxMenuItem.selected, useSmartTimes) - val header = testOverviewTableModel.timeColumnName - val timeColumn = testOverviewTable.columnModel.getColumn(4) - if (timeColumn.headerValue != header) { - timeColumn.headerValue = header - testOverviewTable.tableHeader.repaint - } - resetDerived - val item = new ComboBoxItem(currentRun.reporterId, currentRun.name) - runComboBox.selectedItem = item - elapsedTimeTimer.start - } - } - - def synchronized update(String reporterId) { - setCurrentRun(runs.get(reporterId)) - val row = currentRun.currentTestNumber - 1 - val header = testOverviewTableModel.testIdColumnName - val idColumn = testOverviewTable.columnModel.getColumn(3) - if (idColumn.headerValue != header) { - idColumn.headerValue = header - testOverviewTable.tableHeader.repaint - } - if (row < 0) { - testOverviewTableModel.fireTableDataChanged - } else { - if (testOverviewTableModel.rowCount > row) { - val positionOfCurrentTest = testOverviewTable.getCellRect(testOverviewTable.convertRowIndexToView(row), 0, true); - testOverviewTable.scrollRectToVisible = positionOfCurrentTest - testOverviewTableModel.fireTableRowsUpdated(row, row) - Thread.sleep(5) // reduce flickering - if (!showSuccessfulTestsCheckBoxMenuItem.selected || !showDisabledTestsCheckBoxMenuItem.selected) { - applyFilter(showSuccessfulTestsCheckBoxMenuItem.selected, showDisabledTestsCheckBoxMenuItem.selected) - } - testOverviewTable.scrollRectToVisible = positionOfCurrentTest - } - } - statusLabel.text = currentRun.status - testCounterValueLabel.text = '''«currentRun.totalNumberOfCompletedTests»«IF currentRun.totalNumberOfTests >= 0»/«currentRun.totalNumberOfTests»«ENDIF»''' - errorCounterValueLabel.text = '''«currentRun.counter.error»''' - failureCounterValueLabel.text = '''«currentRun.counter.failure»''' - disabledCounterValueLabel.text = '''«currentRun.counter.disabled»''' - warningsCounterValueLabel.text = '''«currentRun.counter.warning»''' - infoCounterValueLabel.text = '''«currentRun.infoCount»''' - if (currentRun.totalNumberOfTests == 0) { - progressBar.value = 100 - } else { - progressBar.value = Math.round(100 * currentRun.totalNumberOfCompletedTests / currentRun.totalNumberOfTests) - } - if (currentRun.counter.error > 0 || currentRun.counter.failure > 0) { - progressBar.foreground = RED - } else { - progressBar.foreground = GREEN - } - } - - private def getPathListFromSelectedTests() { - val pathList = new ArrayList - for (rowIndex : testOverviewTable.selectedRows) { - val row = testOverviewTable.convertRowIndexToModel(rowIndex) - val test = testOverviewTableModel.getTest(row) - val path = '''«test.ownerName».«test.objectName».«test.procedureName»''' - pathList.add(path) - } - return pathList - } - - private def isWindowsLookAndFeel() { - val laf = UIManager.lookAndFeel?.name - if (laf == "Windows") { - return true - } else { - return false - } - } - - private def isMacLookAndFeel() { - val laf = UIManager.lookAndFeel?.name - if (laf == "Mac OS X") { - return true - } else { - return false - } - } - - private def void fixCheckBoxMenuItem(JCheckBoxMenuItem item) { - if (windowsLookAndFeel) { - if (item.selected) { - item.icon = UtplsqlResources.getIcon("CHECKMARK_ICON") - } else { - item.icon = null - } - } - } - - override actionPerformed(ActionEvent e) { - if (e.source == refreshButton) { - resetDerived - testDetailTabbedPane.selectedIndex = 0 - testOverviewTableModel.fireTableDataChanged - } else if (e.source == rerunButton) { - val runner = new UtplsqlRunner(currentRun.pathList, currentRun.connectionName) - runner.runTestAsync - } else if (e.source == rerunWorksheetButton) { - val worksheet = new UtplsqlWorksheetRunner(currentRun.pathList, currentRun.connectionName) - worksheet.runTestAsync - } else if (e.source == runComboBox) { - if (currentRun !== null) { - val comboBoxItem = runComboBox.selectedItem as ComboBoxItem - if (currentRun.reporterId != comboBoxItem.key) { - update(comboBoxItem.key) - testDetailTabbedPane.selectedIndex = 0 - } - } - } else if (e.source == clearButton) { - val run = currentRun - runs.clear - currentRun = null - setModel(run) - update(run.reporterId) - } else if (e.source == testOverviewRunMenuItem) { - val runner = new UtplsqlRunner(pathListFromSelectedTests, currentRun.connectionName) - runner.runTestAsync - } else if (e.source == testOverviewRunWorksheetMenuItem) { - val worksheet = new UtplsqlWorksheetRunner(pathListFromSelectedTests, currentRun.connectionName) - worksheet.runTestAsync - } else if (e.source == showDisabledCounterCheckBoxMenuItem) { - applyShowDisabledCounter(showDisabledCounterCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showDisabledCounterCheckBoxMenuItem) - } else if (e.source == showWarningsCounterCheckBoxMenuItem) { - applyShowWarningsCounter( showWarningsCounterCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showWarningsCounterCheckBoxMenuItem) - } else if (e.source == showInfoCounterCheckBoxMenuItem) { - applyShowInfoCounter(showInfoCounterCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showInfoCounterCheckBoxMenuItem) - } else if (e.source == showSuccessfulTestsCheckBoxMenuItem) { - applyFilter(showSuccessfulTestsCheckBoxMenuItem.selected, showDisabledTestsCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showSuccessfulTestsCheckBoxMenuItem) - } else if (e.source == showDisabledTestsCheckBoxMenuItem) { - applyFilter(showSuccessfulTestsCheckBoxMenuItem.selected, showDisabledTestsCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showDisabledTestsCheckBoxMenuItem) - } else if (e.source == showTestDescriptionCheckBoxMenuItem) { - applyShowTestDescription(showTestDescriptionCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showTestDescriptionCheckBoxMenuItem) - } else if (e.source == showWarningIndicatorCheckBoxMenuItem) { - applyShowWarningIndicator(showWarningIndicatorCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showWarningIndicatorCheckBoxMenuItem) - } else if (e.source == showInfoIndicatorCheckBoxMenuItem) { - applyShowInfoIndicator(showInfoIndicatorCheckBoxMenuItem.selected) - fixCheckBoxMenuItem(showInfoIndicatorCheckBoxMenuItem) - } else if (e.source == syncDetailTabCheckBoxMenuItem) { - syncDetailTab - fixCheckBoxMenuItem(syncDetailTabCheckBoxMenuItem) - } - } - - override mouseClicked(MouseEvent e) { - if (e.clickCount == 2) { - if (e.source == testOverviewTable) { - if (failuresTable.selectedRowCount == 1) { - openSelectedFailure - } else { - openSelectedTest - } - - } else if (e.source == failuresTable) { - if (failuresTable.selectedRowCount == 1) { - openSelectedFailure - } - } - } - } - - override mouseEntered(MouseEvent e) { - } - - override mouseExited(MouseEvent e) { - } - - override mousePressed(MouseEvent e) { - } - - override mouseReleased(MouseEvent e) { - } - - override hyperlinkUpdate(HyperlinkEvent e) { - if (e.eventType == HyperlinkEvent.EventType.ACTIVATED) { - val link = e.description - openLink(link) - } - } - - private static def formatDateTime(String dateTime) { - if (dateTime === null) { - return null - } else { - if (dateTime.length == 26) { - return dateTime.replace("T", " ").substring(0, 23) - } else { - return dateTime - } - } - } - - static class TestOverviewRowListener implements ListSelectionListener { - RunnerPanel p - - new (RunnerPanel p) { - this.p = p - } - - override void valueChanged(ListSelectionEvent event) { - val rowIndex = p.testOverviewTable.selectedRow - if (rowIndex != -1) { - val row = p.testOverviewTable.convertRowIndexToModel(rowIndex) - val test = p.testOverviewTableModel.getTest(row) - p.testOwnerTextField.text = test.ownerName - p.testPackageTextField.text = test.objectName - p.testProcedureTextField.text = test.procedureName - p.testDescriptionTextArea.text = test.description?.trim - p.testIdTextArea.text = test.id - p.testStartTextField.text = formatDateTime(test.startTime) - p.failuresTableModel.model = test.failedExpectations - p.failuresTableModel.fireTableDataChanged - p.testFailureMessageTextPane.text = null - if (test.failedExpectations !== null && test.failedExpectations.size > 0) { - p.failuresTable.setRowSelectionInterval(0, 0) - } - p.testErrorStackTextPane.text = p.getHtml(test.errorStack?.trim) - p.testWarningsTextPane.text = p.getHtml(test.warnings?.trim) - p.testServerOutputTextPane.text = p.getHtml(test.serverOutput?.trim) - p.syncDetailTab - p.testOverviewRunMenuItem.enabled = true - p.testOverviewRunWorksheetMenuItem.enabled = true - } - } - } - - private def getLinkedAndFormattedText(String text) { - if (text === null) { - return "" - } - // Patterns (primarily Asserts, Errors, ServerOutput): - // at "OWNER.PACKAGE.PROCEDURE", line 42 - // at "OWNER.PROCEDURE", line 42 - // at "OWNER.PACKAGE", line 42 - // at package "OWNER.PACKAGE", line 42 - val p1 = Pattern.compile('''\s+(package\s+)?("(\S+?)\.(\S+?)(?:\.(\S+?))?",\s+line\s+([0-9]+))''') - var localText = HtmlUtils.htmlEscape(text) - var m = p1.matcher(localText) - while(m.find) { - val link = '''«m.group(2)»''' - val start = m.start(2) - val end = m.end(2) - localText = '''«localText.substring(0, start)»«link»«localText.substring(end)»''' - m = p1.matcher(localText) - } - // Patterns (primarily Warnings, without line reference, calculate when opening link): - // owner.package.procedure - val p2 = Pattern.compile('''^\s{2}((\S+?)\.(\S+?)\.(\S+?))$''', Pattern.MULTILINE) - m = p2.matcher(localText) - while(m.find) { - val link = '''  «m.group(1)»''' - val start = m.start(0) - val end = m.end(0) - localText = '''«localText.substring(0, start)»«link»«localText.substring(end)»''' - m = p2.matcher(localText) - } - // Patterns (Title for warning/info on suite level) - // from suite a.junit_utplsql_test1_pkg: - val p3 = Pattern.compile('''^For suite ([^:]+):$''', Pattern.MULTILINE) - m = p3.matcher(localText) - while(m.find) { - val title = '''For suite "«m.group(1)»"''' - val start = m.start(0) - val end = m.end(0) - localText = '''«localText.substring(0, start)»«title»«localText.substring(end)»''' - m = p3.matcher(localText) - } - val result = ''' - «FOR p : localText.split("\n")» -

«p»

- «ENDFOR» - ''' - return result - } - - static class FailuresRowListener implements ListSelectionListener { - RunnerPanel p - - new (RunnerPanel p) { - this.p = p - } - - override void valueChanged(ListSelectionEvent event) { - val rowIndex = p.failuresTable.selectedRow - if (rowIndex != -1) { - val row = p.failuresTable.convertRowIndexToModel(rowIndex) - val expectation = p.failuresTableModel.getExpectation(row) - val html = p.getHtml(expectation.failureText) - p.testFailureMessageTextPane.text = html - - } - } - } - - static class TimeFormatRenderer extends DefaultTableCellRenderer { - override getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, - int row, int col) { - val smartTime = new SmartTime(value as Double, useSmartTimes) - return super.getTableCellRendererComponent(table, smartTime.toString, isSelected, hasFocus, row, col) - } - } - - static class TestTableHeaderRenderer extends DefaultTableCellRenderer { - override getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, - int row, int col) { - val renderer = table.tableHeader.defaultRenderer - val label = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col) as JLabel - if (col === 0) { - label.icon = UtplsqlResources.getIcon("STATUS_ICON") - label.horizontalAlignment = JLabel.CENTER - } else if (col === 1) { - label.icon = UtplsqlResources.getIcon("WARNING_ICON") - label.horizontalAlignment = JLabel.CENTER - } else if (col === 2) { - label.icon = UtplsqlResources.getIcon("INFO_ICON") - label.horizontalAlignment = JLabel.CENTER - } else if (col === 3) { - label.icon = null - label.horizontalAlignment = JLabel.LEFT - } else if (col === 4) { - label.icon = null - label.horizontalAlignment = JLabel.RIGHT - } - return label - } - } - - static class FailuresTableHeaderRenderer extends DefaultTableCellRenderer { - override getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, - int row, int col) { - val renderer = table.tableHeader.defaultRenderer - val label = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col) as JLabel - if (col === 0) { - label.horizontalAlignment = JLabel.RIGHT - } else { - label.horizontalAlignment = JLabel.LEFT - } - return label - } - } - - private def makeLabelledCounterComponent (JLabel label, JComponent comp) { - val groupPanel = new JPanel - groupPanel.layout = new GridBagLayout - var GridBagConstraints c = new GridBagConstraints - // label - c.gridx = 0 - c.gridy = 0 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 10, 5, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::NONE - c.weightx = 0 - c.weighty = 0 - groupPanel.add(label, c) - // component - c.gridx = 1 - c.gridy = 0 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 5, 5, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - groupPanel.add(comp, c) - val dim = new Dimension(134, 24) - groupPanel.minimumSize = dim - groupPanel.preferredSize = dim - return groupPanel - } - - private def initializeGUI() { - // Base panel containing all components - basePanel = new JPanel() - basePanel.setLayout(new GridBagLayout()) - var GridBagConstraints c = new GridBagConstraints() - - // Toolbar - var toolbar = new GradientToolbar - toolbar.floatable = false - val buttonBorder = new EmptyBorder(new Insets(2, 4, 2, 4)) // top, left, bottom, right - refreshButton = new ToolbarButton(UtplsqlResources.getIcon("REFRESH_ICON")) - refreshButton.toolTipText = UtplsqlResources.getString("RUNNER_REFRESH_TOOLTIP") - refreshButton.border = buttonBorder - refreshButton.addActionListener(this) - toolbar.add(refreshButton) - rerunButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_ICON")) - rerunButton.toolTipText = UtplsqlResources.getString("RUNNER_RERUN_TOOLTIP") - rerunButton.border = buttonBorder - rerunButton.addActionListener(this) - toolbar.add(rerunButton) - rerunWorksheetButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_WORKSHEET_ICON")) - rerunWorksheetButton.toolTipText = UtplsqlResources.getString("RUNNER_RERUN_WORKSHEET_TOOLTIP") - rerunWorksheetButton.border = buttonBorder - rerunWorksheetButton.addActionListener(this) - toolbar.add(rerunWorksheetButton) - toolbar.add(Box.createHorizontalGlue()) - runComboBoxModel = new DefaultComboBoxModel>; - runComboBox = new JComboBox>(runComboBoxModel); - runComboBox.editable = false - val comboBoxDim = new Dimension(500, 50) - runComboBox.maximumSize = comboBoxDim - runComboBox.addActionListener(this) - toolbar.add(runComboBox) - clearButton = new ToolbarButton(UtplsqlResources.getIcon("CLEAR_ICON")) - clearButton.toolTipText = UtplsqlResources.getString("RUNNER_CLEAR_BUTTON") - clearButton.border = buttonBorder - clearButton.addActionListener(this) - toolbar.add(clearButton) - c.gridx = 0 - c.gridy = 0 - c.gridwidth = 2 - c.gridheight = 1 - c.insets = new Insets(0, 0, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::NORTH - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - basePanel.add(toolbar, c) - - // Status line - statusLabel = new JLabel - c.gridx = 0 - c.gridy = 1 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(10, 10, 10, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - basePanel.add(statusLabel, c) - elapsedTimeLabel = new JLabel - elapsedTimeLabel.preferredSize = new Dimension(60, 0) - c.gridx = 1 - c.gridy = 1 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(10, 10, 10, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::NONE - c.weightx = 0 - c.weighty = 0 - basePanel.add(elapsedTimeLabel, c) - elapsedTimeTimer = new Timer(100, new ActionListener() { - override actionPerformed(ActionEvent e) { - if (currentRun !== null && currentRun.start !== null) { - val time = new SmartTime - time.smart = useSmartTimes - if (currentRun.executionTime !== null) { - time.seconds = currentRun.executionTime - elapsedTimeTimer.stop - } else { - val long now = System.currentTimeMillis - time.seconds = new Double(now - currentRun.start) / 1000 - } - elapsedTimeLabel.text = '''«time.toString»«IF !useSmartTimes» s«ENDIF»''' - } else { - elapsedTimeLabel.text = null - } - } - }) - - // Counters - // - Test counter - val counterPanel = new JPanel - counterPanel.layout = new WrapLayout(FlowLayout.LEFT, 0, 0) - val testCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_TESTS_LABEL") + ":", JLabel::LEADING) - testCounterValueLabel = new JLabel - counterPanel.add(makeLabelledCounterComponent(testCounterLabel, testCounterValueLabel)) - // - Failure counter - val failureCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_FAILURES_LABEL") + ":", - UtplsqlResources.getIcon("FAILURE_ICON"), JLabel::LEADING) - failureCounterValueLabel = new JLabel - counterPanel.add(makeLabelledCounterComponent(failureCounterLabel,failureCounterValueLabel)) - // - Error counter - val errorCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_ERRORS_LABEL") + ":", - UtplsqlResources.getIcon("ERROR_ICON"), JLabel::LEADING) - errorCounterValueLabel = new JLabel - counterPanel.add(makeLabelledCounterComponent(errorCounterLabel, errorCounterValueLabel)) - // - Disabled counter - val disabledCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_DISABLED_LABEL") + ":", - UtplsqlResources.getIcon("DISABLED_ICON"), JLabel::LEADING) - disabledCounterValueLabel = new JLabel - counterPanel.add(makeLabelledCounterComponent(disabledCounterLabel, disabledCounterValueLabel)) - // - Warnings counter - val warningsCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_WARNINGS_LABEL") + ":", - UtplsqlResources.getIcon("WARNING_ICON"), JLabel::LEADING) - warningsCounterValueLabel = new JLabel - counterPanel.add(makeLabelledCounterComponent(warningsCounterLabel, warningsCounterValueLabel)) - // - Info counter - val infoCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_INFO_LABEL") + ":", - UtplsqlResources.getIcon("INFO_ICON"), JLabel::LEADING) - infoCounterValueLabel = new JLabel - counterPanel.add(makeLabelledCounterComponent(infoCounterLabel, infoCounterValueLabel)) - // - add everything to basePanel - c.gridx = 0 - c.gridy = 2 - c.gridwidth = 2 - c.gridheight = 1 - c.insets = new Insets(5, 0, 5, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - basePanel.add(counterPanel,c) - - // Context menu for counters panel - val countersPopupMenu = new JPopupMenu - showDisabledCounterCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL").replace("?",""), true) - showDisabledCounterCheckBoxMenuItem.addActionListener(this) - countersPopupMenu.add(showDisabledCounterCheckBoxMenuItem) - showWarningsCounterCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL").replace("?",""), true) - showWarningsCounterCheckBoxMenuItem.addActionListener(this) - countersPopupMenu.add(showWarningsCounterCheckBoxMenuItem) - showInfoCounterCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL").replace("?",""), true) - showInfoCounterCheckBoxMenuItem.addActionListener(this) - countersPopupMenu.add(showInfoCounterCheckBoxMenuItem) - counterPanel.componentPopupMenu = countersPopupMenu - - // Progress bar - progressBar = new JProgressBar - val progressBarDim = new Dimension(10, 20) - progressBar.preferredSize = progressBarDim - progressBar.minimumSize = progressBarDim - progressBar.stringPainted = false - progressBar.foreground = GREEN - progressBar.UI = new BasicProgressBarUI - c.gridx = 0 - c.gridy = 3 - c.gridwidth = 2 - c.gridheight = 1 - c.insets = new Insets(10, 10, 10, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - basePanel.add(progressBar, c) - - // Test overview - testOverviewTableModel = new TestOverviewTableModel - testOverviewTable = new JTable(testOverviewTableModel) - testOverviewTable.tableHeader.reorderingAllowed = false - testOverviewTable.autoCreateRowSorter = true - testOverviewTable.rowHeight = OVERVIEW_TABLE_ROW_HEIGHT - testOverviewTable.tableHeader.preferredSize = new Dimension(testOverviewTable.tableHeader.getPreferredSize.width, OVERVIEW_TABLE_ROW_HEIGHT) - testOverviewTable.selectionModel.addListSelectionListener(new TestOverviewRowListener(this)) - testOverviewTable.addMouseListener(this) - RepaintManager.currentManager(testOverviewTable).doubleBufferingEnabled = true // reduce flickering - val testTableHeaderRenderer = new TestTableHeaderRenderer - val overviewTableStatus = testOverviewTable.columnModel.getColumn(0) - overviewTableStatus.minWidth = INDICATOR_WIDTH - overviewTableStatus.preferredWidth = INDICATOR_WIDTH - overviewTableStatus.maxWidth = INDICATOR_WIDTH - overviewTableStatus.headerRenderer = testTableHeaderRenderer - val overviewTableWarning = testOverviewTable.columnModel.getColumn(1) - overviewTableWarning.minWidth = INDICATOR_WIDTH - overviewTableWarning.preferredWidth = INDICATOR_WIDTH - overviewTableWarning.maxWidth = INDICATOR_WIDTH - overviewTableWarning.headerRenderer = testTableHeaderRenderer - val overviewTableInfo = testOverviewTable.columnModel.getColumn(2) - overviewTableInfo.minWidth = INDICATOR_WIDTH - overviewTableInfo.preferredWidth = INDICATOR_WIDTH - overviewTableInfo.maxWidth = INDICATOR_WIDTH - overviewTableInfo.headerRenderer = testTableHeaderRenderer - val overviewTableId = testOverviewTable.columnModel.getColumn(3) - overviewTableId.headerRenderer = testTableHeaderRenderer - val overviewTableTime = testOverviewTable.columnModel.getColumn(4) - overviewTableTime.preferredWidth = 60 - overviewTableTime.maxWidth = 100 - overviewTableTime.headerRenderer = testTableHeaderRenderer - val timeFormatRenderer = new TimeFormatRenderer - timeFormatRenderer.horizontalAlignment = JLabel.RIGHT - overviewTableTime.cellRenderer = timeFormatRenderer - val testOverviewScrollPane = new JScrollPane(testOverviewTable) - - // Context menu for test overview - val testOverviewPopupMenu = new JPopupMenu - testOverviewRunMenuItem = new JMenuItem(UtplsqlResources.getString("RUNNER_RUN_MENUITEM"), UtplsqlResources.getIcon("RUN_ICON")); - testOverviewRunMenuItem.addActionListener(this) - testOverviewPopupMenu.add(testOverviewRunMenuItem) - testOverviewRunWorksheetMenuItem = new JMenuItem(UtplsqlResources.getString("RUNNER_RUN_WORKSHEET_MENUITEM"), UtplsqlResources.getIcon("RUN_WORKSHEET_ICON")); - testOverviewRunWorksheetMenuItem.addActionListener(this) - testOverviewPopupMenu.add(testOverviewRunWorksheetMenuItem) - testOverviewPopupMenu.add(new JSeparator) - showSuccessfulTestsCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL").replace("?",""), true) - showSuccessfulTestsCheckBoxMenuItem.addActionListener(this) - testOverviewPopupMenu.add(showSuccessfulTestsCheckBoxMenuItem) - showDisabledTestsCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL").replace("?",""), true) - showDisabledTestsCheckBoxMenuItem.addActionListener(this) - testOverviewPopupMenu.add(showDisabledTestsCheckBoxMenuItem) - testOverviewPopupMenu.add(new JSeparator) - showTestDescriptionCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL").replace("?",""), true) - showTestDescriptionCheckBoxMenuItem.addActionListener(this) - testOverviewPopupMenu.add(showTestDescriptionCheckBoxMenuItem) - showWarningIndicatorCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL").replace("?",""), true) - showWarningIndicatorCheckBoxMenuItem.addActionListener(this) - testOverviewPopupMenu.add(showWarningIndicatorCheckBoxMenuItem) - showInfoIndicatorCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL").replace("?",""), true) - showInfoIndicatorCheckBoxMenuItem.addActionListener(this) - testOverviewPopupMenu.add(showInfoIndicatorCheckBoxMenuItem) - syncDetailTabCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL").replace("?",""), true) - syncDetailTabCheckBoxMenuItem.addActionListener(this) - testOverviewPopupMenu.add(syncDetailTabCheckBoxMenuItem) - testOverviewTable.componentPopupMenu = testOverviewPopupMenu - testOverviewTable.tableHeader.componentPopupMenu = testOverviewPopupMenu - - // Test tabbed pane (Test Properties) - val testInfoPanel = new ScrollablePanel - testInfoPanel.setLayout(new GridBagLayout()) - // - Owner - val testOwnerLabel = new JLabel(UtplsqlResources.getString("RUNNER_OWNER_LABEL")) - c.gridx = 0 - c.gridy = 0 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(10, 10, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::NONE - c.weightx = 0 - c.weighty = 0 - testInfoPanel.add(testOwnerLabel, c) - testOwnerTextField = new RunnerTextField - testOwnerTextField.editable = false - c.gridx = 1 - c.gridy = 0 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(10, 5, 0, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - testInfoPanel.add(testOwnerTextField, c) - // - Package - val testPackageLabel = new JLabel(UtplsqlResources.getString("RUNNER_PACKAGE_LABEL")) - c.gridx = 0 - c.gridy = 1 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 10, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::NONE - c.weightx = 0 - c.weighty = 0 - testInfoPanel.add(testPackageLabel, c) - testPackageTextField = new RunnerTextField - testPackageTextField.editable = false - c.gridx = 1 - c.gridy = 1 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 5, 0, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - testInfoPanel.add(testPackageTextField, c) - // - Procedure - val testProcedureLabel = new JLabel(UtplsqlResources.getString("RUNNER_PROCEDURE_LABEL")) - c.gridx = 0 - c.gridy = 2 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 10, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::NONE - c.weightx = 0 - c.weighty = 0 - testInfoPanel.add(testProcedureLabel, c) - testProcedureTextField = new RunnerTextField - testProcedureTextField.editable = false - c.gridx = 1 - c.gridy = 2 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 5, 0, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - testInfoPanel.add(testProcedureTextField, c) - // - Description - val testDescriptionLabel = new JLabel(UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL")) - testDescriptionLabel.border = BorderFactory.createEmptyBorder(if (macLookAndFeel) {5} else {3}, 0, 0, 0) - c.gridx = 0 - c.gridy = 3 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 10, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::NORTHWEST - c.fill = GridBagConstraints::NONE - c.weightx = 0 - c.weighty = 0 - testInfoPanel.add(testDescriptionLabel, c) - testDescriptionTextArea = new RunnerTextArea - testDescriptionTextArea.editable = false - testDescriptionTextArea.enabled = true - testDescriptionTextArea.lineWrap = true - testDescriptionTextArea.wrapStyleWord = true - c.gridx = 1 - c.gridy = 3 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 5, 0, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - testInfoPanel.add(testDescriptionTextArea, c) - // - Suitepath (id) - val testIdLabel = new JLabel(UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN")) - testIdLabel.border = BorderFactory.createEmptyBorder(if (macLookAndFeel) {5} else {3}, 0, 0, 0) - c.gridx = 0 - c.gridy = 4 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 10, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::NORTHWEST - c.fill = GridBagConstraints::NONE - c.weightx = 0 - c.weighty = 0 - testInfoPanel.add(testIdLabel, c) - testIdTextArea = new RunnerTextArea - testIdTextArea.editable = false - testIdTextArea.enabled = true - testIdTextArea.lineWrap = true - testIdTextArea.wrapStyleWord = false - c.gridx = 1 - c.gridy = 4 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 5, 0, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - testInfoPanel.add(testIdTextArea, c) - // - Start - val testStartLabel = new JLabel(UtplsqlResources.getString("RUNNER_START_LABEL")) - c.gridx = 0 - c.gridy = 5 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 10, 10, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::NONE - c.weightx = 0 - c.weighty = 0 - testInfoPanel.add(testStartLabel, c) - testStartTextField = new RunnerTextField - testStartTextField.editable = false - c.gridx = 1 - c.gridy = 5 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(5, 5, 10, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::HORIZONTAL - c.weightx = 1 - c.weighty = 0 - testInfoPanel.add(testStartTextField, c) - // - Vertical spring and scrollbar for info panel - c.gridx = 0 - c.gridy = 6 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(0, 0, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::BOTH - c.weightx = 0 - c.weighty = 1 - testInfoPanel.add(Box.createVerticalGlue(), c) - val testPropertiesScrollPane = new JScrollPane(testInfoPanel) - - // Failures tabbed pane (failed expectations) - // - failures table (number and description) - failuresTableModel = new FailuresTableModel - failuresTable = new JTable(failuresTableModel) - failuresTable.tableHeader.reorderingAllowed = false - failuresTable.selectionModel.addListSelectionListener(new FailuresRowListener(this)) - failuresTable.addMouseListener(this) - val failuresTableHeaderRenderer = new FailuresTableHeaderRenderer - val failuresTableNumber = failuresTable.columnModel.getColumn(0) - failuresTableNumber.headerRenderer = failuresTableHeaderRenderer - failuresTableNumber.preferredWidth = 30 - failuresTableNumber.maxWidth = 30 - val failuresDescription = failuresTable.columnModel.getColumn(1) - failuresDescription.headerRenderer = failuresTableHeaderRenderer - val failuresTableScrollPane = new JScrollPane(failuresTable) - // - failures details - testFailureMessageTextPane = new RunnerTextPane - testFailureMessageTextPane.editable = false - testFailureMessageTextPane.enabled = true - testFailureMessageTextPane.contentType = "text/html" - testFailureMessageTextPane.minimumSize = TEXTPANE_DIM - testFailureMessageTextPane.preferredSize = TEXTPANE_DIM - testFailureMessageTextPane.addHyperlinkListener(this) - val testFailureMessageScrollPane = new JScrollPane(testFailureMessageTextPane) - c.gridx = 1 - c.gridy = 0 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(10, 5, 0, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::BOTH - c.weightx = 1 - c.weighty = 6 - - // - split pane - val failuresSplitPane = new JSplitPane(SwingConstants.HORIZONTAL, failuresTableScrollPane, testFailureMessageScrollPane) - failuresSplitPane.resizeWeight = 0.2 - - // Errors tabbed pane (Error Stack) - val testErrorStackPanel = new JPanel - testErrorStackPanel.setLayout(new GridBagLayout()) - testErrorStackTextPane = new RunnerTextPane - testErrorStackTextPane.editable = false - testErrorStackTextPane.enabled = true - testErrorStackTextPane.contentType = "text/html" - testErrorStackTextPane.minimumSize = TEXTPANE_DIM - testErrorStackTextPane.preferredSize = TEXTPANE_DIM - testErrorStackTextPane.addHyperlinkListener(this) - val testErrorStackScrollPane = new JScrollPane(testErrorStackTextPane) - c.gridx = 0 - c.gridy = 0 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(0, 0, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::BOTH - c.weightx = 1 - c.weighty = 1 - testErrorStackPanel.add(testErrorStackScrollPane, c) - - // Warnings tabbed pane - val testWarningsPanel = new JPanel - testWarningsPanel.setLayout(new GridBagLayout()) - testWarningsTextPane = new RunnerTextPane - testWarningsTextPane.editable = false - testWarningsTextPane.enabled = true - testWarningsTextPane.contentType = "text/html" - testWarningsTextPane.minimumSize = TEXTPANE_DIM - testWarningsTextPane.preferredSize = TEXTPANE_DIM - testWarningsTextPane.addHyperlinkListener(this) - val testWarningsScrollPane = new JScrollPane(testWarningsTextPane) - c.gridx = 0 - c.gridy = 0 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(0, 0, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::BOTH - c.weightx = 1 - c.weighty = 1 - testWarningsPanel.add(testWarningsScrollPane, c) - - // Info tabbed pane (Server Output) - val testServerOutputPanel = new JPanel - testServerOutputPanel.setLayout(new GridBagLayout()) - testServerOutputTextPane = new RunnerTextPane - testServerOutputTextPane.editable = false - testServerOutputTextPane.enabled = true - testServerOutputTextPane.contentType = "text/html" - testServerOutputTextPane.minimumSize = TEXTPANE_DIM - testServerOutputTextPane.preferredSize = TEXTPANE_DIM - testServerOutputTextPane.addHyperlinkListener(this) - val testServerOutputScrollPane = new JScrollPane(testServerOutputTextPane) - c.gridx = 0 - c.gridy = 0 - c.gridwidth = 1 - c.gridheight = 1 - c.insets = new Insets(0, 0, 0, 0) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::BOTH - c.weightx = 1 - c.weighty = 1 - testServerOutputPanel.add(testServerOutputScrollPane, c) - - // split pane with all tabs - testDetailTabbedPane = new JTabbedPane() - testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_TEST_TAB_LABEL"), testPropertiesScrollPane) - testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_FAILURES_TAB_LABEL"), failuresSplitPane) - testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_ERRORS_TAB_LABEL"), testErrorStackPanel) - testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_WARNINGS_TAB_LABEL"), testWarningsPanel) - testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_INFO_TAB_LABEL"), testServerOutputPanel) - val horizontalSplitPane = new JSplitPane(SwingConstants.HORIZONTAL, testOverviewScrollPane, testDetailTabbedPane) - horizontalSplitPane.resizeWeight = 0.5 - c.gridx = 0 - c.gridy = 4 - c.gridwidth = 2 - c.gridheight = 1 - c.insets = new Insets(10, 10, 10, 10) // top, left, bottom, right - c.anchor = GridBagConstraints::WEST - c.fill = GridBagConstraints::BOTH - c.weightx = 1 - c.weighty = 1 - basePanel.add(horizontalSplitPane, c) - - // fix borders (colors, margins) - if (macLookAndFeel) { - val border = BorderFactory.createCompoundBorder( - BorderFactory.createEmptyBorder(3, 3, 3, 3), - BorderFactory.createCompoundBorder( - BorderFactory.createLineBorder(new Color(219, 219, 219)), - BorderFactory.createEmptyBorder(1, 1, 1, 1) - ) - ) - testDescriptionTextArea.border = border - testIdTextArea.border = border - } else { - val referenceBorder = testOwnerTextField.border - testDescriptionTextArea.border = referenceBorder - testIdTextArea.border = referenceBorder - } - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener { + public static class TestOverviewRowListener implements ListSelectionListener { + private RunnerPanel p; + + public TestOverviewRowListener(final RunnerPanel p) { + this.p = p; + } + + @Override + public void valueChanged(final ListSelectionEvent event) { + final int rowIndex = this.p.testOverviewTable.getSelectedRow(); + if ((rowIndex != (-1))) { + final int row = this.p.testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = this.p.testOverviewTableModel.getTest(row); + this.p.testOwnerTextField.setText(test.getOwnerName()); + this.p.testPackageTextField.setText(test.getObjectName()); + this.p.testProcedureTextField.setText(test.getProcedureName()); + String _description = test.getDescription(); + String _trim = null; + if (_description!=null) { + _trim=_description.trim(); + } + this.p.testDescriptionTextArea.setText(_trim); + this.p.testIdTextArea.setText(test.getId()); + this.p.testStartTextField.setText(RunnerPanel.formatDateTime(test.getStartTime())); + this.p.failuresTableModel.setModel(test.getFailedExpectations()); + this.p.failuresTableModel.fireTableDataChanged(); + this.p.testFailureMessageTextPane.setText(null); + if (((test.getFailedExpectations() != null) && (test.getFailedExpectations().size() > 0))) { + this.p.failuresTable.setRowSelectionInterval(0, 0); + } + String _errorStack = test.getErrorStack(); + String _trim_1 = null; + if (_errorStack!=null) { + _trim_1=_errorStack.trim(); + } + this.p.testErrorStackTextPane.setText(this.p.getHtml(_trim_1)); + String _warnings = test.getWarnings(); + String _trim_2 = null; + if (_warnings!=null) { + _trim_2=_warnings.trim(); + } + this.p.testWarningsTextPane.setText(this.p.getHtml(_trim_2)); + String _serverOutput = test.getServerOutput(); + String _trim_3 = null; + if (_serverOutput!=null) { + _trim_3=_serverOutput.trim(); + } + this.p.testServerOutputTextPane.setText(this.p.getHtml(_trim_3)); + this.p.syncDetailTab(); + this.p.testOverviewRunMenuItem.setEnabled(true); + this.p.testOverviewRunWorksheetMenuItem.setEnabled(true); + } + } + } + + public static class FailuresRowListener implements ListSelectionListener { + private RunnerPanel p; + + public FailuresRowListener(final RunnerPanel p) { + this.p = p; + } + + @Override + public void valueChanged(final ListSelectionEvent event) { + final int rowIndex = this.p.failuresTable.getSelectedRow(); + if ((rowIndex != (-1))) { + final int row = this.p.failuresTable.convertRowIndexToModel(rowIndex); + final Expectation expectation = this.p.failuresTableModel.getExpectation(row); + final String html = this.p.getHtml(expectation.getFailureText()); + this.p.testFailureMessageTextPane.setText(html); + } + } + } + + public static class TimeFormatRenderer extends DefaultTableCellRenderer { + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int col) { + final SmartTime smartTime = new SmartTime(((Double) value), RunnerPanel.useSmartTimes); + return super.getTableCellRendererComponent(table, smartTime.toString(), isSelected, hasFocus, row, col); + } + } + + public static class TestTableHeaderRenderer extends DefaultTableCellRenderer { + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int col) { + final TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer(); + Component _tableCellRendererComponent = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); + final JLabel label = ((JLabel) _tableCellRendererComponent); + if ((col == 0)) { + label.setIcon(UtplsqlResources.getIcon("STATUS_ICON")); + label.setHorizontalAlignment(JLabel.CENTER); + } else { + if ((col == 1)) { + label.setIcon(UtplsqlResources.getIcon("WARNING_ICON")); + label.setHorizontalAlignment(JLabel.CENTER); + } else { + if ((col == 2)) { + label.setIcon(UtplsqlResources.getIcon("INFO_ICON")); + label.setHorizontalAlignment(JLabel.CENTER); + } else { + if ((col == 3)) { + label.setIcon(null); + label.setHorizontalAlignment(JLabel.LEFT); + } else { + if ((col == 4)) { + label.setIcon(null); + label.setHorizontalAlignment(JLabel.RIGHT); + } + } + } + } + } + return label; + } + } + + public static class FailuresTableHeaderRenderer extends DefaultTableCellRenderer { + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int col) { + final TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer(); + Component _tableCellRendererComponent = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); + final JLabel label = ((JLabel) _tableCellRendererComponent); + if ((col == 0)) { + label.setHorizontalAlignment(JLabel.RIGHT); + } else { + label.setHorizontalAlignment(JLabel.LEFT); + } + return label; + } + } + + private static final Color GREEN = new Color(0, 153, 0); + + private static final Color RED = new Color(153, 0, 0); + + private static final int INDICATOR_WIDTH = 20; + + private static final int OVERVIEW_TABLE_ROW_HEIGHT = 20; + + private static final Dimension TEXTPANE_DIM = new Dimension(100, 100); + + private static boolean useSmartTimes; + + private LimitedLinkedHashMap runs = new LimitedLinkedHashMap(10); + + private Run currentRun; + + private JPanel basePanel; + + private ToolbarButton refreshButton; + + private ToolbarButton rerunButton; + + private ToolbarButton rerunWorksheetButton; + + private DefaultComboBoxModel> runComboBoxModel; + + private ToolbarButton clearButton; + + private JComboBox> runComboBox; + + private JLabel statusLabel; + + private JLabel elapsedTimeLabel; + + private Timer elapsedTimeTimer; + + private JLabel testCounterValueLabel; + + private JLabel errorCounterValueLabel; + + private JLabel failureCounterValueLabel; + + private JLabel disabledCounterValueLabel; + + private JLabel warningsCounterValueLabel; + + private JLabel infoCounterValueLabel; + + private JCheckBoxMenuItem showDisabledCounterCheckBoxMenuItem; + + private JCheckBoxMenuItem showWarningsCounterCheckBoxMenuItem; + + private JCheckBoxMenuItem showInfoCounterCheckBoxMenuItem; + + private JProgressBar progressBar; + + private TestOverviewTableModel testOverviewTableModel; + + private JTable testOverviewTable; + + private JMenuItem testOverviewRunMenuItem; + + private JMenuItem testOverviewRunWorksheetMenuItem; + + private JCheckBoxMenuItem showTestDescriptionCheckBoxMenuItem; + + private JCheckBoxMenuItem showWarningIndicatorCheckBoxMenuItem; + + private JCheckBoxMenuItem showInfoIndicatorCheckBoxMenuItem; + + private JCheckBoxMenuItem showSuccessfulTestsCheckBoxMenuItem; + + private JCheckBoxMenuItem showDisabledTestsCheckBoxMenuItem; + + private JCheckBoxMenuItem syncDetailTabCheckBoxMenuItem; + + private RunnerTextField testOwnerTextField; + + private RunnerTextField testPackageTextField; + + private RunnerTextField testProcedureTextField; + + private RunnerTextArea testDescriptionTextArea; + + private RunnerTextArea testIdTextArea; + + private RunnerTextField testStartTextField; + + private FailuresTableModel failuresTableModel; + + private JTable failuresTable; + + private RunnerTextPane testFailureMessageTextPane; + + private RunnerTextPane testErrorStackTextPane; + + private RunnerTextPane testWarningsTextPane; + + private RunnerTextPane testServerOutputTextPane; + + private JTabbedPane testDetailTabbedPane; + + public Component getGUI() { + if ((this.basePanel == null)) { + this.initializeGUI(); + } + boolean _isShowing = this.basePanel.isShowing(); + boolean _not = (!_isShowing); + if (_not) { + this.applyPreferences(); + } + return this.basePanel; + } + + private void resetDerived() { + RowSorter _rowSorter = this.testOverviewTable.getRowSorter(); + _rowSorter.setSortKeys(null); + this.testOverviewRunMenuItem.setEnabled(false); + this.testOverviewRunWorksheetMenuItem.setEnabled(false); + this.testIdTextArea.setText(null); + this.testOwnerTextField.setText(null); + this.testPackageTextField.setText(null); + this.testProcedureTextField.setText(null); + this.testDescriptionTextArea.setText(null); + this.testStartTextField.setText(null); + this.failuresTableModel.setModel(null); + this.failuresTableModel.fireTableDataChanged(); + this.testFailureMessageTextPane.setText(null); + this.testErrorStackTextPane.setText(null); + this.testWarningsTextPane.setText(null); + this.testServerOutputTextPane.setText(null); + } + + private void refreshRunsComboBox() { + int _size = this.runs.size(); + boolean _greaterThan = (_size > 0); + if (_greaterThan) { + this.runComboBox.removeActionListener(this); + this.runComboBoxModel.removeAllElements(); + for (int i = (this.runs.size() - 1); (i >= 0); i--) { + { + final Map.Entry entry = ((Map.Entry[])Conversions.unwrapArray(this.runs.entrySet(), Map.Entry.class))[i]; + String _key = entry.getKey(); + String _name = entry.getValue().getName(); + final ComboBoxItem item = new ComboBoxItem(_key, _name); + this.runComboBoxModel.addElement(item); + } + } + this.runComboBox.setSelectedIndex(0); + this.runComboBox.addActionListener(this); + } + } + + private LimitedLinkedHashMap applyShowNumberOfRunsInHistory(final int maxRuns) { + LimitedLinkedHashMap _xifexpression = null; + int _maxEntries = this.runs.getMaxEntries(); + boolean _notEquals = (maxRuns != _maxEntries); + if (_notEquals) { + LimitedLinkedHashMap _xblockexpression = null; + { + final LimitedLinkedHashMap newRuns = new LimitedLinkedHashMap(maxRuns); + Set> _entrySet = this.runs.entrySet(); + for (final Map.Entry entry : _entrySet) { + newRuns.put(entry.getKey(), entry.getValue()); + } + _xblockexpression = this.runs = newRuns; + } + _xifexpression = _xblockexpression; + } + return _xifexpression; + } + + private void applyShowDisabledCounter(final boolean show) { + Container _parent = this.disabledCounterValueLabel.getParent(); + _parent.setVisible(this.showDisabledCounterCheckBoxMenuItem.isSelected()); + } + + private void applyShowWarningsCounter(final boolean show) { + Container _parent = this.warningsCounterValueLabel.getParent(); + _parent.setVisible(this.showWarningsCounterCheckBoxMenuItem.isSelected()); + } + + private void applyShowInfoCounter(final boolean show) { + Container _parent = this.infoCounterValueLabel.getParent(); + _parent.setVisible(this.showInfoCounterCheckBoxMenuItem.isSelected()); + } + + private void applyShowTestDescription(final boolean show) { + this.testOverviewTableModel.updateModel(this.showTestDescriptionCheckBoxMenuItem.isSelected()); + final TableColumn idColumn = this.testOverviewTable.getColumnModel().getColumn(3); + idColumn.setHeaderValue(this.testOverviewTableModel.getTestIdColumnName()); + this.testOverviewTable.getTableHeader().repaint(); + } + + private void applyShowWarningIndicator(final boolean show) { + final TableColumn col = this.testOverviewTable.getColumnModel().getColumn(1); + if (show) { + col.setWidth(RunnerPanel.INDICATOR_WIDTH); + col.setMinWidth(RunnerPanel.INDICATOR_WIDTH); + col.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); + col.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); + } else { + col.setWidth(0); + col.setMinWidth(0); + col.setMaxWidth(0); + col.setPreferredWidth(0); + } + } + + private void applyShowInfoIndicator(final boolean show) { + final TableColumn col = this.testOverviewTable.getColumnModel().getColumn(2); + if (show) { + col.setWidth(RunnerPanel.INDICATOR_WIDTH); + col.setMinWidth(RunnerPanel.INDICATOR_WIDTH); + col.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); + col.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); + } else { + col.setWidth(0); + col.setMinWidth(0); + col.setMaxWidth(0); + col.setPreferredWidth(0); + } + } + + private void applyFilter(final boolean showSuccessfulTests, final boolean showDisabledTests) { + RowSorter _rowSorter = this.testOverviewTable.getRowSorter(); + final TableRowSorter sorter = ((TableRowSorter) _rowSorter); + final RowFilter filter = new RowFilter() { + @Override + public boolean include(final RowFilter.Entry entry) { + final Test test = entry.getModel().getTest((entry.getIdentifier()).intValue()); + final Counter counter = test.getCounter(); + if ((counter != null)) { + Integer _success = counter.getSuccess(); + boolean _greaterThan = ((_success).intValue() > 0); + if (_greaterThan) { + if ((!showSuccessfulTests)) { + return false; + } + } + Integer _disabled = counter.getDisabled(); + boolean _greaterThan_1 = ((_disabled).intValue() > 0); + if (_greaterThan_1) { + if ((!showDisabledTests)) { + return false; + } + } + } + return true; + } + }; + sorter.setRowFilter(filter); + } + + private void openTest(final Test test) { + try { + Connection _connection = Connections.getInstance().getConnection(this.currentRun.getConnectionName()); + final UtplsqlDao dao = new UtplsqlDao(_connection); + final String source = dao.getSource(test.getOwnerName(), "PACKAGE", test.getObjectName().toUpperCase()).trim(); + final UtplsqlParser parser = new UtplsqlParser(source); + final int line = parser.getLineOf(test.getProcedureName()); + this.openEditor(test.getOwnerName(), "PACKAGE", test.getObjectName().toUpperCase(), line, 1); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + private void openSelectedTest() { + final int rowIndex = this.testOverviewTable.getSelectedRow(); + if ((rowIndex != (-1))) { + final int row = this.testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = this.testOverviewTableModel.getTest(row); + this.openTest(test); + } + } + + private void openSelectedFailure() { + final int rowIndex = this.failuresTable.getSelectedRow(); + if ((rowIndex != (-1))) { + final int row = this.failuresTable.convertRowIndexToModel(rowIndex); + final Expectation expectation = this.failuresTableModel.getExpectation(row); + final Test test = this.testOverviewTableModel.getTest(this.testOverviewTable.convertRowIndexToModel(this.testOverviewTable.getSelectedRow())); + final Integer callerLine = expectation.getCallerLine(); + if ((callerLine != null)) { + this.openEditor(test.getOwnerName(), "PACKAGE BODY", test.getObjectName().toUpperCase(), (expectation.getCallerLine()).intValue(), 1); + } else { + this.openTest(test); + } + } + } + + private String getHtml(final String text) { + StringConcatenation _builder = new StringConcatenation(); + _builder.append(""); + _builder.newLine(); + _builder.append("\t"); + _builder.append(""); + _builder.newLine(); + _builder.append("\t\t"); + _builder.append(""); + _builder.newLine(); + _builder.append("\t"); + _builder.append(""); + _builder.newLine(); + _builder.append("\t"); + _builder.append(""); + _builder.newLine(); + _builder.append("\t\t"); + String _linkedAndFormattedText = this.getLinkedAndFormattedText(text); + _builder.append(_linkedAndFormattedText, "\t\t"); + _builder.newLineIfNotEmpty(); + _builder.append("\t"); + _builder.append(""); + _builder.newLine(); + _builder.append(""); + _builder.newLine(); + final String html = _builder.toString(); + return html; + } + + private void openLink(final String link) { + try { + final String[] parts = link.split("/"); + final String type = parts[0]; + final String ownerName = parts[1]; + final String objectName = parts[2]; + int line = Integer.parseInt(parts[3]); + Connection _connection = Connections.getInstance().getConnection(this.currentRun.getConnectionName()); + final UtplsqlDao dao = new UtplsqlDao(_connection); + String _xifexpression = null; + boolean _equals = Objects.equal(type, "UNKNOWN"); + if (_equals) { + _xifexpression = dao.getObjectType(ownerName, objectName); + } else { + _xifexpression = type; + } + final String objectType = _xifexpression; + int _size = ((List)Conversions.doWrapArray(parts)).size(); + boolean _equals_1 = (_size == 5); + if (_equals_1) { + final String procedureName = parts[4]; + final String source = dao.getSource(ownerName, objectType, objectName).trim(); + final UtplsqlParser parser = new UtplsqlParser(source); + line = parser.getLineOf(procedureName); + } + this.openEditor(ownerName, objectType, objectName.toUpperCase(), line, 1); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + private void openEditor(final String owner, final String type, final String name, final int line, final int col) { + DefaultDrillLink drillLink = new DefaultDrillLink(); + drillLink.setConnName(this.currentRun.getConnectionName()); + String _valueOf = String.valueOf(line); + String _valueOf_1 = String.valueOf(col); + drillLink.setArgs(new String[] { owner, type, name, _valueOf, _valueOf_1, "OpenEditor", "oracle.dbtools.raptor.controls.grid.DefaultDrillLink" }); + drillLink.performDrill(); + } + + private void syncDetailTab() { + boolean _isSelected = this.syncDetailTabCheckBoxMenuItem.isSelected(); + if (_isSelected) { + final int rowIndex = this.testOverviewTable.getSelectedRow(); + if ((rowIndex != (-1))) { + final int row = this.testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = this.testOverviewTableModel.getTest(row); + int tabIndex = 0; + boolean _and = false; + Counter _counter = test.getCounter(); + Integer _failure = null; + if (_counter!=null) { + _failure=_counter.getFailure(); + } + boolean _tripleNotEquals = (_failure != null); + if (!_tripleNotEquals) { + _and = false; + } else { + Integer _failure_1 = test.getCounter().getFailure(); + boolean _greaterThan = ((_failure_1).intValue() > 0); + _and = _greaterThan; + } + if (_and) { + tabIndex = 1; + } else { + boolean _and_1 = false; + Counter _counter_1 = test.getCounter(); + Integer _error = null; + if (_counter_1!=null) { + _error=_counter_1.getError(); + } + boolean _tripleNotEquals_1 = (_error != null); + if (!_tripleNotEquals_1) { + _and_1 = false; + } else { + Integer _error_1 = test.getCounter().getError(); + boolean _greaterThan_1 = ((_error_1).intValue() > 0); + _and_1 = _greaterThan_1; + } + if (_and_1) { + tabIndex = 2; + } else { + boolean _and_2 = false; + Counter _counter_2 = test.getCounter(); + Integer _warning = null; + if (_counter_2!=null) { + _warning=_counter_2.getWarning(); + } + boolean _tripleNotEquals_2 = (_warning != null); + if (!_tripleNotEquals_2) { + _and_2 = false; + } else { + Integer _warning_1 = test.getCounter().getWarning(); + boolean _greaterThan_2 = ((_warning_1).intValue() > 0); + _and_2 = _greaterThan_2; + } + if (_and_2) { + tabIndex = 3; + } else { + if (((test.getServerOutput() != null) && (test.getServerOutput().length() > 0))) { + tabIndex = 4; + } else { + tabIndex = 0; + } + } + } + } + this.testDetailTabbedPane.setSelectedIndex(tabIndex); + } + } + } + + private PreferenceModel getPreferenceModel() { + PreferenceModel preferences = null; + try { + preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + } catch (final Throwable _t) { + if (_t instanceof NoClassDefFoundError) { + preferences = PreferenceModel.getInstance(null); + } else { + throw Exceptions.sneakyThrow(_t); + } + } + return preferences; + } + + private boolean applyPreferences() { + boolean _xblockexpression = false; + { + final PreferenceModel preferences = this.getPreferenceModel(); + this.applyShowNumberOfRunsInHistory(preferences.getNumberOfRunsInHistory()); + this.showDisabledCounterCheckBoxMenuItem.setSelected(preferences.isShowDisabledCounter()); + this.applyShowDisabledCounter(this.showDisabledCounterCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showDisabledCounterCheckBoxMenuItem); + this.showWarningsCounterCheckBoxMenuItem.setSelected(preferences.isShowWarningsCounter()); + this.applyShowWarningsCounter(this.showWarningsCounterCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showWarningsCounterCheckBoxMenuItem); + this.showInfoCounterCheckBoxMenuItem.setSelected(preferences.isShowInfoCounter()); + this.applyShowInfoCounter(this.showInfoCounterCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showInfoCounterCheckBoxMenuItem); + this.showTestDescriptionCheckBoxMenuItem.setSelected(preferences.isShowTestDescription()); + this.applyShowTestDescription(this.showTestDescriptionCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showTestDescriptionCheckBoxMenuItem); + this.showWarningIndicatorCheckBoxMenuItem.setSelected(preferences.isShowWarningIndicator()); + this.applyShowWarningIndicator(this.showWarningIndicatorCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showWarningIndicatorCheckBoxMenuItem); + this.showInfoIndicatorCheckBoxMenuItem.setSelected(preferences.isShowInfoIndicator()); + this.applyShowInfoIndicator(this.showInfoIndicatorCheckBoxMenuItem.isSelected()); + this.showSuccessfulTestsCheckBoxMenuItem.setSelected(preferences.isShowSuccessfulTests()); + this.fixCheckBoxMenuItem(this.showSuccessfulTestsCheckBoxMenuItem); + this.showDisabledTestsCheckBoxMenuItem.setSelected(preferences.isShowDisabledTests()); + this.fixCheckBoxMenuItem(this.showDisabledTestsCheckBoxMenuItem); + this.applyFilter(this.showSuccessfulTestsCheckBoxMenuItem.isSelected(), this.showDisabledTestsCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showInfoIndicatorCheckBoxMenuItem); + this.syncDetailTabCheckBoxMenuItem.setSelected(preferences.isSyncDetailTab()); + this.fixCheckBoxMenuItem(this.syncDetailTabCheckBoxMenuItem); + _xblockexpression = RunnerPanel.useSmartTimes = preferences.isUseSmartTimes(); + } + return _xblockexpression; + } + + public void setModel(final Run run) { + this.runs.put(run.getReporterId(), run); + this.refreshRunsComboBox(); + this.setCurrentRun(run); + } + + private void setCurrentRun(final Run run) { + if ((run != this.currentRun)) { + this.currentRun = run; + this.testOverviewTableModel.setModel(run.getTests(), this.showTestDescriptionCheckBoxMenuItem.isSelected(), RunnerPanel.useSmartTimes); + final String header = this.testOverviewTableModel.getTimeColumnName(); + final TableColumn timeColumn = this.testOverviewTable.getColumnModel().getColumn(4); + Object _headerValue = timeColumn.getHeaderValue(); + boolean _notEquals = (!Objects.equal(_headerValue, header)); + if (_notEquals) { + timeColumn.setHeaderValue(header); + this.testOverviewTable.getTableHeader().repaint(); + } + this.resetDerived(); + String _reporterId = this.currentRun.getReporterId(); + String _name = this.currentRun.getName(); + final ComboBoxItem item = new ComboBoxItem(_reporterId, _name); + this.runComboBox.setSelectedItem(item); + this.elapsedTimeTimer.start(); + } + } + + public synchronized void update(final String reporterId) { + try { + this.setCurrentRun(this.runs.get(reporterId)); + Integer _currentTestNumber = this.currentRun.getCurrentTestNumber(); + final int row = ((_currentTestNumber).intValue() - 1); + final CharSequence header = this.testOverviewTableModel.getTestIdColumnName(); + final TableColumn idColumn = this.testOverviewTable.getColumnModel().getColumn(3); + Object _headerValue = idColumn.getHeaderValue(); + boolean _notEquals = (!Objects.equal(_headerValue, header)); + if (_notEquals) { + idColumn.setHeaderValue(header); + this.testOverviewTable.getTableHeader().repaint(); + } + if ((row < 0)) { + this.testOverviewTableModel.fireTableDataChanged(); + } else { + int _rowCount = this.testOverviewTableModel.getRowCount(); + boolean _greaterThan = (_rowCount > row); + if (_greaterThan) { + final Rectangle positionOfCurrentTest = this.testOverviewTable.getCellRect(this.testOverviewTable.convertRowIndexToView(row), 0, true); + this.testOverviewTable.scrollRectToVisible(positionOfCurrentTest); + this.testOverviewTableModel.fireTableRowsUpdated(row, row); + Thread.sleep(5); + if (((!this.showSuccessfulTestsCheckBoxMenuItem.isSelected()) || (!this.showDisabledTestsCheckBoxMenuItem.isSelected()))) { + this.applyFilter(this.showSuccessfulTestsCheckBoxMenuItem.isSelected(), this.showDisabledTestsCheckBoxMenuItem.isSelected()); + } + this.testOverviewTable.scrollRectToVisible(positionOfCurrentTest); + } + } + this.statusLabel.setText(this.currentRun.getStatus()); + StringConcatenation _builder = new StringConcatenation(); + int _totalNumberOfCompletedTests = this.currentRun.getTotalNumberOfCompletedTests(); + _builder.append(_totalNumberOfCompletedTests); + { + Integer _totalNumberOfTests = this.currentRun.getTotalNumberOfTests(); + boolean _greaterEqualsThan = ((_totalNumberOfTests).intValue() >= 0); + if (_greaterEqualsThan) { + _builder.append("/"); + Integer _totalNumberOfTests_1 = this.currentRun.getTotalNumberOfTests(); + _builder.append(_totalNumberOfTests_1); + } + } + this.testCounterValueLabel.setText(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + Integer _error = this.currentRun.getCounter().getError(); + _builder_1.append(_error); + this.errorCounterValueLabel.setText(_builder_1.toString()); + StringConcatenation _builder_2 = new StringConcatenation(); + Integer _failure = this.currentRun.getCounter().getFailure(); + _builder_2.append(_failure); + this.failureCounterValueLabel.setText(_builder_2.toString()); + StringConcatenation _builder_3 = new StringConcatenation(); + Integer _disabled = this.currentRun.getCounter().getDisabled(); + _builder_3.append(_disabled); + this.disabledCounterValueLabel.setText(_builder_3.toString()); + StringConcatenation _builder_4 = new StringConcatenation(); + Integer _warning = this.currentRun.getCounter().getWarning(); + _builder_4.append(_warning); + this.warningsCounterValueLabel.setText(_builder_4.toString()); + StringConcatenation _builder_5 = new StringConcatenation(); + Integer _infoCount = this.currentRun.getInfoCount(); + _builder_5.append(_infoCount); + this.infoCounterValueLabel.setText(_builder_5.toString()); + Integer _totalNumberOfTests_2 = this.currentRun.getTotalNumberOfTests(); + boolean _equals = ((_totalNumberOfTests_2).intValue() == 0); + if (_equals) { + this.progressBar.setValue(100); + } else { + int _totalNumberOfCompletedTests_1 = this.currentRun.getTotalNumberOfCompletedTests(); + int _multiply = (100 * _totalNumberOfCompletedTests_1); + Integer _totalNumberOfTests_3 = this.currentRun.getTotalNumberOfTests(); + int _divide = (_multiply / (_totalNumberOfTests_3).intValue()); + this.progressBar.setValue(Math.round(_divide)); + } + if ((((this.currentRun.getCounter().getError()).intValue() > 0) || ((this.currentRun.getCounter().getFailure()).intValue() > 0))) { + this.progressBar.setForeground(RunnerPanel.RED); + } else { + this.progressBar.setForeground(RunnerPanel.GREEN); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + private ArrayList getPathListFromSelectedTests() { + final ArrayList pathList = new ArrayList(); + int[] _selectedRows = this.testOverviewTable.getSelectedRows(); + for (final int rowIndex : _selectedRows) { + { + final int row = this.testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = this.testOverviewTableModel.getTest(row); + StringConcatenation _builder = new StringConcatenation(); + String _ownerName = test.getOwnerName(); + _builder.append(_ownerName); + _builder.append("."); + String _objectName = test.getObjectName(); + _builder.append(_objectName); + _builder.append("."); + String _procedureName = test.getProcedureName(); + _builder.append(_procedureName); + final String path = _builder.toString(); + pathList.add(path); + } + } + return pathList; + } + + private boolean isWindowsLookAndFeel() { + LookAndFeel _lookAndFeel = UIManager.getLookAndFeel(); + String _name = null; + if (_lookAndFeel!=null) { + _name=_lookAndFeel.getName(); + } + final String laf = _name; + boolean _equals = Objects.equal(laf, "Windows"); + if (_equals) { + return true; + } else { + return false; + } + } + + private boolean isMacLookAndFeel() { + LookAndFeel _lookAndFeel = UIManager.getLookAndFeel(); + String _name = null; + if (_lookAndFeel!=null) { + _name=_lookAndFeel.getName(); + } + final String laf = _name; + boolean _equals = Objects.equal(laf, "Mac OS X"); + if (_equals) { + return true; + } else { + return false; + } + } + + private void fixCheckBoxMenuItem(final JCheckBoxMenuItem item) { + boolean _isWindowsLookAndFeel = this.isWindowsLookAndFeel(); + if (_isWindowsLookAndFeel) { + boolean _isSelected = item.isSelected(); + if (_isSelected) { + item.setIcon(UtplsqlResources.getIcon("CHECKMARK_ICON")); + } else { + item.setIcon(null); + } + } + } + + @Override + public void actionPerformed(final ActionEvent e) { + Object _source = e.getSource(); + boolean _equals = Objects.equal(_source, this.refreshButton); + if (_equals) { + this.resetDerived(); + this.testDetailTabbedPane.setSelectedIndex(0); + this.testOverviewTableModel.fireTableDataChanged(); + } else { + Object _source_1 = e.getSource(); + boolean _equals_1 = Objects.equal(_source_1, this.rerunButton); + if (_equals_1) { + List _pathList = this.currentRun.getPathList(); + String _connectionName = this.currentRun.getConnectionName(); + final UtplsqlRunner runner = new UtplsqlRunner(_pathList, _connectionName); + runner.runTestAsync(); + } else { + Object _source_2 = e.getSource(); + boolean _equals_2 = Objects.equal(_source_2, this.rerunWorksheetButton); + if (_equals_2) { + List _pathList_1 = this.currentRun.getPathList(); + String _connectionName_1 = this.currentRun.getConnectionName(); + final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(_pathList_1, _connectionName_1); + worksheet.runTestAsync(); + } else { + Object _source_3 = e.getSource(); + boolean _equals_3 = Objects.equal(_source_3, this.runComboBox); + if (_equals_3) { + if ((this.currentRun != null)) { + Object _selectedItem = this.runComboBox.getSelectedItem(); + final ComboBoxItem comboBoxItem = ((ComboBoxItem) _selectedItem); + String _reporterId = this.currentRun.getReporterId(); + String _key = comboBoxItem.getKey(); + boolean _notEquals = (!Objects.equal(_reporterId, _key)); + if (_notEquals) { + this.update(comboBoxItem.getKey()); + this.testDetailTabbedPane.setSelectedIndex(0); + } + } + } else { + Object _source_4 = e.getSource(); + boolean _equals_4 = Objects.equal(_source_4, this.clearButton); + if (_equals_4) { + final Run run = this.currentRun; + this.runs.clear(); + this.currentRun = null; + this.setModel(run); + this.update(run.getReporterId()); + } else { + Object _source_5 = e.getSource(); + boolean _equals_5 = Objects.equal(_source_5, this.testOverviewRunMenuItem); + if (_equals_5) { + ArrayList _pathListFromSelectedTests = this.getPathListFromSelectedTests(); + String _connectionName_2 = this.currentRun.getConnectionName(); + final UtplsqlRunner runner_1 = new UtplsqlRunner(_pathListFromSelectedTests, _connectionName_2); + runner_1.runTestAsync(); + } else { + Object _source_6 = e.getSource(); + boolean _equals_6 = Objects.equal(_source_6, this.testOverviewRunWorksheetMenuItem); + if (_equals_6) { + ArrayList _pathListFromSelectedTests_1 = this.getPathListFromSelectedTests(); + String _connectionName_3 = this.currentRun.getConnectionName(); + final UtplsqlWorksheetRunner worksheet_1 = new UtplsqlWorksheetRunner(_pathListFromSelectedTests_1, _connectionName_3); + worksheet_1.runTestAsync(); + } else { + Object _source_7 = e.getSource(); + boolean _equals_7 = Objects.equal(_source_7, this.showDisabledCounterCheckBoxMenuItem); + if (_equals_7) { + this.applyShowDisabledCounter(this.showDisabledCounterCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showDisabledCounterCheckBoxMenuItem); + } else { + Object _source_8 = e.getSource(); + boolean _equals_8 = Objects.equal(_source_8, this.showWarningsCounterCheckBoxMenuItem); + if (_equals_8) { + this.applyShowWarningsCounter(this.showWarningsCounterCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showWarningsCounterCheckBoxMenuItem); + } else { + Object _source_9 = e.getSource(); + boolean _equals_9 = Objects.equal(_source_9, this.showInfoCounterCheckBoxMenuItem); + if (_equals_9) { + this.applyShowInfoCounter(this.showInfoCounterCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showInfoCounterCheckBoxMenuItem); + } else { + Object _source_10 = e.getSource(); + boolean _equals_10 = Objects.equal(_source_10, this.showSuccessfulTestsCheckBoxMenuItem); + if (_equals_10) { + this.applyFilter(this.showSuccessfulTestsCheckBoxMenuItem.isSelected(), this.showDisabledTestsCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showSuccessfulTestsCheckBoxMenuItem); + } else { + Object _source_11 = e.getSource(); + boolean _equals_11 = Objects.equal(_source_11, this.showDisabledTestsCheckBoxMenuItem); + if (_equals_11) { + this.applyFilter(this.showSuccessfulTestsCheckBoxMenuItem.isSelected(), this.showDisabledTestsCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showDisabledTestsCheckBoxMenuItem); + } else { + Object _source_12 = e.getSource(); + boolean _equals_12 = Objects.equal(_source_12, this.showTestDescriptionCheckBoxMenuItem); + if (_equals_12) { + this.applyShowTestDescription(this.showTestDescriptionCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showTestDescriptionCheckBoxMenuItem); + } else { + Object _source_13 = e.getSource(); + boolean _equals_13 = Objects.equal(_source_13, this.showWarningIndicatorCheckBoxMenuItem); + if (_equals_13) { + this.applyShowWarningIndicator(this.showWarningIndicatorCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showWarningIndicatorCheckBoxMenuItem); + } else { + Object _source_14 = e.getSource(); + boolean _equals_14 = Objects.equal(_source_14, this.showInfoIndicatorCheckBoxMenuItem); + if (_equals_14) { + this.applyShowInfoIndicator(this.showInfoIndicatorCheckBoxMenuItem.isSelected()); + this.fixCheckBoxMenuItem(this.showInfoIndicatorCheckBoxMenuItem); + } else { + Object _source_15 = e.getSource(); + boolean _equals_15 = Objects.equal(_source_15, this.syncDetailTabCheckBoxMenuItem); + if (_equals_15) { + this.syncDetailTab(); + this.fixCheckBoxMenuItem(this.syncDetailTabCheckBoxMenuItem); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + @Override + public void mouseClicked(final MouseEvent e) { + int _clickCount = e.getClickCount(); + boolean _equals = (_clickCount == 2); + if (_equals) { + Object _source = e.getSource(); + boolean _equals_1 = Objects.equal(_source, this.testOverviewTable); + if (_equals_1) { + int _selectedRowCount = this.failuresTable.getSelectedRowCount(); + boolean _equals_2 = (_selectedRowCount == 1); + if (_equals_2) { + this.openSelectedFailure(); + } else { + this.openSelectedTest(); + } + } else { + Object _source_1 = e.getSource(); + boolean _equals_3 = Objects.equal(_source_1, this.failuresTable); + if (_equals_3) { + int _selectedRowCount_1 = this.failuresTable.getSelectedRowCount(); + boolean _equals_4 = (_selectedRowCount_1 == 1); + if (_equals_4) { + this.openSelectedFailure(); + } + } + } + } + } + + @Override + public void mouseEntered(final MouseEvent e) { + } + + @Override + public void mouseExited(final MouseEvent e) { + } + + @Override + public void mousePressed(final MouseEvent e) { + } + + @Override + public void mouseReleased(final MouseEvent e) { + } + + @Override + public void hyperlinkUpdate(final HyperlinkEvent e) { + HyperlinkEvent.EventType _eventType = e.getEventType(); + boolean _equals = Objects.equal(_eventType, HyperlinkEvent.EventType.ACTIVATED); + if (_equals) { + final String link = e.getDescription(); + this.openLink(link); + } + } + + private static String formatDateTime(final String dateTime) { + if ((dateTime == null)) { + return null; + } else { + int _length = dateTime.length(); + boolean _equals = (_length == 26); + if (_equals) { + return dateTime.replace("T", " ").substring(0, 23); + } else { + return dateTime; + } + } + } + + private String getLinkedAndFormattedText(final String text) { + if ((text == null)) { + return ""; + } + StringConcatenation _builder = new StringConcatenation(); + _builder.append("\\s+(package\\s+)?("(\\S+?)\\.(\\S+?)(?:\\.(\\S+?))?",\\s+line\\s+([0-9]+))"); + final Pattern p1 = Pattern.compile(_builder.toString()); + String localText = HtmlUtils.htmlEscape(text); + Matcher m = p1.matcher(localText); + while (m.find()) { + { + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append(""); + String _group_4 = m.group(2); + _builder_1.append(_group_4); + _builder_1.append(""); + final String link = _builder_1.toString(); + final int start = m.start(2); + final int end = m.end(2); + StringConcatenation _builder_2 = new StringConcatenation(); + String _substring = localText.substring(0, start); + _builder_2.append(_substring); + _builder_2.append(link); + String _substring_1 = localText.substring(end); + _builder_2.append(_substring_1); + localText = _builder_2.toString(); + m = p1.matcher(localText); + } + } + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("^\\s{2}((\\S+?)\\.(\\S+?)\\.(\\S+?))$"); + final Pattern p2 = Pattern.compile(_builder_1.toString(), Pattern.MULTILINE); + m = p2.matcher(localText); + while (m.find()) { + { + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("  "); + String _group = m.group(1); + _builder_2.append(_group); + _builder_2.append(""); + final String link = _builder_2.toString(); + final int start = m.start(0); + final int end = m.end(0); + StringConcatenation _builder_3 = new StringConcatenation(); + String _substring = localText.substring(0, start); + _builder_3.append(_substring); + _builder_3.append(link); + String _substring_1 = localText.substring(end); + _builder_3.append(_substring_1); + localText = _builder_3.toString(); + m = p2.matcher(localText); + } + } + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("^For suite ([^:]+):$"); + final Pattern p3 = Pattern.compile(_builder_2.toString(), Pattern.MULTILINE); + m = p3.matcher(localText); + while (m.find()) { + { + StringConcatenation _builder_3 = new StringConcatenation(); + _builder_3.append("For suite \""); + String _group = m.group(1); + _builder_3.append(_group); + _builder_3.append("\""); + final String title = _builder_3.toString(); + final int start = m.start(0); + final int end = m.end(0); + StringConcatenation _builder_4 = new StringConcatenation(); + String _substring = localText.substring(0, start); + _builder_4.append(_substring); + _builder_4.append(title); + String _substring_1 = localText.substring(end); + _builder_4.append(_substring_1); + localText = _builder_4.toString(); + m = p3.matcher(localText); + } + } + StringConcatenation _builder_3 = new StringConcatenation(); + { + String[] _split = localText.split("\n"); + for(final String p : _split) { + _builder_3.append("

"); + _builder_3.append(p); + _builder_3.append("

"); + _builder_3.newLineIfNotEmpty(); + } + } + final String result = _builder_3.toString(); + return result; + } + + private JPanel makeLabelledCounterComponent(final JLabel label, final JComponent comp) { + final JPanel groupPanel = new JPanel(); + GridBagLayout _gridBagLayout = new GridBagLayout(); + groupPanel.setLayout(_gridBagLayout); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets = new Insets(5, 10, 5, 0); + c.insets = _insets; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + groupPanel.add(label, c); + c.gridx = 1; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_1 = new Insets(5, 5, 5, 10); + c.insets = _insets_1; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + groupPanel.add(comp, c); + final Dimension dim = new Dimension(134, 24); + groupPanel.setMinimumSize(dim); + groupPanel.setPreferredSize(dim); + return groupPanel; + } + + private void initializeGUI() { + JPanel _jPanel = new JPanel(); + this.basePanel = _jPanel; + GridBagLayout _gridBagLayout = new GridBagLayout(); + this.basePanel.setLayout(_gridBagLayout); + GridBagConstraints c = new GridBagConstraints(); + GradientToolbar toolbar = new GradientToolbar(); + toolbar.setFloatable(false); + Insets _insets = new Insets(2, 4, 2, 4); + final EmptyBorder buttonBorder = new EmptyBorder(_insets); + Icon _icon = UtplsqlResources.getIcon("REFRESH_ICON"); + ToolbarButton _toolbarButton = new ToolbarButton(_icon); + this.refreshButton = _toolbarButton; + this.refreshButton.setToolTipText(UtplsqlResources.getString("RUNNER_REFRESH_TOOLTIP")); + this.refreshButton.setBorder(buttonBorder); + this.refreshButton.addActionListener(this); + toolbar.add(this.refreshButton); + Icon _icon_1 = UtplsqlResources.getIcon("RUN_ICON"); + ToolbarButton _toolbarButton_1 = new ToolbarButton(_icon_1); + this.rerunButton = _toolbarButton_1; + this.rerunButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_TOOLTIP")); + this.rerunButton.setBorder(buttonBorder); + this.rerunButton.addActionListener(this); + toolbar.add(this.rerunButton); + Icon _icon_2 = UtplsqlResources.getIcon("RUN_WORKSHEET_ICON"); + ToolbarButton _toolbarButton_2 = new ToolbarButton(_icon_2); + this.rerunWorksheetButton = _toolbarButton_2; + this.rerunWorksheetButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_WORKSHEET_TOOLTIP")); + this.rerunWorksheetButton.setBorder(buttonBorder); + this.rerunWorksheetButton.addActionListener(this); + toolbar.add(this.rerunWorksheetButton); + toolbar.add(Box.createHorizontalGlue()); + DefaultComboBoxModel> _defaultComboBoxModel = new DefaultComboBoxModel>(); + this.runComboBoxModel = _defaultComboBoxModel; + JComboBox> _jComboBox = new JComboBox>(this.runComboBoxModel); + this.runComboBox = _jComboBox; + this.runComboBox.setEditable(false); + final Dimension comboBoxDim = new Dimension(500, 50); + this.runComboBox.setMaximumSize(comboBoxDim); + this.runComboBox.addActionListener(this); + toolbar.add(this.runComboBox); + Icon _icon_3 = UtplsqlResources.getIcon("CLEAR_ICON"); + ToolbarButton _toolbarButton_3 = new ToolbarButton(_icon_3); + this.clearButton = _toolbarButton_3; + this.clearButton.setToolTipText(UtplsqlResources.getString("RUNNER_CLEAR_BUTTON")); + this.clearButton.setBorder(buttonBorder); + this.clearButton.addActionListener(this); + toolbar.add(this.clearButton); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 2; + c.gridheight = 1; + Insets _insets_1 = new Insets(0, 0, 0, 0); + c.insets = _insets_1; + c.anchor = GridBagConstraints.NORTH; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + this.basePanel.add(toolbar, c); + JLabel _jLabel = new JLabel(); + this.statusLabel = _jLabel; + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_2 = new Insets(10, 10, 10, 0); + c.insets = _insets_2; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + this.basePanel.add(this.statusLabel, c); + JLabel _jLabel_1 = new JLabel(); + this.elapsedTimeLabel = _jLabel_1; + Dimension _dimension = new Dimension(60, 0); + this.elapsedTimeLabel.setPreferredSize(_dimension); + c.gridx = 1; + c.gridy = 1; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_3 = new Insets(10, 10, 10, 10); + c.insets = _insets_3; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + this.basePanel.add(this.elapsedTimeLabel, c); + Timer _timer = new Timer(100, new ActionListener() { + @Override + public void actionPerformed(final ActionEvent e) { + if (((RunnerPanel.this.currentRun != null) && (RunnerPanel.this.currentRun.getStart() != null))) { + final SmartTime time = new SmartTime(); + time.setSmart(RunnerPanel.useSmartTimes); + Double _executionTime = RunnerPanel.this.currentRun.getExecutionTime(); + boolean _tripleNotEquals = (_executionTime != null); + if (_tripleNotEquals) { + time.setSeconds(RunnerPanel.this.currentRun.getExecutionTime()); + RunnerPanel.this.elapsedTimeTimer.stop(); + } else { + final long now = System.currentTimeMillis(); + Long _start = RunnerPanel.this.currentRun.getStart(); + long _minus = (now - (_start).longValue()); + Double _double = new Double(_minus); + double _divide = ((_double).doubleValue() / 1000); + time.setSeconds(Double.valueOf(_divide)); + } + StringConcatenation _builder = new StringConcatenation(); + String _string = time.toString(); + _builder.append(_string); + { + if ((!RunnerPanel.useSmartTimes)) { + _builder.append(" s"); + } + } + RunnerPanel.this.elapsedTimeLabel.setText(_builder.toString()); + } else { + RunnerPanel.this.elapsedTimeLabel.setText(null); + } + } + }); + this.elapsedTimeTimer = _timer; + final JPanel counterPanel = new JPanel(); + WrapLayout _wrapLayout = new WrapLayout(FlowLayout.LEFT, 0, 0); + counterPanel.setLayout(_wrapLayout); + String _string = UtplsqlResources.getString("RUNNER_TESTS_LABEL"); + String _plus = (_string + ":"); + final JLabel testCounterLabel = new JLabel(_plus, JLabel.LEADING); + JLabel _jLabel_2 = new JLabel(); + this.testCounterValueLabel = _jLabel_2; + counterPanel.add(this.makeLabelledCounterComponent(testCounterLabel, this.testCounterValueLabel)); + String _string_1 = UtplsqlResources.getString("RUNNER_FAILURES_LABEL"); + String _plus_1 = (_string_1 + ":"); + Icon _icon_4 = UtplsqlResources.getIcon("FAILURE_ICON"); + final JLabel failureCounterLabel = new JLabel(_plus_1, _icon_4, JLabel.LEADING); + JLabel _jLabel_3 = new JLabel(); + this.failureCounterValueLabel = _jLabel_3; + counterPanel.add(this.makeLabelledCounterComponent(failureCounterLabel, this.failureCounterValueLabel)); + String _string_2 = UtplsqlResources.getString("RUNNER_ERRORS_LABEL"); + String _plus_2 = (_string_2 + ":"); + Icon _icon_5 = UtplsqlResources.getIcon("ERROR_ICON"); + final JLabel errorCounterLabel = new JLabel(_plus_2, _icon_5, JLabel.LEADING); + JLabel _jLabel_4 = new JLabel(); + this.errorCounterValueLabel = _jLabel_4; + counterPanel.add(this.makeLabelledCounterComponent(errorCounterLabel, this.errorCounterValueLabel)); + String _string_3 = UtplsqlResources.getString("RUNNER_DISABLED_LABEL"); + String _plus_3 = (_string_3 + ":"); + Icon _icon_6 = UtplsqlResources.getIcon("DISABLED_ICON"); + final JLabel disabledCounterLabel = new JLabel(_plus_3, _icon_6, JLabel.LEADING); + JLabel _jLabel_5 = new JLabel(); + this.disabledCounterValueLabel = _jLabel_5; + counterPanel.add(this.makeLabelledCounterComponent(disabledCounterLabel, this.disabledCounterValueLabel)); + String _string_4 = UtplsqlResources.getString("RUNNER_WARNINGS_LABEL"); + String _plus_4 = (_string_4 + ":"); + Icon _icon_7 = UtplsqlResources.getIcon("WARNING_ICON"); + final JLabel warningsCounterLabel = new JLabel(_plus_4, _icon_7, JLabel.LEADING); + JLabel _jLabel_6 = new JLabel(); + this.warningsCounterValueLabel = _jLabel_6; + counterPanel.add(this.makeLabelledCounterComponent(warningsCounterLabel, this.warningsCounterValueLabel)); + String _string_5 = UtplsqlResources.getString("RUNNER_INFO_LABEL"); + String _plus_5 = (_string_5 + ":"); + Icon _icon_8 = UtplsqlResources.getIcon("INFO_ICON"); + final JLabel infoCounterLabel = new JLabel(_plus_5, _icon_8, JLabel.LEADING); + JLabel _jLabel_7 = new JLabel(); + this.infoCounterValueLabel = _jLabel_7; + counterPanel.add(this.makeLabelledCounterComponent(infoCounterLabel, this.infoCounterValueLabel)); + c.gridx = 0; + c.gridy = 2; + c.gridwidth = 2; + c.gridheight = 1; + Insets _insets_4 = new Insets(5, 0, 5, 0); + c.insets = _insets_4; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + this.basePanel.add(counterPanel, c); + final JPopupMenu countersPopupMenu = new JPopupMenu(); + String _replace = UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem = new JCheckBoxMenuItem(_replace, true); + this.showDisabledCounterCheckBoxMenuItem = _jCheckBoxMenuItem; + this.showDisabledCounterCheckBoxMenuItem.addActionListener(this); + countersPopupMenu.add(this.showDisabledCounterCheckBoxMenuItem); + String _replace_1 = UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem_1 = new JCheckBoxMenuItem(_replace_1, true); + this.showWarningsCounterCheckBoxMenuItem = _jCheckBoxMenuItem_1; + this.showWarningsCounterCheckBoxMenuItem.addActionListener(this); + countersPopupMenu.add(this.showWarningsCounterCheckBoxMenuItem); + String _replace_2 = UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem_2 = new JCheckBoxMenuItem(_replace_2, true); + this.showInfoCounterCheckBoxMenuItem = _jCheckBoxMenuItem_2; + this.showInfoCounterCheckBoxMenuItem.addActionListener(this); + countersPopupMenu.add(this.showInfoCounterCheckBoxMenuItem); + counterPanel.setComponentPopupMenu(countersPopupMenu); + JProgressBar _jProgressBar = new JProgressBar(); + this.progressBar = _jProgressBar; + final Dimension progressBarDim = new Dimension(10, 20); + this.progressBar.setPreferredSize(progressBarDim); + this.progressBar.setMinimumSize(progressBarDim); + this.progressBar.setStringPainted(false); + this.progressBar.setForeground(RunnerPanel.GREEN); + BasicProgressBarUI _basicProgressBarUI = new BasicProgressBarUI(); + this.progressBar.setUI(_basicProgressBarUI); + c.gridx = 0; + c.gridy = 3; + c.gridwidth = 2; + c.gridheight = 1; + Insets _insets_5 = new Insets(10, 10, 10, 10); + c.insets = _insets_5; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + this.basePanel.add(this.progressBar, c); + TestOverviewTableModel _testOverviewTableModel = new TestOverviewTableModel(); + this.testOverviewTableModel = _testOverviewTableModel; + JTable _jTable = new JTable(this.testOverviewTableModel); + this.testOverviewTable = _jTable; + JTableHeader _tableHeader = this.testOverviewTable.getTableHeader(); + _tableHeader.setReorderingAllowed(false); + this.testOverviewTable.setAutoCreateRowSorter(true); + this.testOverviewTable.setRowHeight(RunnerPanel.OVERVIEW_TABLE_ROW_HEIGHT); + JTableHeader _tableHeader_1 = this.testOverviewTable.getTableHeader(); + Dimension _dimension_1 = new Dimension(this.testOverviewTable.getTableHeader().getPreferredSize().width, RunnerPanel.OVERVIEW_TABLE_ROW_HEIGHT); + _tableHeader_1.setPreferredSize(_dimension_1); + ListSelectionModel _selectionModel = this.testOverviewTable.getSelectionModel(); + RunnerPanel.TestOverviewRowListener _testOverviewRowListener = new RunnerPanel.TestOverviewRowListener(this); + _selectionModel.addListSelectionListener(_testOverviewRowListener); + this.testOverviewTable.addMouseListener(this); + RepaintManager _currentManager = RepaintManager.currentManager(this.testOverviewTable); + _currentManager.setDoubleBufferingEnabled(true); + final RunnerPanel.TestTableHeaderRenderer testTableHeaderRenderer = new RunnerPanel.TestTableHeaderRenderer(); + final TableColumn overviewTableStatus = this.testOverviewTable.getColumnModel().getColumn(0); + overviewTableStatus.setMinWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableStatus.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableStatus.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableStatus.setHeaderRenderer(testTableHeaderRenderer); + final TableColumn overviewTableWarning = this.testOverviewTable.getColumnModel().getColumn(1); + overviewTableWarning.setMinWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableWarning.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableWarning.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableWarning.setHeaderRenderer(testTableHeaderRenderer); + final TableColumn overviewTableInfo = this.testOverviewTable.getColumnModel().getColumn(2); + overviewTableInfo.setMinWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableInfo.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableInfo.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); + overviewTableInfo.setHeaderRenderer(testTableHeaderRenderer); + final TableColumn overviewTableId = this.testOverviewTable.getColumnModel().getColumn(3); + overviewTableId.setHeaderRenderer(testTableHeaderRenderer); + final TableColumn overviewTableTime = this.testOverviewTable.getColumnModel().getColumn(4); + overviewTableTime.setPreferredWidth(60); + overviewTableTime.setMaxWidth(100); + overviewTableTime.setHeaderRenderer(testTableHeaderRenderer); + final RunnerPanel.TimeFormatRenderer timeFormatRenderer = new RunnerPanel.TimeFormatRenderer(); + timeFormatRenderer.setHorizontalAlignment(JLabel.RIGHT); + overviewTableTime.setCellRenderer(timeFormatRenderer); + final JScrollPane testOverviewScrollPane = new JScrollPane(this.testOverviewTable); + final JPopupMenu testOverviewPopupMenu = new JPopupMenu(); + String _string_6 = UtplsqlResources.getString("RUNNER_RUN_MENUITEM"); + Icon _icon_9 = UtplsqlResources.getIcon("RUN_ICON"); + JMenuItem _jMenuItem = new JMenuItem(_string_6, _icon_9); + this.testOverviewRunMenuItem = _jMenuItem; + this.testOverviewRunMenuItem.addActionListener(this); + testOverviewPopupMenu.add(this.testOverviewRunMenuItem); + String _string_7 = UtplsqlResources.getString("RUNNER_RUN_WORKSHEET_MENUITEM"); + Icon _icon_10 = UtplsqlResources.getIcon("RUN_WORKSHEET_ICON"); + JMenuItem _jMenuItem_1 = new JMenuItem(_string_7, _icon_10); + this.testOverviewRunWorksheetMenuItem = _jMenuItem_1; + this.testOverviewRunWorksheetMenuItem.addActionListener(this); + testOverviewPopupMenu.add(this.testOverviewRunWorksheetMenuItem); + JSeparator _jSeparator = new JSeparator(); + testOverviewPopupMenu.add(_jSeparator); + String _replace_3 = UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem_3 = new JCheckBoxMenuItem(_replace_3, true); + this.showSuccessfulTestsCheckBoxMenuItem = _jCheckBoxMenuItem_3; + this.showSuccessfulTestsCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(this.showSuccessfulTestsCheckBoxMenuItem); + String _replace_4 = UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem_4 = new JCheckBoxMenuItem(_replace_4, true); + this.showDisabledTestsCheckBoxMenuItem = _jCheckBoxMenuItem_4; + this.showDisabledTestsCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(this.showDisabledTestsCheckBoxMenuItem); + JSeparator _jSeparator_1 = new JSeparator(); + testOverviewPopupMenu.add(_jSeparator_1); + String _replace_5 = UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem_5 = new JCheckBoxMenuItem(_replace_5, true); + this.showTestDescriptionCheckBoxMenuItem = _jCheckBoxMenuItem_5; + this.showTestDescriptionCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(this.showTestDescriptionCheckBoxMenuItem); + String _replace_6 = UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem_6 = new JCheckBoxMenuItem(_replace_6, true); + this.showWarningIndicatorCheckBoxMenuItem = _jCheckBoxMenuItem_6; + this.showWarningIndicatorCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(this.showWarningIndicatorCheckBoxMenuItem); + String _replace_7 = UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem_7 = new JCheckBoxMenuItem(_replace_7, true); + this.showInfoIndicatorCheckBoxMenuItem = _jCheckBoxMenuItem_7; + this.showInfoIndicatorCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(this.showInfoIndicatorCheckBoxMenuItem); + String _replace_8 = UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL").replace("?", ""); + JCheckBoxMenuItem _jCheckBoxMenuItem_8 = new JCheckBoxMenuItem(_replace_8, true); + this.syncDetailTabCheckBoxMenuItem = _jCheckBoxMenuItem_8; + this.syncDetailTabCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(this.syncDetailTabCheckBoxMenuItem); + this.testOverviewTable.setComponentPopupMenu(testOverviewPopupMenu); + JTableHeader _tableHeader_2 = this.testOverviewTable.getTableHeader(); + _tableHeader_2.setComponentPopupMenu(testOverviewPopupMenu); + final ScrollablePanel testInfoPanel = new ScrollablePanel(); + GridBagLayout _gridBagLayout_1 = new GridBagLayout(); + testInfoPanel.setLayout(_gridBagLayout_1); + String _string_8 = UtplsqlResources.getString("RUNNER_OWNER_LABEL"); + final JLabel testOwnerLabel = new JLabel(_string_8); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_6 = new Insets(10, 10, 0, 0); + c.insets = _insets_6; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testOwnerLabel, c); + RunnerTextField _runnerTextField = new RunnerTextField(); + this.testOwnerTextField = _runnerTextField; + this.testOwnerTextField.setEditable(false); + c.gridx = 1; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_7 = new Insets(10, 5, 0, 10); + c.insets = _insets_7; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(this.testOwnerTextField, c); + String _string_9 = UtplsqlResources.getString("RUNNER_PACKAGE_LABEL"); + final JLabel testPackageLabel = new JLabel(_string_9); + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_8 = new Insets(5, 10, 0, 0); + c.insets = _insets_8; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testPackageLabel, c); + RunnerTextField _runnerTextField_1 = new RunnerTextField(); + this.testPackageTextField = _runnerTextField_1; + this.testPackageTextField.setEditable(false); + c.gridx = 1; + c.gridy = 1; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_9 = new Insets(5, 5, 0, 10); + c.insets = _insets_9; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(this.testPackageTextField, c); + String _string_10 = UtplsqlResources.getString("RUNNER_PROCEDURE_LABEL"); + final JLabel testProcedureLabel = new JLabel(_string_10); + c.gridx = 0; + c.gridy = 2; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_10 = new Insets(5, 10, 0, 0); + c.insets = _insets_10; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testProcedureLabel, c); + RunnerTextField _runnerTextField_2 = new RunnerTextField(); + this.testProcedureTextField = _runnerTextField_2; + this.testProcedureTextField.setEditable(false); + c.gridx = 1; + c.gridy = 2; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_11 = new Insets(5, 5, 0, 10); + c.insets = _insets_11; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(this.testProcedureTextField, c); + String _string_11 = UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL"); + final JLabel testDescriptionLabel = new JLabel(_string_11); + int _xifexpression = (int) 0; + boolean _isMacLookAndFeel = this.isMacLookAndFeel(); + if (_isMacLookAndFeel) { + _xifexpression = 5; + } else { + _xifexpression = 3; + } + testDescriptionLabel.setBorder(BorderFactory.createEmptyBorder(_xifexpression, 0, 0, 0)); + c.gridx = 0; + c.gridy = 3; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_12 = new Insets(5, 10, 0, 0); + c.insets = _insets_12; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testDescriptionLabel, c); + RunnerTextArea _runnerTextArea = new RunnerTextArea(); + this.testDescriptionTextArea = _runnerTextArea; + this.testDescriptionTextArea.setEditable(false); + this.testDescriptionTextArea.setEnabled(true); + this.testDescriptionTextArea.setLineWrap(true); + this.testDescriptionTextArea.setWrapStyleWord(true); + c.gridx = 1; + c.gridy = 3; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_13 = new Insets(5, 5, 0, 10); + c.insets = _insets_13; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(this.testDescriptionTextArea, c); + String _string_12 = UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN"); + final JLabel testIdLabel = new JLabel(_string_12); + int _xifexpression_1 = (int) 0; + boolean _isMacLookAndFeel_1 = this.isMacLookAndFeel(); + if (_isMacLookAndFeel_1) { + _xifexpression_1 = 5; + } else { + _xifexpression_1 = 3; + } + testIdLabel.setBorder(BorderFactory.createEmptyBorder(_xifexpression_1, 0, 0, 0)); + c.gridx = 0; + c.gridy = 4; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_14 = new Insets(5, 10, 0, 0); + c.insets = _insets_14; + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testIdLabel, c); + RunnerTextArea _runnerTextArea_1 = new RunnerTextArea(); + this.testIdTextArea = _runnerTextArea_1; + this.testIdTextArea.setEditable(false); + this.testIdTextArea.setEnabled(true); + this.testIdTextArea.setLineWrap(true); + this.testIdTextArea.setWrapStyleWord(false); + c.gridx = 1; + c.gridy = 4; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_15 = new Insets(5, 5, 0, 10); + c.insets = _insets_15; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(this.testIdTextArea, c); + String _string_13 = UtplsqlResources.getString("RUNNER_START_LABEL"); + final JLabel testStartLabel = new JLabel(_string_13); + c.gridx = 0; + c.gridy = 5; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_16 = new Insets(5, 10, 10, 0); + c.insets = _insets_16; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testStartLabel, c); + RunnerTextField _runnerTextField_3 = new RunnerTextField(); + this.testStartTextField = _runnerTextField_3; + this.testStartTextField.setEditable(false); + c.gridx = 1; + c.gridy = 5; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_17 = new Insets(5, 5, 10, 10); + c.insets = _insets_17; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(this.testStartTextField, c); + c.gridx = 0; + c.gridy = 6; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_18 = new Insets(0, 0, 0, 0); + c.insets = _insets_18; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 0; + c.weighty = 1; + testInfoPanel.add(Box.createVerticalGlue(), c); + final JScrollPane testPropertiesScrollPane = new JScrollPane(testInfoPanel); + FailuresTableModel _failuresTableModel = new FailuresTableModel(); + this.failuresTableModel = _failuresTableModel; + JTable _jTable_1 = new JTable(this.failuresTableModel); + this.failuresTable = _jTable_1; + JTableHeader _tableHeader_3 = this.failuresTable.getTableHeader(); + _tableHeader_3.setReorderingAllowed(false); + ListSelectionModel _selectionModel_1 = this.failuresTable.getSelectionModel(); + RunnerPanel.FailuresRowListener _failuresRowListener = new RunnerPanel.FailuresRowListener(this); + _selectionModel_1.addListSelectionListener(_failuresRowListener); + this.failuresTable.addMouseListener(this); + final RunnerPanel.FailuresTableHeaderRenderer failuresTableHeaderRenderer = new RunnerPanel.FailuresTableHeaderRenderer(); + final TableColumn failuresTableNumber = this.failuresTable.getColumnModel().getColumn(0); + failuresTableNumber.setHeaderRenderer(failuresTableHeaderRenderer); + failuresTableNumber.setPreferredWidth(30); + failuresTableNumber.setMaxWidth(30); + final TableColumn failuresDescription = this.failuresTable.getColumnModel().getColumn(1); + failuresDescription.setHeaderRenderer(failuresTableHeaderRenderer); + final JScrollPane failuresTableScrollPane = new JScrollPane(this.failuresTable); + RunnerTextPane _runnerTextPane = new RunnerTextPane(); + this.testFailureMessageTextPane = _runnerTextPane; + this.testFailureMessageTextPane.setEditable(false); + this.testFailureMessageTextPane.setEnabled(true); + this.testFailureMessageTextPane.setContentType("text/html"); + this.testFailureMessageTextPane.setMinimumSize(RunnerPanel.TEXTPANE_DIM); + this.testFailureMessageTextPane.setPreferredSize(RunnerPanel.TEXTPANE_DIM); + this.testFailureMessageTextPane.addHyperlinkListener(this); + final JScrollPane testFailureMessageScrollPane = new JScrollPane(this.testFailureMessageTextPane); + c.gridx = 1; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_19 = new Insets(10, 5, 0, 10); + c.insets = _insets_19; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 6; + final JSplitPane failuresSplitPane = new JSplitPane(SwingConstants.HORIZONTAL, failuresTableScrollPane, testFailureMessageScrollPane); + failuresSplitPane.setResizeWeight(0.2); + final JPanel testErrorStackPanel = new JPanel(); + GridBagLayout _gridBagLayout_2 = new GridBagLayout(); + testErrorStackPanel.setLayout(_gridBagLayout_2); + RunnerTextPane _runnerTextPane_1 = new RunnerTextPane(); + this.testErrorStackTextPane = _runnerTextPane_1; + this.testErrorStackTextPane.setEditable(false); + this.testErrorStackTextPane.setEnabled(true); + this.testErrorStackTextPane.setContentType("text/html"); + this.testErrorStackTextPane.setMinimumSize(RunnerPanel.TEXTPANE_DIM); + this.testErrorStackTextPane.setPreferredSize(RunnerPanel.TEXTPANE_DIM); + this.testErrorStackTextPane.addHyperlinkListener(this); + final JScrollPane testErrorStackScrollPane = new JScrollPane(this.testErrorStackTextPane); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_20 = new Insets(0, 0, 0, 0); + c.insets = _insets_20; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + testErrorStackPanel.add(testErrorStackScrollPane, c); + final JPanel testWarningsPanel = new JPanel(); + GridBagLayout _gridBagLayout_3 = new GridBagLayout(); + testWarningsPanel.setLayout(_gridBagLayout_3); + RunnerTextPane _runnerTextPane_2 = new RunnerTextPane(); + this.testWarningsTextPane = _runnerTextPane_2; + this.testWarningsTextPane.setEditable(false); + this.testWarningsTextPane.setEnabled(true); + this.testWarningsTextPane.setContentType("text/html"); + this.testWarningsTextPane.setMinimumSize(RunnerPanel.TEXTPANE_DIM); + this.testWarningsTextPane.setPreferredSize(RunnerPanel.TEXTPANE_DIM); + this.testWarningsTextPane.addHyperlinkListener(this); + final JScrollPane testWarningsScrollPane = new JScrollPane(this.testWarningsTextPane); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_21 = new Insets(0, 0, 0, 0); + c.insets = _insets_21; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + testWarningsPanel.add(testWarningsScrollPane, c); + final JPanel testServerOutputPanel = new JPanel(); + GridBagLayout _gridBagLayout_4 = new GridBagLayout(); + testServerOutputPanel.setLayout(_gridBagLayout_4); + RunnerTextPane _runnerTextPane_3 = new RunnerTextPane(); + this.testServerOutputTextPane = _runnerTextPane_3; + this.testServerOutputTextPane.setEditable(false); + this.testServerOutputTextPane.setEnabled(true); + this.testServerOutputTextPane.setContentType("text/html"); + this.testServerOutputTextPane.setMinimumSize(RunnerPanel.TEXTPANE_DIM); + this.testServerOutputTextPane.setPreferredSize(RunnerPanel.TEXTPANE_DIM); + this.testServerOutputTextPane.addHyperlinkListener(this); + final JScrollPane testServerOutputScrollPane = new JScrollPane(this.testServerOutputTextPane); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + Insets _insets_22 = new Insets(0, 0, 0, 0); + c.insets = _insets_22; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + testServerOutputPanel.add(testServerOutputScrollPane, c); + JTabbedPane _jTabbedPane = new JTabbedPane(); + this.testDetailTabbedPane = _jTabbedPane; + this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_TEST_TAB_LABEL"), testPropertiesScrollPane); + this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_FAILURES_TAB_LABEL"), failuresSplitPane); + this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_ERRORS_TAB_LABEL"), testErrorStackPanel); + this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_WARNINGS_TAB_LABEL"), testWarningsPanel); + this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_INFO_TAB_LABEL"), testServerOutputPanel); + final JSplitPane horizontalSplitPane = new JSplitPane(SwingConstants.HORIZONTAL, testOverviewScrollPane, this.testDetailTabbedPane); + horizontalSplitPane.setResizeWeight(0.5); + c.gridx = 0; + c.gridy = 4; + c.gridwidth = 2; + c.gridheight = 1; + Insets _insets_23 = new Insets(10, 10, 10, 10); + c.insets = _insets_23; + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + this.basePanel.add(horizontalSplitPane, c); + boolean _isMacLookAndFeel_2 = this.isMacLookAndFeel(); + if (_isMacLookAndFeel_2) { + Color _color = new Color(219, 219, 219); + final CompoundBorder border = BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder(3, 3, 3, 3), + BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(_color), + BorderFactory.createEmptyBorder(1, 1, 1, 1))); + this.testDescriptionTextArea.setBorder(border); + this.testIdTextArea.setBorder(border); + } else { + final Border referenceBorder = this.testOwnerTextField.getBorder(); + this.testDescriptionTextArea.setBorder(referenceBorder); + this.testIdTextArea.setBorder(referenceBorder); + } + } +} From e4ba479e21a19bcbb2f6886dc5bf99bae22bbff4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 19:12:53 +0200 Subject: [PATCH 149/286] convert RunnerPanel to Java, removing Xtend dependencies --- .../utplsql/sqldev/ui/runner/RunnerPanel.java | 3017 +++++++---------- 1 file changed, 1247 insertions(+), 1770 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java index 289d2c7f..a4990ef4 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,10 +15,8 @@ */ package org.utplsql.sqldev.ui.runner; -import com.google.common.base.Objects; import java.awt.Color; import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; @@ -33,13 +31,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Set; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; + import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.DefaultComboBoxModel; -import javax.swing.Icon; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComboBox; import javax.swing.JComponent; @@ -53,11 +51,9 @@ import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTable; -import javax.swing.ListSelectionModel; import javax.swing.LookAndFeel; import javax.swing.RepaintManager; import javax.swing.RowFilter; -import javax.swing.RowSorter; import javax.swing.SwingConstants; import javax.swing.Timer; import javax.swing.UIManager; @@ -70,20 +66,13 @@ import javax.swing.event.ListSelectionListener; import javax.swing.plaf.basic.BasicProgressBarUI; import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; -import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; -import oracle.dbtools.raptor.controls.grid.DefaultDrillLink; -import oracle.dbtools.raptor.utils.Connections; -import oracle.ide.config.Preferences; -import oracle.javatools.ui.table.ToolbarButton; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.Conversions; -import org.eclipse.xtext.xbase.lib.Exceptions; + import org.springframework.web.util.HtmlUtils; import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; import org.utplsql.sqldev.model.LimitedLinkedHashMap; import org.utplsql.sqldev.model.preference.PreferenceModel; import org.utplsql.sqldev.model.runner.Counter; @@ -94,1820 +83,1308 @@ import org.utplsql.sqldev.resources.UtplsqlResources; import org.utplsql.sqldev.runner.UtplsqlRunner; import org.utplsql.sqldev.runner.UtplsqlWorksheetRunner; -import org.utplsql.sqldev.ui.runner.ComboBoxItem; -import org.utplsql.sqldev.ui.runner.FailuresTableModel; -import org.utplsql.sqldev.ui.runner.GradientToolbar; -import org.utplsql.sqldev.ui.runner.RunnerTextArea; -import org.utplsql.sqldev.ui.runner.RunnerTextField; -import org.utplsql.sqldev.ui.runner.RunnerTextPane; -import org.utplsql.sqldev.ui.runner.ScrollablePanel; -import org.utplsql.sqldev.ui.runner.SmartTime; -import org.utplsql.sqldev.ui.runner.TestOverviewTableModel; -import org.utplsql.sqldev.ui.runner.WrapLayout; - -@SuppressWarnings("all") + +import oracle.dbtools.raptor.controls.grid.DefaultDrillLink; +import oracle.dbtools.raptor.utils.Connections; +import oracle.ide.config.Preferences; +import oracle.javatools.db.DBException; +import oracle.javatools.ui.table.ToolbarButton; + public class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener { - public static class TestOverviewRowListener implements ListSelectionListener { - private RunnerPanel p; - - public TestOverviewRowListener(final RunnerPanel p) { - this.p = p; - } - - @Override - public void valueChanged(final ListSelectionEvent event) { - final int rowIndex = this.p.testOverviewTable.getSelectedRow(); - if ((rowIndex != (-1))) { - final int row = this.p.testOverviewTable.convertRowIndexToModel(rowIndex); - final Test test = this.p.testOverviewTableModel.getTest(row); - this.p.testOwnerTextField.setText(test.getOwnerName()); - this.p.testPackageTextField.setText(test.getObjectName()); - this.p.testProcedureTextField.setText(test.getProcedureName()); - String _description = test.getDescription(); - String _trim = null; - if (_description!=null) { - _trim=_description.trim(); - } - this.p.testDescriptionTextArea.setText(_trim); - this.p.testIdTextArea.setText(test.getId()); - this.p.testStartTextField.setText(RunnerPanel.formatDateTime(test.getStartTime())); - this.p.failuresTableModel.setModel(test.getFailedExpectations()); - this.p.failuresTableModel.fireTableDataChanged(); - this.p.testFailureMessageTextPane.setText(null); - if (((test.getFailedExpectations() != null) && (test.getFailedExpectations().size() > 0))) { - this.p.failuresTable.setRowSelectionInterval(0, 0); - } - String _errorStack = test.getErrorStack(); - String _trim_1 = null; - if (_errorStack!=null) { - _trim_1=_errorStack.trim(); - } - this.p.testErrorStackTextPane.setText(this.p.getHtml(_trim_1)); - String _warnings = test.getWarnings(); - String _trim_2 = null; - if (_warnings!=null) { - _trim_2=_warnings.trim(); - } - this.p.testWarningsTextPane.setText(this.p.getHtml(_trim_2)); - String _serverOutput = test.getServerOutput(); - String _trim_3 = null; - if (_serverOutput!=null) { - _trim_3=_serverOutput.trim(); + private static final Logger logger = Logger.getLogger(RunnerPanel.class.getName()); + private static final Color GREEN = new Color(0, 153, 0); + private static final Color RED = new Color(153, 0, 0); + private static final int INDICATOR_WIDTH = 20; + private static final int OVERVIEW_TABLE_ROW_HEIGHT = 20; + private static final Dimension TEXTPANE_DIM = new Dimension(100, 100); + + private boolean useSmartTimes = false; + private LimitedLinkedHashMap runs = new LimitedLinkedHashMap<>(10); + private Run currentRun; + private JPanel basePanel; + private ToolbarButton refreshButton; + private ToolbarButton rerunButton; + private ToolbarButton rerunWorksheetButton; + private DefaultComboBoxModel> runComboBoxModel; + private ToolbarButton clearButton; + private JComboBox> runComboBox; + private JLabel statusLabel; + private Timer elapsedTimeTimer; + private JLabel testCounterValueLabel; + private JLabel errorCounterValueLabel; + private JLabel failureCounterValueLabel; + private JLabel disabledCounterValueLabel; + private JLabel warningsCounterValueLabel; + private JLabel infoCounterValueLabel; + private JCheckBoxMenuItem showDisabledCounterCheckBoxMenuItem; + private JCheckBoxMenuItem showWarningsCounterCheckBoxMenuItem; + private JCheckBoxMenuItem showInfoCounterCheckBoxMenuItem; + private JProgressBar progressBar; + private TestOverviewTableModel testOverviewTableModel; + private JTable testOverviewTable; + private JMenuItem testOverviewRunMenuItem; + private JMenuItem testOverviewRunWorksheetMenuItem; + private JCheckBoxMenuItem showTestDescriptionCheckBoxMenuItem; + private JCheckBoxMenuItem showWarningIndicatorCheckBoxMenuItem; + private JCheckBoxMenuItem showInfoIndicatorCheckBoxMenuItem; + private JCheckBoxMenuItem showSuccessfulTestsCheckBoxMenuItem; + private JCheckBoxMenuItem showDisabledTestsCheckBoxMenuItem; + private JCheckBoxMenuItem syncDetailTabCheckBoxMenuItem; + private RunnerTextField testOwnerTextField; + private RunnerTextField testPackageTextField; + private RunnerTextField testProcedureTextField; + private RunnerTextArea testDescriptionTextArea; + private RunnerTextArea testIdTextArea; + private RunnerTextField testStartTextField; + private FailuresTableModel failuresTableModel; + private JTable failuresTable; + private RunnerTextPane testFailureMessageTextPane; + private RunnerTextPane testErrorStackTextPane; + private RunnerTextPane testWarningsTextPane; + private RunnerTextPane testServerOutputTextPane; + private JTabbedPane testDetailTabbedPane; + + public class TestOverviewRowListener implements ListSelectionListener { + + private String formatDateTime(final String dateTime) { + if (dateTime == null) { + return null; + } else { + if (dateTime.length() == 26) { + return dateTime.replace("T", " ").substring(0, 23); + } else { + return dateTime; + } + } } - this.p.testServerOutputTextPane.setText(this.p.getHtml(_trim_3)); - this.p.syncDetailTab(); - this.p.testOverviewRunMenuItem.setEnabled(true); - this.p.testOverviewRunWorksheetMenuItem.setEnabled(true); - } - } - } - - public static class FailuresRowListener implements ListSelectionListener { - private RunnerPanel p; - - public FailuresRowListener(final RunnerPanel p) { - this.p = p; + + @Override + public void valueChanged(final ListSelectionEvent event) { + final int rowIndex = testOverviewTable.getSelectedRow(); + if (rowIndex != -1) { + final int row = testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = testOverviewTableModel.getTest(row); + testOwnerTextField.setText(test.getOwnerName()); + testPackageTextField.setText(test.getObjectName()); + testProcedureTextField.setText(test.getProcedureName()); + testDescriptionTextArea.setText(test.getDescription() != null ? test.getDescription().trim() : null); + testIdTextArea.setText(test.getId()); + testStartTextField.setText(formatDateTime(test.getStartTime())); + failuresTableModel.setModel(test.getFailedExpectations()); + failuresTableModel.fireTableDataChanged(); + testFailureMessageTextPane.setText(null); + if (test.getFailedExpectations() != null && !test.getFailedExpectations().isEmpty()) { + failuresTable.setRowSelectionInterval(0, 0); + } + testErrorStackTextPane.setText(getHtml(test.getErrorStack() != null ? test.getErrorStack().trim() : null)); + testWarningsTextPane.setText(getHtml(test.getWarnings() != null ? test.getWarnings().trim() : null)); + testServerOutputTextPane.setText(getHtml(test.getServerOutput() != null ? test.getServerOutput().trim() : null)); + syncDetailTab(); + testOverviewRunMenuItem.setEnabled(true); + testOverviewRunWorksheetMenuItem.setEnabled(true); + } + } } - - @Override - public void valueChanged(final ListSelectionEvent event) { - final int rowIndex = this.p.failuresTable.getSelectedRow(); - if ((rowIndex != (-1))) { - final int row = this.p.failuresTable.convertRowIndexToModel(rowIndex); - final Expectation expectation = this.p.failuresTableModel.getExpectation(row); - final String html = this.p.getHtml(expectation.getFailureText()); - this.p.testFailureMessageTextPane.setText(html); - } + + public class FailuresRowListener implements ListSelectionListener { + + @Override + public void valueChanged(final ListSelectionEvent event) { + final int rowIndex = failuresTable.getSelectedRow(); + if (rowIndex != -1) { + final int row = failuresTable.convertRowIndexToModel(rowIndex); + final Expectation expectation = failuresTableModel.getExpectation(row); + final String html = getHtml(expectation.getFailureText()); + testFailureMessageTextPane.setText(html); + } + } } - } - - public static class TimeFormatRenderer extends DefaultTableCellRenderer { - @Override - public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int col) { - final SmartTime smartTime = new SmartTime(((Double) value), RunnerPanel.useSmartTimes); - return super.getTableCellRendererComponent(table, smartTime.toString(), isSelected, hasFocus, row, col); + + public class TimeFormatRenderer extends DefaultTableCellRenderer { + private static final long serialVersionUID = 7720067427609773267L; + + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, + final boolean hasFocus, final int row, final int col) { + final SmartTime smartTime = new SmartTime(((Double) value), useSmartTimes); + return super.getTableCellRendererComponent(table, smartTime.toString(), isSelected, hasFocus, row, col); + } } - } - - public static class TestTableHeaderRenderer extends DefaultTableCellRenderer { - @Override - public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int col) { - final TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer(); - Component _tableCellRendererComponent = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); - final JLabel label = ((JLabel) _tableCellRendererComponent); - if ((col == 0)) { - label.setIcon(UtplsqlResources.getIcon("STATUS_ICON")); - label.setHorizontalAlignment(JLabel.CENTER); - } else { - if ((col == 1)) { - label.setIcon(UtplsqlResources.getIcon("WARNING_ICON")); - label.setHorizontalAlignment(JLabel.CENTER); - } else { - if ((col == 2)) { - label.setIcon(UtplsqlResources.getIcon("INFO_ICON")); - label.setHorizontalAlignment(JLabel.CENTER); - } else { - if ((col == 3)) { - label.setIcon(null); - label.setHorizontalAlignment(JLabel.LEFT); - } else { - if ((col == 4)) { + + public class TestTableHeaderRenderer extends DefaultTableCellRenderer { + private static final long serialVersionUID = 6295858563570577027L; + + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, + final boolean hasFocus, final int row, final int col) { + final TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer(); + final JLabel label = ((JLabel) renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, + row, col)); + if (col == 0) { + label.setIcon(UtplsqlResources.getIcon("STATUS_ICON")); + label.setHorizontalAlignment(JLabel.CENTER); + } else if (col == 1) { + label.setIcon(UtplsqlResources.getIcon("WARNING_ICON")); + label.setHorizontalAlignment(JLabel.CENTER); + } else if (col == 2) { + label.setIcon(UtplsqlResources.getIcon("INFO_ICON")); + label.setHorizontalAlignment(JLabel.CENTER); + } else if (col == 3) { + label.setIcon(null); + label.setHorizontalAlignment(JLabel.LEFT); + } else if (col == 4) { label.setIcon(null); label.setHorizontalAlignment(JLabel.RIGHT); - } } - } + return label; } - } - return label; - } - } - - public static class FailuresTableHeaderRenderer extends DefaultTableCellRenderer { - @Override - public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int col) { - final TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer(); - Component _tableCellRendererComponent = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); - final JLabel label = ((JLabel) _tableCellRendererComponent); - if ((col == 0)) { - label.setHorizontalAlignment(JLabel.RIGHT); - } else { - label.setHorizontalAlignment(JLabel.LEFT); - } - return label; - } - } - - private static final Color GREEN = new Color(0, 153, 0); - - private static final Color RED = new Color(153, 0, 0); - - private static final int INDICATOR_WIDTH = 20; - - private static final int OVERVIEW_TABLE_ROW_HEIGHT = 20; - - private static final Dimension TEXTPANE_DIM = new Dimension(100, 100); - - private static boolean useSmartTimes; - - private LimitedLinkedHashMap runs = new LimitedLinkedHashMap(10); - - private Run currentRun; - - private JPanel basePanel; - - private ToolbarButton refreshButton; - - private ToolbarButton rerunButton; - - private ToolbarButton rerunWorksheetButton; - - private DefaultComboBoxModel> runComboBoxModel; - - private ToolbarButton clearButton; - - private JComboBox> runComboBox; - - private JLabel statusLabel; - - private JLabel elapsedTimeLabel; - - private Timer elapsedTimeTimer; - - private JLabel testCounterValueLabel; - - private JLabel errorCounterValueLabel; - - private JLabel failureCounterValueLabel; - - private JLabel disabledCounterValueLabel; - - private JLabel warningsCounterValueLabel; - - private JLabel infoCounterValueLabel; - - private JCheckBoxMenuItem showDisabledCounterCheckBoxMenuItem; - - private JCheckBoxMenuItem showWarningsCounterCheckBoxMenuItem; - - private JCheckBoxMenuItem showInfoCounterCheckBoxMenuItem; - - private JProgressBar progressBar; - - private TestOverviewTableModel testOverviewTableModel; - - private JTable testOverviewTable; - - private JMenuItem testOverviewRunMenuItem; - - private JMenuItem testOverviewRunWorksheetMenuItem; - - private JCheckBoxMenuItem showTestDescriptionCheckBoxMenuItem; - - private JCheckBoxMenuItem showWarningIndicatorCheckBoxMenuItem; - - private JCheckBoxMenuItem showInfoIndicatorCheckBoxMenuItem; - - private JCheckBoxMenuItem showSuccessfulTestsCheckBoxMenuItem; - - private JCheckBoxMenuItem showDisabledTestsCheckBoxMenuItem; - - private JCheckBoxMenuItem syncDetailTabCheckBoxMenuItem; - - private RunnerTextField testOwnerTextField; - - private RunnerTextField testPackageTextField; - - private RunnerTextField testProcedureTextField; - - private RunnerTextArea testDescriptionTextArea; - - private RunnerTextArea testIdTextArea; - - private RunnerTextField testStartTextField; - - private FailuresTableModel failuresTableModel; - - private JTable failuresTable; - - private RunnerTextPane testFailureMessageTextPane; - - private RunnerTextPane testErrorStackTextPane; - - private RunnerTextPane testWarningsTextPane; - - private RunnerTextPane testServerOutputTextPane; - - private JTabbedPane testDetailTabbedPane; - - public Component getGUI() { - if ((this.basePanel == null)) { - this.initializeGUI(); } - boolean _isShowing = this.basePanel.isShowing(); - boolean _not = (!_isShowing); - if (_not) { - this.applyPreferences(); - } - return this.basePanel; - } - - private void resetDerived() { - RowSorter _rowSorter = this.testOverviewTable.getRowSorter(); - _rowSorter.setSortKeys(null); - this.testOverviewRunMenuItem.setEnabled(false); - this.testOverviewRunWorksheetMenuItem.setEnabled(false); - this.testIdTextArea.setText(null); - this.testOwnerTextField.setText(null); - this.testPackageTextField.setText(null); - this.testProcedureTextField.setText(null); - this.testDescriptionTextArea.setText(null); - this.testStartTextField.setText(null); - this.failuresTableModel.setModel(null); - this.failuresTableModel.fireTableDataChanged(); - this.testFailureMessageTextPane.setText(null); - this.testErrorStackTextPane.setText(null); - this.testWarningsTextPane.setText(null); - this.testServerOutputTextPane.setText(null); - } - - private void refreshRunsComboBox() { - int _size = this.runs.size(); - boolean _greaterThan = (_size > 0); - if (_greaterThan) { - this.runComboBox.removeActionListener(this); - this.runComboBoxModel.removeAllElements(); - for (int i = (this.runs.size() - 1); (i >= 0); i--) { - { - final Map.Entry entry = ((Map.Entry[])Conversions.unwrapArray(this.runs.entrySet(), Map.Entry.class))[i]; - String _key = entry.getKey(); - String _name = entry.getValue().getName(); - final ComboBoxItem item = new ComboBoxItem(_key, _name); - this.runComboBoxModel.addElement(item); + + public class FailuresTableHeaderRenderer extends DefaultTableCellRenderer { + private static final long serialVersionUID = 5059401447983514596L; + + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, + final boolean hasFocus, final int row, final int col) { + final TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer(); + final JLabel label = ((JLabel) renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, + row, col)); + if (col == 0) { + label.setHorizontalAlignment(JLabel.RIGHT); + } else { + label.setHorizontalAlignment(JLabel.LEFT); + } + return label; } - } - this.runComboBox.setSelectedIndex(0); - this.runComboBox.addActionListener(this); } - } - - private LimitedLinkedHashMap applyShowNumberOfRunsInHistory(final int maxRuns) { - LimitedLinkedHashMap _xifexpression = null; - int _maxEntries = this.runs.getMaxEntries(); - boolean _notEquals = (maxRuns != _maxEntries); - if (_notEquals) { - LimitedLinkedHashMap _xblockexpression = null; - { - final LimitedLinkedHashMap newRuns = new LimitedLinkedHashMap(maxRuns); - Set> _entrySet = this.runs.entrySet(); - for (final Map.Entry entry : _entrySet) { - newRuns.put(entry.getKey(), entry.getValue()); + + public Component getGUI() { + if (basePanel == null) { + initializeGUI(); } - _xblockexpression = this.runs = newRuns; - } - _xifexpression = _xblockexpression; - } - return _xifexpression; - } - - private void applyShowDisabledCounter(final boolean show) { - Container _parent = this.disabledCounterValueLabel.getParent(); - _parent.setVisible(this.showDisabledCounterCheckBoxMenuItem.isSelected()); - } - - private void applyShowWarningsCounter(final boolean show) { - Container _parent = this.warningsCounterValueLabel.getParent(); - _parent.setVisible(this.showWarningsCounterCheckBoxMenuItem.isSelected()); - } - - private void applyShowInfoCounter(final boolean show) { - Container _parent = this.infoCounterValueLabel.getParent(); - _parent.setVisible(this.showInfoCounterCheckBoxMenuItem.isSelected()); - } - - private void applyShowTestDescription(final boolean show) { - this.testOverviewTableModel.updateModel(this.showTestDescriptionCheckBoxMenuItem.isSelected()); - final TableColumn idColumn = this.testOverviewTable.getColumnModel().getColumn(3); - idColumn.setHeaderValue(this.testOverviewTableModel.getTestIdColumnName()); - this.testOverviewTable.getTableHeader().repaint(); - } - - private void applyShowWarningIndicator(final boolean show) { - final TableColumn col = this.testOverviewTable.getColumnModel().getColumn(1); - if (show) { - col.setWidth(RunnerPanel.INDICATOR_WIDTH); - col.setMinWidth(RunnerPanel.INDICATOR_WIDTH); - col.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); - col.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); - } else { - col.setWidth(0); - col.setMinWidth(0); - col.setMaxWidth(0); - col.setPreferredWidth(0); + if (!basePanel.isShowing()) { + applyPreferences(); + } + return basePanel; } - } - - private void applyShowInfoIndicator(final boolean show) { - final TableColumn col = this.testOverviewTable.getColumnModel().getColumn(2); - if (show) { - col.setWidth(RunnerPanel.INDICATOR_WIDTH); - col.setMinWidth(RunnerPanel.INDICATOR_WIDTH); - col.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); - col.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); - } else { - col.setWidth(0); - col.setMinWidth(0); - col.setMaxWidth(0); - col.setPreferredWidth(0); + + private void resetDerived() { + testOverviewTable.getRowSorter().setSortKeys(null); + testOverviewRunMenuItem.setEnabled(false); + testOverviewRunWorksheetMenuItem.setEnabled(false); + testIdTextArea.setText(null); + testOwnerTextField.setText(null); + testPackageTextField.setText(null); + testProcedureTextField.setText(null); + testDescriptionTextArea.setText(null); + testStartTextField.setText(null); + failuresTableModel.setModel(null); + failuresTableModel.fireTableDataChanged(); + testFailureMessageTextPane.setText(null); + testErrorStackTextPane.setText(null); + testWarningsTextPane.setText(null); + testServerOutputTextPane.setText(null); } - } - - private void applyFilter(final boolean showSuccessfulTests, final boolean showDisabledTests) { - RowSorter _rowSorter = this.testOverviewTable.getRowSorter(); - final TableRowSorter sorter = ((TableRowSorter) _rowSorter); - final RowFilter filter = new RowFilter() { - @Override - public boolean include(final RowFilter.Entry entry) { - final Test test = entry.getModel().getTest((entry.getIdentifier()).intValue()); - final Counter counter = test.getCounter(); - if ((counter != null)) { - Integer _success = counter.getSuccess(); - boolean _greaterThan = ((_success).intValue() > 0); - if (_greaterThan) { - if ((!showSuccessfulTests)) { - return false; + + private void refreshRunsComboBox() { + if (!runs.isEmpty()) { + runComboBox.removeActionListener(this); + runComboBoxModel.removeAllElements(); + List> entries = new ArrayList<>(runs.entrySet()); + for (int i = runs.size() - 1; i >= 0; i--) { + final Map.Entry entry = entries.get(i); + final ComboBoxItem item = new ComboBoxItem<>(entry.getKey(), entry.getValue().getName()); + runComboBoxModel.addElement(item); } - } - Integer _disabled = counter.getDisabled(); - boolean _greaterThan_1 = ((_disabled).intValue() > 0); - if (_greaterThan_1) { - if ((!showDisabledTests)) { - return false; + runComboBox.setSelectedIndex(0); + runComboBox.addActionListener(this); + } + } + + private void applyShowNumberOfRunsInHistory(final int maxRuns) { + if (maxRuns != runs.getMaxEntries()) { + final LimitedLinkedHashMap newRuns = new LimitedLinkedHashMap<>(maxRuns); + for (final Map.Entry entry : runs.entrySet()) { + newRuns.put(entry.getKey(), entry.getValue()); } - } + runs = newRuns; } - return true; - } - }; - sorter.setRowFilter(filter); - } - - private void openTest(final Test test) { - try { - Connection _connection = Connections.getInstance().getConnection(this.currentRun.getConnectionName()); - final UtplsqlDao dao = new UtplsqlDao(_connection); - final String source = dao.getSource(test.getOwnerName(), "PACKAGE", test.getObjectName().toUpperCase()).trim(); - final UtplsqlParser parser = new UtplsqlParser(source); - final int line = parser.getLineOf(test.getProcedureName()); - this.openEditor(test.getOwnerName(), "PACKAGE", test.getObjectName().toUpperCase(), line, 1); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); } - } - - private void openSelectedTest() { - final int rowIndex = this.testOverviewTable.getSelectedRow(); - if ((rowIndex != (-1))) { - final int row = this.testOverviewTable.convertRowIndexToModel(rowIndex); - final Test test = this.testOverviewTableModel.getTest(row); - this.openTest(test); + + private void applyShowDisabledCounter() { + disabledCounterValueLabel.getParent().setVisible(showDisabledCounterCheckBoxMenuItem.isSelected()); + } + + private void applyShowWarningsCounter() { + warningsCounterValueLabel.getParent().setVisible(showWarningsCounterCheckBoxMenuItem.isSelected()); } - } - - private void openSelectedFailure() { - final int rowIndex = this.failuresTable.getSelectedRow(); - if ((rowIndex != (-1))) { - final int row = this.failuresTable.convertRowIndexToModel(rowIndex); - final Expectation expectation = this.failuresTableModel.getExpectation(row); - final Test test = this.testOverviewTableModel.getTest(this.testOverviewTable.convertRowIndexToModel(this.testOverviewTable.getSelectedRow())); - final Integer callerLine = expectation.getCallerLine(); - if ((callerLine != null)) { - this.openEditor(test.getOwnerName(), "PACKAGE BODY", test.getObjectName().toUpperCase(), (expectation.getCallerLine()).intValue(), 1); - } else { - this.openTest(test); - } + + private void applyShowInfoCounter() { + infoCounterValueLabel.getParent().setVisible(showInfoCounterCheckBoxMenuItem.isSelected()); } - } - - private String getHtml(final String text) { - StringConcatenation _builder = new StringConcatenation(); - _builder.append(""); - _builder.newLine(); - _builder.append("\t"); - _builder.append(""); - _builder.newLine(); - _builder.append("\t\t"); - _builder.append(""); - _builder.newLine(); - _builder.append("\t"); - _builder.append(""); - _builder.newLine(); - _builder.append("\t"); - _builder.append(""); - _builder.newLine(); - _builder.append("\t\t"); - String _linkedAndFormattedText = this.getLinkedAndFormattedText(text); - _builder.append(_linkedAndFormattedText, "\t\t"); - _builder.newLineIfNotEmpty(); - _builder.append("\t"); - _builder.append(""); - _builder.newLine(); - _builder.append(""); - _builder.newLine(); - final String html = _builder.toString(); - return html; - } - - private void openLink(final String link) { - try { - final String[] parts = link.split("/"); - final String type = parts[0]; - final String ownerName = parts[1]; - final String objectName = parts[2]; - int line = Integer.parseInt(parts[3]); - Connection _connection = Connections.getInstance().getConnection(this.currentRun.getConnectionName()); - final UtplsqlDao dao = new UtplsqlDao(_connection); - String _xifexpression = null; - boolean _equals = Objects.equal(type, "UNKNOWN"); - if (_equals) { - _xifexpression = dao.getObjectType(ownerName, objectName); - } else { - _xifexpression = type; - } - final String objectType = _xifexpression; - int _size = ((List)Conversions.doWrapArray(parts)).size(); - boolean _equals_1 = (_size == 5); - if (_equals_1) { - final String procedureName = parts[4]; - final String source = dao.getSource(ownerName, objectType, objectName).trim(); - final UtplsqlParser parser = new UtplsqlParser(source); - line = parser.getLineOf(procedureName); - } - this.openEditor(ownerName, objectType, objectName.toUpperCase(), line, 1); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + private void applyShowTestDescription() { + testOverviewTableModel.updateModel(showTestDescriptionCheckBoxMenuItem.isSelected()); + final TableColumn idColumn = testOverviewTable.getColumnModel().getColumn(3); + idColumn.setHeaderValue(testOverviewTableModel.getTestIdColumnName()); + testOverviewTable.getTableHeader().repaint(); } - } - - private void openEditor(final String owner, final String type, final String name, final int line, final int col) { - DefaultDrillLink drillLink = new DefaultDrillLink(); - drillLink.setConnName(this.currentRun.getConnectionName()); - String _valueOf = String.valueOf(line); - String _valueOf_1 = String.valueOf(col); - drillLink.setArgs(new String[] { owner, type, name, _valueOf, _valueOf_1, "OpenEditor", "oracle.dbtools.raptor.controls.grid.DefaultDrillLink" }); - drillLink.performDrill(); - } - - private void syncDetailTab() { - boolean _isSelected = this.syncDetailTabCheckBoxMenuItem.isSelected(); - if (_isSelected) { - final int rowIndex = this.testOverviewTable.getSelectedRow(); - if ((rowIndex != (-1))) { - final int row = this.testOverviewTable.convertRowIndexToModel(rowIndex); - final Test test = this.testOverviewTableModel.getTest(row); - int tabIndex = 0; - boolean _and = false; - Counter _counter = test.getCounter(); - Integer _failure = null; - if (_counter!=null) { - _failure=_counter.getFailure(); - } - boolean _tripleNotEquals = (_failure != null); - if (!_tripleNotEquals) { - _and = false; + + private void applyShowWarningIndicator(final boolean show) { + final TableColumn col = testOverviewTable.getColumnModel().getColumn(1); + if (show) { + col.setWidth(INDICATOR_WIDTH); + col.setMinWidth(INDICATOR_WIDTH); + col.setMaxWidth(INDICATOR_WIDTH); + col.setPreferredWidth(INDICATOR_WIDTH); } else { - Integer _failure_1 = test.getCounter().getFailure(); - boolean _greaterThan = ((_failure_1).intValue() > 0); - _and = _greaterThan; + col.setWidth(0); + col.setMinWidth(0); + col.setMaxWidth(0); + col.setPreferredWidth(0); } - if (_and) { - tabIndex = 1; + } + + private void applyShowInfoIndicator(final boolean show) { + final TableColumn col = testOverviewTable.getColumnModel().getColumn(2); + if (show) { + col.setWidth(INDICATOR_WIDTH); + col.setMinWidth(INDICATOR_WIDTH); + col.setMaxWidth(INDICATOR_WIDTH); + col.setPreferredWidth(INDICATOR_WIDTH); } else { - boolean _and_1 = false; - Counter _counter_1 = test.getCounter(); - Integer _error = null; - if (_counter_1!=null) { - _error=_counter_1.getError(); - } - boolean _tripleNotEquals_1 = (_error != null); - if (!_tripleNotEquals_1) { - _and_1 = false; - } else { - Integer _error_1 = test.getCounter().getError(); - boolean _greaterThan_1 = ((_error_1).intValue() > 0); - _and_1 = _greaterThan_1; - } - if (_and_1) { - tabIndex = 2; - } else { - boolean _and_2 = false; - Counter _counter_2 = test.getCounter(); - Integer _warning = null; - if (_counter_2!=null) { - _warning=_counter_2.getWarning(); - } - boolean _tripleNotEquals_2 = (_warning != null); - if (!_tripleNotEquals_2) { - _and_2 = false; - } else { - Integer _warning_1 = test.getCounter().getWarning(); - boolean _greaterThan_2 = ((_warning_1).intValue() > 0); - _and_2 = _greaterThan_2; + col.setWidth(0); + col.setMinWidth(0); + col.setMaxWidth(0); + col.setPreferredWidth(0); + } + } + + private void applyFilter(final boolean showSuccessfulTests, final boolean showDisabledTests) { + @SuppressWarnings("unchecked") + final TableRowSorter sorter = ((TableRowSorter) testOverviewTable.getRowSorter()); + final RowFilter filter = new RowFilter() { + @Override + public boolean include(final RowFilter.Entry entry) { + final Test test = entry.getModel().getTest((entry.getIdentifier()).intValue()); + final Counter counter = test.getCounter(); + if (counter != null) { + if (counter.getSuccess() > 0 && !showSuccessfulTests) { + return false; + } + if (counter.getDisabled() > 0 && !showDisabledTests) { + return false; + } + } + return true; } - if (_and_2) { - tabIndex = 3; + }; + sorter.setRowFilter(filter); + } + + private Connection getConnection(String name) { + try { + return Connections.getInstance().getConnection(name); + } catch (DBException e) { + final String msg = "Error getting connection with for '" + name + "' due to " + e.getMessage(); + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); + } + } + + private void openTest(final Test test) { + final UtplsqlDao dao = new UtplsqlDao(getConnection(currentRun.getConnectionName())); + final String source = dao.getSource(test.getOwnerName(), "PACKAGE", test.getObjectName().toUpperCase()).trim(); + final UtplsqlParser parser = new UtplsqlParser(source); + final int line = parser.getLineOf(test.getProcedureName()); + openEditor(test.getOwnerName(), "PACKAGE", test.getObjectName().toUpperCase(), line, 1); + } + + private void openSelectedTest() { + final int rowIndex = testOverviewTable.getSelectedRow(); + if (rowIndex != -1) { + final int row = testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = testOverviewTableModel.getTest(row); + openTest(test); + } + } + + private void openSelectedFailure() { + final int rowIndex = failuresTable.getSelectedRow(); + if (rowIndex != -1) { + final int row = failuresTable.convertRowIndexToModel(rowIndex); + final Expectation expectation = failuresTableModel.getExpectation(row); + final Test test = testOverviewTableModel + .getTest(testOverviewTable.convertRowIndexToModel(testOverviewTable.getSelectedRow())); + final Integer callerLine = expectation.getCallerLine(); + if (callerLine != null) { + openEditor(test.getOwnerName(), "PACKAGE BODY", test.getObjectName().toUpperCase(), + expectation.getCallerLine(), 1); } else { - if (((test.getServerOutput() != null) && (test.getServerOutput().length() > 0))) { - tabIndex = 4; - } else { - tabIndex = 0; - } + openTest(test); } - } } - this.testDetailTabbedPane.setSelectedIndex(tabIndex); - } } - } - - private PreferenceModel getPreferenceModel() { - PreferenceModel preferences = null; - try { - preferences = PreferenceModel.getInstance(Preferences.getPreferences()); - } catch (final Throwable _t) { - if (_t instanceof NoClassDefFoundError) { - preferences = PreferenceModel.getInstance(null); - } else { - throw Exceptions.sneakyThrow(_t); - } + + private String getHtml(final String text) { + StringBuilder sb = new StringBuilder(); + sb.append("\n"); + sb.append("\t\n"); + sb.append("\t\t\n"); + sb.append("\t\n"); + sb.append("\t\n"); + sb.append("\t\t"); + sb.append(getLinkedAndFormattedText(text)); + sb.append('\n'); + sb.append("\t\n"); + sb.append("\n"); + return sb.toString(); } - return preferences; - } - - private boolean applyPreferences() { - boolean _xblockexpression = false; - { - final PreferenceModel preferences = this.getPreferenceModel(); - this.applyShowNumberOfRunsInHistory(preferences.getNumberOfRunsInHistory()); - this.showDisabledCounterCheckBoxMenuItem.setSelected(preferences.isShowDisabledCounter()); - this.applyShowDisabledCounter(this.showDisabledCounterCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showDisabledCounterCheckBoxMenuItem); - this.showWarningsCounterCheckBoxMenuItem.setSelected(preferences.isShowWarningsCounter()); - this.applyShowWarningsCounter(this.showWarningsCounterCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showWarningsCounterCheckBoxMenuItem); - this.showInfoCounterCheckBoxMenuItem.setSelected(preferences.isShowInfoCounter()); - this.applyShowInfoCounter(this.showInfoCounterCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showInfoCounterCheckBoxMenuItem); - this.showTestDescriptionCheckBoxMenuItem.setSelected(preferences.isShowTestDescription()); - this.applyShowTestDescription(this.showTestDescriptionCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showTestDescriptionCheckBoxMenuItem); - this.showWarningIndicatorCheckBoxMenuItem.setSelected(preferences.isShowWarningIndicator()); - this.applyShowWarningIndicator(this.showWarningIndicatorCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showWarningIndicatorCheckBoxMenuItem); - this.showInfoIndicatorCheckBoxMenuItem.setSelected(preferences.isShowInfoIndicator()); - this.applyShowInfoIndicator(this.showInfoIndicatorCheckBoxMenuItem.isSelected()); - this.showSuccessfulTestsCheckBoxMenuItem.setSelected(preferences.isShowSuccessfulTests()); - this.fixCheckBoxMenuItem(this.showSuccessfulTestsCheckBoxMenuItem); - this.showDisabledTestsCheckBoxMenuItem.setSelected(preferences.isShowDisabledTests()); - this.fixCheckBoxMenuItem(this.showDisabledTestsCheckBoxMenuItem); - this.applyFilter(this.showSuccessfulTestsCheckBoxMenuItem.isSelected(), this.showDisabledTestsCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showInfoIndicatorCheckBoxMenuItem); - this.syncDetailTabCheckBoxMenuItem.setSelected(preferences.isSyncDetailTab()); - this.fixCheckBoxMenuItem(this.syncDetailTabCheckBoxMenuItem); - _xblockexpression = RunnerPanel.useSmartTimes = preferences.isUseSmartTimes(); + + private void openLink(final String link) { + final String[] parts = link.split("/"); + final String type = parts[0]; + final String ownerName = parts[1]; + final String objectName = parts[2]; + int line = Integer.parseInt(parts[3]); + final UtplsqlDao dao = new UtplsqlDao(getConnection(currentRun.getConnectionName())); + final String objectType = "UNKNOWN".equals(type) ? dao.getObjectType(ownerName, objectName) : type; + if (parts.length == 5) { + final String procedureName = parts[4]; + final String source = dao.getSource(ownerName, objectType, objectName).trim(); + final UtplsqlParser parser = new UtplsqlParser(source); + line = parser.getLineOf(procedureName); + } + openEditor(ownerName, objectType, objectName.toUpperCase(), line, 1); } - return _xblockexpression; - } - - public void setModel(final Run run) { - this.runs.put(run.getReporterId(), run); - this.refreshRunsComboBox(); - this.setCurrentRun(run); - } - - private void setCurrentRun(final Run run) { - if ((run != this.currentRun)) { - this.currentRun = run; - this.testOverviewTableModel.setModel(run.getTests(), this.showTestDescriptionCheckBoxMenuItem.isSelected(), RunnerPanel.useSmartTimes); - final String header = this.testOverviewTableModel.getTimeColumnName(); - final TableColumn timeColumn = this.testOverviewTable.getColumnModel().getColumn(4); - Object _headerValue = timeColumn.getHeaderValue(); - boolean _notEquals = (!Objects.equal(_headerValue, header)); - if (_notEquals) { - timeColumn.setHeaderValue(header); - this.testOverviewTable.getTableHeader().repaint(); - } - this.resetDerived(); - String _reporterId = this.currentRun.getReporterId(); - String _name = this.currentRun.getName(); - final ComboBoxItem item = new ComboBoxItem(_reporterId, _name); - this.runComboBox.setSelectedItem(item); - this.elapsedTimeTimer.start(); + + private void openEditor(final String owner, final String type, final String name, final int line, final int col) { + DefaultDrillLink drillLink = new DefaultDrillLink(); + drillLink.setConnName(currentRun.getConnectionName()); + // argument order is based on SQLDEV:LINK that can be used in SQL query result tables (editors, reports) + drillLink.setArgs(new String[] { owner, type, name, String.valueOf(line), String.valueOf(col), "OpenEditor", + "oracle.dbtools.raptor.controls.grid.DefaultDrillLink" }); + drillLink.performDrill(); } - } - - public synchronized void update(final String reporterId) { - try { - this.setCurrentRun(this.runs.get(reporterId)); - Integer _currentTestNumber = this.currentRun.getCurrentTestNumber(); - final int row = ((_currentTestNumber).intValue() - 1); - final CharSequence header = this.testOverviewTableModel.getTestIdColumnName(); - final TableColumn idColumn = this.testOverviewTable.getColumnModel().getColumn(3); - Object _headerValue = idColumn.getHeaderValue(); - boolean _notEquals = (!Objects.equal(_headerValue, header)); - if (_notEquals) { - idColumn.setHeaderValue(header); - this.testOverviewTable.getTableHeader().repaint(); - } - if ((row < 0)) { - this.testOverviewTableModel.fireTableDataChanged(); - } else { - int _rowCount = this.testOverviewTableModel.getRowCount(); - boolean _greaterThan = (_rowCount > row); - if (_greaterThan) { - final Rectangle positionOfCurrentTest = this.testOverviewTable.getCellRect(this.testOverviewTable.convertRowIndexToView(row), 0, true); - this.testOverviewTable.scrollRectToVisible(positionOfCurrentTest); - this.testOverviewTableModel.fireTableRowsUpdated(row, row); - Thread.sleep(5); - if (((!this.showSuccessfulTestsCheckBoxMenuItem.isSelected()) || (!this.showDisabledTestsCheckBoxMenuItem.isSelected()))) { - this.applyFilter(this.showSuccessfulTestsCheckBoxMenuItem.isSelected(), this.showDisabledTestsCheckBoxMenuItem.isSelected()); - } - this.testOverviewTable.scrollRectToVisible(positionOfCurrentTest); - } - } - this.statusLabel.setText(this.currentRun.getStatus()); - StringConcatenation _builder = new StringConcatenation(); - int _totalNumberOfCompletedTests = this.currentRun.getTotalNumberOfCompletedTests(); - _builder.append(_totalNumberOfCompletedTests); - { - Integer _totalNumberOfTests = this.currentRun.getTotalNumberOfTests(); - boolean _greaterEqualsThan = ((_totalNumberOfTests).intValue() >= 0); - if (_greaterEqualsThan) { - _builder.append("/"); - Integer _totalNumberOfTests_1 = this.currentRun.getTotalNumberOfTests(); - _builder.append(_totalNumberOfTests_1); + + private void syncDetailTab() { + if (syncDetailTabCheckBoxMenuItem.isSelected()) { + final int rowIndex = testOverviewTable.getSelectedRow(); + if (rowIndex != -1) { + final int row = testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = testOverviewTableModel.getTest(row); + int tabIndex = 0; + if (test != null && test.getCounter() != null) { + if (test.getCounter().getFailure() != null && test.getCounter().getFailure() > 0) { + tabIndex = 1; + } else if (test.getCounter().getError() != null && test.getCounter().getError() > 0) { + tabIndex = 2; + } else if (test.getCounter().getWarning() != null && test.getCounter().getWarning() > 0) { + tabIndex = 3; + } else if (test.getServerOutput() != null && test.getServerOutput().length() > 0) { + tabIndex = 4; + } + } + testDetailTabbedPane.setSelectedIndex(tabIndex); + } } - } - this.testCounterValueLabel.setText(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - Integer _error = this.currentRun.getCounter().getError(); - _builder_1.append(_error); - this.errorCounterValueLabel.setText(_builder_1.toString()); - StringConcatenation _builder_2 = new StringConcatenation(); - Integer _failure = this.currentRun.getCounter().getFailure(); - _builder_2.append(_failure); - this.failureCounterValueLabel.setText(_builder_2.toString()); - StringConcatenation _builder_3 = new StringConcatenation(); - Integer _disabled = this.currentRun.getCounter().getDisabled(); - _builder_3.append(_disabled); - this.disabledCounterValueLabel.setText(_builder_3.toString()); - StringConcatenation _builder_4 = new StringConcatenation(); - Integer _warning = this.currentRun.getCounter().getWarning(); - _builder_4.append(_warning); - this.warningsCounterValueLabel.setText(_builder_4.toString()); - StringConcatenation _builder_5 = new StringConcatenation(); - Integer _infoCount = this.currentRun.getInfoCount(); - _builder_5.append(_infoCount); - this.infoCounterValueLabel.setText(_builder_5.toString()); - Integer _totalNumberOfTests_2 = this.currentRun.getTotalNumberOfTests(); - boolean _equals = ((_totalNumberOfTests_2).intValue() == 0); - if (_equals) { - this.progressBar.setValue(100); - } else { - int _totalNumberOfCompletedTests_1 = this.currentRun.getTotalNumberOfCompletedTests(); - int _multiply = (100 * _totalNumberOfCompletedTests_1); - Integer _totalNumberOfTests_3 = this.currentRun.getTotalNumberOfTests(); - int _divide = (_multiply / (_totalNumberOfTests_3).intValue()); - this.progressBar.setValue(Math.round(_divide)); - } - if ((((this.currentRun.getCounter().getError()).intValue() > 0) || ((this.currentRun.getCounter().getFailure()).intValue() > 0))) { - this.progressBar.setForeground(RunnerPanel.RED); - } else { - this.progressBar.setForeground(RunnerPanel.GREEN); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); } - } - - private ArrayList getPathListFromSelectedTests() { - final ArrayList pathList = new ArrayList(); - int[] _selectedRows = this.testOverviewTable.getSelectedRows(); - for (final int rowIndex : _selectedRows) { - { - final int row = this.testOverviewTable.convertRowIndexToModel(rowIndex); - final Test test = this.testOverviewTableModel.getTest(row); - StringConcatenation _builder = new StringConcatenation(); - String _ownerName = test.getOwnerName(); - _builder.append(_ownerName); - _builder.append("."); - String _objectName = test.getObjectName(); - _builder.append(_objectName); - _builder.append("."); - String _procedureName = test.getProcedureName(); - _builder.append(_procedureName); - final String path = _builder.toString(); - pathList.add(path); - } - } - return pathList; - } - - private boolean isWindowsLookAndFeel() { - LookAndFeel _lookAndFeel = UIManager.getLookAndFeel(); - String _name = null; - if (_lookAndFeel!=null) { - _name=_lookAndFeel.getName(); + + private PreferenceModel getPreferenceModel() { + PreferenceModel preferences = null; + try { + preferences = PreferenceModel.getInstance(Preferences.getPreferences()); + } catch (NoClassDefFoundError e) { + // running outside of SQL Developer + preferences = PreferenceModel.getInstance(null); + } + return preferences; } - final String laf = _name; - boolean _equals = Objects.equal(laf, "Windows"); - if (_equals) { - return true; - } else { - return false; + + private void applyPreferences() { + final PreferenceModel preferences = getPreferenceModel(); + applyShowNumberOfRunsInHistory(preferences.getNumberOfRunsInHistory()); + showDisabledCounterCheckBoxMenuItem.setSelected(preferences.isShowDisabledCounter()); + applyShowDisabledCounter(); + fixCheckBoxMenuItem(showDisabledCounterCheckBoxMenuItem); + showWarningsCounterCheckBoxMenuItem.setSelected(preferences.isShowWarningsCounter()); + applyShowWarningsCounter(); + fixCheckBoxMenuItem(showWarningsCounterCheckBoxMenuItem); + showInfoCounterCheckBoxMenuItem.setSelected(preferences.isShowInfoCounter()); + applyShowInfoCounter(); + fixCheckBoxMenuItem(showInfoCounterCheckBoxMenuItem); + showTestDescriptionCheckBoxMenuItem.setSelected(preferences.isShowTestDescription()); + applyShowTestDescription(); + fixCheckBoxMenuItem(showTestDescriptionCheckBoxMenuItem); + showWarningIndicatorCheckBoxMenuItem.setSelected(preferences.isShowWarningIndicator()); + applyShowWarningIndicator(showWarningIndicatorCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showWarningIndicatorCheckBoxMenuItem); + showInfoIndicatorCheckBoxMenuItem.setSelected(preferences.isShowInfoIndicator()); + applyShowInfoIndicator(showInfoIndicatorCheckBoxMenuItem.isSelected()); + showSuccessfulTestsCheckBoxMenuItem.setSelected(preferences.isShowSuccessfulTests()); + fixCheckBoxMenuItem(showSuccessfulTestsCheckBoxMenuItem); + showDisabledTestsCheckBoxMenuItem.setSelected(preferences.isShowDisabledTests()); + fixCheckBoxMenuItem(showDisabledTestsCheckBoxMenuItem); + applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), showDisabledTestsCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showInfoIndicatorCheckBoxMenuItem); + syncDetailTabCheckBoxMenuItem.setSelected(preferences.isSyncDetailTab()); + fixCheckBoxMenuItem(syncDetailTabCheckBoxMenuItem); + useSmartTimes = preferences.isUseSmartTimes(); } - } - - private boolean isMacLookAndFeel() { - LookAndFeel _lookAndFeel = UIManager.getLookAndFeel(); - String _name = null; - if (_lookAndFeel!=null) { - _name=_lookAndFeel.getName(); + + public void setModel(final Run run) { + runs.put(run.getReporterId(), run); + refreshRunsComboBox(); + setCurrentRun(run); } - final String laf = _name; - boolean _equals = Objects.equal(laf, "Mac OS X"); - if (_equals) { - return true; - } else { - return false; + + private void setCurrentRun(final Run run) { + if (run != currentRun) { + currentRun = run; + testOverviewTableModel.setModel(run.getTests(), showTestDescriptionCheckBoxMenuItem.isSelected(), + useSmartTimes); + final String header = testOverviewTableModel.getTimeColumnName(); + final TableColumn timeColumn = testOverviewTable.getColumnModel().getColumn(4); + if (!timeColumn.getHeaderValue().equals(header)) { + timeColumn.setHeaderValue(header); + testOverviewTable.getTableHeader().repaint(); + } + resetDerived(); + final ComboBoxItem item = new ComboBoxItem<>(currentRun.getReporterId(), + currentRun.getName()); + runComboBox.setSelectedItem(item); + elapsedTimeTimer.start(); + } } - } - - private void fixCheckBoxMenuItem(final JCheckBoxMenuItem item) { - boolean _isWindowsLookAndFeel = this.isWindowsLookAndFeel(); - if (_isWindowsLookAndFeel) { - boolean _isSelected = item.isSelected(); - if (_isSelected) { - item.setIcon(UtplsqlResources.getIcon("CHECKMARK_ICON")); - } else { - item.setIcon(null); - } + + private void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } } - } - - @Override - public void actionPerformed(final ActionEvent e) { - Object _source = e.getSource(); - boolean _equals = Objects.equal(_source, this.refreshButton); - if (_equals) { - this.resetDerived(); - this.testDetailTabbedPane.setSelectedIndex(0); - this.testOverviewTableModel.fireTableDataChanged(); - } else { - Object _source_1 = e.getSource(); - boolean _equals_1 = Objects.equal(_source_1, this.rerunButton); - if (_equals_1) { - List _pathList = this.currentRun.getPathList(); - String _connectionName = this.currentRun.getConnectionName(); - final UtplsqlRunner runner = new UtplsqlRunner(_pathList, _connectionName); - runner.runTestAsync(); - } else { - Object _source_2 = e.getSource(); - boolean _equals_2 = Objects.equal(_source_2, this.rerunWorksheetButton); - if (_equals_2) { - List _pathList_1 = this.currentRun.getPathList(); - String _connectionName_1 = this.currentRun.getConnectionName(); - final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(_pathList_1, _connectionName_1); - worksheet.runTestAsync(); + + public synchronized void update(final String reporterId) { + setCurrentRun(runs.get(reporterId)); + final int row = currentRun.getCurrentTestNumber() - 1; + final CharSequence header = testOverviewTableModel.getTestIdColumnName(); + final TableColumn idColumn = testOverviewTable.getColumnModel().getColumn(3); + if (!idColumn.getHeaderValue().equals(header)) { + idColumn.setHeaderValue(header); + testOverviewTable.getTableHeader().repaint(); + } + if (row < 0) { + testOverviewTableModel.fireTableDataChanged(); } else { - Object _source_3 = e.getSource(); - boolean _equals_3 = Objects.equal(_source_3, this.runComboBox); - if (_equals_3) { - if ((this.currentRun != null)) { - Object _selectedItem = this.runComboBox.getSelectedItem(); - final ComboBoxItem comboBoxItem = ((ComboBoxItem) _selectedItem); - String _reporterId = this.currentRun.getReporterId(); - String _key = comboBoxItem.getKey(); - boolean _notEquals = (!Objects.equal(_reporterId, _key)); - if (_notEquals) { - this.update(comboBoxItem.getKey()); - this.testDetailTabbedPane.setSelectedIndex(0); - } + if (testOverviewTableModel.getRowCount() > row) { + final Rectangle positionOfCurrentTest = testOverviewTable + .getCellRect(testOverviewTable.convertRowIndexToView(row), 0, true); + testOverviewTable.scrollRectToVisible(positionOfCurrentTest); + testOverviewTableModel.fireTableRowsUpdated(row, row); + sleep(5); + if (!showSuccessfulTestsCheckBoxMenuItem.isSelected() + || !showDisabledTestsCheckBoxMenuItem.isSelected()) { + applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), + showDisabledTestsCheckBoxMenuItem.isSelected()); + } + testOverviewTable.scrollRectToVisible(positionOfCurrentTest); } - } else { - Object _source_4 = e.getSource(); - boolean _equals_4 = Objects.equal(_source_4, this.clearButton); - if (_equals_4) { - final Run run = this.currentRun; - this.runs.clear(); - this.currentRun = null; - this.setModel(run); - this.update(run.getReporterId()); + } + statusLabel.setText(currentRun.getStatus()); + testCounterValueLabel.setText(currentRun.getTotalNumberOfCompletedTests() + + (currentRun.getTotalNumberOfTests() >= 0 ? "/" + currentRun.getTotalNumberOfTests() : "")); + errorCounterValueLabel.setText(String.valueOf(currentRun.getCounter().getError())); + failureCounterValueLabel.setText(String.valueOf(currentRun.getCounter().getFailure())); + disabledCounterValueLabel.setText(String.valueOf(currentRun.getCounter().getDisabled())); + warningsCounterValueLabel.setText(String.valueOf(currentRun.getCounter().getWarning())); + infoCounterValueLabel.setText(String.valueOf(currentRun.getInfoCount())); + if (currentRun.getTotalNumberOfTests() == 0) { + progressBar.setValue(100); + } else { + progressBar + .setValue(100 * currentRun.getTotalNumberOfCompletedTests() / currentRun.getTotalNumberOfTests()); + } + if (currentRun.getCounter().getError() > 0 || (currentRun.getCounter().getFailure() > 0)) { + progressBar.setForeground(RED); + } else { + progressBar.setForeground(GREEN); + } + } + + private ArrayList getPathListFromSelectedTests() { + final ArrayList pathList = new ArrayList<>(); + for (final int rowIndex : testOverviewTable.getSelectedRows()) { + final int row = testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = testOverviewTableModel.getTest(row); + final String path = test.getOwnerName() + "." + test.getObjectName() + "." + test.getProcedureName(); + pathList.add(path); + } + return pathList; + } + + private boolean isWindowsLookAndFeel() { + LookAndFeel laf = UIManager.getLookAndFeel(); + final String lafName = laf != null ? laf.getName() : null; + return "Windows".equals(lafName); + } + + private boolean isMacLookAndFeel() { + LookAndFeel laf = UIManager.getLookAndFeel(); + final String lafName = laf != null ? laf.getName() : null; + return "Mac OS X".equals(lafName); + } + + private void fixCheckBoxMenuItem(final JCheckBoxMenuItem item) { + if (isWindowsLookAndFeel()) { + if (item.isSelected()) { + item.setIcon(UtplsqlResources.getIcon("CHECKMARK_ICON")); } else { - Object _source_5 = e.getSource(); - boolean _equals_5 = Objects.equal(_source_5, this.testOverviewRunMenuItem); - if (_equals_5) { - ArrayList _pathListFromSelectedTests = this.getPathListFromSelectedTests(); - String _connectionName_2 = this.currentRun.getConnectionName(); - final UtplsqlRunner runner_1 = new UtplsqlRunner(_pathListFromSelectedTests, _connectionName_2); - runner_1.runTestAsync(); - } else { - Object _source_6 = e.getSource(); - boolean _equals_6 = Objects.equal(_source_6, this.testOverviewRunWorksheetMenuItem); - if (_equals_6) { - ArrayList _pathListFromSelectedTests_1 = this.getPathListFromSelectedTests(); - String _connectionName_3 = this.currentRun.getConnectionName(); - final UtplsqlWorksheetRunner worksheet_1 = new UtplsqlWorksheetRunner(_pathListFromSelectedTests_1, _connectionName_3); - worksheet_1.runTestAsync(); - } else { - Object _source_7 = e.getSource(); - boolean _equals_7 = Objects.equal(_source_7, this.showDisabledCounterCheckBoxMenuItem); - if (_equals_7) { - this.applyShowDisabledCounter(this.showDisabledCounterCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showDisabledCounterCheckBoxMenuItem); - } else { - Object _source_8 = e.getSource(); - boolean _equals_8 = Objects.equal(_source_8, this.showWarningsCounterCheckBoxMenuItem); - if (_equals_8) { - this.applyShowWarningsCounter(this.showWarningsCounterCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showWarningsCounterCheckBoxMenuItem); - } else { - Object _source_9 = e.getSource(); - boolean _equals_9 = Objects.equal(_source_9, this.showInfoCounterCheckBoxMenuItem); - if (_equals_9) { - this.applyShowInfoCounter(this.showInfoCounterCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showInfoCounterCheckBoxMenuItem); - } else { - Object _source_10 = e.getSource(); - boolean _equals_10 = Objects.equal(_source_10, this.showSuccessfulTestsCheckBoxMenuItem); - if (_equals_10) { - this.applyFilter(this.showSuccessfulTestsCheckBoxMenuItem.isSelected(), this.showDisabledTestsCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showSuccessfulTestsCheckBoxMenuItem); - } else { - Object _source_11 = e.getSource(); - boolean _equals_11 = Objects.equal(_source_11, this.showDisabledTestsCheckBoxMenuItem); - if (_equals_11) { - this.applyFilter(this.showSuccessfulTestsCheckBoxMenuItem.isSelected(), this.showDisabledTestsCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showDisabledTestsCheckBoxMenuItem); - } else { - Object _source_12 = e.getSource(); - boolean _equals_12 = Objects.equal(_source_12, this.showTestDescriptionCheckBoxMenuItem); - if (_equals_12) { - this.applyShowTestDescription(this.showTestDescriptionCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showTestDescriptionCheckBoxMenuItem); - } else { - Object _source_13 = e.getSource(); - boolean _equals_13 = Objects.equal(_source_13, this.showWarningIndicatorCheckBoxMenuItem); - if (_equals_13) { - this.applyShowWarningIndicator(this.showWarningIndicatorCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showWarningIndicatorCheckBoxMenuItem); - } else { - Object _source_14 = e.getSource(); - boolean _equals_14 = Objects.equal(_source_14, this.showInfoIndicatorCheckBoxMenuItem); - if (_equals_14) { - this.applyShowInfoIndicator(this.showInfoIndicatorCheckBoxMenuItem.isSelected()); - this.fixCheckBoxMenuItem(this.showInfoIndicatorCheckBoxMenuItem); - } else { - Object _source_15 = e.getSource(); - boolean _equals_15 = Objects.equal(_source_15, this.syncDetailTabCheckBoxMenuItem); - if (_equals_15) { - this.syncDetailTab(); - this.fixCheckBoxMenuItem(this.syncDetailTabCheckBoxMenuItem); - } - } - } - } - } - } - } - } - } - } - } + item.setIcon(null); } - } } - } } - } - - @Override - public void mouseClicked(final MouseEvent e) { - int _clickCount = e.getClickCount(); - boolean _equals = (_clickCount == 2); - if (_equals) { - Object _source = e.getSource(); - boolean _equals_1 = Objects.equal(_source, this.testOverviewTable); - if (_equals_1) { - int _selectedRowCount = this.failuresTable.getSelectedRowCount(); - boolean _equals_2 = (_selectedRowCount == 1); - if (_equals_2) { - this.openSelectedFailure(); - } else { - this.openSelectedTest(); + + @Override + public void actionPerformed(final ActionEvent e) { + if (e.getSource() == refreshButton) { + resetDerived(); + testDetailTabbedPane.setSelectedIndex(0); + testOverviewTableModel.fireTableDataChanged(); + } else if (e.getSource() == rerunButton) { + final UtplsqlRunner runner = new UtplsqlRunner(currentRun.getPathList(), currentRun.getConnectionName()); + runner.runTestAsync(); + } else if (e.getSource() == rerunWorksheetButton) { + final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(currentRun.getPathList(), + currentRun.getConnectionName()); + worksheet.runTestAsync(); + } else if (e.getSource() == runComboBox) { + if (currentRun != null) { + @SuppressWarnings("unchecked") + final ComboBoxItem comboBoxItem = (ComboBoxItem) runComboBox + .getSelectedItem(); + if (currentRun.getReporterId() != null && !currentRun.getReporterId().equals(comboBoxItem.getKey())) { + update(comboBoxItem.getKey()); + testDetailTabbedPane.setSelectedIndex(0); + } + } + } else if (e.getSource() == clearButton) { + final Run run = currentRun; + runs.clear(); + currentRun = null; + setModel(run); + update(run.getReporterId()); + } else if (e.getSource() == testOverviewRunMenuItem) { + final UtplsqlRunner runner = new UtplsqlRunner(getPathListFromSelectedTests(), + currentRun.getConnectionName()); + runner.runTestAsync(); + } else if (e.getSource() == testOverviewRunWorksheetMenuItem) { + final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(this.getPathListFromSelectedTests(), + currentRun.getConnectionName()); + worksheet.runTestAsync(); + } else if (e.getSource() == showDisabledCounterCheckBoxMenuItem) { + applyShowDisabledCounter(); + fixCheckBoxMenuItem(showDisabledCounterCheckBoxMenuItem); + } else if (e.getSource() == showWarningsCounterCheckBoxMenuItem) { + applyShowWarningsCounter(); + fixCheckBoxMenuItem(showWarningsCounterCheckBoxMenuItem); + } else if (e.getSource() == showInfoCounterCheckBoxMenuItem) { + applyShowInfoCounter(); + fixCheckBoxMenuItem(showInfoCounterCheckBoxMenuItem); + } else if (e.getSource() == showSuccessfulTestsCheckBoxMenuItem) { + applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), + showDisabledTestsCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showSuccessfulTestsCheckBoxMenuItem); + } else if (e.getSource() == showDisabledTestsCheckBoxMenuItem) { + applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), + showDisabledTestsCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showDisabledTestsCheckBoxMenuItem); + } else if (e.getSource() == showTestDescriptionCheckBoxMenuItem) { + applyShowTestDescription(); + fixCheckBoxMenuItem(showTestDescriptionCheckBoxMenuItem); + } else if (e.getSource() == showWarningIndicatorCheckBoxMenuItem) { + applyShowWarningIndicator(showWarningIndicatorCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showWarningIndicatorCheckBoxMenuItem); + } else if (e.getSource() == showInfoIndicatorCheckBoxMenuItem) { + applyShowInfoIndicator(showInfoIndicatorCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showInfoIndicatorCheckBoxMenuItem); + } else if (e.getSource() == syncDetailTabCheckBoxMenuItem) { + syncDetailTab(); + fixCheckBoxMenuItem(syncDetailTabCheckBoxMenuItem); } - } else { - Object _source_1 = e.getSource(); - boolean _equals_3 = Objects.equal(_source_1, this.failuresTable); - if (_equals_3) { - int _selectedRowCount_1 = this.failuresTable.getSelectedRowCount(); - boolean _equals_4 = (_selectedRowCount_1 == 1); - if (_equals_4) { - this.openSelectedFailure(); - } + } + + @Override + public void mouseClicked(final MouseEvent e) { + if (e.getClickCount() == 2) { + if (e.getSource() == testOverviewTable) { + if (failuresTable.getSelectedRowCount() == 1) { + openSelectedFailure(); + } else { + openSelectedTest(); + } + } else { + if (e.getSource() == failuresTable && failuresTable.getSelectedRowCount() == 1) { + openSelectedFailure(); + } + } } - } } - } - - @Override - public void mouseEntered(final MouseEvent e) { - } - - @Override - public void mouseExited(final MouseEvent e) { - } - - @Override - public void mousePressed(final MouseEvent e) { - } - - @Override - public void mouseReleased(final MouseEvent e) { - } - - @Override - public void hyperlinkUpdate(final HyperlinkEvent e) { - HyperlinkEvent.EventType _eventType = e.getEventType(); - boolean _equals = Objects.equal(_eventType, HyperlinkEvent.EventType.ACTIVATED); - if (_equals) { - final String link = e.getDescription(); - this.openLink(link); + + @Override + public void mouseEntered(final MouseEvent e) { + // ignore + } + + @Override + public void mouseExited(final MouseEvent e) { + // ignore } - } - - private static String formatDateTime(final String dateTime) { - if ((dateTime == null)) { - return null; - } else { - int _length = dateTime.length(); - boolean _equals = (_length == 26); - if (_equals) { - return dateTime.replace("T", " ").substring(0, 23); - } else { - return dateTime; - } + + @Override + public void mousePressed(final MouseEvent e) { + // ignore } - } - - private String getLinkedAndFormattedText(final String text) { - if ((text == null)) { - return ""; + + @Override + public void mouseReleased(final MouseEvent e) { + // ignore } - StringConcatenation _builder = new StringConcatenation(); - _builder.append("\\s+(package\\s+)?("(\\S+?)\\.(\\S+?)(?:\\.(\\S+?))?",\\s+line\\s+([0-9]+))"); - final Pattern p1 = Pattern.compile(_builder.toString()); - String localText = HtmlUtils.htmlEscape(text); - Matcher m = p1.matcher(localText); - while (m.find()) { - { - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append(""); - String _group_4 = m.group(2); - _builder_1.append(_group_4); - _builder_1.append(""); - final String link = _builder_1.toString(); - final int start = m.start(2); - final int end = m.end(2); - StringConcatenation _builder_2 = new StringConcatenation(); - String _substring = localText.substring(0, start); - _builder_2.append(_substring); - _builder_2.append(link); - String _substring_1 = localText.substring(end); - _builder_2.append(_substring_1); - localText = _builder_2.toString(); - m = p1.matcher(localText); - } } - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("^\\s{2}((\\S+?)\\.(\\S+?)\\.(\\S+?))$"); - final Pattern p2 = Pattern.compile(_builder_1.toString(), Pattern.MULTILINE); - m = p2.matcher(localText); - while (m.find()) { - { - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append("  "); - String _group = m.group(1); - _builder_2.append(_group); - _builder_2.append(""); - final String link = _builder_2.toString(); - final int start = m.start(0); - final int end = m.end(0); - StringConcatenation _builder_3 = new StringConcatenation(); - String _substring = localText.substring(0, start); - _builder_3.append(_substring); - _builder_3.append(link); - String _substring_1 = localText.substring(end); - _builder_3.append(_substring_1); - localText = _builder_3.toString(); + + private String getLinkedAndFormattedText(final String text) { + if ((text == null)) { + return ""; + } + // Patterns (primarily Asserts, Errors, ServerOutput): + // at "OWNER.PACKAGE.PROCEDURE", line 42 + // at "OWNER.PROCEDURE", line 42 + // at "OWNER.PACKAGE", line 42 + // at package "OWNER.PACKAGE", line 42 + final Pattern p1 = Pattern.compile("\\s+(package\\s+)?("(\\S+?)\\.(\\S+?)(?:\\.(\\S+?))?",\\s+line\\s+([0-9]+))"); + String localText = HtmlUtils.htmlEscape(text); + Matcher m = p1.matcher(localText); + while (m.find()) { + final String link = "" + m.group(2) + ""; + final int start = m.start(2); + final int end = m.end(2); + localText = localText.substring(0, start) + link + localText.substring(end); + m = p1.matcher(localText); + } + // Patterns (primarily Warnings, without line reference, calculate when opening link): + // owner.package.procedure + final Pattern p2 = Pattern.compile("^\\s{2}((\\S+?)\\.(\\S+?)\\.(\\S+?))$", Pattern.MULTILINE); m = p2.matcher(localText); - } - } - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append("^For suite ([^:]+):$"); - final Pattern p3 = Pattern.compile(_builder_2.toString(), Pattern.MULTILINE); - m = p3.matcher(localText); - while (m.find()) { - { - StringConcatenation _builder_3 = new StringConcatenation(); - _builder_3.append("For suite \""); - String _group = m.group(1); - _builder_3.append(_group); - _builder_3.append("\""); - final String title = _builder_3.toString(); - final int start = m.start(0); - final int end = m.end(0); - StringConcatenation _builder_4 = new StringConcatenation(); - String _substring = localText.substring(0, start); - _builder_4.append(_substring); - _builder_4.append(title); - String _substring_1 = localText.substring(end); - _builder_4.append(_substring_1); - localText = _builder_4.toString(); + while (m.find()) { + final String link = "  " + m.group(1) + ""; + final int start = m.start(0); + final int end = m.end(0); + localText = localText.substring(0, start) + link + localText.substring(end); + m = p2.matcher(localText); + } + // Patterns (Title for warning/info on suite level) + // from suite a.junit_utplsql_test1_pkg: + final Pattern p3 = Pattern.compile("^For suite ([^:]+):$", Pattern.MULTILINE); m = p3.matcher(localText); - } + while (m.find()) { + final String title = "For suite \"" + m.group(1) + "\""; + final int start = m.start(0); + final int end = m.end(0); + localText = localText.substring(0, start) + title + localText.substring(end); + m = p3.matcher(localText); + } + StringBuilder sb = new StringBuilder(); + for (final String p : localText.split("\n")) { + sb.append("

"); + sb.append(p); + sb.append("

\n"); + } + return sb.toString(); } - StringConcatenation _builder_3 = new StringConcatenation(); - { - String[] _split = localText.split("\n"); - for(final String p : _split) { - _builder_3.append("

"); - _builder_3.append(p); - _builder_3.append("

"); - _builder_3.newLineIfNotEmpty(); - } + + private JPanel makeLabelledCounterComponent(final JLabel label, final JComponent comp) { + final JPanel groupPanel = new JPanel(); + groupPanel.setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + // label + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 10, 5, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + groupPanel.add(label, c); + // component + c.gridx = 1; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 5, 5, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + groupPanel.add(comp, c); + final Dimension dim = new Dimension(134, 24); + groupPanel.setMinimumSize(dim); + groupPanel.setPreferredSize(dim); + return groupPanel; } - final String result = _builder_3.toString(); - return result; - } - - private JPanel makeLabelledCounterComponent(final JLabel label, final JComponent comp) { - final JPanel groupPanel = new JPanel(); - GridBagLayout _gridBagLayout = new GridBagLayout(); - groupPanel.setLayout(_gridBagLayout); - GridBagConstraints c = new GridBagConstraints(); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets = new Insets(5, 10, 5, 0); - c.insets = _insets; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - groupPanel.add(label, c); - c.gridx = 1; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_1 = new Insets(5, 5, 5, 10); - c.insets = _insets_1; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - groupPanel.add(comp, c); - final Dimension dim = new Dimension(134, 24); - groupPanel.setMinimumSize(dim); - groupPanel.setPreferredSize(dim); - return groupPanel; - } - - private void initializeGUI() { - JPanel _jPanel = new JPanel(); - this.basePanel = _jPanel; - GridBagLayout _gridBagLayout = new GridBagLayout(); - this.basePanel.setLayout(_gridBagLayout); - GridBagConstraints c = new GridBagConstraints(); - GradientToolbar toolbar = new GradientToolbar(); - toolbar.setFloatable(false); - Insets _insets = new Insets(2, 4, 2, 4); - final EmptyBorder buttonBorder = new EmptyBorder(_insets); - Icon _icon = UtplsqlResources.getIcon("REFRESH_ICON"); - ToolbarButton _toolbarButton = new ToolbarButton(_icon); - this.refreshButton = _toolbarButton; - this.refreshButton.setToolTipText(UtplsqlResources.getString("RUNNER_REFRESH_TOOLTIP")); - this.refreshButton.setBorder(buttonBorder); - this.refreshButton.addActionListener(this); - toolbar.add(this.refreshButton); - Icon _icon_1 = UtplsqlResources.getIcon("RUN_ICON"); - ToolbarButton _toolbarButton_1 = new ToolbarButton(_icon_1); - this.rerunButton = _toolbarButton_1; - this.rerunButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_TOOLTIP")); - this.rerunButton.setBorder(buttonBorder); - this.rerunButton.addActionListener(this); - toolbar.add(this.rerunButton); - Icon _icon_2 = UtplsqlResources.getIcon("RUN_WORKSHEET_ICON"); - ToolbarButton _toolbarButton_2 = new ToolbarButton(_icon_2); - this.rerunWorksheetButton = _toolbarButton_2; - this.rerunWorksheetButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_WORKSHEET_TOOLTIP")); - this.rerunWorksheetButton.setBorder(buttonBorder); - this.rerunWorksheetButton.addActionListener(this); - toolbar.add(this.rerunWorksheetButton); - toolbar.add(Box.createHorizontalGlue()); - DefaultComboBoxModel> _defaultComboBoxModel = new DefaultComboBoxModel>(); - this.runComboBoxModel = _defaultComboBoxModel; - JComboBox> _jComboBox = new JComboBox>(this.runComboBoxModel); - this.runComboBox = _jComboBox; - this.runComboBox.setEditable(false); - final Dimension comboBoxDim = new Dimension(500, 50); - this.runComboBox.setMaximumSize(comboBoxDim); - this.runComboBox.addActionListener(this); - toolbar.add(this.runComboBox); - Icon _icon_3 = UtplsqlResources.getIcon("CLEAR_ICON"); - ToolbarButton _toolbarButton_3 = new ToolbarButton(_icon_3); - this.clearButton = _toolbarButton_3; - this.clearButton.setToolTipText(UtplsqlResources.getString("RUNNER_CLEAR_BUTTON")); - this.clearButton.setBorder(buttonBorder); - this.clearButton.addActionListener(this); - toolbar.add(this.clearButton); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 2; - c.gridheight = 1; - Insets _insets_1 = new Insets(0, 0, 0, 0); - c.insets = _insets_1; - c.anchor = GridBagConstraints.NORTH; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - this.basePanel.add(toolbar, c); - JLabel _jLabel = new JLabel(); - this.statusLabel = _jLabel; - c.gridx = 0; - c.gridy = 1; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_2 = new Insets(10, 10, 10, 0); - c.insets = _insets_2; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - this.basePanel.add(this.statusLabel, c); - JLabel _jLabel_1 = new JLabel(); - this.elapsedTimeLabel = _jLabel_1; - Dimension _dimension = new Dimension(60, 0); - this.elapsedTimeLabel.setPreferredSize(_dimension); - c.gridx = 1; - c.gridy = 1; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_3 = new Insets(10, 10, 10, 10); - c.insets = _insets_3; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - this.basePanel.add(this.elapsedTimeLabel, c); - Timer _timer = new Timer(100, new ActionListener() { - @Override - public void actionPerformed(final ActionEvent e) { - if (((RunnerPanel.this.currentRun != null) && (RunnerPanel.this.currentRun.getStart() != null))) { - final SmartTime time = new SmartTime(); - time.setSmart(RunnerPanel.useSmartTimes); - Double _executionTime = RunnerPanel.this.currentRun.getExecutionTime(); - boolean _tripleNotEquals = (_executionTime != null); - if (_tripleNotEquals) { - time.setSeconds(RunnerPanel.this.currentRun.getExecutionTime()); - RunnerPanel.this.elapsedTimeTimer.stop(); - } else { - final long now = System.currentTimeMillis(); - Long _start = RunnerPanel.this.currentRun.getStart(); - long _minus = (now - (_start).longValue()); - Double _double = new Double(_minus); - double _divide = ((_double).doubleValue() / 1000); - time.setSeconds(Double.valueOf(_divide)); - } - StringConcatenation _builder = new StringConcatenation(); - String _string = time.toString(); - _builder.append(_string); - { - if ((!RunnerPanel.useSmartTimes)) { - _builder.append(" s"); + + private void initializeGUI() { + // Base panel containing all components + basePanel = new JPanel(); + basePanel.setLayout(new GridBagLayout()); + final GridBagConstraints c = new GridBagConstraints(); + + // Toolbar + final GradientToolbar toolbar = new GradientToolbar(); + toolbar.setFloatable(false); + final EmptyBorder buttonBorder = new EmptyBorder(new Insets(2, 4, 2, 4)); // insets: top, left, bottom, right + refreshButton = new ToolbarButton(UtplsqlResources.getIcon("REFRESH_ICON")); + refreshButton.setToolTipText(UtplsqlResources.getString("RUNNER_REFRESH_TOOLTIP")); + refreshButton.setBorder(buttonBorder); + refreshButton.addActionListener(this); + toolbar.add(refreshButton); + rerunButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_ICON")); + rerunButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_TOOLTIP")); + rerunButton.setBorder(buttonBorder); + rerunButton.addActionListener(this); + toolbar.add(rerunButton); + rerunWorksheetButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_WORKSHEET_ICON")); + rerunWorksheetButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_WORKSHEET_TOOLTIP")); + rerunWorksheetButton.setBorder(buttonBorder); + rerunWorksheetButton.addActionListener(this); + toolbar.add(rerunWorksheetButton); + toolbar.add(Box.createHorizontalGlue()); + runComboBoxModel = new DefaultComboBoxModel<>(); + runComboBox = new JComboBox<>(runComboBoxModel); + runComboBox.setEditable(false); + final Dimension comboBoxDim = new Dimension(500, 50); + runComboBox.setMaximumSize(comboBoxDim); + runComboBox.addActionListener(this); + toolbar.add(runComboBox); + clearButton = new ToolbarButton(UtplsqlResources.getIcon("CLEAR_ICON")); + clearButton.setToolTipText(UtplsqlResources.getString("RUNNER_CLEAR_BUTTON")); + clearButton.setBorder(buttonBorder); + clearButton.addActionListener(this); + toolbar.add(clearButton); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 2; + c.gridheight = 1; + c.insets = new Insets(0, 0, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.NORTH; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + basePanel.add(toolbar, c); + + // Status line + statusLabel = new JLabel(); + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(10, 10, 10, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + basePanel.add(statusLabel, c); + JLabel elapsedTimeLabel = new JLabel(); + elapsedTimeLabel.setPreferredSize(new Dimension(60, 0)); + c.gridx = 1; + c.gridy = 1; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(10, 10, 10, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + basePanel.add(elapsedTimeLabel, c); + elapsedTimeTimer = new Timer(100, event -> { + if (currentRun != null && currentRun.getStart() != null) { + final SmartTime time = new SmartTime(); + time.setSmart(useSmartTimes); + if (currentRun.getExecutionTime() != null) { + time.setSeconds(currentRun.getExecutionTime()); + elapsedTimeTimer.stop(); + } else { + final Double now = Double.valueOf(System.currentTimeMillis()); + time.setSeconds(Double.valueOf(now - currentRun.getStart()) / 1000); + } + elapsedTimeLabel.setText(time.toString() + (!useSmartTimes ? " s" : "")); + } else { + elapsedTimeLabel.setText(null); } - } - RunnerPanel.this.elapsedTimeLabel.setText(_builder.toString()); + }); + + // Counters + // - Test counter + final JPanel counterPanel = new JPanel(); + counterPanel.setLayout(new WrapLayout(FlowLayout.LEFT, 0, 0)); + final JLabel testCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_TESTS_LABEL") + ":", JLabel.LEADING); + testCounterValueLabel = new JLabel(); + counterPanel.add(makeLabelledCounterComponent(testCounterLabel, testCounterValueLabel)); + // - Failure counter + final JLabel failureCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_FAILURES_LABEL") + ":", + UtplsqlResources.getIcon("FAILURE_ICON"), JLabel.LEADING); + failureCounterValueLabel = new JLabel(); + counterPanel.add(makeLabelledCounterComponent(failureCounterLabel, failureCounterValueLabel)); + // - Error counter + final JLabel errorCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_ERRORS_LABEL") + ":", + UtplsqlResources.getIcon("ERROR_ICON"), JLabel.LEADING); + errorCounterValueLabel = new JLabel(); + counterPanel.add(makeLabelledCounterComponent(errorCounterLabel, errorCounterValueLabel)); + // - Disabled counter + final JLabel disabledCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_DISABLED_LABEL") + ":", + UtplsqlResources.getIcon("DISABLED_ICON"), JLabel.LEADING); + disabledCounterValueLabel = new JLabel(); + counterPanel.add(makeLabelledCounterComponent(disabledCounterLabel, disabledCounterValueLabel)); + // - Warnings counter + final JLabel warningsCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_WARNINGS_LABEL") + ":", + UtplsqlResources.getIcon("WARNING_ICON"), JLabel.LEADING); + warningsCounterValueLabel = new JLabel(); + counterPanel.add(makeLabelledCounterComponent(warningsCounterLabel, warningsCounterValueLabel)); + // - Info counter + final JLabel infoCounterLabel = new JLabel(UtplsqlResources.getString("RUNNER_INFO_LABEL") + ":", + UtplsqlResources.getIcon("INFO_ICON"), JLabel.LEADING); + infoCounterValueLabel = new JLabel(); + counterPanel.add(makeLabelledCounterComponent(infoCounterLabel, infoCounterValueLabel)); + // - add everything to basePanel + c.gridx = 0; + c.gridy = 2; + c.gridwidth = 2; + c.gridheight = 1; + c.insets = new Insets(5, 0, 5, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + basePanel.add(counterPanel, c); + + // Context menu for counters panel + final JPopupMenu countersPopupMenu = new JPopupMenu(); + showDisabledCounterCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL").replace("?", ""), true); + showDisabledCounterCheckBoxMenuItem.addActionListener(this); + countersPopupMenu.add(showDisabledCounterCheckBoxMenuItem); + showWarningsCounterCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL").replace("?", ""), true); + showWarningsCounterCheckBoxMenuItem.addActionListener(this); + countersPopupMenu.add(showWarningsCounterCheckBoxMenuItem); + showInfoCounterCheckBoxMenuItem = new JCheckBoxMenuItem( UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL").replace("?", ""), true); + showInfoCounterCheckBoxMenuItem.addActionListener(this); + countersPopupMenu.add(showInfoCounterCheckBoxMenuItem); + counterPanel.setComponentPopupMenu(countersPopupMenu); + + // Progress bar + progressBar = new JProgressBar(); + final Dimension progressBarDim = new Dimension(10, 20); + progressBar.setPreferredSize(progressBarDim); + progressBar.setMinimumSize(progressBarDim); + progressBar.setStringPainted(false); + progressBar.setForeground(GREEN); + progressBar.setUI(new BasicProgressBarUI()); + c.gridx = 0; + c.gridy = 3; + c.gridwidth = 2; + c.gridheight = 1; + c.insets = new Insets(10, 10, 10, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + basePanel.add(progressBar, c); + + // Test overview + testOverviewTableModel = new TestOverviewTableModel(); + testOverviewTable = new JTable(testOverviewTableModel); + testOverviewTable.getTableHeader().setReorderingAllowed(false); + testOverviewTable.setAutoCreateRowSorter(true); + testOverviewTable.setRowHeight(OVERVIEW_TABLE_ROW_HEIGHT); + testOverviewTable.getTableHeader().setPreferredSize( + new Dimension(testOverviewTable.getTableHeader().getPreferredSize().width, OVERVIEW_TABLE_ROW_HEIGHT)); + testOverviewTable.getSelectionModel().addListSelectionListener(new TestOverviewRowListener()); + testOverviewTable.addMouseListener(this); + RepaintManager.currentManager(testOverviewTable).setDoubleBufferingEnabled(true); + final TestTableHeaderRenderer testTableHeaderRenderer = new TestTableHeaderRenderer(); + final TableColumn overviewTableStatus = testOverviewTable.getColumnModel().getColumn(0); + overviewTableStatus.setMinWidth(INDICATOR_WIDTH); + overviewTableStatus.setPreferredWidth(INDICATOR_WIDTH); + overviewTableStatus.setMaxWidth(INDICATOR_WIDTH); + overviewTableStatus.setHeaderRenderer(testTableHeaderRenderer); + final TableColumn overviewTableWarning = testOverviewTable.getColumnModel().getColumn(1); + overviewTableWarning.setMinWidth(INDICATOR_WIDTH); + overviewTableWarning.setPreferredWidth(INDICATOR_WIDTH); + overviewTableWarning.setMaxWidth(INDICATOR_WIDTH); + overviewTableWarning.setHeaderRenderer(testTableHeaderRenderer); + final TableColumn overviewTableInfo = testOverviewTable.getColumnModel().getColumn(2); + overviewTableInfo.setMinWidth(INDICATOR_WIDTH); + overviewTableInfo.setPreferredWidth(INDICATOR_WIDTH); + overviewTableInfo.setMaxWidth(INDICATOR_WIDTH); + overviewTableInfo.setHeaderRenderer(testTableHeaderRenderer); + final TableColumn overviewTableId = testOverviewTable.getColumnModel().getColumn(3); + overviewTableId.setHeaderRenderer(testTableHeaderRenderer); + final TableColumn overviewTableTime = testOverviewTable.getColumnModel().getColumn(4); + overviewTableTime.setPreferredWidth(60); + overviewTableTime.setMaxWidth(100); + overviewTableTime.setHeaderRenderer(testTableHeaderRenderer); + final TimeFormatRenderer timeFormatRenderer = new TimeFormatRenderer(); + timeFormatRenderer.setHorizontalAlignment(JLabel.RIGHT); + overviewTableTime.setCellRenderer(timeFormatRenderer); + final JScrollPane testOverviewScrollPane = new JScrollPane(testOverviewTable); + + // Context menu for test overview + final JPopupMenu testOverviewPopupMenu = new JPopupMenu(); + testOverviewRunMenuItem = new JMenuItem(UtplsqlResources.getString("RUNNER_RUN_MENUITEM"), UtplsqlResources.getIcon("RUN_ICON")); + testOverviewRunMenuItem.addActionListener(this); + testOverviewPopupMenu.add(testOverviewRunMenuItem); + testOverviewRunWorksheetMenuItem = new JMenuItem(UtplsqlResources.getString("RUNNER_RUN_WORKSHEET_MENUITEM"), UtplsqlResources.getIcon("RUN_WORKSHEET_ICON")); + testOverviewRunWorksheetMenuItem.addActionListener(this); + testOverviewPopupMenu.add(testOverviewRunWorksheetMenuItem); + testOverviewPopupMenu.add(new JSeparator()); + showSuccessfulTestsCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL").replace("?", ""), true); + showSuccessfulTestsCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(showSuccessfulTestsCheckBoxMenuItem); + showDisabledTestsCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL").replace("?", ""), true); + showDisabledTestsCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(showDisabledTestsCheckBoxMenuItem); + testOverviewPopupMenu.add(new JSeparator()); + showTestDescriptionCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL").replace("?", ""), true); + showTestDescriptionCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(showTestDescriptionCheckBoxMenuItem); + showWarningIndicatorCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL").replace("?", ""), true); + showWarningIndicatorCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(showWarningIndicatorCheckBoxMenuItem); + showInfoIndicatorCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL").replace("?", ""), true); + showInfoIndicatorCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(showInfoIndicatorCheckBoxMenuItem); + syncDetailTabCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL").replace("?", ""), true); + syncDetailTabCheckBoxMenuItem.addActionListener(this); + testOverviewPopupMenu.add(syncDetailTabCheckBoxMenuItem); + testOverviewTable.setComponentPopupMenu(testOverviewPopupMenu); + testOverviewTable.getTableHeader().setComponentPopupMenu(testOverviewPopupMenu); + + // Test tabbed pane (Test Properties) + final ScrollablePanel testInfoPanel = new ScrollablePanel(); + testInfoPanel.setLayout(new GridBagLayout()); + // - Owner + final JLabel testOwnerLabel = new JLabel(UtplsqlResources.getString("RUNNER_OWNER_LABEL")); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(10, 10, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testOwnerLabel, c); + testOwnerTextField = new RunnerTextField(); + testOwnerTextField.setEditable(false); + c.gridx = 1; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(10, 5, 0, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(testOwnerTextField, c); + // - Package + final JLabel testPackageLabel = new JLabel(UtplsqlResources.getString("RUNNER_PACKAGE_LABEL")); + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 10, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testPackageLabel, c); + testPackageTextField = new RunnerTextField(); + testPackageTextField.setEditable(false); + c.gridx = 1; + c.gridy = 1; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 5, 0, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(testPackageTextField, c); + // - Procedure + final JLabel testProcedureLabel = new JLabel(UtplsqlResources.getString("RUNNER_PROCEDURE_LABEL")); + c.gridx = 0; + c.gridy = 2; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 10, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testProcedureLabel, c); + testProcedureTextField = new RunnerTextField(); + testProcedureTextField.setEditable(false); + c.gridx = 1; + c.gridy = 2; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 5, 0, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(testProcedureTextField, c); + // - Description + final JLabel testDescriptionLabel = new JLabel(UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL")); + testDescriptionLabel.setBorder(BorderFactory.createEmptyBorder(isMacLookAndFeel() ? 5 : 3, 0, 0, 0)); + c.gridx = 0; + c.gridy = 3; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 10, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testDescriptionLabel, c); + testDescriptionTextArea = new RunnerTextArea(); + testDescriptionTextArea.setEditable(false); + testDescriptionTextArea.setEnabled(true); + testDescriptionTextArea.setLineWrap(true); + testDescriptionTextArea.setWrapStyleWord(true); + c.gridx = 1; + c.gridy = 3; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 5, 0, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(testDescriptionTextArea, c); + // - Suitepath (id) + final JLabel testIdLabel = new JLabel(UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN")); + testIdLabel.setBorder(BorderFactory.createEmptyBorder(isMacLookAndFeel() ? 5 : 3, 0, 0, 0)); + c.gridx = 0; + c.gridy = 4; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 10, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.NORTHWEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testIdLabel, c); + testIdTextArea = new RunnerTextArea(); + testIdTextArea.setEditable(false); + testIdTextArea.setEnabled(true); + testIdTextArea.setLineWrap(true); + testIdTextArea.setWrapStyleWord(false); + c.gridx = 1; + c.gridy = 4; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 5, 0, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(testIdTextArea, c); + // - Start + final JLabel testStartLabel = new JLabel(UtplsqlResources.getString("RUNNER_START_LABEL")); + c.gridx = 0; + c.gridy = 5; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 10, 10, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.NONE; + c.weightx = 0; + c.weighty = 0; + testInfoPanel.add(testStartLabel, c); + testStartTextField = new RunnerTextField(); + testStartTextField.setEditable(false); + c.gridx = 1; + c.gridy = 5; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(5, 5, 10, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1; + c.weighty = 0; + testInfoPanel.add(testStartTextField, c); + c.gridx = 0; + c.gridy = 6; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(0, 0, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 0; + c.weighty = 1; + testInfoPanel.add(Box.createVerticalGlue(), c); + final JScrollPane testPropertiesScrollPane = new JScrollPane(testInfoPanel); + + // Failures tabbed pane (failed expectations) + // - failures table (number and description) + failuresTableModel = new FailuresTableModel(); + failuresTable = new JTable(failuresTableModel); + failuresTable.getTableHeader().setReorderingAllowed(false); + failuresTable.getSelectionModel().addListSelectionListener(new FailuresRowListener()); + failuresTable.addMouseListener(this); + final FailuresTableHeaderRenderer failuresTableHeaderRenderer = new FailuresTableHeaderRenderer(); + final TableColumn failuresTableNumber = failuresTable.getColumnModel().getColumn(0); + failuresTableNumber.setHeaderRenderer(failuresTableHeaderRenderer); + failuresTableNumber.setPreferredWidth(30); + failuresTableNumber.setMaxWidth(30); + final TableColumn failuresDescription = failuresTable.getColumnModel().getColumn(1); + failuresDescription.setHeaderRenderer(failuresTableHeaderRenderer); + final JScrollPane failuresTableScrollPane = new JScrollPane(failuresTable); + // - failures details + testFailureMessageTextPane = new RunnerTextPane(); + testFailureMessageTextPane.setEditable(false); + testFailureMessageTextPane.setEnabled(true); + testFailureMessageTextPane.setContentType("text/html"); + testFailureMessageTextPane.setMinimumSize(TEXTPANE_DIM); + testFailureMessageTextPane.setPreferredSize(TEXTPANE_DIM); + testFailureMessageTextPane.addHyperlinkListener(this); + final JScrollPane testFailureMessageScrollPane = new JScrollPane(testFailureMessageTextPane); + c.gridx = 1; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(10, 5, 0, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 6; + + // - split pane + final JSplitPane failuresSplitPane = new JSplitPane(SwingConstants.HORIZONTAL, failuresTableScrollPane, + testFailureMessageScrollPane); + failuresSplitPane.setResizeWeight(0.2); + + // Errors tabbed pane (Error Stack) + final JPanel testErrorStackPanel = new JPanel(); + testErrorStackPanel.setLayout(new GridBagLayout()); + testErrorStackTextPane = new RunnerTextPane(); + testErrorStackTextPane.setEditable(false); + testErrorStackTextPane.setEnabled(true); + testErrorStackTextPane.setContentType("text/html"); + testErrorStackTextPane.setMinimumSize(TEXTPANE_DIM); + testErrorStackTextPane.setPreferredSize(TEXTPANE_DIM); + testErrorStackTextPane.addHyperlinkListener(this); + final JScrollPane testErrorStackScrollPane = new JScrollPane(testErrorStackTextPane); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(0, 0, 0, 0); + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + testErrorStackPanel.add(testErrorStackScrollPane, c); + + // Warnings tabbed pane + final JPanel testWarningsPanel = new JPanel(); + testWarningsPanel.setLayout(new GridBagLayout()); + testWarningsTextPane = new RunnerTextPane(); + testWarningsTextPane.setEditable(false); + testWarningsTextPane.setEnabled(true); + testWarningsTextPane.setContentType("text/html"); + testWarningsTextPane.setMinimumSize(TEXTPANE_DIM); + testWarningsTextPane.setPreferredSize(TEXTPANE_DIM); + testWarningsTextPane.addHyperlinkListener(this); + final JScrollPane testWarningsScrollPane = new JScrollPane(testWarningsTextPane); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(0, 0, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + testWarningsPanel.add(testWarningsScrollPane, c); + + // Info tabbed pane (Server Output) + final JPanel testServerOutputPanel = new JPanel(); + testServerOutputPanel.setLayout(new GridBagLayout()); + testServerOutputTextPane = new RunnerTextPane(); + testServerOutputTextPane.setEditable(false); + testServerOutputTextPane.setEnabled(true); + testServerOutputTextPane.setContentType("text/html"); + testServerOutputTextPane.setMinimumSize(TEXTPANE_DIM); + testServerOutputTextPane.setPreferredSize(TEXTPANE_DIM); + testServerOutputTextPane.addHyperlinkListener(this); + final JScrollPane testServerOutputScrollPane = new JScrollPane(testServerOutputTextPane); + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.insets = new Insets(0, 0, 0, 0); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + testServerOutputPanel.add(testServerOutputScrollPane, c); + + // split pane with all tabs + testDetailTabbedPane = new JTabbedPane(); + testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_TEST_TAB_LABEL"), testPropertiesScrollPane); + testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_FAILURES_TAB_LABEL"), failuresSplitPane); + testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_ERRORS_TAB_LABEL"), testErrorStackPanel); + testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_WARNINGS_TAB_LABEL"), testWarningsPanel); + testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_INFO_TAB_LABEL"), testServerOutputPanel); + final JSplitPane horizontalSplitPane = new JSplitPane(SwingConstants.HORIZONTAL, testOverviewScrollPane, + testDetailTabbedPane); + horizontalSplitPane.setResizeWeight(0.5); + c.gridx = 0; + c.gridy = 4; + c.gridwidth = 2; + c.gridheight = 1; + c.insets = new Insets(10, 10, 10, 10); // top, left, bottom, right + c.anchor = GridBagConstraints.WEST; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + basePanel.add(horizontalSplitPane, c); + if (isMacLookAndFeel()) { + final CompoundBorder border = BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder(3, 3, 3, 3), + BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(new Color(219, 219, 219)), + BorderFactory.createEmptyBorder(1, 1, 1, 1))); + testDescriptionTextArea.setBorder(border); + testIdTextArea.setBorder(border); } else { - RunnerPanel.this.elapsedTimeLabel.setText(null); + final Border referenceBorder = testOwnerTextField.getBorder(); + testDescriptionTextArea.setBorder(referenceBorder); + testIdTextArea.setBorder(referenceBorder); } - } - }); - this.elapsedTimeTimer = _timer; - final JPanel counterPanel = new JPanel(); - WrapLayout _wrapLayout = new WrapLayout(FlowLayout.LEFT, 0, 0); - counterPanel.setLayout(_wrapLayout); - String _string = UtplsqlResources.getString("RUNNER_TESTS_LABEL"); - String _plus = (_string + ":"); - final JLabel testCounterLabel = new JLabel(_plus, JLabel.LEADING); - JLabel _jLabel_2 = new JLabel(); - this.testCounterValueLabel = _jLabel_2; - counterPanel.add(this.makeLabelledCounterComponent(testCounterLabel, this.testCounterValueLabel)); - String _string_1 = UtplsqlResources.getString("RUNNER_FAILURES_LABEL"); - String _plus_1 = (_string_1 + ":"); - Icon _icon_4 = UtplsqlResources.getIcon("FAILURE_ICON"); - final JLabel failureCounterLabel = new JLabel(_plus_1, _icon_4, JLabel.LEADING); - JLabel _jLabel_3 = new JLabel(); - this.failureCounterValueLabel = _jLabel_3; - counterPanel.add(this.makeLabelledCounterComponent(failureCounterLabel, this.failureCounterValueLabel)); - String _string_2 = UtplsqlResources.getString("RUNNER_ERRORS_LABEL"); - String _plus_2 = (_string_2 + ":"); - Icon _icon_5 = UtplsqlResources.getIcon("ERROR_ICON"); - final JLabel errorCounterLabel = new JLabel(_plus_2, _icon_5, JLabel.LEADING); - JLabel _jLabel_4 = new JLabel(); - this.errorCounterValueLabel = _jLabel_4; - counterPanel.add(this.makeLabelledCounterComponent(errorCounterLabel, this.errorCounterValueLabel)); - String _string_3 = UtplsqlResources.getString("RUNNER_DISABLED_LABEL"); - String _plus_3 = (_string_3 + ":"); - Icon _icon_6 = UtplsqlResources.getIcon("DISABLED_ICON"); - final JLabel disabledCounterLabel = new JLabel(_plus_3, _icon_6, JLabel.LEADING); - JLabel _jLabel_5 = new JLabel(); - this.disabledCounterValueLabel = _jLabel_5; - counterPanel.add(this.makeLabelledCounterComponent(disabledCounterLabel, this.disabledCounterValueLabel)); - String _string_4 = UtplsqlResources.getString("RUNNER_WARNINGS_LABEL"); - String _plus_4 = (_string_4 + ":"); - Icon _icon_7 = UtplsqlResources.getIcon("WARNING_ICON"); - final JLabel warningsCounterLabel = new JLabel(_plus_4, _icon_7, JLabel.LEADING); - JLabel _jLabel_6 = new JLabel(); - this.warningsCounterValueLabel = _jLabel_6; - counterPanel.add(this.makeLabelledCounterComponent(warningsCounterLabel, this.warningsCounterValueLabel)); - String _string_5 = UtplsqlResources.getString("RUNNER_INFO_LABEL"); - String _plus_5 = (_string_5 + ":"); - Icon _icon_8 = UtplsqlResources.getIcon("INFO_ICON"); - final JLabel infoCounterLabel = new JLabel(_plus_5, _icon_8, JLabel.LEADING); - JLabel _jLabel_7 = new JLabel(); - this.infoCounterValueLabel = _jLabel_7; - counterPanel.add(this.makeLabelledCounterComponent(infoCounterLabel, this.infoCounterValueLabel)); - c.gridx = 0; - c.gridy = 2; - c.gridwidth = 2; - c.gridheight = 1; - Insets _insets_4 = new Insets(5, 0, 5, 0); - c.insets = _insets_4; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - this.basePanel.add(counterPanel, c); - final JPopupMenu countersPopupMenu = new JPopupMenu(); - String _replace = UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem = new JCheckBoxMenuItem(_replace, true); - this.showDisabledCounterCheckBoxMenuItem = _jCheckBoxMenuItem; - this.showDisabledCounterCheckBoxMenuItem.addActionListener(this); - countersPopupMenu.add(this.showDisabledCounterCheckBoxMenuItem); - String _replace_1 = UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem_1 = new JCheckBoxMenuItem(_replace_1, true); - this.showWarningsCounterCheckBoxMenuItem = _jCheckBoxMenuItem_1; - this.showWarningsCounterCheckBoxMenuItem.addActionListener(this); - countersPopupMenu.add(this.showWarningsCounterCheckBoxMenuItem); - String _replace_2 = UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem_2 = new JCheckBoxMenuItem(_replace_2, true); - this.showInfoCounterCheckBoxMenuItem = _jCheckBoxMenuItem_2; - this.showInfoCounterCheckBoxMenuItem.addActionListener(this); - countersPopupMenu.add(this.showInfoCounterCheckBoxMenuItem); - counterPanel.setComponentPopupMenu(countersPopupMenu); - JProgressBar _jProgressBar = new JProgressBar(); - this.progressBar = _jProgressBar; - final Dimension progressBarDim = new Dimension(10, 20); - this.progressBar.setPreferredSize(progressBarDim); - this.progressBar.setMinimumSize(progressBarDim); - this.progressBar.setStringPainted(false); - this.progressBar.setForeground(RunnerPanel.GREEN); - BasicProgressBarUI _basicProgressBarUI = new BasicProgressBarUI(); - this.progressBar.setUI(_basicProgressBarUI); - c.gridx = 0; - c.gridy = 3; - c.gridwidth = 2; - c.gridheight = 1; - Insets _insets_5 = new Insets(10, 10, 10, 10); - c.insets = _insets_5; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - this.basePanel.add(this.progressBar, c); - TestOverviewTableModel _testOverviewTableModel = new TestOverviewTableModel(); - this.testOverviewTableModel = _testOverviewTableModel; - JTable _jTable = new JTable(this.testOverviewTableModel); - this.testOverviewTable = _jTable; - JTableHeader _tableHeader = this.testOverviewTable.getTableHeader(); - _tableHeader.setReorderingAllowed(false); - this.testOverviewTable.setAutoCreateRowSorter(true); - this.testOverviewTable.setRowHeight(RunnerPanel.OVERVIEW_TABLE_ROW_HEIGHT); - JTableHeader _tableHeader_1 = this.testOverviewTable.getTableHeader(); - Dimension _dimension_1 = new Dimension(this.testOverviewTable.getTableHeader().getPreferredSize().width, RunnerPanel.OVERVIEW_TABLE_ROW_HEIGHT); - _tableHeader_1.setPreferredSize(_dimension_1); - ListSelectionModel _selectionModel = this.testOverviewTable.getSelectionModel(); - RunnerPanel.TestOverviewRowListener _testOverviewRowListener = new RunnerPanel.TestOverviewRowListener(this); - _selectionModel.addListSelectionListener(_testOverviewRowListener); - this.testOverviewTable.addMouseListener(this); - RepaintManager _currentManager = RepaintManager.currentManager(this.testOverviewTable); - _currentManager.setDoubleBufferingEnabled(true); - final RunnerPanel.TestTableHeaderRenderer testTableHeaderRenderer = new RunnerPanel.TestTableHeaderRenderer(); - final TableColumn overviewTableStatus = this.testOverviewTable.getColumnModel().getColumn(0); - overviewTableStatus.setMinWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableStatus.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableStatus.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableStatus.setHeaderRenderer(testTableHeaderRenderer); - final TableColumn overviewTableWarning = this.testOverviewTable.getColumnModel().getColumn(1); - overviewTableWarning.setMinWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableWarning.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableWarning.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableWarning.setHeaderRenderer(testTableHeaderRenderer); - final TableColumn overviewTableInfo = this.testOverviewTable.getColumnModel().getColumn(2); - overviewTableInfo.setMinWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableInfo.setPreferredWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableInfo.setMaxWidth(RunnerPanel.INDICATOR_WIDTH); - overviewTableInfo.setHeaderRenderer(testTableHeaderRenderer); - final TableColumn overviewTableId = this.testOverviewTable.getColumnModel().getColumn(3); - overviewTableId.setHeaderRenderer(testTableHeaderRenderer); - final TableColumn overviewTableTime = this.testOverviewTable.getColumnModel().getColumn(4); - overviewTableTime.setPreferredWidth(60); - overviewTableTime.setMaxWidth(100); - overviewTableTime.setHeaderRenderer(testTableHeaderRenderer); - final RunnerPanel.TimeFormatRenderer timeFormatRenderer = new RunnerPanel.TimeFormatRenderer(); - timeFormatRenderer.setHorizontalAlignment(JLabel.RIGHT); - overviewTableTime.setCellRenderer(timeFormatRenderer); - final JScrollPane testOverviewScrollPane = new JScrollPane(this.testOverviewTable); - final JPopupMenu testOverviewPopupMenu = new JPopupMenu(); - String _string_6 = UtplsqlResources.getString("RUNNER_RUN_MENUITEM"); - Icon _icon_9 = UtplsqlResources.getIcon("RUN_ICON"); - JMenuItem _jMenuItem = new JMenuItem(_string_6, _icon_9); - this.testOverviewRunMenuItem = _jMenuItem; - this.testOverviewRunMenuItem.addActionListener(this); - testOverviewPopupMenu.add(this.testOverviewRunMenuItem); - String _string_7 = UtplsqlResources.getString("RUNNER_RUN_WORKSHEET_MENUITEM"); - Icon _icon_10 = UtplsqlResources.getIcon("RUN_WORKSHEET_ICON"); - JMenuItem _jMenuItem_1 = new JMenuItem(_string_7, _icon_10); - this.testOverviewRunWorksheetMenuItem = _jMenuItem_1; - this.testOverviewRunWorksheetMenuItem.addActionListener(this); - testOverviewPopupMenu.add(this.testOverviewRunWorksheetMenuItem); - JSeparator _jSeparator = new JSeparator(); - testOverviewPopupMenu.add(_jSeparator); - String _replace_3 = UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem_3 = new JCheckBoxMenuItem(_replace_3, true); - this.showSuccessfulTestsCheckBoxMenuItem = _jCheckBoxMenuItem_3; - this.showSuccessfulTestsCheckBoxMenuItem.addActionListener(this); - testOverviewPopupMenu.add(this.showSuccessfulTestsCheckBoxMenuItem); - String _replace_4 = UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem_4 = new JCheckBoxMenuItem(_replace_4, true); - this.showDisabledTestsCheckBoxMenuItem = _jCheckBoxMenuItem_4; - this.showDisabledTestsCheckBoxMenuItem.addActionListener(this); - testOverviewPopupMenu.add(this.showDisabledTestsCheckBoxMenuItem); - JSeparator _jSeparator_1 = new JSeparator(); - testOverviewPopupMenu.add(_jSeparator_1); - String _replace_5 = UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem_5 = new JCheckBoxMenuItem(_replace_5, true); - this.showTestDescriptionCheckBoxMenuItem = _jCheckBoxMenuItem_5; - this.showTestDescriptionCheckBoxMenuItem.addActionListener(this); - testOverviewPopupMenu.add(this.showTestDescriptionCheckBoxMenuItem); - String _replace_6 = UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem_6 = new JCheckBoxMenuItem(_replace_6, true); - this.showWarningIndicatorCheckBoxMenuItem = _jCheckBoxMenuItem_6; - this.showWarningIndicatorCheckBoxMenuItem.addActionListener(this); - testOverviewPopupMenu.add(this.showWarningIndicatorCheckBoxMenuItem); - String _replace_7 = UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem_7 = new JCheckBoxMenuItem(_replace_7, true); - this.showInfoIndicatorCheckBoxMenuItem = _jCheckBoxMenuItem_7; - this.showInfoIndicatorCheckBoxMenuItem.addActionListener(this); - testOverviewPopupMenu.add(this.showInfoIndicatorCheckBoxMenuItem); - String _replace_8 = UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL").replace("?", ""); - JCheckBoxMenuItem _jCheckBoxMenuItem_8 = new JCheckBoxMenuItem(_replace_8, true); - this.syncDetailTabCheckBoxMenuItem = _jCheckBoxMenuItem_8; - this.syncDetailTabCheckBoxMenuItem.addActionListener(this); - testOverviewPopupMenu.add(this.syncDetailTabCheckBoxMenuItem); - this.testOverviewTable.setComponentPopupMenu(testOverviewPopupMenu); - JTableHeader _tableHeader_2 = this.testOverviewTable.getTableHeader(); - _tableHeader_2.setComponentPopupMenu(testOverviewPopupMenu); - final ScrollablePanel testInfoPanel = new ScrollablePanel(); - GridBagLayout _gridBagLayout_1 = new GridBagLayout(); - testInfoPanel.setLayout(_gridBagLayout_1); - String _string_8 = UtplsqlResources.getString("RUNNER_OWNER_LABEL"); - final JLabel testOwnerLabel = new JLabel(_string_8); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_6 = new Insets(10, 10, 0, 0); - c.insets = _insets_6; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - testInfoPanel.add(testOwnerLabel, c); - RunnerTextField _runnerTextField = new RunnerTextField(); - this.testOwnerTextField = _runnerTextField; - this.testOwnerTextField.setEditable(false); - c.gridx = 1; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_7 = new Insets(10, 5, 0, 10); - c.insets = _insets_7; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - testInfoPanel.add(this.testOwnerTextField, c); - String _string_9 = UtplsqlResources.getString("RUNNER_PACKAGE_LABEL"); - final JLabel testPackageLabel = new JLabel(_string_9); - c.gridx = 0; - c.gridy = 1; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_8 = new Insets(5, 10, 0, 0); - c.insets = _insets_8; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - testInfoPanel.add(testPackageLabel, c); - RunnerTextField _runnerTextField_1 = new RunnerTextField(); - this.testPackageTextField = _runnerTextField_1; - this.testPackageTextField.setEditable(false); - c.gridx = 1; - c.gridy = 1; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_9 = new Insets(5, 5, 0, 10); - c.insets = _insets_9; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - testInfoPanel.add(this.testPackageTextField, c); - String _string_10 = UtplsqlResources.getString("RUNNER_PROCEDURE_LABEL"); - final JLabel testProcedureLabel = new JLabel(_string_10); - c.gridx = 0; - c.gridy = 2; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_10 = new Insets(5, 10, 0, 0); - c.insets = _insets_10; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - testInfoPanel.add(testProcedureLabel, c); - RunnerTextField _runnerTextField_2 = new RunnerTextField(); - this.testProcedureTextField = _runnerTextField_2; - this.testProcedureTextField.setEditable(false); - c.gridx = 1; - c.gridy = 2; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_11 = new Insets(5, 5, 0, 10); - c.insets = _insets_11; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - testInfoPanel.add(this.testProcedureTextField, c); - String _string_11 = UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL"); - final JLabel testDescriptionLabel = new JLabel(_string_11); - int _xifexpression = (int) 0; - boolean _isMacLookAndFeel = this.isMacLookAndFeel(); - if (_isMacLookAndFeel) { - _xifexpression = 5; - } else { - _xifexpression = 3; - } - testDescriptionLabel.setBorder(BorderFactory.createEmptyBorder(_xifexpression, 0, 0, 0)); - c.gridx = 0; - c.gridy = 3; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_12 = new Insets(5, 10, 0, 0); - c.insets = _insets_12; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - testInfoPanel.add(testDescriptionLabel, c); - RunnerTextArea _runnerTextArea = new RunnerTextArea(); - this.testDescriptionTextArea = _runnerTextArea; - this.testDescriptionTextArea.setEditable(false); - this.testDescriptionTextArea.setEnabled(true); - this.testDescriptionTextArea.setLineWrap(true); - this.testDescriptionTextArea.setWrapStyleWord(true); - c.gridx = 1; - c.gridy = 3; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_13 = new Insets(5, 5, 0, 10); - c.insets = _insets_13; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - testInfoPanel.add(this.testDescriptionTextArea, c); - String _string_12 = UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN"); - final JLabel testIdLabel = new JLabel(_string_12); - int _xifexpression_1 = (int) 0; - boolean _isMacLookAndFeel_1 = this.isMacLookAndFeel(); - if (_isMacLookAndFeel_1) { - _xifexpression_1 = 5; - } else { - _xifexpression_1 = 3; - } - testIdLabel.setBorder(BorderFactory.createEmptyBorder(_xifexpression_1, 0, 0, 0)); - c.gridx = 0; - c.gridy = 4; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_14 = new Insets(5, 10, 0, 0); - c.insets = _insets_14; - c.anchor = GridBagConstraints.NORTHWEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - testInfoPanel.add(testIdLabel, c); - RunnerTextArea _runnerTextArea_1 = new RunnerTextArea(); - this.testIdTextArea = _runnerTextArea_1; - this.testIdTextArea.setEditable(false); - this.testIdTextArea.setEnabled(true); - this.testIdTextArea.setLineWrap(true); - this.testIdTextArea.setWrapStyleWord(false); - c.gridx = 1; - c.gridy = 4; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_15 = new Insets(5, 5, 0, 10); - c.insets = _insets_15; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - testInfoPanel.add(this.testIdTextArea, c); - String _string_13 = UtplsqlResources.getString("RUNNER_START_LABEL"); - final JLabel testStartLabel = new JLabel(_string_13); - c.gridx = 0; - c.gridy = 5; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_16 = new Insets(5, 10, 10, 0); - c.insets = _insets_16; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.NONE; - c.weightx = 0; - c.weighty = 0; - testInfoPanel.add(testStartLabel, c); - RunnerTextField _runnerTextField_3 = new RunnerTextField(); - this.testStartTextField = _runnerTextField_3; - this.testStartTextField.setEditable(false); - c.gridx = 1; - c.gridy = 5; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_17 = new Insets(5, 5, 10, 10); - c.insets = _insets_17; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; - c.weighty = 0; - testInfoPanel.add(this.testStartTextField, c); - c.gridx = 0; - c.gridy = 6; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_18 = new Insets(0, 0, 0, 0); - c.insets = _insets_18; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 0; - c.weighty = 1; - testInfoPanel.add(Box.createVerticalGlue(), c); - final JScrollPane testPropertiesScrollPane = new JScrollPane(testInfoPanel); - FailuresTableModel _failuresTableModel = new FailuresTableModel(); - this.failuresTableModel = _failuresTableModel; - JTable _jTable_1 = new JTable(this.failuresTableModel); - this.failuresTable = _jTable_1; - JTableHeader _tableHeader_3 = this.failuresTable.getTableHeader(); - _tableHeader_3.setReorderingAllowed(false); - ListSelectionModel _selectionModel_1 = this.failuresTable.getSelectionModel(); - RunnerPanel.FailuresRowListener _failuresRowListener = new RunnerPanel.FailuresRowListener(this); - _selectionModel_1.addListSelectionListener(_failuresRowListener); - this.failuresTable.addMouseListener(this); - final RunnerPanel.FailuresTableHeaderRenderer failuresTableHeaderRenderer = new RunnerPanel.FailuresTableHeaderRenderer(); - final TableColumn failuresTableNumber = this.failuresTable.getColumnModel().getColumn(0); - failuresTableNumber.setHeaderRenderer(failuresTableHeaderRenderer); - failuresTableNumber.setPreferredWidth(30); - failuresTableNumber.setMaxWidth(30); - final TableColumn failuresDescription = this.failuresTable.getColumnModel().getColumn(1); - failuresDescription.setHeaderRenderer(failuresTableHeaderRenderer); - final JScrollPane failuresTableScrollPane = new JScrollPane(this.failuresTable); - RunnerTextPane _runnerTextPane = new RunnerTextPane(); - this.testFailureMessageTextPane = _runnerTextPane; - this.testFailureMessageTextPane.setEditable(false); - this.testFailureMessageTextPane.setEnabled(true); - this.testFailureMessageTextPane.setContentType("text/html"); - this.testFailureMessageTextPane.setMinimumSize(RunnerPanel.TEXTPANE_DIM); - this.testFailureMessageTextPane.setPreferredSize(RunnerPanel.TEXTPANE_DIM); - this.testFailureMessageTextPane.addHyperlinkListener(this); - final JScrollPane testFailureMessageScrollPane = new JScrollPane(this.testFailureMessageTextPane); - c.gridx = 1; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_19 = new Insets(10, 5, 0, 10); - c.insets = _insets_19; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.weighty = 6; - final JSplitPane failuresSplitPane = new JSplitPane(SwingConstants.HORIZONTAL, failuresTableScrollPane, testFailureMessageScrollPane); - failuresSplitPane.setResizeWeight(0.2); - final JPanel testErrorStackPanel = new JPanel(); - GridBagLayout _gridBagLayout_2 = new GridBagLayout(); - testErrorStackPanel.setLayout(_gridBagLayout_2); - RunnerTextPane _runnerTextPane_1 = new RunnerTextPane(); - this.testErrorStackTextPane = _runnerTextPane_1; - this.testErrorStackTextPane.setEditable(false); - this.testErrorStackTextPane.setEnabled(true); - this.testErrorStackTextPane.setContentType("text/html"); - this.testErrorStackTextPane.setMinimumSize(RunnerPanel.TEXTPANE_DIM); - this.testErrorStackTextPane.setPreferredSize(RunnerPanel.TEXTPANE_DIM); - this.testErrorStackTextPane.addHyperlinkListener(this); - final JScrollPane testErrorStackScrollPane = new JScrollPane(this.testErrorStackTextPane); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_20 = new Insets(0, 0, 0, 0); - c.insets = _insets_20; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.weighty = 1; - testErrorStackPanel.add(testErrorStackScrollPane, c); - final JPanel testWarningsPanel = new JPanel(); - GridBagLayout _gridBagLayout_3 = new GridBagLayout(); - testWarningsPanel.setLayout(_gridBagLayout_3); - RunnerTextPane _runnerTextPane_2 = new RunnerTextPane(); - this.testWarningsTextPane = _runnerTextPane_2; - this.testWarningsTextPane.setEditable(false); - this.testWarningsTextPane.setEnabled(true); - this.testWarningsTextPane.setContentType("text/html"); - this.testWarningsTextPane.setMinimumSize(RunnerPanel.TEXTPANE_DIM); - this.testWarningsTextPane.setPreferredSize(RunnerPanel.TEXTPANE_DIM); - this.testWarningsTextPane.addHyperlinkListener(this); - final JScrollPane testWarningsScrollPane = new JScrollPane(this.testWarningsTextPane); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_21 = new Insets(0, 0, 0, 0); - c.insets = _insets_21; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.weighty = 1; - testWarningsPanel.add(testWarningsScrollPane, c); - final JPanel testServerOutputPanel = new JPanel(); - GridBagLayout _gridBagLayout_4 = new GridBagLayout(); - testServerOutputPanel.setLayout(_gridBagLayout_4); - RunnerTextPane _runnerTextPane_3 = new RunnerTextPane(); - this.testServerOutputTextPane = _runnerTextPane_3; - this.testServerOutputTextPane.setEditable(false); - this.testServerOutputTextPane.setEnabled(true); - this.testServerOutputTextPane.setContentType("text/html"); - this.testServerOutputTextPane.setMinimumSize(RunnerPanel.TEXTPANE_DIM); - this.testServerOutputTextPane.setPreferredSize(RunnerPanel.TEXTPANE_DIM); - this.testServerOutputTextPane.addHyperlinkListener(this); - final JScrollPane testServerOutputScrollPane = new JScrollPane(this.testServerOutputTextPane); - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - Insets _insets_22 = new Insets(0, 0, 0, 0); - c.insets = _insets_22; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.weighty = 1; - testServerOutputPanel.add(testServerOutputScrollPane, c); - JTabbedPane _jTabbedPane = new JTabbedPane(); - this.testDetailTabbedPane = _jTabbedPane; - this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_TEST_TAB_LABEL"), testPropertiesScrollPane); - this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_FAILURES_TAB_LABEL"), failuresSplitPane); - this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_ERRORS_TAB_LABEL"), testErrorStackPanel); - this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_WARNINGS_TAB_LABEL"), testWarningsPanel); - this.testDetailTabbedPane.add(UtplsqlResources.getString("RUNNER_INFO_TAB_LABEL"), testServerOutputPanel); - final JSplitPane horizontalSplitPane = new JSplitPane(SwingConstants.HORIZONTAL, testOverviewScrollPane, this.testDetailTabbedPane); - horizontalSplitPane.setResizeWeight(0.5); - c.gridx = 0; - c.gridy = 4; - c.gridwidth = 2; - c.gridheight = 1; - Insets _insets_23 = new Insets(10, 10, 10, 10); - c.insets = _insets_23; - c.anchor = GridBagConstraints.WEST; - c.fill = GridBagConstraints.BOTH; - c.weightx = 1; - c.weighty = 1; - this.basePanel.add(horizontalSplitPane, c); - boolean _isMacLookAndFeel_2 = this.isMacLookAndFeel(); - if (_isMacLookAndFeel_2) { - Color _color = new Color(219, 219, 219); - final CompoundBorder border = BorderFactory.createCompoundBorder( - BorderFactory.createEmptyBorder(3, 3, 3, 3), - BorderFactory.createCompoundBorder( - BorderFactory.createLineBorder(_color), - BorderFactory.createEmptyBorder(1, 1, 1, 1))); - this.testDescriptionTextArea.setBorder(border); - this.testIdTextArea.setBorder(border); - } else { - final Border referenceBorder = this.testOwnerTextField.getBorder(); - this.testDescriptionTextArea.setBorder(referenceBorder); - this.testIdTextArea.setBorder(referenceBorder); } - } } From 77a5a28560d483ac86566fffe0b938644c7ef2ce Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 19:13:23 +0200 Subject: [PATCH 150/286] change return type of all doProcess methods to void --- .../main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java index 54c61635..84bfdc7b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java @@ -153,15 +153,14 @@ private void initRun() { panel.update(reporterId); } - private Object doProcess(final PreRunEvent event) { + private void doProcess(final PreRunEvent event) { run.setTotalNumberOfTests(event.getTotalNumberOfTests()); run.put(event.getItems()); run.setStatus(UtplsqlResources.getString("RUNNER_RUNNING_TEXT")); panel.update(reporterId); - return null; } - private Object doProcess(final PostRunEvent event) { + private void doProcess(final PostRunEvent event) { run.setStartTime(event.getStartTime()); run.setEndTime(event.getEndTime()); run.setExecutionTime(event.getExecutionTime()); @@ -169,7 +168,6 @@ private Object doProcess(final PostRunEvent event) { run.setServerOutput(event.getServerOutput()); run.setStatus(UtplsqlResources.getString("RUNNER_FINNISHED_TEXT")); panel.update(reporterId); - return null; } private void doProcess(final PreSuiteEvent event) { From 8101e1664587b48a1c86b2cb85facc1477c92897 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 21:12:51 +0200 Subject: [PATCH 151/286] add formatDateTime method (removed from RunnerPanel) --- .../java/org/utplsql/sqldev/model/StringTools.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java index ce9a86dd..23fc20f9 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/StringTools.java @@ -62,4 +62,16 @@ public static String replaceTabsWithSpaces(final CharSequence input, int indentS final String spaces = StringTools.repeat(" ", indentSpaces); return input.toString().replace("\t", spaces); } + + public static String formatDateTime(final String dateTime) { + if (dateTime == null) { + return null; + } else { + if (dateTime.length() == 26) { + return dateTime.replace("T", " ").substring(0, 23); + } else { + return dateTime; + } + } + } } From 773ed0f2f0ecb2cd234f0874e8f93953fab754e4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 21:14:45 +0200 Subject: [PATCH 152/286] move ActionListner, MouseListener, HyperLinkLister to anonymous classes --- .../utplsql/sqldev/ui/runner/RunnerPanel.java | 390 ++++++++---------- 1 file changed, 175 insertions(+), 215 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java index a4990ef4..c6e4b588 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java @@ -23,10 +23,9 @@ import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Rectangle; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; import java.sql.Connection; import java.util.ArrayList; import java.util.List; @@ -61,9 +60,6 @@ import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.event.HyperlinkEvent; -import javax.swing.event.HyperlinkListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; import javax.swing.plaf.basic.BasicProgressBarUI; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; @@ -74,6 +70,7 @@ import org.utplsql.sqldev.dal.UtplsqlDao; import org.utplsql.sqldev.exception.GenericDatabaseAccessException; import org.utplsql.sqldev.model.LimitedLinkedHashMap; +import org.utplsql.sqldev.model.StringTools; import org.utplsql.sqldev.model.preference.PreferenceModel; import org.utplsql.sqldev.model.runner.Counter; import org.utplsql.sqldev.model.runner.Expectation; @@ -90,7 +87,7 @@ import oracle.javatools.db.DBException; import oracle.javatools.ui.table.ToolbarButton; -public class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener { +public class RunnerPanel { private static final Logger logger = Logger.getLogger(RunnerPanel.class.getName()); private static final Color GREEN = new Color(0, 153, 0); private static final Color RED = new Color(153, 0, 0); @@ -144,74 +141,8 @@ public class RunnerPanel implements ActionListener, MouseListener, HyperlinkList private RunnerTextPane testServerOutputTextPane; private JTabbedPane testDetailTabbedPane; - public class TestOverviewRowListener implements ListSelectionListener { - - private String formatDateTime(final String dateTime) { - if (dateTime == null) { - return null; - } else { - if (dateTime.length() == 26) { - return dateTime.replace("T", " ").substring(0, 23); - } else { - return dateTime; - } - } - } - - @Override - public void valueChanged(final ListSelectionEvent event) { - final int rowIndex = testOverviewTable.getSelectedRow(); - if (rowIndex != -1) { - final int row = testOverviewTable.convertRowIndexToModel(rowIndex); - final Test test = testOverviewTableModel.getTest(row); - testOwnerTextField.setText(test.getOwnerName()); - testPackageTextField.setText(test.getObjectName()); - testProcedureTextField.setText(test.getProcedureName()); - testDescriptionTextArea.setText(test.getDescription() != null ? test.getDescription().trim() : null); - testIdTextArea.setText(test.getId()); - testStartTextField.setText(formatDateTime(test.getStartTime())); - failuresTableModel.setModel(test.getFailedExpectations()); - failuresTableModel.fireTableDataChanged(); - testFailureMessageTextPane.setText(null); - if (test.getFailedExpectations() != null && !test.getFailedExpectations().isEmpty()) { - failuresTable.setRowSelectionInterval(0, 0); - } - testErrorStackTextPane.setText(getHtml(test.getErrorStack() != null ? test.getErrorStack().trim() : null)); - testWarningsTextPane.setText(getHtml(test.getWarnings() != null ? test.getWarnings().trim() : null)); - testServerOutputTextPane.setText(getHtml(test.getServerOutput() != null ? test.getServerOutput().trim() : null)); - syncDetailTab(); - testOverviewRunMenuItem.setEnabled(true); - testOverviewRunWorksheetMenuItem.setEnabled(true); - } - } - } - - public class FailuresRowListener implements ListSelectionListener { - - @Override - public void valueChanged(final ListSelectionEvent event) { - final int rowIndex = failuresTable.getSelectedRow(); - if (rowIndex != -1) { - final int row = failuresTable.convertRowIndexToModel(rowIndex); - final Expectation expectation = failuresTableModel.getExpectation(row); - final String html = getHtml(expectation.getFailureText()); - testFailureMessageTextPane.setText(html); - } - } - } - - public class TimeFormatRenderer extends DefaultTableCellRenderer { - private static final long serialVersionUID = 7720067427609773267L; - - @Override - public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, - final boolean hasFocus, final int row, final int col) { - final SmartTime smartTime = new SmartTime(((Double) value), useSmartTimes); - return super.getTableCellRendererComponent(table, smartTime.toString(), isSelected, hasFocus, row, col); - } - } - - public class TestTableHeaderRenderer extends DefaultTableCellRenderer { + // used in multiple components, therefore an inner class + private class TestTableHeaderRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 6295858563570577027L; @Override @@ -240,7 +171,8 @@ public Component getTableCellRendererComponent(final JTable table, final Object } } - public class FailuresTableHeaderRenderer extends DefaultTableCellRenderer { + // used in mulitple components, therefore an inner class + private class FailuresTableHeaderRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 5059401447983514596L; @Override @@ -288,7 +220,9 @@ private void resetDerived() { private void refreshRunsComboBox() { if (!runs.isEmpty()) { - runComboBox.removeActionListener(this); + for (ActionListener al : runComboBox.getActionListeners()) { + runComboBox.removeActionListener(al); + } runComboBoxModel.removeAllElements(); List> entries = new ArrayList<>(runs.entrySet()); for (int i = runs.size() - 1; i >= 0; i--) { @@ -297,7 +231,7 @@ private void refreshRunsComboBox() { runComboBoxModel.addElement(item); } runComboBox.setSelectedIndex(0); - runComboBox.addActionListener(this); + runComboBox.addActionListener(event -> comboBoxAction()); } } @@ -648,121 +582,19 @@ private void fixCheckBoxMenuItem(final JCheckBoxMenuItem item) { } } } - - @Override - public void actionPerformed(final ActionEvent e) { - if (e.getSource() == refreshButton) { - resetDerived(); - testDetailTabbedPane.setSelectedIndex(0); - testOverviewTableModel.fireTableDataChanged(); - } else if (e.getSource() == rerunButton) { - final UtplsqlRunner runner = new UtplsqlRunner(currentRun.getPathList(), currentRun.getConnectionName()); - runner.runTestAsync(); - } else if (e.getSource() == rerunWorksheetButton) { - final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(currentRun.getPathList(), - currentRun.getConnectionName()); - worksheet.runTestAsync(); - } else if (e.getSource() == runComboBox) { - if (currentRun != null) { - @SuppressWarnings("unchecked") - final ComboBoxItem comboBoxItem = (ComboBoxItem) runComboBox - .getSelectedItem(); - if (currentRun.getReporterId() != null && !currentRun.getReporterId().equals(comboBoxItem.getKey())) { - update(comboBoxItem.getKey()); - testDetailTabbedPane.setSelectedIndex(0); - } - } - } else if (e.getSource() == clearButton) { - final Run run = currentRun; - runs.clear(); - currentRun = null; - setModel(run); - update(run.getReporterId()); - } else if (e.getSource() == testOverviewRunMenuItem) { - final UtplsqlRunner runner = new UtplsqlRunner(getPathListFromSelectedTests(), - currentRun.getConnectionName()); - runner.runTestAsync(); - } else if (e.getSource() == testOverviewRunWorksheetMenuItem) { - final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(this.getPathListFromSelectedTests(), - currentRun.getConnectionName()); - worksheet.runTestAsync(); - } else if (e.getSource() == showDisabledCounterCheckBoxMenuItem) { - applyShowDisabledCounter(); - fixCheckBoxMenuItem(showDisabledCounterCheckBoxMenuItem); - } else if (e.getSource() == showWarningsCounterCheckBoxMenuItem) { - applyShowWarningsCounter(); - fixCheckBoxMenuItem(showWarningsCounterCheckBoxMenuItem); - } else if (e.getSource() == showInfoCounterCheckBoxMenuItem) { - applyShowInfoCounter(); - fixCheckBoxMenuItem(showInfoCounterCheckBoxMenuItem); - } else if (e.getSource() == showSuccessfulTestsCheckBoxMenuItem) { - applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), - showDisabledTestsCheckBoxMenuItem.isSelected()); - fixCheckBoxMenuItem(showSuccessfulTestsCheckBoxMenuItem); - } else if (e.getSource() == showDisabledTestsCheckBoxMenuItem) { - applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), - showDisabledTestsCheckBoxMenuItem.isSelected()); - fixCheckBoxMenuItem(showDisabledTestsCheckBoxMenuItem); - } else if (e.getSource() == showTestDescriptionCheckBoxMenuItem) { - applyShowTestDescription(); - fixCheckBoxMenuItem(showTestDescriptionCheckBoxMenuItem); - } else if (e.getSource() == showWarningIndicatorCheckBoxMenuItem) { - applyShowWarningIndicator(showWarningIndicatorCheckBoxMenuItem.isSelected()); - fixCheckBoxMenuItem(showWarningIndicatorCheckBoxMenuItem); - } else if (e.getSource() == showInfoIndicatorCheckBoxMenuItem) { - applyShowInfoIndicator(showInfoIndicatorCheckBoxMenuItem.isSelected()); - fixCheckBoxMenuItem(showInfoIndicatorCheckBoxMenuItem); - } else if (e.getSource() == syncDetailTabCheckBoxMenuItem) { - syncDetailTab(); - fixCheckBoxMenuItem(syncDetailTabCheckBoxMenuItem); - } - } - - @Override - public void mouseClicked(final MouseEvent e) { - if (e.getClickCount() == 2) { - if (e.getSource() == testOverviewTable) { - if (failuresTable.getSelectedRowCount() == 1) { - openSelectedFailure(); - } else { - openSelectedTest(); - } - } else { - if (e.getSource() == failuresTable && failuresTable.getSelectedRowCount() == 1) { - openSelectedFailure(); - } + + private void comboBoxAction() { + if (currentRun != null) { + @SuppressWarnings("unchecked") + final ComboBoxItem comboBoxItem = (ComboBoxItem) runComboBox + .getSelectedItem(); + if (currentRun.getReporterId() != null && !currentRun.getReporterId().equals(comboBoxItem.getKey())) { + update(comboBoxItem.getKey()); + testDetailTabbedPane.setSelectedIndex(0); } } } - @Override - public void mouseEntered(final MouseEvent e) { - // ignore - } - - @Override - public void mouseExited(final MouseEvent e) { - // ignore - } - - @Override - public void mousePressed(final MouseEvent e) { - // ignore - } - - @Override - public void mouseReleased(final MouseEvent e) { - // ignore - } - - @Override - public void hyperlinkUpdate(final HyperlinkEvent e) { - if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { - final String link = e.getDescription(); - openLink(link); - } - } - private String getLinkedAndFormattedText(final String text) { if ((text == null)) { return ""; @@ -860,17 +692,28 @@ private void initializeGUI() { refreshButton = new ToolbarButton(UtplsqlResources.getIcon("REFRESH_ICON")); refreshButton.setToolTipText(UtplsqlResources.getString("RUNNER_REFRESH_TOOLTIP")); refreshButton.setBorder(buttonBorder); - refreshButton.addActionListener(this); + refreshButton.addActionListener(event -> { + resetDerived(); + testDetailTabbedPane.setSelectedIndex(0); + testOverviewTableModel.fireTableDataChanged(); + }); toolbar.add(refreshButton); rerunButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_ICON")); rerunButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_TOOLTIP")); rerunButton.setBorder(buttonBorder); - rerunButton.addActionListener(this); + rerunButton.addActionListener(event -> { + final UtplsqlRunner runner = new UtplsqlRunner(currentRun.getPathList(), currentRun.getConnectionName()); + runner.runTestAsync(); + }); toolbar.add(rerunButton); rerunWorksheetButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_WORKSHEET_ICON")); rerunWorksheetButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_WORKSHEET_TOOLTIP")); rerunWorksheetButton.setBorder(buttonBorder); - rerunWorksheetButton.addActionListener(this); + rerunWorksheetButton.addActionListener(event -> { + final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(currentRun.getPathList(), + currentRun.getConnectionName()); + worksheet.runTestAsync(); + }); toolbar.add(rerunWorksheetButton); toolbar.add(Box.createHorizontalGlue()); runComboBoxModel = new DefaultComboBoxModel<>(); @@ -878,12 +721,18 @@ private void initializeGUI() { runComboBox.setEditable(false); final Dimension comboBoxDim = new Dimension(500, 50); runComboBox.setMaximumSize(comboBoxDim); - runComboBox.addActionListener(this); + runComboBox.addActionListener(event -> comboBoxAction()); toolbar.add(runComboBox); clearButton = new ToolbarButton(UtplsqlResources.getIcon("CLEAR_ICON")); clearButton.setToolTipText(UtplsqlResources.getString("RUNNER_CLEAR_BUTTON")); clearButton.setBorder(buttonBorder); - clearButton.addActionListener(this); + clearButton.addActionListener(event -> { + final Run run = currentRun; + runs.clear(); + currentRun = null; + setModel(run); + update(run.getReporterId()); + }); toolbar.add(clearButton); c.gridx = 0; c.gridy = 0; @@ -984,13 +833,22 @@ private void initializeGUI() { // Context menu for counters panel final JPopupMenu countersPopupMenu = new JPopupMenu(); showDisabledCounterCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_DISABLED_COUNTER_LABEL").replace("?", ""), true); - showDisabledCounterCheckBoxMenuItem.addActionListener(this); + showDisabledCounterCheckBoxMenuItem.addActionListener(event -> { + applyShowDisabledCounter(); + fixCheckBoxMenuItem(showDisabledCounterCheckBoxMenuItem); + }); countersPopupMenu.add(showDisabledCounterCheckBoxMenuItem); showWarningsCounterCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_WARNINGS_COUNTER_LABEL").replace("?", ""), true); - showWarningsCounterCheckBoxMenuItem.addActionListener(this); + showWarningsCounterCheckBoxMenuItem.addActionListener(event -> { + applyShowWarningsCounter(); + fixCheckBoxMenuItem(showWarningsCounterCheckBoxMenuItem); + }); countersPopupMenu.add(showWarningsCounterCheckBoxMenuItem); showInfoCounterCheckBoxMenuItem = new JCheckBoxMenuItem( UtplsqlResources.getString("PREF_SHOW_INFO_COUNTER_LABEL").replace("?", ""), true); - showInfoCounterCheckBoxMenuItem.addActionListener(this); + showInfoCounterCheckBoxMenuItem.addActionListener(event -> { + applyShowInfoCounter(); + fixCheckBoxMenuItem(showInfoCounterCheckBoxMenuItem); + }); countersPopupMenu.add(showInfoCounterCheckBoxMenuItem); counterPanel.setComponentPopupMenu(countersPopupMenu); @@ -1021,8 +879,45 @@ private void initializeGUI() { testOverviewTable.setRowHeight(OVERVIEW_TABLE_ROW_HEIGHT); testOverviewTable.getTableHeader().setPreferredSize( new Dimension(testOverviewTable.getTableHeader().getPreferredSize().width, OVERVIEW_TABLE_ROW_HEIGHT)); - testOverviewTable.getSelectionModel().addListSelectionListener(new TestOverviewRowListener()); - testOverviewTable.addMouseListener(this); + testOverviewTable.getSelectionModel().addListSelectionListener(event -> { + final int rowIndex = testOverviewTable.getSelectedRow(); + if (rowIndex != -1) { + final int row = testOverviewTable.convertRowIndexToModel(rowIndex); + final Test test = testOverviewTableModel.getTest(row); + testOwnerTextField.setText(test.getOwnerName()); + testPackageTextField.setText(test.getObjectName()); + testProcedureTextField.setText(test.getProcedureName()); + testDescriptionTextArea.setText(test.getDescription() != null ? test.getDescription().trim() : null); + testIdTextArea.setText(test.getId()); + testStartTextField.setText(StringTools.formatDateTime(test.getStartTime())); + failuresTableModel.setModel(test.getFailedExpectations()); + failuresTableModel.fireTableDataChanged(); + testFailureMessageTextPane.setText(null); + if (test.getFailedExpectations() != null && !test.getFailedExpectations().isEmpty()) { + failuresTable.setRowSelectionInterval(0, 0); + } + testErrorStackTextPane + .setText(getHtml(test.getErrorStack() != null ? test.getErrorStack().trim() : null)); + testWarningsTextPane.setText(getHtml(test.getWarnings() != null ? test.getWarnings().trim() : null)); + testServerOutputTextPane + .setText(getHtml(test.getServerOutput() != null ? test.getServerOutput().trim() : null)); + syncDetailTab(); + testOverviewRunMenuItem.setEnabled(true); + testOverviewRunWorksheetMenuItem.setEnabled(true); + } + }); + testOverviewTable.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(final MouseEvent e) { + if (e.getClickCount() == 2) { + if (failuresTable.getSelectedRowCount() == 1) { + openSelectedFailure(); + } else { + openSelectedTest(); + } + } + } + }); RepaintManager.currentManager(testOverviewTable).setDoubleBufferingEnabled(true); final TestTableHeaderRenderer testTableHeaderRenderer = new TestTableHeaderRenderer(); final TableColumn overviewTableStatus = testOverviewTable.getColumnModel().getColumn(0); @@ -1046,38 +941,76 @@ private void initializeGUI() { overviewTableTime.setPreferredWidth(60); overviewTableTime.setMaxWidth(100); overviewTableTime.setHeaderRenderer(testTableHeaderRenderer); - final TimeFormatRenderer timeFormatRenderer = new TimeFormatRenderer(); - timeFormatRenderer.setHorizontalAlignment(JLabel.RIGHT); - overviewTableTime.setCellRenderer(timeFormatRenderer); + overviewTableTime.setCellRenderer(new DefaultTableCellRenderer() { + private static final long serialVersionUID = 7720067427609773267L; + { + setHorizontalAlignment(JLabel.RIGHT); + } + + @Override + public Component getTableCellRendererComponent(final JTable table, final Object value, + final boolean isSelected, final boolean hasFocus, final int row, final int col) { + final SmartTime smartTime = new SmartTime(((Double) value), useSmartTimes); + return super.getTableCellRendererComponent(table, smartTime.toString(), isSelected, hasFocus, row, col); + } + }); final JScrollPane testOverviewScrollPane = new JScrollPane(testOverviewTable); // Context menu for test overview final JPopupMenu testOverviewPopupMenu = new JPopupMenu(); testOverviewRunMenuItem = new JMenuItem(UtplsqlResources.getString("RUNNER_RUN_MENUITEM"), UtplsqlResources.getIcon("RUN_ICON")); - testOverviewRunMenuItem.addActionListener(this); + testOverviewRunMenuItem.addActionListener(event -> { + final UtplsqlRunner runner = new UtplsqlRunner(getPathListFromSelectedTests(), + currentRun.getConnectionName()); + runner.runTestAsync(); + }); testOverviewPopupMenu.add(testOverviewRunMenuItem); testOverviewRunWorksheetMenuItem = new JMenuItem(UtplsqlResources.getString("RUNNER_RUN_WORKSHEET_MENUITEM"), UtplsqlResources.getIcon("RUN_WORKSHEET_ICON")); - testOverviewRunWorksheetMenuItem.addActionListener(this); + testOverviewRunWorksheetMenuItem.addActionListener(event -> { + final UtplsqlWorksheetRunner worksheet = new UtplsqlWorksheetRunner(this.getPathListFromSelectedTests(), + currentRun.getConnectionName()); + worksheet.runTestAsync(); + }); testOverviewPopupMenu.add(testOverviewRunWorksheetMenuItem); testOverviewPopupMenu.add(new JSeparator()); showSuccessfulTestsCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_SUCCESSFUL_TESTS_LABEL").replace("?", ""), true); - showSuccessfulTestsCheckBoxMenuItem.addActionListener(this); + showSuccessfulTestsCheckBoxMenuItem.addActionListener(event -> { + applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), + showDisabledTestsCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showSuccessfulTestsCheckBoxMenuItem); + }); testOverviewPopupMenu.add(showSuccessfulTestsCheckBoxMenuItem); showDisabledTestsCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_DISABLED_TESTS_LABEL").replace("?", ""), true); - showDisabledTestsCheckBoxMenuItem.addActionListener(this); + showDisabledTestsCheckBoxMenuItem.addActionListener(event -> { + applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), + showDisabledTestsCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showDisabledTestsCheckBoxMenuItem); + }); testOverviewPopupMenu.add(showDisabledTestsCheckBoxMenuItem); testOverviewPopupMenu.add(new JSeparator()); showTestDescriptionCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_TEST_DESCRIPTION_LABEL").replace("?", ""), true); - showTestDescriptionCheckBoxMenuItem.addActionListener(this); + showTestDescriptionCheckBoxMenuItem.addActionListener(event -> { + applyShowTestDescription(); + fixCheckBoxMenuItem(showTestDescriptionCheckBoxMenuItem); + }); testOverviewPopupMenu.add(showTestDescriptionCheckBoxMenuItem); showWarningIndicatorCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_WARNING_INDICATOR_LABEL").replace("?", ""), true); - showWarningIndicatorCheckBoxMenuItem.addActionListener(this); + showWarningIndicatorCheckBoxMenuItem.addActionListener(event -> { + applyShowWarningIndicator(showWarningIndicatorCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showWarningIndicatorCheckBoxMenuItem); + }); testOverviewPopupMenu.add(showWarningIndicatorCheckBoxMenuItem); showInfoIndicatorCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SHOW_INFO_INDICATOR_LABEL").replace("?", ""), true); - showInfoIndicatorCheckBoxMenuItem.addActionListener(this); + showInfoIndicatorCheckBoxMenuItem.addActionListener(event -> { + applyShowInfoIndicator(showInfoIndicatorCheckBoxMenuItem.isSelected()); + fixCheckBoxMenuItem(showInfoIndicatorCheckBoxMenuItem); + }); testOverviewPopupMenu.add(showInfoIndicatorCheckBoxMenuItem); syncDetailTabCheckBoxMenuItem = new JCheckBoxMenuItem(UtplsqlResources.getString("PREF_SYNC_DETAIL_TAB_LABEL").replace("?", ""), true); - syncDetailTabCheckBoxMenuItem.addActionListener(this); + syncDetailTabCheckBoxMenuItem.addActionListener(event -> { + syncDetailTab(); + fixCheckBoxMenuItem(syncDetailTabCheckBoxMenuItem); + }); testOverviewPopupMenu.add(syncDetailTabCheckBoxMenuItem); testOverviewTable.setComponentPopupMenu(testOverviewPopupMenu); testOverviewTable.getTableHeader().setComponentPopupMenu(testOverviewPopupMenu); @@ -1254,8 +1187,25 @@ private void initializeGUI() { failuresTableModel = new FailuresTableModel(); failuresTable = new JTable(failuresTableModel); failuresTable.getTableHeader().setReorderingAllowed(false); - failuresTable.getSelectionModel().addListSelectionListener(new FailuresRowListener()); - failuresTable.addMouseListener(this); + failuresTable.getSelectionModel().addListSelectionListener(event -> { + final int rowIndex = failuresTable.getSelectedRow(); + if (rowIndex != -1) { + final int row = failuresTable.convertRowIndexToModel(rowIndex); + final Expectation expectation = failuresTableModel.getExpectation(row); + final String html = getHtml(expectation.getFailureText()); + testFailureMessageTextPane.setText(html); + } + }); + failuresTable.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(final MouseEvent e) { + if (e.getClickCount() == 2) { + if (failuresTable.getSelectedRowCount() == 1) { + openSelectedFailure(); + } + } + } + }); final FailuresTableHeaderRenderer failuresTableHeaderRenderer = new FailuresTableHeaderRenderer(); final TableColumn failuresTableNumber = failuresTable.getColumnModel().getColumn(0); failuresTableNumber.setHeaderRenderer(failuresTableHeaderRenderer); @@ -1271,7 +1221,12 @@ private void initializeGUI() { testFailureMessageTextPane.setContentType("text/html"); testFailureMessageTextPane.setMinimumSize(TEXTPANE_DIM); testFailureMessageTextPane.setPreferredSize(TEXTPANE_DIM); - testFailureMessageTextPane.addHyperlinkListener(this); + testFailureMessageTextPane.addHyperlinkListener(event -> { + if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + final String link = event.getDescription(); + openLink(link); + } + }); final JScrollPane testFailureMessageScrollPane = new JScrollPane(testFailureMessageTextPane); c.gridx = 1; c.gridy = 0; @@ -1297,7 +1252,12 @@ private void initializeGUI() { testErrorStackTextPane.setContentType("text/html"); testErrorStackTextPane.setMinimumSize(TEXTPANE_DIM); testErrorStackTextPane.setPreferredSize(TEXTPANE_DIM); - testErrorStackTextPane.addHyperlinkListener(this); + testErrorStackTextPane.addHyperlinkListener(event -> { + if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + final String link = event.getDescription(); + openLink(link); + } + }); final JScrollPane testErrorStackScrollPane = new JScrollPane(testErrorStackTextPane); c.gridx = 0; c.gridy = 0; @@ -1319,7 +1279,7 @@ private void initializeGUI() { testWarningsTextPane.setContentType("text/html"); testWarningsTextPane.setMinimumSize(TEXTPANE_DIM); testWarningsTextPane.setPreferredSize(TEXTPANE_DIM); - testWarningsTextPane.addHyperlinkListener(this); + testWarningsTextPane.addHyperlinkListener(event -> openLink(event.getDescription())); final JScrollPane testWarningsScrollPane = new JScrollPane(testWarningsTextPane); c.gridx = 0; c.gridy = 0; @@ -1341,7 +1301,7 @@ private void initializeGUI() { testServerOutputTextPane.setContentType("text/html"); testServerOutputTextPane.setMinimumSize(TEXTPANE_DIM); testServerOutputTextPane.setPreferredSize(TEXTPANE_DIM); - testServerOutputTextPane.addHyperlinkListener(this); + testServerOutputTextPane.addHyperlinkListener(event -> openLink(event.getDescription())); final JScrollPane testServerOutputScrollPane = new JScrollPane(testServerOutputTextPane); c.gridx = 0; c.gridy = 0; From e8c9b58d5061ee5cceba77593dd7b0b898fd8d27 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Wed, 27 May 2020 21:24:05 +0200 Subject: [PATCH 153/286] move unnecessary private fields to local variables --- .../utplsql/sqldev/ui/runner/RunnerPanel.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java index c6e4b588..08b73ace 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java @@ -99,11 +99,7 @@ public class RunnerPanel { private LimitedLinkedHashMap runs = new LimitedLinkedHashMap<>(10); private Run currentRun; private JPanel basePanel; - private ToolbarButton refreshButton; - private ToolbarButton rerunButton; - private ToolbarButton rerunWorksheetButton; private DefaultComboBoxModel> runComboBoxModel; - private ToolbarButton clearButton; private JComboBox> runComboBox; private JLabel statusLabel; private Timer elapsedTimeTimer; @@ -689,7 +685,7 @@ private void initializeGUI() { final GradientToolbar toolbar = new GradientToolbar(); toolbar.setFloatable(false); final EmptyBorder buttonBorder = new EmptyBorder(new Insets(2, 4, 2, 4)); // insets: top, left, bottom, right - refreshButton = new ToolbarButton(UtplsqlResources.getIcon("REFRESH_ICON")); + final ToolbarButton refreshButton = new ToolbarButton(UtplsqlResources.getIcon("REFRESH_ICON")); refreshButton.setToolTipText(UtplsqlResources.getString("RUNNER_REFRESH_TOOLTIP")); refreshButton.setBorder(buttonBorder); refreshButton.addActionListener(event -> { @@ -698,7 +694,7 @@ private void initializeGUI() { testOverviewTableModel.fireTableDataChanged(); }); toolbar.add(refreshButton); - rerunButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_ICON")); + final ToolbarButton rerunButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_ICON")); rerunButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_TOOLTIP")); rerunButton.setBorder(buttonBorder); rerunButton.addActionListener(event -> { @@ -706,7 +702,7 @@ private void initializeGUI() { runner.runTestAsync(); }); toolbar.add(rerunButton); - rerunWorksheetButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_WORKSHEET_ICON")); + final ToolbarButton rerunWorksheetButton = new ToolbarButton(UtplsqlResources.getIcon("RUN_WORKSHEET_ICON")); rerunWorksheetButton.setToolTipText(UtplsqlResources.getString("RUNNER_RERUN_WORKSHEET_TOOLTIP")); rerunWorksheetButton.setBorder(buttonBorder); rerunWorksheetButton.addActionListener(event -> { @@ -723,7 +719,7 @@ private void initializeGUI() { runComboBox.setMaximumSize(comboBoxDim); runComboBox.addActionListener(event -> comboBoxAction()); toolbar.add(runComboBox); - clearButton = new ToolbarButton(UtplsqlResources.getIcon("CLEAR_ICON")); + final ToolbarButton clearButton = new ToolbarButton(UtplsqlResources.getIcon("CLEAR_ICON")); clearButton.setToolTipText(UtplsqlResources.getString("RUNNER_CLEAR_BUTTON")); clearButton.setBorder(buttonBorder); clearButton.addActionListener(event -> { @@ -1199,10 +1195,8 @@ public Component getTableCellRendererComponent(final JTable table, final Object failuresTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(final MouseEvent e) { - if (e.getClickCount() == 2) { - if (failuresTable.getSelectedRowCount() == 1) { - openSelectedFailure(); - } + if (e.getClickCount() == 2 && failuresTable.getSelectedRowCount() == 1) { + openSelectedFailure(); } } }); From 9eda9e6136f904d3fd05be509940def8d17429cd Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 07:59:52 +0200 Subject: [PATCH 154/286] rename RunnerTextArea.xtend to RunnerTextArea.java --- .../ui/runner/{RunnerTextArea.xtend => RunnerTextArea.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{RunnerTextArea.xtend => RunnerTextArea.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java From 3450897e5544bda434a61599163e238bddd76667 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 08:00:10 +0200 Subject: [PATCH 155/286] add RunnerTextArea.java generated by Xtend 2.20.0 --- .../sqldev/ui/runner/RunnerTextArea.java | 85 ++++++++++--------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java index be9520c7..452ca79e 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java @@ -1,40 +1,47 @@ -package org.utplsql.sqldev.ui.runner - -import java.awt.Graphics -import java.awt.event.FocusEvent -import java.awt.event.FocusListener -import javax.swing.JTextArea -import javax.swing.UIManager - -class RunnerTextArea extends JTextArea implements FocusListener{ - - new() { - super() - this.addFocusListener = this - } - - override paintComponent(Graphics g) { - // default for non-opaque components - if (!opaque) { - super.paintComponent(g) - return - } - - // use value of JTextField for consistency - g.color = UIManager.getColor("TextField.inactiveBackground") - g.fillRect(3, 3, width - 6, height - 6) - - // do rest, changing opaque to ensure background is not overwritten - setOpaque(false) - super.paintComponent(g) - setOpaque(true) - } - - override void focusGained(FocusEvent e) { - this.caret.visible = true - } - - override focusLost(FocusEvent e) { - this.caret.visible = false - } +package org.utplsql.sqldev.ui.runner; + +import java.awt.Graphics; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import javax.swing.JTextArea; +import javax.swing.UIManager; +import javax.swing.text.Caret; + +@SuppressWarnings("all") +public class RunnerTextArea extends JTextArea implements FocusListener { + public RunnerTextArea() { + super(); + this.addFocusListener(this); + } + + @Override + public void paintComponent(final Graphics g) { + boolean _isOpaque = this.isOpaque(); + boolean _not = (!_isOpaque); + if (_not) { + super.paintComponent(g); + return; + } + g.setColor(UIManager.getColor("TextField.inactiveBackground")); + int _width = this.getWidth(); + int _minus = (_width - 6); + int _height = this.getHeight(); + int _minus_1 = (_height - 6); + g.fillRect(3, 3, _minus, _minus_1); + this.setOpaque(false); + super.paintComponent(g); + this.setOpaque(true); + } + + @Override + public void focusGained(final FocusEvent e) { + Caret _caret = this.getCaret(); + _caret.setVisible(true); + } + + @Override + public void focusLost(final FocusEvent e) { + Caret _caret = this.getCaret(); + _caret.setVisible(false); + } } From 1c0033afb5400a10d601117ea23bc0e1f8614a6a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 08:07:59 +0200 Subject: [PATCH 156/286] convert RunnerTextArea to Java, removing Xtend dependencies --- .../sqldev/ui/runner/RunnerTextArea.java | 85 +++++++++++-------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java index 452ca79e..25377d1d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextArea.java @@ -1,47 +1,60 @@ +/* + * Copyright 2019 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.utplsql.sqldev.ui.runner; import java.awt.Graphics; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; + import javax.swing.JTextArea; import javax.swing.UIManager; -import javax.swing.text.Caret; -@SuppressWarnings("all") public class RunnerTextArea extends JTextArea implements FocusListener { - public RunnerTextArea() { - super(); - this.addFocusListener(this); - } - - @Override - public void paintComponent(final Graphics g) { - boolean _isOpaque = this.isOpaque(); - boolean _not = (!_isOpaque); - if (_not) { - super.paintComponent(g); - return; + private static final long serialVersionUID = -1536393556223117580L; + + public RunnerTextArea() { + super(); + addFocusListener(this); + } + + @Override + public void paintComponent(final Graphics g) { + // default for non-opaque components + if (!isOpaque()) { + super.paintComponent(g); + return; + } + + // use value of JTextField for consistency + g.setColor(UIManager.getColor("TextField.inactiveBackground")); + g.fillRect(3, 3, getWidth() - 6, getHeight() - 6); + + // do rest, changing opaque to ensure background is not overwritten + setOpaque(false); + super.paintComponent(g); + setOpaque(true); + } + + @Override + public void focusGained(final FocusEvent e) { + getCaret().setVisible(true); + } + + @Override + public void focusLost(final FocusEvent e) { + getCaret().setVisible(false); } - g.setColor(UIManager.getColor("TextField.inactiveBackground")); - int _width = this.getWidth(); - int _minus = (_width - 6); - int _height = this.getHeight(); - int _minus_1 = (_height - 6); - g.fillRect(3, 3, _minus, _minus_1); - this.setOpaque(false); - super.paintComponent(g); - this.setOpaque(true); - } - - @Override - public void focusGained(final FocusEvent e) { - Caret _caret = this.getCaret(); - _caret.setVisible(true); - } - - @Override - public void focusLost(final FocusEvent e) { - Caret _caret = this.getCaret(); - _caret.setVisible(false); - } } From ddbc41951cb95cf15315bdd2d4e226cd33329f3d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 08:09:10 +0200 Subject: [PATCH 157/286] rename RunnerTextField.xtend to RunnerTextField.java --- .../ui/runner/{RunnerTextField.xtend => RunnerTextField.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{RunnerTextField.xtend => RunnerTextField.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java From dd3f071e6f33c3c3b6ee85d7e88853945e287c6f Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 08:09:32 +0200 Subject: [PATCH 158/286] add RunnerTextField.java generated by Xtend 2.20.0 --- .../sqldev/ui/runner/RunnerTextField.java | 76 ++++++++++--------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java index 65e326ea..c15d05f5 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java @@ -1,39 +1,43 @@ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.awt.Graphics -import java.awt.event.FocusEvent -import java.awt.event.FocusListener -import javax.swing.JTextField -import javax.swing.UIManager +import java.awt.Graphics; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.text.Caret; -class RunnerTextField extends JTextField implements FocusListener { - - new() { - super() - this.addFocusListener = this - } - - override paintComponent(Graphics g) { - // default for non-opaque components - if (!opaque) { - super.paintComponent(g) - return - } - - g.color = UIManager.getColor("TextField.inactiveBackground") - g.fillRect(0, 0, width, height) - - // do rest, changing opaque to ensure background is not overwritten - setOpaque(false) - super.paintComponent(g) - setOpaque(true) - } - - override void focusGained(FocusEvent e) { - this.caret.visible = true - } - - override focusLost(FocusEvent e) { - this.caret.visible = false - } +@SuppressWarnings("all") +public class RunnerTextField extends JTextField implements FocusListener { + public RunnerTextField() { + super(); + this.addFocusListener(this); + } + + @Override + public void paintComponent(final Graphics g) { + boolean _isOpaque = this.isOpaque(); + boolean _not = (!_isOpaque); + if (_not) { + super.paintComponent(g); + return; + } + g.setColor(UIManager.getColor("TextField.inactiveBackground")); + g.fillRect(0, 0, this.getWidth(), this.getHeight()); + this.setOpaque(false); + super.paintComponent(g); + this.setOpaque(true); + } + + @Override + public void focusGained(final FocusEvent e) { + Caret _caret = this.getCaret(); + _caret.setVisible(true); + } + + @Override + public void focusLost(final FocusEvent e) { + Caret _caret = this.getCaret(); + _caret.setVisible(false); + } } From 345a65b45f4d7ff3713f491f0f5875df0eb7fbff Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 09:16:32 +0200 Subject: [PATCH 159/286] convert RunnerTextField to Java, removing Xtend dependencies --- .../sqldev/ui/runner/RunnerTextField.java | 81 +++++++++++-------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java index c15d05f5..0553ab5e 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextField.java @@ -1,43 +1,60 @@ +/* + * Copyright 2019 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.utplsql.sqldev.ui.runner; import java.awt.Graphics; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; + import javax.swing.JTextField; import javax.swing.UIManager; -import javax.swing.text.Caret; -@SuppressWarnings("all") public class RunnerTextField extends JTextField implements FocusListener { - public RunnerTextField() { - super(); - this.addFocusListener(this); - } - - @Override - public void paintComponent(final Graphics g) { - boolean _isOpaque = this.isOpaque(); - boolean _not = (!_isOpaque); - if (_not) { - super.paintComponent(g); - return; + private static final long serialVersionUID = 4527406698634871523L; + + public RunnerTextField() { + super(); + addFocusListener(this); + } + + @Override + public void paintComponent(final Graphics g) { + // default for non-opaque components + if (!isOpaque()) { + super.paintComponent(g); + return; + } + + // use value of JTextField for consistency + g.setColor(UIManager.getColor("TextField.inactiveBackground")); + g.fillRect(0, 0, getWidth(), getHeight()); + + // do rest, changing opaque to ensure background is not overwritten + setOpaque(false); + super.paintComponent(g); + setOpaque(true); + } + + @Override + public void focusGained(final FocusEvent e) { + getCaret().setVisible(true); + } + + @Override + public void focusLost(final FocusEvent e) { + getCaret().setVisible(false); } - g.setColor(UIManager.getColor("TextField.inactiveBackground")); - g.fillRect(0, 0, this.getWidth(), this.getHeight()); - this.setOpaque(false); - super.paintComponent(g); - this.setOpaque(true); - } - - @Override - public void focusGained(final FocusEvent e) { - Caret _caret = this.getCaret(); - _caret.setVisible(true); - } - - @Override - public void focusLost(final FocusEvent e) { - Caret _caret = this.getCaret(); - _caret.setVisible(false); - } } From 429e3e5e06622ea957d831a7582e05c059f09024 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 09:17:39 +0200 Subject: [PATCH 160/286] rename RunnerView.xtend to RunnerView.java --- .../sqldev/ui/runner/{RunnerView.xtend => RunnerView.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{RunnerView.xtend => RunnerView.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java From 098a722253d623c0e293a68247f24ca8fe5e9b42 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 09:17:53 +0200 Subject: [PATCH 161/286] add RunnerView.java generated by Xtend 2.20.0 --- .../utplsql/sqldev/ui/runner/RunnerView.java | 69 +++++++++++-------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java index 49050d4a..6a12c237 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,34 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import oracle.ide.docking.DockableWindow -import oracle.ide.layout.ViewId -import org.utplsql.sqldev.resources.UtplsqlResources +import java.awt.Component; +import javax.swing.Icon; +import oracle.ide.docking.DockableWindow; +import oracle.ide.layout.ViewId; +import org.utplsql.sqldev.resources.UtplsqlResources; +import org.utplsql.sqldev.ui.runner.RunnerFactory; +import org.utplsql.sqldev.ui.runner.RunnerPanel; -class RunnerView extends DockableWindow { - static val VIEW_NAME = "UTPLSQL_RUNNER_VIEW" - public static val ViewId VIEW_ID = new ViewId(RunnerFactory.FACTORY_NAME, VIEW_NAME) - var RunnerPanel panel - - override getTitleName() { - return UtplsqlResources.getString("RUNNER_VIEW_TITLE") - } - - override getGUI() { - if (panel === null) { - panel = new RunnerPanel - } - return panel.getGUI() - } - - override getTabIcon() { - return UtplsqlResources.getIcon("UTPLSQL_ICON") - } - - def getRunnerPanel() { - getGUI() - return panel - } +@SuppressWarnings("all") +public class RunnerView extends DockableWindow { + private static final String VIEW_NAME = "UTPLSQL_RUNNER_VIEW"; + + public static final ViewId VIEW_ID = new ViewId(RunnerFactory.FACTORY_NAME, RunnerView.VIEW_NAME); + + private RunnerPanel panel; + + @Override + public String getTitleName() { + return UtplsqlResources.getString("RUNNER_VIEW_TITLE"); + } + + @Override + public Component getGUI() { + if ((this.panel == null)) { + RunnerPanel _runnerPanel = new RunnerPanel(); + this.panel = _runnerPanel; + } + return this.panel.getGUI(); + } + + @Override + public Icon getTabIcon() { + return UtplsqlResources.getIcon("UTPLSQL_ICON"); + } + + public RunnerPanel getRunnerPanel() { + this.getGUI(); + return this.panel; + } } From d54e73fc1b862da265ec3f60bc00d4d9737259c4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:01:51 +0200 Subject: [PATCH 162/286] convert RunnerView to Java, removing Xtend dependencies --- .../utplsql/sqldev/ui/runner/RunnerView.java | 63 +++++++++---------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java index 6a12c237..e97d7ba0 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerView.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,42 +16,39 @@ package org.utplsql.sqldev.ui.runner; import java.awt.Component; + import javax.swing.Icon; + +import org.utplsql.sqldev.resources.UtplsqlResources; + import oracle.ide.docking.DockableWindow; import oracle.ide.layout.ViewId; -import org.utplsql.sqldev.resources.UtplsqlResources; -import org.utplsql.sqldev.ui.runner.RunnerFactory; -import org.utplsql.sqldev.ui.runner.RunnerPanel; -@SuppressWarnings("all") public class RunnerView extends DockableWindow { - private static final String VIEW_NAME = "UTPLSQL_RUNNER_VIEW"; - - public static final ViewId VIEW_ID = new ViewId(RunnerFactory.FACTORY_NAME, RunnerView.VIEW_NAME); - - private RunnerPanel panel; - - @Override - public String getTitleName() { - return UtplsqlResources.getString("RUNNER_VIEW_TITLE"); - } - - @Override - public Component getGUI() { - if ((this.panel == null)) { - RunnerPanel _runnerPanel = new RunnerPanel(); - this.panel = _runnerPanel; + private static final String VIEW_NAME = "UTPLSQL_RUNNER_VIEW"; + public static final ViewId VIEW_ID = new ViewId(RunnerFactory.FACTORY_NAME, VIEW_NAME); + private RunnerPanel panel; + + @Override + public String getTitleName() { + return UtplsqlResources.getString("RUNNER_VIEW_TITLE"); + } + + @Override + public Component getGUI() { + if (panel == null) { + panel = new RunnerPanel(); + } + return panel.getGUI(); + } + + @Override + public Icon getTabIcon() { + return UtplsqlResources.getIcon("UTPLSQL_ICON"); + } + + public RunnerPanel getRunnerPanel() { + getGUI(); + return panel; } - return this.panel.getGUI(); - } - - @Override - public Icon getTabIcon() { - return UtplsqlResources.getIcon("UTPLSQL_ICON"); - } - - public RunnerPanel getRunnerPanel() { - this.getGUI(); - return this.panel; - } } From 6aa0411be124438999de502e34d8be1afdb7bdb2 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:02:49 +0200 Subject: [PATCH 163/286] rename RunnerTextPane.xtend to RunnerTextPane.java --- .../ui/runner/{RunnerTextPane.xtend => RunnerTextPane.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{RunnerTextPane.xtend => RunnerTextPane.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java From 3d51f9fe89c4b64feeb95ca1e3bbde2b9e01d311 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:03:06 +0200 Subject: [PATCH 164/286] add RunnerTextPane.java generated by Xtend 2.20.0 --- .../sqldev/ui/runner/RunnerTextPane.java | 92 ++++++++++--------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java index e3e4c663..27caaf98 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,50 +13,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.utplsql.sqldev.ui.runner; -package org.utplsql.sqldev.ui.runner +import java.awt.Graphics; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import javax.swing.JTextPane; +import javax.swing.UIManager; +import javax.swing.text.Caret; -import java.awt.Graphics -import java.awt.event.FocusEvent -import java.awt.event.FocusListener -import javax.swing.JTextPane -import javax.swing.UIManager - -class RunnerTextPane extends JTextPane implements FocusListener{ - - new() { - super() - this.addFocusListener = this - } - - override paintComponent(Graphics g) { - // default for non-opaque components - if (!opaque) { - super.paintComponent(g) - return - } - - // use value of JTextField for consistency - g.color = UIManager.getColor("TextField.inactiveBackground") - g.fillRect(0, 0, width, height) - - // do rest, changing opaque to ensure background is not overwritten - setOpaque(false) - super.paintComponent(g) - setOpaque(true) - } - - override void focusGained(FocusEvent e) { - this.caret.visible = true - } - - override focusLost(FocusEvent e) { - this.caret.visible = false - } - - override setText(String t) { - super.setText(t) - // ensure left parts of long lines are always visible - caretPosition = 0 - } +@SuppressWarnings("all") +public class RunnerTextPane extends JTextPane implements FocusListener { + public RunnerTextPane() { + super(); + this.addFocusListener(this); + } + + @Override + public void paintComponent(final Graphics g) { + boolean _isOpaque = this.isOpaque(); + boolean _not = (!_isOpaque); + if (_not) { + super.paintComponent(g); + return; + } + g.setColor(UIManager.getColor("TextField.inactiveBackground")); + g.fillRect(0, 0, this.getWidth(), this.getHeight()); + this.setOpaque(false); + super.paintComponent(g); + this.setOpaque(true); + } + + @Override + public void focusGained(final FocusEvent e) { + Caret _caret = this.getCaret(); + _caret.setVisible(true); + } + + @Override + public void focusLost(final FocusEvent e) { + Caret _caret = this.getCaret(); + _caret.setVisible(false); + } + + @Override + public void setText(final String t) { + super.setText(t); + this.setCaretPosition(0); + } } From d03ba668af240821020b49ff3011d79e0b0e11b6 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:06:03 +0200 Subject: [PATCH 165/286] convert RunnerTextPane to Java, removing Xtend dependencies --- .../sqldev/ui/runner/RunnerTextPane.java | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java index 27caaf98..cd1fb700 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerTextPane.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,47 +18,50 @@ import java.awt.Graphics; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; + import javax.swing.JTextPane; import javax.swing.UIManager; -import javax.swing.text.Caret; -@SuppressWarnings("all") public class RunnerTextPane extends JTextPane implements FocusListener { - public RunnerTextPane() { - super(); - this.addFocusListener(this); - } - - @Override - public void paintComponent(final Graphics g) { - boolean _isOpaque = this.isOpaque(); - boolean _not = (!_isOpaque); - if (_not) { - super.paintComponent(g); - return; + private static final long serialVersionUID = 1089473481444949272L; + + public RunnerTextPane() { + super(); + addFocusListener(this); + } + + @Override + public void paintComponent(final Graphics g) { + // default for non-opaque components + if (isOpaque()) { + super.paintComponent(g); + return; + } + + // use value of JTextField for consistency + g.setColor(UIManager.getColor("TextField.inactiveBackground")); + g.fillRect(0, 0, getWidth(), getHeight()); + setOpaque(false); + + // do rest, changing opaque to ensure background is not overwritten + super.paintComponent(g); + setOpaque(true); + } + + @Override + public void focusGained(final FocusEvent e) { + getCaret().setVisible(true); + } + + @Override + public void focusLost(final FocusEvent e) { + getCaret().setVisible(false); + } + + @Override + public void setText(final String t) { + super.setText(t); + // ensure left parts of long lines are always visible + setCaretPosition(0); } - g.setColor(UIManager.getColor("TextField.inactiveBackground")); - g.fillRect(0, 0, this.getWidth(), this.getHeight()); - this.setOpaque(false); - super.paintComponent(g); - this.setOpaque(true); - } - - @Override - public void focusGained(final FocusEvent e) { - Caret _caret = this.getCaret(); - _caret.setVisible(true); - } - - @Override - public void focusLost(final FocusEvent e) { - Caret _caret = this.getCaret(); - _caret.setVisible(false); - } - - @Override - public void setText(final String t) { - super.setText(t); - this.setCaretPosition(0); - } } From e2e11cd64dbfdcad73cace3eef70ecf07d040cf7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:08:12 +0200 Subject: [PATCH 166/286] rename ScrollablePanel.xtend to ScrollablePanel.java --- .../ui/runner/{ScrollablePanel.xtend => ScrollablePanel.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{ScrollablePanel.xtend => ScrollablePanel.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java From feb329e06968c686bd584968f181e2529130bf68 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:08:29 +0200 Subject: [PATCH 167/286] add ScrollablePanel.java generated by Xtend 2.20.0 --- .../sqldev/ui/runner/ScrollablePanel.java | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java index fb834008..b6a17287 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,35 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.awt.Rectangle -import javax.swing.JPanel -import javax.swing.Scrollable +import java.awt.Dimension; +import java.awt.Rectangle; +import javax.swing.JPanel; +import javax.swing.Scrollable; -/* - * Fixes resizing issues of JTextArea when put into JPanel and JPanel into JScrollPane +/** + * Fixes resizing issues of JTextArea when put into JPanel and JPanel into JScrollPane * Solution is based on https://stackoverflow.com/questions/15783014/jtextarea-on-jpanel-inside-jscrollpane-does-not-resize-properly/15786939 - */ -class ScrollablePanel extends JPanel implements Scrollable { - - override getPreferredScrollableViewportSize() { - return super.getPreferredSize() - } - - override getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { - return 0 - } - - override getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { - return 0 - } - - override getScrollableTracksViewportWidth() { - return true - } - - override getScrollableTracksViewportHeight() { - return false - } + */ +@SuppressWarnings("all") +public class ScrollablePanel extends JPanel implements Scrollable { + @Override + public Dimension getPreferredScrollableViewportSize() { + return super.getPreferredSize(); + } + + @Override + public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation, final int direction) { + return 0; + } + + @Override + public int getScrollableBlockIncrement(final Rectangle visibleRect, final int orientation, final int direction) { + return 0; + } + + @Override + public boolean getScrollableTracksViewportWidth() { + return true; + } + + @Override + public boolean getScrollableTracksViewportHeight() { + return false; + } } From df5dd128129732561fc8345944ac0ded13c2a04b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:11:14 +0200 Subject: [PATCH 168/286] convert ScrollablePanel to Java, removing Xtend dependencies --- .../sqldev/ui/runner/ScrollablePanel.java | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java index b6a17287..b2398d6d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/ScrollablePanel.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,37 +17,39 @@ import java.awt.Dimension; import java.awt.Rectangle; + import javax.swing.JPanel; import javax.swing.Scrollable; /** - * Fixes resizing issues of JTextArea when put into JPanel and JPanel into JScrollPane + * Fixes resizing issues of JTextArea when put into JPanel and JPanel into JScrollPane * Solution is based on https://stackoverflow.com/questions/15783014/jtextarea-on-jpanel-inside-jscrollpane-does-not-resize-properly/15786939 */ -@SuppressWarnings("all") public class ScrollablePanel extends JPanel implements Scrollable { - @Override - public Dimension getPreferredScrollableViewportSize() { - return super.getPreferredSize(); - } - - @Override - public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation, final int direction) { - return 0; - } - - @Override - public int getScrollableBlockIncrement(final Rectangle visibleRect, final int orientation, final int direction) { - return 0; - } - - @Override - public boolean getScrollableTracksViewportWidth() { - return true; - } - - @Override - public boolean getScrollableTracksViewportHeight() { - return false; - } + private static final long serialVersionUID = -8074226692678606351L; + + @Override + public Dimension getPreferredScrollableViewportSize() { + return super.getPreferredSize(); + } + + @Override + public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation, final int direction) { + return 0; + } + + @Override + public int getScrollableBlockIncrement(final Rectangle visibleRect, final int orientation, final int direction) { + return 0; + } + + @Override + public boolean getScrollableTracksViewportWidth() { + return true; + } + + @Override + public boolean getScrollableTracksViewportHeight() { + return false; + } } From e1a9368dd1e2acb1da09e9d0c4ffd78140b4d55a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:12:09 +0200 Subject: [PATCH 169/286] rename SmartTime.xtend to SmartTime.java --- .../utplsql/sqldev/ui/runner/{SmartTime.xtend => SmartTime.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{SmartTime.xtend => SmartTime.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java From ab6b036b55425ef322ab6ebc94df3acff5b149f2 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:12:33 +0200 Subject: [PATCH 170/286] add SmartTime.java generated by Xtend 2.20.0 --- .../utplsql/sqldev/ui/runner/SmartTime.java | 127 ++++++++++-------- 1 file changed, 71 insertions(+), 56 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java index 6dc7246a..7debdbf2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,60 +13,75 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.text.DecimalFormat +import java.text.DecimalFormat; -class SmartTime { - var Double seconds - var boolean smart = false - - new() { - super() - } - - new(Double seconds, boolean smart) { - super() - this.seconds = seconds - this.smart = smart - } - - def setSeconds(Double seconds) { - this.seconds = seconds - } - - def setSmart(boolean smart) { - this.smart = smart - } - - def getSeconds() { - return seconds - } - - override toString() { - var String ret; - if (seconds === null) { - ret = null - } else if (smart) { - if (seconds >= 60*60) { - val DecimalFormat formatter = new DecimalFormat("#0.00") - ret = formatter.format(seconds / 60 / 60) + " h" - } else if (seconds >= 60) { - val DecimalFormat formatter = new DecimalFormat("#0.00") - ret = formatter.format(seconds / 60) + " min" - } else if (seconds >= 1) { - val DecimalFormat formatter = new DecimalFormat("#0.000") - ret = formatter.format(seconds) + " s" - } else { - val DecimalFormat formatter = new DecimalFormat("##0") - ret = formatter.format(seconds * 1000) + " ms" - } - - } else { - val DecimalFormat formatter = new DecimalFormat("##,##0.000") - ret = formatter.format(seconds) - } - return ret - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class SmartTime { + private Double seconds; + + private boolean smart = false; + + public SmartTime() { + super(); + } + + public SmartTime(final Double seconds, final boolean smart) { + super(); + this.seconds = seconds; + this.smart = smart; + } + + public Double setSeconds(final Double seconds) { + return this.seconds = seconds; + } + + public boolean setSmart(final boolean smart) { + return this.smart = smart; + } + + public Double getSeconds() { + return this.seconds; + } + + @Override + public String toString() { + String ret = null; + if ((this.seconds == null)) { + ret = null; + } else { + if (this.smart) { + if (((this.seconds).doubleValue() >= (60 * 60))) { + final DecimalFormat formatter = new DecimalFormat("#0.00"); + String _format = formatter.format((((this.seconds).doubleValue() / 60) / 60)); + String _plus = (_format + " h"); + ret = _plus; + } else { + if (((this.seconds).doubleValue() >= 60)) { + final DecimalFormat formatter_1 = new DecimalFormat("#0.00"); + String _format_1 = formatter_1.format(((this.seconds).doubleValue() / 60)); + String _plus_1 = (_format_1 + " min"); + ret = _plus_1; + } else { + if (((this.seconds).doubleValue() >= 1)) { + final DecimalFormat formatter_2 = new DecimalFormat("#0.000"); + String _format_2 = formatter_2.format(this.seconds); + String _plus_2 = (_format_2 + " s"); + ret = _plus_2; + } else { + final DecimalFormat formatter_3 = new DecimalFormat("##0"); + String _format_3 = formatter_3.format(((this.seconds).doubleValue() * 1000)); + String _plus_3 = (_format_3 + " ms"); + ret = _plus_3; + } + } + } + } else { + final DecimalFormat formatter_4 = new DecimalFormat("##,##0.000"); + ret = formatter_4.format(this.seconds); + } + } + return ret; + } +} From 8169f19dcc201d0b721086668d82e404400fd21b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:37:12 +0200 Subject: [PATCH 171/286] convert SmartTime to Java, removing Xtend dependencies --- .../utplsql/sqldev/ui/runner/SmartTime.java | 110 ++++++++---------- 1 file changed, 47 insertions(+), 63 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java index 7debdbf2..8e4e046b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,71 +17,55 @@ import java.text.DecimalFormat; -@SuppressWarnings("all") public class SmartTime { - private Double seconds; - - private boolean smart = false; - - public SmartTime() { - super(); - } - - public SmartTime(final Double seconds, final boolean smart) { - super(); - this.seconds = seconds; - this.smart = smart; - } - - public Double setSeconds(final Double seconds) { - return this.seconds = seconds; - } - - public boolean setSmart(final boolean smart) { - return this.smart = smart; - } - - public Double getSeconds() { - return this.seconds; - } - - @Override - public String toString() { - String ret = null; - if ((this.seconds == null)) { - ret = null; - } else { - if (this.smart) { - if (((this.seconds).doubleValue() >= (60 * 60))) { - final DecimalFormat formatter = new DecimalFormat("#0.00"); - String _format = formatter.format((((this.seconds).doubleValue() / 60) / 60)); - String _plus = (_format + " h"); - ret = _plus; - } else { - if (((this.seconds).doubleValue() >= 60)) { - final DecimalFormat formatter_1 = new DecimalFormat("#0.00"); - String _format_1 = formatter_1.format(((this.seconds).doubleValue() / 60)); - String _plus_1 = (_format_1 + " min"); - ret = _plus_1; - } else { - if (((this.seconds).doubleValue() >= 1)) { - final DecimalFormat formatter_2 = new DecimalFormat("#0.000"); - String _format_2 = formatter_2.format(this.seconds); - String _plus_2 = (_format_2 + " s"); - ret = _plus_2; + private Double seconds; + private boolean smart = false; + + public SmartTime() { + super(); + } + + public SmartTime(final Double seconds, final boolean smart) { + super(); + this.seconds = seconds; + this.smart = smart; + } + + public void setSeconds(final Double seconds) { + this.seconds = seconds; + } + + public void setSmart(final boolean smart) { + this.smart = smart; + } + + public Double getSeconds() { + return seconds; + } + + @Override + public String toString() { + String ret = null; + if (seconds == null) { + ret = null; + } else if (smart) { + if (seconds >= 60 * 60) { + final DecimalFormat formatter = new DecimalFormat("#0.00"); + ret = formatter.format(seconds / 60 / 60) + " h"; + } else if (seconds >= 60) { + final DecimalFormat formatter = new DecimalFormat("#0.00"); + ret = formatter.format(seconds / 60) + " min"; + } else if (seconds >= 1) { + final DecimalFormat formatter = new DecimalFormat("#0.000"); + ret = formatter.format(seconds) + " s"; } else { - final DecimalFormat formatter_3 = new DecimalFormat("##0"); - String _format_3 = formatter_3.format(((this.seconds).doubleValue() * 1000)); - String _plus_3 = (_format_3 + " ms"); - ret = _plus_3; + final DecimalFormat formatter = new DecimalFormat("##0"); + ret = formatter.format(seconds * 1000) + " ms"; } - } + } else { + final DecimalFormat formatter = new DecimalFormat("##,##0.000"); + ret = formatter.format(seconds); } - } else { - final DecimalFormat formatter_4 = new DecimalFormat("##,##0.000"); - ret = formatter_4.format(this.seconds); - } + return ret; } - return ret; - } } From 9593196e6fe648797bcf76abbb6dde6b1fefb679 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:38:09 +0200 Subject: [PATCH 172/286] rename TestOverviewTableModel.xtend to TestOverviewTableModel.java --- .../{TestOverviewTableModel.xtend => TestOverviewTableModel.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{TestOverviewTableModel.xtend => TestOverviewTableModel.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java From 1c77f811e6d5c86f3fe2386064a48dd5ceb858c5 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 10:38:28 +0200 Subject: [PATCH 173/286] add TestOverviewTableModel.java generated by Xtend 2.20.0 --- .../ui/runner/TestOverviewTableModel.java | 336 ++++++++++-------- 1 file changed, 194 insertions(+), 142 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java index c0f021c2..55ea0c66 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,147 +13,199 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.util.LinkedHashMap -import javax.swing.Icon -import javax.swing.table.DefaultTableModel -import org.utplsql.sqldev.model.PrefixTools -import org.utplsql.sqldev.model.runner.Test -import org.utplsql.sqldev.resources.UtplsqlResources +import com.google.common.base.Objects; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import javax.swing.Icon; +import javax.swing.table.DefaultTableModel; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Conversions; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.utplsql.sqldev.model.PrefixTools; +import org.utplsql.sqldev.model.runner.Test; +import org.utplsql.sqldev.resources.UtplsqlResources; -class TestOverviewTableModel extends DefaultTableModel { - LinkedHashMap tests - String commonPrefix - boolean commonPrefixCalculated - boolean showDescription - boolean useSmartTimes - - new() { - super() - } - - private def calcCommonPrefix() { - if (!commonPrefixCalculated && tests !== null && tests.size > 0) { - this.commonPrefix = PrefixTools.commonPrefix(tests.keySet.toList) - fireTableDataChanged() - commonPrefixCalculated = true - } - } - - def setModel(LinkedHashMap tests, boolean showDescription, boolean useSmartTimes) { - commonPrefixCalculated = false - this.tests = tests - this.showDescription = showDescription - this.useSmartTimes = useSmartTimes - calcCommonPrefix - fireTableDataChanged() - } - - def updateModel(boolean showDescription) { - this.showDescription = showDescription - fireTableDataChanged() - } - - def getTestIdColumnName() { - calcCommonPrefix - if (commonPrefix === null || commonPrefix == "") { - if (showDescription) { - UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL") - } else { - UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN") - } - } else { - if (showDescription) { - '''«UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL")» («commonPrefix»)''' - } else { - commonPrefix - } - } - } - - def getTimeColumnName() { - val timeColumnName = '''«UtplsqlResources.getString("RUNNER_TEST_EXECUTION_TIME_COLUMN")»«IF !useSmartTimes» [s]«ENDIF»''' - return timeColumnName - } - - def getTest(int row) { - val entry = tests.entrySet.get(row) - val test = tests.get(entry.key) - return test - } - - override getRowCount() { - if (tests === null) { - return 0 - } - return tests.size() - } - - override getColumnCount() { - return 5 - } - - override getValueAt(int row, int col) { - val test = tests.entrySet.get(row).value - if (test === null) { - return null - } - switch (col) { - case 0: { - return test.statusIcon - } - case 1: { - return test.warningIcon - } - case 2: { - return test.infoIcon - } - case 3: { - return if(showDescription && test.description !== null) { - test.description - } else { - test.id.substring(if(commonPrefix === null) {0} else {commonPrefix.length}) - } - } - case 4: { - return test.executionTime - } - default: { - return null - } - } - } - - override getColumnName(int col) { - return #["", "", "", UtplsqlResources.getString(if (showDescription) {"RUNNER_DESCRIPTION_LABEL"} else {"RUNNER_TEST_ID_COLUMN"}), - timeColumnName].get(col) - } - - override isCellEditable(int row, int column) { - return false - } - - override getColumnClass(int col) { - switch (col) { - case 0: { - return Icon - } - case 1: { - return Icon - } - case 2: { - return Icon - } - case 3: { - return String - } - case 4: { - return Double - } - default: { - return String - } - } - } +@SuppressWarnings("all") +public class TestOverviewTableModel extends DefaultTableModel { + private LinkedHashMap tests; + + private String commonPrefix; + + private boolean commonPrefixCalculated; + + private boolean showDescription; + + private boolean useSmartTimes; + + public TestOverviewTableModel() { + super(); + } + + private boolean calcCommonPrefix() { + boolean _xifexpression = false; + if ((((!this.commonPrefixCalculated) && (this.tests != null)) && (this.tests.size() > 0))) { + boolean _xblockexpression = false; + { + this.commonPrefix = PrefixTools.commonPrefix(IterableExtensions.toList(this.tests.keySet())); + this.fireTableDataChanged(); + _xblockexpression = this.commonPrefixCalculated = true; + } + _xifexpression = _xblockexpression; + } + return _xifexpression; + } + + public void setModel(final LinkedHashMap tests, final boolean showDescription, final boolean useSmartTimes) { + this.commonPrefixCalculated = false; + this.tests = tests; + this.showDescription = showDescription; + this.useSmartTimes = useSmartTimes; + this.calcCommonPrefix(); + this.fireTableDataChanged(); + } + + public void updateModel(final boolean showDescription) { + this.showDescription = showDescription; + this.fireTableDataChanged(); + } + + public CharSequence getTestIdColumnName() { + CharSequence _xblockexpression = null; + { + this.calcCommonPrefix(); + CharSequence _xifexpression = null; + if (((this.commonPrefix == null) || Objects.equal(this.commonPrefix, ""))) { + String _xifexpression_1 = null; + if (this.showDescription) { + _xifexpression_1 = UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL"); + } else { + _xifexpression_1 = UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN"); + } + _xifexpression = _xifexpression_1; + } else { + CharSequence _xifexpression_2 = null; + if (this.showDescription) { + StringConcatenation _builder = new StringConcatenation(); + String _string = UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL"); + _builder.append(_string); + _builder.append(" ("); + _builder.append(this.commonPrefix); + _builder.append(")"); + _xifexpression_2 = _builder; + } else { + _xifexpression_2 = this.commonPrefix; + } + _xifexpression = _xifexpression_2; + } + _xblockexpression = _xifexpression; + } + return _xblockexpression; + } + + public String getTimeColumnName() { + StringConcatenation _builder = new StringConcatenation(); + String _string = UtplsqlResources.getString("RUNNER_TEST_EXECUTION_TIME_COLUMN"); + _builder.append(_string); + { + if ((!this.useSmartTimes)) { + _builder.append(" [s]"); + } + } + final String timeColumnName = _builder.toString(); + return timeColumnName; + } + + public Test getTest(final int row) { + final Map.Entry entry = ((Map.Entry[])Conversions.unwrapArray(this.tests.entrySet(), Map.Entry.class))[row]; + final Test test = this.tests.get(entry.getKey()); + return test; + } + + @Override + public int getRowCount() { + if ((this.tests == null)) { + return 0; + } + return this.tests.size(); + } + + @Override + public int getColumnCount() { + return 5; + } + + @Override + public Object getValueAt(final int row, final int col) { + final Test test = ((Map.Entry[])Conversions.unwrapArray(this.tests.entrySet(), Map.Entry.class))[row].getValue(); + if ((test == null)) { + return null; + } + switch (col) { + case 0: + return test.getStatusIcon(); + case 1: + return test.getWarningIcon(); + case 2: + return test.getInfoIcon(); + case 3: + String _xifexpression = null; + if ((this.showDescription && (test.getDescription() != null))) { + _xifexpression = test.getDescription(); + } else { + String _id = test.getId(); + int _xifexpression_1 = (int) 0; + if ((this.commonPrefix == null)) { + _xifexpression_1 = 0; + } else { + _xifexpression_1 = this.commonPrefix.length(); + } + _xifexpression = _id.substring(_xifexpression_1); + } + return _xifexpression; + case 4: + return test.getExecutionTime(); + default: + return null; + } + } + + @Override + public String getColumnName(final int col) { + String _xifexpression = null; + if (this.showDescription) { + _xifexpression = "RUNNER_DESCRIPTION_LABEL"; + } else { + _xifexpression = "RUNNER_TEST_ID_COLUMN"; + } + String _string = UtplsqlResources.getString(_xifexpression); + String _timeColumnName = this.getTimeColumnName(); + return Collections.unmodifiableList(CollectionLiterals.newArrayList("", "", "", _string, _timeColumnName)).get(col); + } + + @Override + public boolean isCellEditable(final int row, final int column) { + return false; + } + + @Override + public Class getColumnClass(final int col) { + switch (col) { + case 0: + return Icon.class; + case 1: + return Icon.class; + case 2: + return Icon.class; + case 3: + return String.class; + case 4: + return Double.class; + default: + return String.class; + } + } } From 85e0a3343d5b5cb30937e20abcd913921abbf855 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 12:20:35 +0200 Subject: [PATCH 174/286] convert TestOverviewTableModel to Java, removing Xtend dependencies --- .../ui/runner/TestOverviewTableModel.java | 307 ++++++++---------- 1 file changed, 133 insertions(+), 174 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java index 55ea0c66..02e85d81 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,197 +15,156 @@ */ package org.utplsql.sqldev.ui.runner; -import com.google.common.base.Objects; -import java.util.Collections; +import java.util.ArrayList; import java.util.LinkedHashMap; -import java.util.Map; +import java.util.Map.Entry; + import javax.swing.Icon; import javax.swing.table.DefaultTableModel; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Conversions; -import org.eclipse.xtext.xbase.lib.IterableExtensions; + import org.utplsql.sqldev.model.PrefixTools; import org.utplsql.sqldev.model.runner.Test; import org.utplsql.sqldev.resources.UtplsqlResources; -@SuppressWarnings("all") public class TestOverviewTableModel extends DefaultTableModel { - private LinkedHashMap tests; - - private String commonPrefix; - - private boolean commonPrefixCalculated; - - private boolean showDescription; - - private boolean useSmartTimes; - - public TestOverviewTableModel() { - super(); - } - - private boolean calcCommonPrefix() { - boolean _xifexpression = false; - if ((((!this.commonPrefixCalculated) && (this.tests != null)) && (this.tests.size() > 0))) { - boolean _xblockexpression = false; - { - this.commonPrefix = PrefixTools.commonPrefix(IterableExtensions.toList(this.tests.keySet())); - this.fireTableDataChanged(); - _xblockexpression = this.commonPrefixCalculated = true; - } - _xifexpression = _xblockexpression; + private static final long serialVersionUID = -4087082648970132657L; + + private LinkedHashMap tests; + private String commonPrefix; + private boolean commonPrefixCalculated; + private boolean showDescription; + private boolean useSmartTimes; + + public TestOverviewTableModel() { + super(); } - return _xifexpression; - } - - public void setModel(final LinkedHashMap tests, final boolean showDescription, final boolean useSmartTimes) { - this.commonPrefixCalculated = false; - this.tests = tests; - this.showDescription = showDescription; - this.useSmartTimes = useSmartTimes; - this.calcCommonPrefix(); - this.fireTableDataChanged(); - } - - public void updateModel(final boolean showDescription) { - this.showDescription = showDescription; - this.fireTableDataChanged(); - } - - public CharSequence getTestIdColumnName() { - CharSequence _xblockexpression = null; - { - this.calcCommonPrefix(); - CharSequence _xifexpression = null; - if (((this.commonPrefix == null) || Objects.equal(this.commonPrefix, ""))) { - String _xifexpression_1 = null; - if (this.showDescription) { - _xifexpression_1 = UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL"); - } else { - _xifexpression_1 = UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN"); + + private void calcCommonPrefix() { + if (!commonPrefixCalculated && tests != null && tests.size() > 0) { + commonPrefix = PrefixTools.commonPrefix(new ArrayList(tests.keySet())); + fireTableDataChanged(); + commonPrefixCalculated = true; } - _xifexpression = _xifexpression_1; - } else { - CharSequence _xifexpression_2 = null; - if (this.showDescription) { - StringConcatenation _builder = new StringConcatenation(); - String _string = UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL"); - _builder.append(_string); - _builder.append(" ("); - _builder.append(this.commonPrefix); - _builder.append(")"); - _xifexpression_2 = _builder; + } + + public void setModel(final LinkedHashMap tests, final boolean showDescription, + final boolean useSmartTimes) { + commonPrefixCalculated = false; + this.tests = tests; + this.showDescription = showDescription; + this.useSmartTimes = useSmartTimes; + calcCommonPrefix(); + fireTableDataChanged(); + } + + public void updateModel(final boolean showDescription) { + this.showDescription = showDescription; + fireTableDataChanged(); + } + + public CharSequence getTestIdColumnName() { + StringBuilder sb = new StringBuilder(); + calcCommonPrefix(); + if (commonPrefix == null || commonPrefix.isEmpty()) { + if (showDescription) { + sb.append(UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL")); + } else { + sb.append(UtplsqlResources.getString("RUNNER_TEST_ID_COLUMN")); + } } else { - _xifexpression_2 = this.commonPrefix; + if (showDescription) { + sb.append(UtplsqlResources.getString("RUNNER_DESCRIPTION_LABEL")); + sb.append(" ("); + sb.append(commonPrefix); + sb.append(")"); + } else { + sb.append(commonPrefix); + } } - _xifexpression = _xifexpression_2; - } - _xblockexpression = _xifexpression; + return sb.toString(); + } + + public String getTimeColumnName() { + return UtplsqlResources.getString("RUNNER_TEST_EXECUTION_TIME_COLUMN") + (!useSmartTimes ? " [s]" : ""); } - return _xblockexpression; - } - - public String getTimeColumnName() { - StringConcatenation _builder = new StringConcatenation(); - String _string = UtplsqlResources.getString("RUNNER_TEST_EXECUTION_TIME_COLUMN"); - _builder.append(_string); - { - if ((!this.useSmartTimes)) { - _builder.append(" [s]"); - } + + public Test getTest(final int row) { + return new ArrayList>(tests.entrySet()).get(row).getValue(); } - final String timeColumnName = _builder.toString(); - return timeColumnName; - } - - public Test getTest(final int row) { - final Map.Entry entry = ((Map.Entry[])Conversions.unwrapArray(this.tests.entrySet(), Map.Entry.class))[row]; - final Test test = this.tests.get(entry.getKey()); - return test; - } - - @Override - public int getRowCount() { - if ((this.tests == null)) { - return 0; + + @Override + public int getRowCount() { + if (tests == null) { + return 0; + } + return tests.size(); } - return this.tests.size(); - } - - @Override - public int getColumnCount() { - return 5; - } - - @Override - public Object getValueAt(final int row, final int col) { - final Test test = ((Map.Entry[])Conversions.unwrapArray(this.tests.entrySet(), Map.Entry.class))[row].getValue(); - if ((test == null)) { - return null; + + @Override + public int getColumnCount() { + return 5; } - switch (col) { - case 0: - return test.getStatusIcon(); - case 1: - return test.getWarningIcon(); - case 2: - return test.getInfoIcon(); - case 3: - String _xifexpression = null; - if ((this.showDescription && (test.getDescription() != null))) { - _xifexpression = test.getDescription(); - } else { - String _id = test.getId(); - int _xifexpression_1 = (int) 0; - if ((this.commonPrefix == null)) { - _xifexpression_1 = 0; - } else { - _xifexpression_1 = this.commonPrefix.length(); - } - _xifexpression = _id.substring(_xifexpression_1); + + @Override + public Object getValueAt(final int row, final int col) { + final Test test = getTest(row); + switch (col) { + case 0: + return test.getStatusIcon(); + case 1: + return test.getWarningIcon(); + case 2: + return test.getInfoIcon(); + case 3: + if (showDescription && test.getDescription() != null) { + return test.getDescription(); + } else { + return test.getId().substring(commonPrefix == null ? 0 : commonPrefix.length()); + } + case 4: + return test.getExecutionTime(); + default: + return null; } - return _xifexpression; - case 4: - return test.getExecutionTime(); - default: - return null; } - } - - @Override - public String getColumnName(final int col) { - String _xifexpression = null; - if (this.showDescription) { - _xifexpression = "RUNNER_DESCRIPTION_LABEL"; - } else { - _xifexpression = "RUNNER_TEST_ID_COLUMN"; + + @Override + public String getColumnName(final int col) { + switch (col) { + case 0: + case 1: + case 2: + return ""; // icons are used instead of descriptions + case 3: + return UtplsqlResources.getString(showDescription ? "RUNNER_DESCRIPTION_LABEL" : "RUNNER_TEST_ID_COLUMN"); + case 4: + return getTimeColumnName(); + default: + return null; + } + + } + + @Override + public boolean isCellEditable(final int row, final int column) { + return false; } - String _string = UtplsqlResources.getString(_xifexpression); - String _timeColumnName = this.getTimeColumnName(); - return Collections.unmodifiableList(CollectionLiterals.newArrayList("", "", "", _string, _timeColumnName)).get(col); - } - - @Override - public boolean isCellEditable(final int row, final int column) { - return false; - } - - @Override - public Class getColumnClass(final int col) { - switch (col) { - case 0: - return Icon.class; - case 1: - return Icon.class; - case 2: - return Icon.class; - case 3: - return String.class; - case 4: - return Double.class; - default: - return String.class; + + @Override + public Class getColumnClass(final int col) { + switch (col) { + case 0: + return Icon.class; + case 1: + return Icon.class; + case 2: + return Icon.class; + case 3: + return String.class; + case 4: + return Double.class; + default: + return String.class; + } } - } } From db240c4f64bdd2a0b8bea75da124603cc7d9e177 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 12:21:36 +0200 Subject: [PATCH 175/286] rename WrapLayout.xtend to WrapLayout.java --- .../sqldev/ui/runner/{WrapLayout.xtend => WrapLayout.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/ui/runner/{WrapLayout.xtend => WrapLayout.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.xtend rename to sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java From dd23e83787352f560d5ad3d5d396ac806283667a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 12:21:57 +0200 Subject: [PATCH 176/286] add WrapLayout.java generated by Xtend 2.20.0 --- .../utplsql/sqldev/ui/runner/WrapLayout.java | 310 +++++++++--------- 1 file changed, 162 insertions(+), 148 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java index dce4695c..3c964a65 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,156 +13,170 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.ui.runner +package org.utplsql.sqldev.ui.runner; -import java.awt.Component -import java.awt.Container -import java.awt.Dimension -import java.awt.FlowLayout -import java.awt.Insets -import javax.swing.JScrollPane -import javax.swing.SwingUtilities +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Insets; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; -/** +/** * FlowLayout subclass that fully supports wrapping of components. * Converted to Xtend based on http://www.camick.com/java/source/WrapLayout.java */ -class WrapLayout extends FlowLayout { - - /** - * Constructs a new WrapLayout with a left - * alignment and a default 5-unit horizontal and vertical gap. - */ - new() { - super() - } - - /** - * Constructs a new FlowLayout with the specified - * alignment and a default 5-unit horizontal and vertical gap. - * The value of the alignment argument must be one of - * WrapLayout, WrapLayout, - * or WrapLayout. - * @param align the alignment value - */ - new(int align) { - super(align) - } - - /** - * Creates a new flow layout manager with the indicated alignment - * and the indicated horizontal and vertical gaps. - *

- * The value of the alignment argument must be one of - * WrapLayout, WrapLayout, - * or WrapLayout. - * @param align the alignment value - * @param hgap the horizontal gap between components - * @param vgap the vertical gap between components - */ - new(int align, int hgap, int vgap) { - super(align, hgap, vgap) - } - - /** - * Returns the preferred dimensions for this layout given the - * visible components in the specified target container. - * @param target the component which needs to be laid out - * @return the preferred dimensions to lay out the - * subcomponents of the specified container - */ - override Dimension preferredLayoutSize(Container target) { - return layoutSize(target, true) - } - - /** - * Returns the minimum dimensions needed to layout the visible - * components contained in the specified target container. - * @param target the component which needs to be laid out - * @return the minimum dimensions to lay out the - * subcomponents of the specified container - */ - override Dimension minimumLayoutSize(Container target) { - var Dimension minimum = layoutSize(target, false) - minimum.width -= (getHgap() + 1) - return minimum - } - - /** - * Returns the minimum or preferred dimension needed to layout the target - * container. - * @param target target to get layout size for - * @param preferred should preferred size be calculated - * @return the dimension to layout the target container - */ - def private Dimension layoutSize(Container target, boolean preferred) { - synchronized (target.getTreeLock()) { - // Each row must fit with the width allocated to the containter. - // When the container width = 0, the preferred width of the container - // has not yet been calculated so lets ask for the maximum. - var int targetWidth = target.getSize().width - var Container container = target - while (container.getSize().width === 0 && container.getParent() !== null) { - container = container.getParent() - } - targetWidth = container.getSize().width - if(targetWidth === 0) targetWidth = Integer.MAX_VALUE - var int hgap = getHgap() - var int vgap = getVgap() - var Insets insets = target.getInsets() - var int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2) - var int maxWidth = targetWidth - horizontalInsetsAndGap - // Fit components into the allowed width - var Dimension dim = new Dimension(0, 0) - var int rowWidth = 0 - var int rowHeight = 0 - var int nmembers = target.getComponentCount() - for (var int i = 0; i < nmembers; i++) { - var Component m = target.getComponent(i) - if (m.isVisible()) { - var Dimension d = if(preferred) m.getPreferredSize() else m.getMinimumSize() - // Can't add the component to current row. Start a new row. - if (rowWidth + d.width > maxWidth) { - addRow(dim, rowWidth, rowHeight) - rowWidth = 0 - rowHeight = 0 - } - // Add a horizontal gap for all components after the first - if (rowWidth !== 0) { - rowWidth += hgap - } - rowWidth += d.width - rowHeight = Math.max(rowHeight, d.height) - } - } - addRow(dim, rowWidth, rowHeight) - dim.width += horizontalInsetsAndGap - dim.height += insets.top + insets.bottom + vgap * 2 - // When using a scroll pane or the DecoratedLookAndFeel we need to - // make sure the preferred size is less than the size of the - // target containter so shrinking the container size works - // correctly. Removing the horizontal gap is an easy way to do this. - var Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane, target) - if (scrollPane !== null && target.isValid()) { - dim.width -= (hgap + 1) - } - return dim - } - } - - /* - * A new row has been completed. Use the dimensions of this row - * to update the preferred size for the container. - * - * @param dim update the width and height when appropriate - * @param rowWidth the width of the row to add - * @param rowHeight the height of the row to add - */ - def private void addRow(Dimension dim, int rowWidth, int rowHeight) { - dim.width = Math.max(dim.width, rowWidth) - if (dim.height > 0) { - dim.height += getVgap() - } - dim.height += rowHeight - } +@SuppressWarnings("all") +public class WrapLayout extends FlowLayout { + /** + * Constructs a new WrapLayout with a left + * alignment and a default 5-unit horizontal and vertical gap. + */ + public WrapLayout() { + super(); + } + + /** + * Constructs a new FlowLayout with the specified + * alignment and a default 5-unit horizontal and vertical gap. + * The value of the alignment argument must be one of + * WrapLayout, WrapLayout, + * or WrapLayout. + * @param align the alignment value + */ + public WrapLayout(final int align) { + super(align); + } + + /** + * Creates a new flow layout manager with the indicated alignment + * and the indicated horizontal and vertical gaps. + *

+ * The value of the alignment argument must be one of + * WrapLayout, WrapLayout, + * or WrapLayout. + * @param align the alignment value + * @param hgap the horizontal gap between components + * @param vgap the vertical gap between components + */ + public WrapLayout(final int align, final int hgap, final int vgap) { + super(align, hgap, vgap); + } + + /** + * Returns the preferred dimensions for this layout given the + * visible components in the specified target container. + * @param target the component which needs to be laid out + * @return the preferred dimensions to lay out the + * subcomponents of the specified container + */ + @Override + public Dimension preferredLayoutSize(final Container target) { + return this.layoutSize(target, true); + } + + /** + * Returns the minimum dimensions needed to layout the visible + * components contained in the specified target container. + * @param target the component which needs to be laid out + * @return the minimum dimensions to lay out the + * subcomponents of the specified container + */ + @Override + public Dimension minimumLayoutSize(final Container target) { + Dimension minimum = this.layoutSize(target, false); + int _width = minimum.width; + int _hgap = this.getHgap(); + int _plus = (_hgap + 1); + minimum.width = (_width - _plus); + return minimum; + } + + /** + * Returns the minimum or preferred dimension needed to layout the target + * container. + * @param target target to get layout size for + * @param preferred should preferred size be calculated + * @return the dimension to layout the target container + */ + private Dimension layoutSize(final Container target, final boolean preferred) { + synchronized (target.getTreeLock()) { + int targetWidth = target.getSize().width; + Container container = target; + while (((container.getSize().width == 0) && (container.getParent() != null))) { + container = container.getParent(); + } + targetWidth = container.getSize().width; + if ((targetWidth == 0)) { + targetWidth = Integer.MAX_VALUE; + } + int hgap = this.getHgap(); + int vgap = this.getVgap(); + Insets insets = target.getInsets(); + int horizontalInsetsAndGap = ((insets.left + insets.right) + (hgap * 2)); + int maxWidth = (targetWidth - horizontalInsetsAndGap); + Dimension dim = new Dimension(0, 0); + int rowWidth = 0; + int rowHeight = 0; + int nmembers = target.getComponentCount(); + for (int i = 0; (i < nmembers); i++) { + { + Component m = target.getComponent(i); + boolean _isVisible = m.isVisible(); + if (_isVisible) { + Dimension _xifexpression = null; + if (preferred) { + _xifexpression = m.getPreferredSize(); + } else { + _xifexpression = m.getMinimumSize(); + } + Dimension d = _xifexpression; + if (((rowWidth + d.width) > maxWidth)) { + this.addRow(dim, rowWidth, rowHeight); + rowWidth = 0; + rowHeight = 0; + } + if ((rowWidth != 0)) { + int _rowWidth = rowWidth; + rowWidth = (_rowWidth + hgap); + } + int _rowWidth_1 = rowWidth; + rowWidth = (_rowWidth_1 + d.width); + rowHeight = Math.max(rowHeight, d.height); + } + } + } + this.addRow(dim, rowWidth, rowHeight); + int _width = dim.width; + dim.width = (_width + horizontalInsetsAndGap); + int _height = dim.height; + dim.height = (_height + ((insets.top + insets.bottom) + (vgap * 2))); + Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target); + if (((scrollPane != null) && target.isValid())) { + int _width_1 = dim.width; + dim.width = (_width_1 - (hgap + 1)); + } + return dim; + } + } + + /** + * A new row has been completed. Use the dimensions of this row + * to update the preferred size for the container. + * + * @param dim update the width and height when appropriate + * @param rowWidth the width of the row to add + * @param rowHeight the height of the row to add + */ + private void addRow(final Dimension dim, final int rowWidth, final int rowHeight) { + dim.width = Math.max(dim.width, rowWidth); + if ((dim.height > 0)) { + int _height = dim.height; + int _vgap = this.getVgap(); + dim.height = (_height + _vgap); + } + int _height_1 = dim.height; + dim.height = (_height_1 + rowHeight); + } } From 0fe8716c8ea11428d79b40323366bbdb157f40e4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 12:37:56 +0200 Subject: [PATCH 177/286] convert WrapLayout to Java, removing Xtend dependencies --- .../utplsql/sqldev/ui/runner/WrapLayout.java | 302 +++++++++--------- 1 file changed, 154 insertions(+), 148 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java index 3c964a65..1ccf2f2c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/WrapLayout.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,163 +20,169 @@ import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Insets; + import javax.swing.JScrollPane; import javax.swing.SwingUtilities; /** - * FlowLayout subclass that fully supports wrapping of components. - * Converted to Xtend based on http://www.camick.com/java/source/WrapLayout.java + * FlowLayout subclass that fully supports wrapping of components. + * Converted to Xtend based on http://www.camick.com/java/source/WrapLayout.java + * Converted back to Java with small amendments to original code */ -@SuppressWarnings("all") public class WrapLayout extends FlowLayout { - /** - * Constructs a new WrapLayout with a left - * alignment and a default 5-unit horizontal and vertical gap. - */ - public WrapLayout() { - super(); - } - - /** - * Constructs a new FlowLayout with the specified - * alignment and a default 5-unit horizontal and vertical gap. - * The value of the alignment argument must be one of - * WrapLayout, WrapLayout, - * or WrapLayout. - * @param align the alignment value - */ - public WrapLayout(final int align) { - super(align); - } - - /** - * Creates a new flow layout manager with the indicated alignment - * and the indicated horizontal and vertical gaps. - *

- * The value of the alignment argument must be one of - * WrapLayout, WrapLayout, - * or WrapLayout. - * @param align the alignment value - * @param hgap the horizontal gap between components - * @param vgap the vertical gap between components - */ - public WrapLayout(final int align, final int hgap, final int vgap) { - super(align, hgap, vgap); - } - - /** - * Returns the preferred dimensions for this layout given the - * visible components in the specified target container. - * @param target the component which needs to be laid out - * @return the preferred dimensions to lay out the - * subcomponents of the specified container - */ - @Override - public Dimension preferredLayoutSize(final Container target) { - return this.layoutSize(target, true); - } - - /** - * Returns the minimum dimensions needed to layout the visible - * components contained in the specified target container. - * @param target the component which needs to be laid out - * @return the minimum dimensions to lay out the - * subcomponents of the specified container - */ - @Override - public Dimension minimumLayoutSize(final Container target) { - Dimension minimum = this.layoutSize(target, false); - int _width = minimum.width; - int _hgap = this.getHgap(); - int _plus = (_hgap + 1); - minimum.width = (_width - _plus); - return minimum; - } - - /** - * Returns the minimum or preferred dimension needed to layout the target - * container. - * @param target target to get layout size for - * @param preferred should preferred size be calculated - * @return the dimension to layout the target container - */ - private Dimension layoutSize(final Container target, final boolean preferred) { - synchronized (target.getTreeLock()) { - int targetWidth = target.getSize().width; - Container container = target; - while (((container.getSize().width == 0) && (container.getParent() != null))) { - container = container.getParent(); - } - targetWidth = container.getSize().width; - if ((targetWidth == 0)) { - targetWidth = Integer.MAX_VALUE; - } - int hgap = this.getHgap(); - int vgap = this.getVgap(); - Insets insets = target.getInsets(); - int horizontalInsetsAndGap = ((insets.left + insets.right) + (hgap * 2)); - int maxWidth = (targetWidth - horizontalInsetsAndGap); - Dimension dim = new Dimension(0, 0); - int rowWidth = 0; - int rowHeight = 0; - int nmembers = target.getComponentCount(); - for (int i = 0; (i < nmembers); i++) { - { - Component m = target.getComponent(i); - boolean _isVisible = m.isVisible(); - if (_isVisible) { - Dimension _xifexpression = null; - if (preferred) { - _xifexpression = m.getPreferredSize(); - } else { - _xifexpression = m.getMinimumSize(); + private static final long serialVersionUID = -4576022991725404247L; + + /** + * Constructs a new WrapLayout with a left alignment and a default + * 5-unit horizontal and vertical gap. + */ + public WrapLayout() { + super(); + } + + /** + * Constructs a new FlowLayout with the specified alignment and a + * default 5-unit horizontal and vertical gap. The value of the alignment + * argument must be one of WrapLayout, WrapLayout, or + * WrapLayout. + * + * @param align + * the alignment value + */ + public WrapLayout(final int align) { + super(align); + } + + /** + * Creates a new flow layout manager with the indicated alignment and the + * indicated horizontal and vertical gaps. + *

+ * The value of the alignment argument must be one of WrapLayout, + * WrapLayout, or WrapLayout. + * + * @param align + * the alignment value + * @param hgap + * the horizontal gap between components + * @param vgap + * the vertical gap between components + */ + public WrapLayout(final int align, final int hgap, final int vgap) { + super(align, hgap, vgap); + } + + /** + * Returns the preferred dimensions for this layout given the visible + * components in the specified target container. + * + * @param target + * the component which needs to be laid out + * @return the preferred dimensions to lay out the subcomponents of the + * specified container + */ + @Override + public Dimension preferredLayoutSize(final Container target) { + return layoutSize(target, true); + } + + /** + * Returns the minimum dimensions needed to layout the visible components + * contained in the specified target container. + * + * @param target + * the component which needs to be laid out + * @return the minimum dimensions to lay out the subcomponents of the specified + * container + */ + @Override + public Dimension minimumLayoutSize(final Container target) { + Dimension minimum = layoutSize(target, false); + minimum.width -= (getHgap() + 1); + return minimum; + } + + /** + * Returns the minimum or preferred dimension needed to layout the target + * container. + * + * @param target + * target to get layout size for + * @param preferred + * should preferred size be calculated + * @return the dimension to layout the target container + */ + private Dimension layoutSize(final Container target, final boolean preferred) { + synchronized (target.getTreeLock()) { + // Each row must fit with the width allocated to the container. + // When the container width = 0, the preferred width of the container + // has not yet been calculated so lets ask for the maximum. + Container container = target; + while (container.getSize().width == 0 && container.getParent() != null) { + container = container.getParent(); + } + int targetWidth = container.getSize().width; + if (targetWidth == 0) { + targetWidth = Integer.MAX_VALUE; } - Dimension d = _xifexpression; - if (((rowWidth + d.width) > maxWidth)) { - this.addRow(dim, rowWidth, rowHeight); - rowWidth = 0; - rowHeight = 0; + int hgap = getHgap(); + int vgap = getVgap(); + Insets insets = target.getInsets(); + int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2); + int maxWidth = targetWidth - horizontalInsetsAndGap; + // Fit components into the allowed width + Dimension dim = new Dimension(0, 0); + int rowWidth = 0; + int rowHeight = 0; + int nmembers = target.getComponentCount(); + for (int i = 0; i < nmembers; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize(); + // Can't add the component to current row. Start a new row. + if (rowWidth + d.width > maxWidth) { + addRow(dim, rowWidth, rowHeight); + rowWidth = 0; + rowHeight = 0; + } + // Add a horizontal gap for all components after the first + if (rowWidth != 0) { + rowWidth += hgap; + } + rowWidth += d.width; + rowHeight = Math.max(rowHeight, d.height); + } } - if ((rowWidth != 0)) { - int _rowWidth = rowWidth; - rowWidth = (_rowWidth + hgap); + addRow(dim, rowWidth, rowHeight); + dim.width += horizontalInsetsAndGap; + dim.height += insets.top + insets.bottom + vgap * 2; + // When using a scroll pane or the DecoratedLookAndFeel we need to + // make sure the preferred size is less than the size of the + // target container so shrinking the container size works + // correctly. Removing the horizontal gap is an easy way to do this. + Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target); + if (scrollPane != null && target.isValid()) { + dim.width -= (hgap + 1); } - int _rowWidth_1 = rowWidth; - rowWidth = (_rowWidth_1 + d.width); - rowHeight = Math.max(rowHeight, d.height); - } + return dim; } - } - this.addRow(dim, rowWidth, rowHeight); - int _width = dim.width; - dim.width = (_width + horizontalInsetsAndGap); - int _height = dim.height; - dim.height = (_height + ((insets.top + insets.bottom) + (vgap * 2))); - Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target); - if (((scrollPane != null) && target.isValid())) { - int _width_1 = dim.width; - dim.width = (_width_1 - (hgap + 1)); - } - return dim; } - } - - /** - * A new row has been completed. Use the dimensions of this row - * to update the preferred size for the container. - * - * @param dim update the width and height when appropriate - * @param rowWidth the width of the row to add - * @param rowHeight the height of the row to add - */ - private void addRow(final Dimension dim, final int rowWidth, final int rowHeight) { - dim.width = Math.max(dim.width, rowWidth); - if ((dim.height > 0)) { - int _height = dim.height; - int _vgap = this.getVgap(); - dim.height = (_height + _vgap); + + /** + * A new row has been completed. Use the dimensions of this row to update the + * preferred size for the container. + * + * @param dim + * update the width and height when appropriate + * @param rowWidth + * the width of the row to add + * @param rowHeight + * the height of the row to add + */ + private void addRow(final Dimension dim, final int rowWidth, final int rowHeight) { + dim.width = Math.max(dim.width, rowWidth); + if (dim.height > 0) { + dim.height += getVgap(); + } + dim.height += rowHeight; } - int _height_1 = dim.height; - dim.height = (_height_1 + rowHeight); - } } From c5af17e02c1a1d2fa58f664b0090e65afb50f71c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 12:40:34 +0200 Subject: [PATCH 178/286] rename AbstractJdbcTest.xtend to AbstractJdbcTest.java --- .../sqldev/test/{AbstractJdbcTest.xtend => AbstractJdbcTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/{AbstractJdbcTest.xtend => AbstractJdbcTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java From 4c44e4c7e5bd08548a09c9917b45a5823cab8cb8 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 12:40:51 +0200 Subject: [PATCH 179/286] add AbstractJdbcTest.java generated by Xtend 2.20.0 --- .../utplsql/sqldev/test/AbstractJdbcTest.java | 136 ++++++++++++------ 1 file changed, 90 insertions(+), 46 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java index 015885e0..225c26cb 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,51 +13,95 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test +package org.utplsql.sqldev.test; -import java.io.StringReader -import java.util.ArrayList -import java.util.Properties -import oracle.dbtools.raptor.newscriptrunner.SQLCommand.StmtType -import oracle.dbtools.worksheet.scriptparser.sqlplus.SQLPlusScriptParser -import org.springframework.jdbc.core.JdbcTemplate -import org.springframework.jdbc.datasource.SingleConnectionDataSource +import com.google.common.base.Objects; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Properties; +import oracle.dbtools.raptor.newscriptrunner.ISQLCommand; +import oracle.dbtools.raptor.newscriptrunner.SQLCommand; +import oracle.dbtools.worksheet.scriptparser.sqlplus.SQLPlusScriptParser; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.Functions.Function0; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; -abstract class AbstractJdbcTest { - protected static var SingleConnectionDataSource dataSource - protected static var JdbcTemplate jdbcTemplate - protected static var SingleConnectionDataSource sysDataSource - protected static var JdbcTemplate sysJdbcTemplate - // static initializer not supported in Xtend, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=429141 - protected static val _staticInitializerForDataSourceAndJdbcTemplate = { - val p = new Properties() - p.load(AbstractJdbcTest.getClass().getResourceAsStream("/test.properties")) - // create dataSource and jdbcTemplate - dataSource = new SingleConnectionDataSource() - dataSource.driverClassName = "oracle.jdbc.OracleDriver" - dataSource.url = '''jdbc:oracle:thin:@«p.getProperty("host")»:«p.getProperty("port")»/«p.getProperty("service")»''' - dataSource.username = p.getProperty("scott_username") - dataSource.password = p.getProperty("scott_password") - jdbcTemplate = new JdbcTemplate(dataSource) - // create dbaDataSource and dbaJdbcTemplate - sysDataSource = new SingleConnectionDataSource() - sysDataSource.driverClassName = "oracle.jdbc.OracleDriver" - sysDataSource.url = '''jdbc:oracle:thin:@«p.getProperty("host")»:«p.getProperty("port")»/«p.getProperty("service")»''' - sysDataSource.username = p.getProperty("sys_username") - sysDataSource.password = p.getProperty("sys_password") - sysJdbcTemplate = new JdbcTemplate(AbstractJdbcTest.sysDataSource) - } - - def static getStatements(String sqlplusScript) { - var SQLPlusScriptParser p = new SQLPlusScriptParser(new StringReader(sqlplusScript)) - val stmts = new ArrayList - while (p.hasNext) { - val stmt = p.next - if ((stmt.executable || stmt.runnable) && stmt.stmtType != StmtType.G_C_COMMENT && - stmt.stmtType != StmtType.G_C_MULTILINECOMMENT && stmt.stmtType != StmtType.G_C_SQLPLUS) { - stmts.add(stmt.sql) - } - } - return stmts; - } +@SuppressWarnings("all") +public abstract class AbstractJdbcTest { + protected static SingleConnectionDataSource dataSource; + + protected static JdbcTemplate jdbcTemplate; + + protected static SingleConnectionDataSource sysDataSource; + + protected static JdbcTemplate sysJdbcTemplate; + + protected static final JdbcTemplate _staticInitializerForDataSourceAndJdbcTemplate = new Function0() { + public JdbcTemplate apply() { + try { + JdbcTemplate _xblockexpression = null; + { + final Properties p = new Properties(); + p.load(AbstractJdbcTest.class.getClass().getResourceAsStream("/test.properties")); + SingleConnectionDataSource _singleConnectionDataSource = new SingleConnectionDataSource(); + AbstractJdbcTest.dataSource = _singleConnectionDataSource; + AbstractJdbcTest.dataSource.setDriverClassName("oracle.jdbc.OracleDriver"); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("jdbc:oracle:thin:@"); + String _property = p.getProperty("host"); + _builder.append(_property); + _builder.append(":"); + String _property_1 = p.getProperty("port"); + _builder.append(_property_1); + _builder.append("/"); + String _property_2 = p.getProperty("service"); + _builder.append(_property_2); + AbstractJdbcTest.dataSource.setUrl(_builder.toString()); + AbstractJdbcTest.dataSource.setUsername(p.getProperty("scott_username")); + AbstractJdbcTest.dataSource.setPassword(p.getProperty("scott_password")); + JdbcTemplate _jdbcTemplate = new JdbcTemplate(AbstractJdbcTest.dataSource); + AbstractJdbcTest.jdbcTemplate = _jdbcTemplate; + SingleConnectionDataSource _singleConnectionDataSource_1 = new SingleConnectionDataSource(); + AbstractJdbcTest.sysDataSource = _singleConnectionDataSource_1; + AbstractJdbcTest.sysDataSource.setDriverClassName("oracle.jdbc.OracleDriver"); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("jdbc:oracle:thin:@"); + String _property_3 = p.getProperty("host"); + _builder_1.append(_property_3); + _builder_1.append(":"); + String _property_4 = p.getProperty("port"); + _builder_1.append(_property_4); + _builder_1.append("/"); + String _property_5 = p.getProperty("service"); + _builder_1.append(_property_5); + AbstractJdbcTest.sysDataSource.setUrl(_builder_1.toString()); + AbstractJdbcTest.sysDataSource.setUsername(p.getProperty("sys_username")); + AbstractJdbcTest.sysDataSource.setPassword(p.getProperty("sys_password")); + JdbcTemplate _jdbcTemplate_1 = new JdbcTemplate(AbstractJdbcTest.sysDataSource); + _xblockexpression = AbstractJdbcTest.sysJdbcTemplate = _jdbcTemplate_1; + } + return _xblockexpression; + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + }.apply(); + + public static ArrayList getStatements(final String sqlplusScript) { + StringReader _stringReader = new StringReader(sqlplusScript); + SQLPlusScriptParser p = new SQLPlusScriptParser(_stringReader); + final ArrayList stmts = new ArrayList(); + while (p.hasNext()) { + { + final ISQLCommand stmt = p.next(); + if (((((stmt.getExecutable() || stmt.getRunnable()) && (!Objects.equal(stmt.getStmtType(), SQLCommand.StmtType.G_C_COMMENT))) && + (!Objects.equal(stmt.getStmtType(), SQLCommand.StmtType.G_C_MULTILINECOMMENT))) && (!Objects.equal(stmt.getStmtType(), SQLCommand.StmtType.G_C_SQLPLUS)))) { + stmts.add(stmt.getSql()); + } + } + } + return stmts; + } } From cb4e69151acf558986f93bb25c73c44f8ab1aaf4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:06:23 +0200 Subject: [PATCH 180/286] convert AbstractJdbcTest to Java, removing Xtend dependencies --- .../utplsql/sqldev/test/AbstractJdbcTest.java | 125 +++++++----------- 1 file changed, 47 insertions(+), 78 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java index 225c26cb..f19103a5 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,93 +15,62 @@ */ package org.utplsql.sqldev.test; -import com.google.common.base.Objects; +import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; +import java.util.List; import java.util.Properties; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.exception.GenericRuntimeException; + import oracle.dbtools.raptor.newscriptrunner.ISQLCommand; import oracle.dbtools.raptor.newscriptrunner.SQLCommand; import oracle.dbtools.worksheet.scriptparser.sqlplus.SQLPlusScriptParser; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.Functions.Function0; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.SingleConnectionDataSource; -@SuppressWarnings("all") public abstract class AbstractJdbcTest { - protected static SingleConnectionDataSource dataSource; - - protected static JdbcTemplate jdbcTemplate; - - protected static SingleConnectionDataSource sysDataSource; - - protected static JdbcTemplate sysJdbcTemplate; - - protected static final JdbcTemplate _staticInitializerForDataSourceAndJdbcTemplate = new Function0() { - public JdbcTemplate apply() { - try { - JdbcTemplate _xblockexpression = null; - { - final Properties p = new Properties(); - p.load(AbstractJdbcTest.class.getClass().getResourceAsStream("/test.properties")); - SingleConnectionDataSource _singleConnectionDataSource = new SingleConnectionDataSource(); - AbstractJdbcTest.dataSource = _singleConnectionDataSource; - AbstractJdbcTest.dataSource.setDriverClassName("oracle.jdbc.OracleDriver"); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("jdbc:oracle:thin:@"); - String _property = p.getProperty("host"); - _builder.append(_property); - _builder.append(":"); - String _property_1 = p.getProperty("port"); - _builder.append(_property_1); - _builder.append("/"); - String _property_2 = p.getProperty("service"); - _builder.append(_property_2); - AbstractJdbcTest.dataSource.setUrl(_builder.toString()); - AbstractJdbcTest.dataSource.setUsername(p.getProperty("scott_username")); - AbstractJdbcTest.dataSource.setPassword(p.getProperty("scott_password")); - JdbcTemplate _jdbcTemplate = new JdbcTemplate(AbstractJdbcTest.dataSource); - AbstractJdbcTest.jdbcTemplate = _jdbcTemplate; - SingleConnectionDataSource _singleConnectionDataSource_1 = new SingleConnectionDataSource(); - AbstractJdbcTest.sysDataSource = _singleConnectionDataSource_1; - AbstractJdbcTest.sysDataSource.setDriverClassName("oracle.jdbc.OracleDriver"); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("jdbc:oracle:thin:@"); - String _property_3 = p.getProperty("host"); - _builder_1.append(_property_3); - _builder_1.append(":"); - String _property_4 = p.getProperty("port"); - _builder_1.append(_property_4); - _builder_1.append("/"); - String _property_5 = p.getProperty("service"); - _builder_1.append(_property_5); - AbstractJdbcTest.sysDataSource.setUrl(_builder_1.toString()); - AbstractJdbcTest.sysDataSource.setUsername(p.getProperty("sys_username")); - AbstractJdbcTest.sysDataSource.setPassword(p.getProperty("sys_password")); - JdbcTemplate _jdbcTemplate_1 = new JdbcTemplate(AbstractJdbcTest.sysDataSource); - _xblockexpression = AbstractJdbcTest.sysJdbcTemplate = _jdbcTemplate_1; + protected static SingleConnectionDataSource dataSource; + protected static JdbcTemplate jdbcTemplate; + protected static SingleConnectionDataSource sysDataSource; + protected static JdbcTemplate sysJdbcTemplate; + + static { + final Properties p = new Properties(); + try { + p.load(AbstractJdbcTest.class.getClass().getResourceAsStream("/test.properties")); + } catch (IOException e) { + throw new GenericRuntimeException("Cannot read test.properties", e); } - return _xblockexpression; - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } + // create dataSource and jdbcTemplate + dataSource = new SingleConnectionDataSource(); + dataSource.setDriverClassName("oracle.jdbc.OracleDriver"); + dataSource.setUrl("jdbc:oracle:thin:@" + p.getProperty("host") + ":" + p.getProperty("port") + "/" + + p.getProperty("service")); + dataSource.setUsername(p.getProperty("scott_username")); + dataSource.setPassword(p.getProperty("scott_password")); + jdbcTemplate = new JdbcTemplate(dataSource); + // create dbaDataSource and dbaJdbcTemplate + sysDataSource = new SingleConnectionDataSource(); + sysDataSource.setDriverClassName("oracle.jdbc.OracleDriver"); + sysDataSource.setUrl("jdbc:oracle:thin:@" + p.getProperty("host") + ":" + p.getProperty("port") + "/" + + p.getProperty("service")); + sysDataSource.setUsername(p.getProperty("sys_username")); + sysDataSource.setPassword(p.getProperty("sys_password")); + sysJdbcTemplate = new JdbcTemplate(sysDataSource); } - }.apply(); - - public static ArrayList getStatements(final String sqlplusScript) { - StringReader _stringReader = new StringReader(sqlplusScript); - SQLPlusScriptParser p = new SQLPlusScriptParser(_stringReader); - final ArrayList stmts = new ArrayList(); - while (p.hasNext()) { - { - final ISQLCommand stmt = p.next(); - if (((((stmt.getExecutable() || stmt.getRunnable()) && (!Objects.equal(stmt.getStmtType(), SQLCommand.StmtType.G_C_COMMENT))) && - (!Objects.equal(stmt.getStmtType(), SQLCommand.StmtType.G_C_MULTILINECOMMENT))) && (!Objects.equal(stmt.getStmtType(), SQLCommand.StmtType.G_C_SQLPLUS)))) { - stmts.add(stmt.getSql()); + + public static List getStatements(final String sqlplusScript) { + SQLPlusScriptParser p = new SQLPlusScriptParser(new StringReader(sqlplusScript)); + final ArrayList stmts = new ArrayList<>(); + while (p.hasNext()) { + final ISQLCommand stmt = p.next(); + if ((stmt.getExecutable() || stmt.getRunnable()) && stmt.getStmtType() != SQLCommand.StmtType.G_C_COMMENT + && stmt.getStmtType() != SQLCommand.StmtType.G_C_MULTILINECOMMENT + && stmt.getStmtType() != SQLCommand.StmtType.G_C_SQLPLUS) { + stmts.add(stmt.getSql()); + } } - } + return stmts; } - return stmts; - } } From 7753a565c9d053d3e16bee8b6864bdf01a2dd575 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:08:56 +0200 Subject: [PATCH 181/286] rename PrefixToolsTest.xtend to PrefixToolsTest.java --- .../sqldev/test/{PrefixToolsTest.xtend => PrefixToolsTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/{PrefixToolsTest.xtend => PrefixToolsTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java From 9e12764dca74743bc4df12c6a5c853f25bcd209b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:09:14 +0200 Subject: [PATCH 182/286] add PrefixToolsTest.java generated by Xtend 2.20.0 --- .../utplsql/sqldev/test/PrefixToolsTest.java | 84 ++++++++++--------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java index 8c7d7760..abbe409a 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java @@ -1,43 +1,45 @@ -package org.utplsql.sqldev.test +package org.utplsql.sqldev.test; -import org.junit.Assert -import org.junit.Test -import org.utplsql.sqldev.model.PrefixTools +import java.util.Collections; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.model.PrefixTools; -class PrefixToolsTest { - @Test - def void two() { - val actual = PrefixTools.commonPrefix(#["junit.test.a", "junit.test.b"]) - val expected = "junit.test." - Assert.assertEquals(expected, actual) - } - - @Test - def void oneWithDot() { - val actual = PrefixTools.commonPrefix(#["junit.test.a"]) - val expected = "junit.test." - Assert.assertEquals(expected, actual) - } - - @Test - def void oneWithoutDot() { - val actual = PrefixTools.commonPrefix(#["junit-test-a"]) - val expected = "" - Assert.assertEquals(expected, actual) - } - - @Test - def void twoOverlapLeft() { - val actual = PrefixTools.commonPrefix(#["a.b.c", "a.b.c.d"]) - val expected = "" - Assert.assertEquals(expected, actual) - } - - @Test - def void twoOverlapRight() { - val actual = PrefixTools.commonPrefix(#["a.b.c.d", "a.b.c"]) - val expected = "" - Assert.assertEquals(expected, actual) - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class PrefixToolsTest { + @Test + public void two() { + final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("junit.test.a", "junit.test.b"))); + final String expected = "junit.test."; + Assert.assertEquals(expected, actual); + } + + @Test + public void oneWithDot() { + final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("junit.test.a"))); + final String expected = "junit.test."; + Assert.assertEquals(expected, actual); + } + + @Test + public void oneWithoutDot() { + final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("junit-test-a"))); + final String expected = ""; + Assert.assertEquals(expected, actual); + } + + @Test + public void twoOverlapLeft() { + final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("a.b.c", "a.b.c.d"))); + final String expected = ""; + Assert.assertEquals(expected, actual); + } + + @Test + public void twoOverlapRight() { + final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("a.b.c.d", "a.b.c"))); + final String expected = ""; + Assert.assertEquals(expected, actual); + } +} From 4c9283ebf34be840ff9bb04725d53e92d79c1b92 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:13:48 +0200 Subject: [PATCH 183/286] convert PrefixToolsTest to Java, removing Xtend dependencies --- .../utplsql/sqldev/test/PrefixToolsTest.java | 88 +++++++++++-------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java index abbe409a..c4b0983e 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/PrefixToolsTest.java @@ -1,45 +1,59 @@ +/* + * Copyright 2019 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.utplsql.sqldev.test; -import java.util.Collections; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import java.util.Arrays; + import org.junit.Assert; import org.junit.Test; import org.utplsql.sqldev.model.PrefixTools; -@SuppressWarnings("all") public class PrefixToolsTest { - @Test - public void two() { - final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("junit.test.a", "junit.test.b"))); - final String expected = "junit.test."; - Assert.assertEquals(expected, actual); - } - - @Test - public void oneWithDot() { - final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("junit.test.a"))); - final String expected = "junit.test."; - Assert.assertEquals(expected, actual); - } - - @Test - public void oneWithoutDot() { - final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("junit-test-a"))); - final String expected = ""; - Assert.assertEquals(expected, actual); - } - - @Test - public void twoOverlapLeft() { - final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("a.b.c", "a.b.c.d"))); - final String expected = ""; - Assert.assertEquals(expected, actual); - } - - @Test - public void twoOverlapRight() { - final String actual = PrefixTools.commonPrefix(Collections.unmodifiableList(CollectionLiterals.newArrayList("a.b.c.d", "a.b.c"))); - final String expected = ""; - Assert.assertEquals(expected, actual); - } + @Test + public void two() { + final String actual = PrefixTools.commonPrefix(Arrays.asList("junit.test.a", "junit.test.b")); + final String expected = "junit.test."; + Assert.assertEquals(expected, actual); + } + + @Test + public void oneWithDot() { + final String actual = PrefixTools.commonPrefix(Arrays.asList("junit.test.a")); + final String expected = "junit.test."; + Assert.assertEquals(expected, actual); + } + + @Test + public void oneWithoutDot() { + final String actual = PrefixTools.commonPrefix(Arrays.asList("junit-test-a")); + final String expected = ""; + Assert.assertEquals(expected, actual); + } + + @Test + public void twoOverlapLeft() { + final String actual = PrefixTools.commonPrefix(Arrays.asList("a.b.c", "a.b.c.d")); + final String expected = ""; + Assert.assertEquals(expected, actual); + } + + @Test + public void twoOverlapRight() { + final String actual = PrefixTools.commonPrefix(Arrays.asList("a.b.c.d", "a.b.c")); + final String expected = ""; + Assert.assertEquals(expected, actual); + } } From 90a5cad401d04727423bb7ba811717cfea0c54ea Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:15:20 +0200 Subject: [PATCH 184/286] rename ResourceTest.xtend to ResourceTest.java --- .../utplsql/sqldev/test/{ResourceTest.xtend => ResourceTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/{ResourceTest.xtend => ResourceTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java From 409dbb6a86822ccefc31441529bb5ee0577ded4c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:15:34 +0200 Subject: [PATCH 185/286] add ResourceTest.java generated by Xtend 2.20.0 --- .../org/utplsql/sqldev/test/ResourceTest.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java index d283cb5d..e9f5ee72 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test +package org.utplsql.sqldev.test; -import org.junit.Assert -import org.junit.Test -import org.utplsql.sqldev.resources.UtplsqlResources +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.resources.UtplsqlResources; -class ResourceTest { - - @Test - def void windowPathsLabel() { - val actual = UtplsqlResources.getString("WINDOW_PATHS_LABEL") - val expected = "utPLSQL paths" - Assert.assertEquals(expected, actual) - } -} \ No newline at end of file +@SuppressWarnings("all") +public class ResourceTest { + @Test + public void windowPathsLabel() { + final String actual = UtplsqlResources.getString("WINDOW_PATHS_LABEL"); + final String expected = "utPLSQL paths"; + Assert.assertEquals(expected, actual); + } +} From 47e82b09eac5ec2c4156140803b4ac39e3c2ff21 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:17:15 +0200 Subject: [PATCH 186/286] convert ResourceTest to Java, removing Xtend dependencies --- .../org/utplsql/sqldev/test/ResourceTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java index e9f5ee72..4c6c39e4 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/ResourceTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,12 +19,12 @@ import org.junit.Test; import org.utplsql.sqldev.resources.UtplsqlResources; -@SuppressWarnings("all") public class ResourceTest { - @Test - public void windowPathsLabel() { - final String actual = UtplsqlResources.getString("WINDOW_PATHS_LABEL"); - final String expected = "utPLSQL paths"; - Assert.assertEquals(expected, actual); - } + + @Test + public void windowPathsLabel() { + final String actual = UtplsqlResources.getString("WINDOW_PATHS_LABEL"); + final String expected = "utPLSQL paths"; + Assert.assertEquals(expected, actual); + } } From 2a77ec2ad25ede021dd7573bc7505f545ede8b1f Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:18:26 +0200 Subject: [PATCH 187/286] rename SnippetTest.xtend to SnippetTest.java --- .../utplsql/sqldev/test/{SnippetTest.xtend => SnippetTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/{SnippetTest.xtend => SnippetTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java From afed8737cd8b5a0619c9812dfcfb00dc95716dc5 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 13:18:43 +0200 Subject: [PATCH 188/286] add SnippetTest.java generated by Xtend 2.20.0 --- .../org/utplsql/sqldev/test/SnippetTest.java | 212 ++++++++++++------ 1 file changed, 140 insertions(+), 72 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java index 1a7e2387..e31f1ae2 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,77 +13,145 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test - -import java.io.File -import java.nio.file.Files -import java.nio.file.Paths -import org.junit.Assert -import org.junit.Test -import org.utplsql.sqldev.snippet.SnippetMerger - -class SnippetTest { - - @Test - def void mergeAsCopy() { - val file = new File(System.getProperty("user.home") + File.separator + "UserSnippets.xml") - file.delete - val merger = new SnippetMerger(file) - merger.merge - Assert.assertTrue(file.exists) - val userSnippetsXml = new String(Files.readAllBytes(Paths.get(file.absolutePath))) - Assert.assertEquals(merger.template, userSnippetsXml ) - } - - @Test - def void mergeKeepExisting() { - val file = new File(System.getProperty("user.home") + File.separator + "UserSnippets.xml") - file.delete - val userSnippetsXml = ''' - - - - - - - - - - - '''.toString - Files.write(Paths.get(file.absolutePath), userSnippetsXml.bytes) - val merger = new SnippetMerger(file) - merger.merge - Assert.assertTrue(file.exists) - val userSnippetsXml2 = new String(Files.readAllBytes(Paths.get(file.absolutePath))) - Assert.assertTrue(userSnippetsXml2.length > userSnippetsXml.length) - Assert.assertTrue(userSnippetsXml2.contains('''''')) - Assert.assertTrue(userSnippetsXml2.contains('''''')) - Assert.assertTrue(userSnippetsXml2.contains('''''')) - } - - @Test - def void mergeRemoveExisting() { - val file = new File(System.getProperty("user.home") + File.separator + "UserSnippets.xml") - file.delete - val userSnippetsXml = ''' - - - - - - '''.toString - Files.write(Paths.get(file.absolutePath), userSnippetsXml.bytes) - val merger = new SnippetMerger(file) - merger.merge - Assert.assertTrue(file.exists) - val userSnippetsXml2 = new String(Files.readAllBytes(Paths.get(file.absolutePath))) - Assert.assertTrue(userSnippetsXml2.length > userSnippetsXml.length) - Assert.assertFalse(userSnippetsXml2.contains('''''')) - Assert.assertFalse(userSnippetsXml2.contains('''''')) - Assert.assertTrue(userSnippetsXml2.contains('''''')) - Assert.assertTrue(userSnippetsXml2.contains('''''')) - } +package org.utplsql.sqldev.test; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.snippet.SnippetMerger; +@SuppressWarnings("all") +public class SnippetTest { + @Test + public void mergeAsCopy() { + try { + String _property = System.getProperty("user.home"); + String _plus = (_property + File.separator); + String _plus_1 = (_plus + "UserSnippets.xml"); + final File file = new File(_plus_1); + file.delete(); + final SnippetMerger merger = new SnippetMerger(file); + merger.merge(); + Assert.assertTrue(file.exists()); + byte[] _readAllBytes = Files.readAllBytes(Paths.get(file.getAbsolutePath())); + final String userSnippetsXml = new String(_readAllBytes); + Assert.assertEquals(merger.getTemplate(), userSnippetsXml); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void mergeKeepExisting() { + try { + String _property = System.getProperty("user.home"); + String _plus = (_property + File.separator); + String _plus_1 = (_plus + "UserSnippets.xml"); + final File file = new File(_plus_1); + file.delete(); + StringConcatenation _builder = new StringConcatenation(); + _builder.append(""); + _builder.newLine(); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(""); + _builder.newLine(); + final String userSnippetsXml = _builder.toString(); + Files.write(Paths.get(file.getAbsolutePath()), userSnippetsXml.getBytes()); + final SnippetMerger merger = new SnippetMerger(file); + merger.merge(); + Assert.assertTrue(file.exists()); + byte[] _readAllBytes = Files.readAllBytes(Paths.get(file.getAbsolutePath())); + final String userSnippetsXml2 = new String(_readAllBytes); + int _length = userSnippetsXml2.length(); + int _length_1 = userSnippetsXml.length(); + boolean _greaterThan = (_length > _length_1); + Assert.assertTrue(_greaterThan); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append(""); + Assert.assertTrue(userSnippetsXml2.contains(_builder_1)); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append(""); + Assert.assertTrue(userSnippetsXml2.contains(_builder_2)); + StringConcatenation _builder_3 = new StringConcatenation(); + _builder_3.append(""); + Assert.assertTrue(userSnippetsXml2.contains(_builder_3)); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void mergeRemoveExisting() { + try { + String _property = System.getProperty("user.home"); + String _plus = (_property + File.separator); + String _plus_1 = (_plus + "UserSnippets.xml"); + final File file = new File(_plus_1); + file.delete(); + StringConcatenation _builder = new StringConcatenation(); + _builder.append(""); + _builder.newLine(); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(" "); + _builder.append(""); + _builder.newLine(); + _builder.append(""); + _builder.newLine(); + final String userSnippetsXml = _builder.toString(); + Files.write(Paths.get(file.getAbsolutePath()), userSnippetsXml.getBytes()); + final SnippetMerger merger = new SnippetMerger(file); + merger.merge(); + Assert.assertTrue(file.exists()); + byte[] _readAllBytes = Files.readAllBytes(Paths.get(file.getAbsolutePath())); + final String userSnippetsXml2 = new String(_readAllBytes); + int _length = userSnippetsXml2.length(); + int _length_1 = userSnippetsXml.length(); + boolean _greaterThan = (_length > _length_1); + Assert.assertTrue(_greaterThan); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append(""); + Assert.assertFalse(userSnippetsXml2.contains(_builder_1)); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append(""); + Assert.assertFalse(userSnippetsXml2.contains(_builder_2)); + StringConcatenation _builder_3 = new StringConcatenation(); + _builder_3.append(""); + Assert.assertTrue(userSnippetsXml2.contains(_builder_3)); + StringConcatenation _builder_4 = new StringConcatenation(); + _builder_4.append(""); + Assert.assertTrue(userSnippetsXml2.contains(_builder_4)); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } } From c44c3714e4dfb3a082027d26236f57a704a32b8d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:15:26 +0200 Subject: [PATCH 189/286] add FileTools.java to wrap checked exceptions --- .../org/utplsql/sqldev/model/FileTools.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 sqldev/src/main/java/org/utplsql/sqldev/model/FileTools.java diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/FileTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/FileTools.java new file mode 100644 index 00000000..02b32e5f --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/FileTools.java @@ -0,0 +1,57 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.model; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.utplsql.sqldev.exception.GenericRuntimeException; + +public class FileTools { + // do not instantiate this class + private FileTools() { + super(); + } + + public static byte[] readFile(Path path) { + try { + return Files.readAllBytes(path); + } catch (IOException e) { + final String msg = "Cannot read file " + path.toString() + "."; + throw new GenericRuntimeException(msg, e); + } + } + + public static void writeFile(Path path, byte[] bytes) { + try { + Files.write(path, bytes); + } catch (IOException e) { + final String msg = "Cannot write file " + path.toString() + "."; + throw new GenericRuntimeException(msg, e); + } + } + + public static void writeFile(Path path, Iterable lines, Charset cs) { + try { + Files.write(path, lines, cs); + } catch (IOException e) { + final String msg = "Cannot write file " + path.toString() + "."; + throw new GenericRuntimeException(msg, e); + } + } +} From 1df21806182c13356f3c5773836b15bec2fd3f08 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:15:54 +0200 Subject: [PATCH 190/286] convert SnippetTest to Java, removing Xtend dependencies --- .../org/utplsql/sqldev/test/SnippetTest.java | 190 ++++++------------ 1 file changed, 60 insertions(+), 130 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java index e31f1ae2..d03a1816 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,142 +16,72 @@ package org.utplsql.sqldev.test; import java.io.File; -import java.nio.file.Files; import java.nio.file.Paths; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.Exceptions; + import org.junit.Assert; import org.junit.Test; +import org.utplsql.sqldev.model.FileTools; import org.utplsql.sqldev.snippet.SnippetMerger; -@SuppressWarnings("all") public class SnippetTest { - @Test - public void mergeAsCopy() { - try { - String _property = System.getProperty("user.home"); - String _plus = (_property + File.separator); - String _plus_1 = (_plus + "UserSnippets.xml"); - final File file = new File(_plus_1); - file.delete(); - final SnippetMerger merger = new SnippetMerger(file); - merger.merge(); - Assert.assertTrue(file.exists()); - byte[] _readAllBytes = Files.readAllBytes(Paths.get(file.getAbsolutePath())); - final String userSnippetsXml = new String(_readAllBytes); - Assert.assertEquals(merger.getTemplate(), userSnippetsXml); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + private static final File USER_SNIPPETS_FILE = new File( + System.getProperty("user.home") + File.separator + "UserSnippets.xml"); + + @Test + public void mergeAsCopy() { + USER_SNIPPETS_FILE.delete(); + final SnippetMerger merger = new SnippetMerger(USER_SNIPPETS_FILE); + merger.merge(); + Assert.assertTrue(USER_SNIPPETS_FILE.exists()); + final String userSnippetsXml = new String(FileTools.readFile(USER_SNIPPETS_FILE.toPath())); + Assert.assertEquals(merger.getTemplate(), userSnippetsXml); } - } - - @Test - public void mergeKeepExisting() { - try { - String _property = System.getProperty("user.home"); - String _plus = (_property + File.separator); - String _plus_1 = (_plus + "UserSnippets.xml"); - final File file = new File(_plus_1); - file.delete(); - StringConcatenation _builder = new StringConcatenation(); - _builder.append(""); - _builder.newLine(); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(""); - _builder.newLine(); - final String userSnippetsXml = _builder.toString(); - Files.write(Paths.get(file.getAbsolutePath()), userSnippetsXml.getBytes()); - final SnippetMerger merger = new SnippetMerger(file); - merger.merge(); - Assert.assertTrue(file.exists()); - byte[] _readAllBytes = Files.readAllBytes(Paths.get(file.getAbsolutePath())); - final String userSnippetsXml2 = new String(_readAllBytes); - int _length = userSnippetsXml2.length(); - int _length_1 = userSnippetsXml.length(); - boolean _greaterThan = (_length > _length_1); - Assert.assertTrue(_greaterThan); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append(""); - Assert.assertTrue(userSnippetsXml2.contains(_builder_1)); - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append(""); - Assert.assertTrue(userSnippetsXml2.contains(_builder_2)); - StringConcatenation _builder_3 = new StringConcatenation(); - _builder_3.append(""); - Assert.assertTrue(userSnippetsXml2.contains(_builder_3)); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + public void mergeKeepExisting() { + USER_SNIPPETS_FILE.delete(); + StringBuilder sb = new StringBuilder(); + sb.append("\n"); + sb.append("\n"); + sb.append(" \n"); + sb.append(" \n"); + sb.append(" \n"); + sb.append(" \n"); + sb.append(" \n"); + sb.append(" \n"); + sb.append(" \n"); + sb.append("\n"); + final String userSnippetsXml = sb.toString(); + FileTools.writeFile(Paths.get(USER_SNIPPETS_FILE.getAbsolutePath()), userSnippetsXml.getBytes()); + final SnippetMerger merger = new SnippetMerger(USER_SNIPPETS_FILE); + merger.merge(); + Assert.assertTrue(USER_SNIPPETS_FILE.exists()); + final String userSnippetsXml2 = new String(FileTools.readFile(USER_SNIPPETS_FILE.toPath())); + Assert.assertTrue(userSnippetsXml2.length() > userSnippetsXml.length()); + Assert.assertTrue(userSnippetsXml2.contains("")); + Assert.assertTrue(userSnippetsXml2.contains("")); + Assert.assertTrue(userSnippetsXml2.contains("")); } - } - - @Test - public void mergeRemoveExisting() { - try { - String _property = System.getProperty("user.home"); - String _plus = (_property + File.separator); - String _plus_1 = (_plus + "UserSnippets.xml"); - final File file = new File(_plus_1); - file.delete(); - StringConcatenation _builder = new StringConcatenation(); - _builder.append(""); - _builder.newLine(); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(" "); - _builder.append(""); - _builder.newLine(); - _builder.append(""); - _builder.newLine(); - final String userSnippetsXml = _builder.toString(); - Files.write(Paths.get(file.getAbsolutePath()), userSnippetsXml.getBytes()); - final SnippetMerger merger = new SnippetMerger(file); - merger.merge(); - Assert.assertTrue(file.exists()); - byte[] _readAllBytes = Files.readAllBytes(Paths.get(file.getAbsolutePath())); - final String userSnippetsXml2 = new String(_readAllBytes); - int _length = userSnippetsXml2.length(); - int _length_1 = userSnippetsXml.length(); - boolean _greaterThan = (_length > _length_1); - Assert.assertTrue(_greaterThan); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append(""); - Assert.assertFalse(userSnippetsXml2.contains(_builder_1)); - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append(""); - Assert.assertFalse(userSnippetsXml2.contains(_builder_2)); - StringConcatenation _builder_3 = new StringConcatenation(); - _builder_3.append(""); - Assert.assertTrue(userSnippetsXml2.contains(_builder_3)); - StringConcatenation _builder_4 = new StringConcatenation(); - _builder_4.append(""); - Assert.assertTrue(userSnippetsXml2.contains(_builder_4)); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + public void mergeRemoveExisting() { + USER_SNIPPETS_FILE.delete(); + StringBuilder sb = new StringBuilder(); + sb.append("\n"); + sb.append("\n"); + sb.append(" \n"); + sb.append(" \n"); + sb.append("\n"); + final String userSnippetsXml = sb.toString(); + FileTools.writeFile(Paths.get(USER_SNIPPETS_FILE.getAbsolutePath()), userSnippetsXml.getBytes()); + final SnippetMerger merger = new SnippetMerger(USER_SNIPPETS_FILE); + merger.merge(); + Assert.assertTrue(USER_SNIPPETS_FILE.exists()); + final String userSnippetsXml2 = new String(FileTools.readFile(Paths.get(USER_SNIPPETS_FILE.getAbsolutePath()))); + Assert.assertTrue(userSnippetsXml2.length() > userSnippetsXml.length()); + Assert.assertFalse(userSnippetsXml2.contains("")); + Assert.assertFalse(userSnippetsXml2.contains("")); + Assert.assertTrue(userSnippetsXml2.contains("")); + Assert.assertTrue(userSnippetsXml2.contains("")); } - } } From 22c09cffbdc6f7fec630cd61ee99fca0a5fee777 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:17:08 +0200 Subject: [PATCH 191/286] use FileTools instead of Files --- .../sqldev/coverage/CodeCoverageReporter.java | 4 +-- .../utplsql/sqldev/snippet/SnippetMerger.java | 27 +++---------------- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index 5f27d5f1..101961b2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -19,7 +19,6 @@ import java.io.File; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; @@ -30,6 +29,7 @@ import org.utplsql.sqldev.dal.UtplsqlDao; import org.utplsql.sqldev.exception.GenericDatabaseAccessException; import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.FileTools; import org.utplsql.sqldev.ui.coverage.CodeCoverageReporterDialog; import oracle.dbtools.raptor.utils.Connections; @@ -103,7 +103,7 @@ private void run() { toStringList(includeObjects), toStringList(excludeObjects)); final File file = File.createTempFile("utplsql_", ".html"); logger.fine(() -> "Writing result to " + file + "..."); - Files.write(file.toPath(), Arrays.asList(content.split(System.lineSeparator())), StandardCharsets.UTF_8); + FileTools.writeFile(file.toPath(), Arrays.asList(content.split(System.lineSeparator())), StandardCharsets.UTF_8); final URL url = file.toURI().toURL(); logger.fine(() -> "Opening " + url.toExternalForm() + " in browser..."); final Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null; diff --git a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java index f3873b20..be2429ef 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java @@ -22,8 +22,6 @@ import java.io.InputStreamReader; import java.io.StringReader; import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -34,6 +32,7 @@ import javax.xml.parsers.ParserConfigurationException; import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.FileTools; import org.utplsql.sqldev.model.XMLTools; import org.w3c.dom.Document; import org.w3c.dom.NodeList; @@ -66,26 +65,6 @@ public SnippetMerger(final File file) { userSnippetsFile = file; } - private byte[] readFile(Path path) { - try { - return Files.readAllBytes(path); - } catch (IOException e) { - final String msg = "Cannot read file " + path.toString() + " due to " + e.getMessage() + "."; - logger.severe(() -> msg); - throw new GenericRuntimeException(msg, e); - } - } - - private void writeFile(Path path, byte[] bytes) { - try { - Files.write(path, bytes); - } catch (IOException e) { - final String msg = "Cannot write file " + path.toString() + " due to " + e.getMessage() + "."; - logger.severe(() -> msg); - throw new GenericRuntimeException(msg, e); - } - } - private DocumentBuilder createDocumentBuilder() { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { @@ -112,7 +91,7 @@ public void merge() { String result = null; if (userSnippetsFile.exists()) { // file exists, proper merge required - final String userSnippets = new String(readFile(Paths.get(userSnippetsFile.getAbsolutePath()))); + final String userSnippets = new String(FileTools.readFile(Paths.get(userSnippetsFile.getAbsolutePath()))); final DocumentBuilder docBuilder = createDocumentBuilder(); final Document userSnippetsDoc = parse(docBuilder, new InputSource(new StringReader(userSnippets))); final NodeList userSnippetsGroups = xmlTools.getNodeList(userSnippetsDoc, @@ -138,7 +117,7 @@ public void merge() { // just copy result = utplsqlSnippets; } - writeFile(Paths.get(userSnippetsFile.getAbsolutePath()), result.getBytes()); + FileTools.writeFile(Paths.get(userSnippetsFile.getAbsolutePath()), result.getBytes()); } public String getTemplate() { From 9fc72bb0b709cb68c6a57b4518a4ebab15c56996 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:18:52 +0200 Subject: [PATCH 192/286] rename UrlToolsTest.xtend to UrlToolsTest.java --- .../utplsql/sqldev/test/{UrlToolsTest.xtend => UrlToolsTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/{UrlToolsTest.xtend => UrlToolsTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java From cc343bfd5d8633dcc178a2bacf0a819e77677782 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:19:25 +0200 Subject: [PATCH 193/286] add UrlToolsTest.java generated by Xtend 2.20.0 --- .../org/utplsql/sqldev/test/UrlToolsTest.java | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java index 05ff2bc4..868e0f3a 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,33 +13,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test +package org.utplsql.sqldev.test; -import org.junit.Assert -import org.junit.Test -import org.utplsql.sqldev.model.URLTools - -class UrlToolsTest { - - @Test - def void replacePlusSign() { - Assert.assertEquals("+", URLTools.replaceHexChars("%2B")) - Assert.assertEquals("++", URLTools.replaceHexChars("%2B%2B")) - Assert.assertEquals("abc+%xyz", URLTools.replaceHexChars("abc%2B%xyz")) - } - - @Test - def void replaceAtSign() { - Assert.assertEquals("@", URLTools.replaceHexChars("%40")) - Assert.assertEquals("@@", URLTools.replaceHexChars("%40%40")) - Assert.assertEquals("abc@%xyz", URLTools.replaceHexChars("abc%40%xyz")) - } - - @Test - def void replaceAtAndPlusSign() { - Assert.assertEquals("@+", URLTools.replaceHexChars("%40%2B")) - Assert.assertEquals("@+@+", URLTools.replaceHexChars("%40%2B%40%2B")) - Assert.assertEquals("abc@+%xyz", URLTools.replaceHexChars("abc%40%2B%xyz")) - } +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.model.URLTools; +@SuppressWarnings("all") +public class UrlToolsTest { + @Test + public void replacePlusSign() { + Assert.assertEquals("+", URLTools.replaceHexChars("%2B")); + Assert.assertEquals("++", URLTools.replaceHexChars("%2B%2B")); + Assert.assertEquals("abc+%xyz", URLTools.replaceHexChars("abc%2B%xyz")); + } + + @Test + public void replaceAtSign() { + Assert.assertEquals("@", URLTools.replaceHexChars("%40")); + Assert.assertEquals("@@", URLTools.replaceHexChars("%40%40")); + Assert.assertEquals("abc@%xyz", URLTools.replaceHexChars("abc%40%xyz")); + } + + @Test + public void replaceAtAndPlusSign() { + Assert.assertEquals("@+", URLTools.replaceHexChars("%40%2B")); + Assert.assertEquals("@+@+", URLTools.replaceHexChars("%40%2B%40%2B")); + Assert.assertEquals("abc@+%xyz", URLTools.replaceHexChars("abc%40%2B%xyz")); + } } From 63fd2b804f968092436b780076101702cde8103c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:21:57 +0200 Subject: [PATCH 194/286] convert UrlToolsTest to Java, removing Xtend dependencies --- .../org/utplsql/sqldev/test/UrlToolsTest.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java index 868e0f3a..acccfe16 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/UrlToolsTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,26 +19,26 @@ import org.junit.Test; import org.utplsql.sqldev.model.URLTools; -@SuppressWarnings("all") public class UrlToolsTest { - @Test - public void replacePlusSign() { - Assert.assertEquals("+", URLTools.replaceHexChars("%2B")); - Assert.assertEquals("++", URLTools.replaceHexChars("%2B%2B")); - Assert.assertEquals("abc+%xyz", URLTools.replaceHexChars("abc%2B%xyz")); - } - - @Test - public void replaceAtSign() { - Assert.assertEquals("@", URLTools.replaceHexChars("%40")); - Assert.assertEquals("@@", URLTools.replaceHexChars("%40%40")); - Assert.assertEquals("abc@%xyz", URLTools.replaceHexChars("abc%40%xyz")); - } - - @Test - public void replaceAtAndPlusSign() { - Assert.assertEquals("@+", URLTools.replaceHexChars("%40%2B")); - Assert.assertEquals("@+@+", URLTools.replaceHexChars("%40%2B%40%2B")); - Assert.assertEquals("abc@+%xyz", URLTools.replaceHexChars("abc%40%2B%xyz")); - } + + @Test + public void replacePlusSign() { + Assert.assertEquals("+", URLTools.replaceHexChars("%2B")); + Assert.assertEquals("++", URLTools.replaceHexChars("%2B%2B")); + Assert.assertEquals("abc+%xyz", URLTools.replaceHexChars("abc%2B%xyz")); + } + + @Test + public void replaceAtSign() { + Assert.assertEquals("@", URLTools.replaceHexChars("%40")); + Assert.assertEquals("@@", URLTools.replaceHexChars("%40%40")); + Assert.assertEquals("abc@%xyz", URLTools.replaceHexChars("abc%40%xyz")); + } + + @Test + public void replaceAtAndPlusSign() { + Assert.assertEquals("@+", URLTools.replaceHexChars("%40%2B")); + Assert.assertEquals("@+@+", URLTools.replaceHexChars("%40%2B%40%2B")); + Assert.assertEquals("abc@+%xyz", URLTools.replaceHexChars("abc%40%2B%xyz")); + } } From 4ff4d537a6d76bffcbafa05652b70570943ab3ea Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:23:22 +0200 Subject: [PATCH 195/286] rename CodeCoverageReporterDialogTest.xtend to CodeCoverageReporterDialogTest.java --- ...porterDialogTest.xtend => CodeCoverageReporterDialogTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/coverage/{CodeCoverageReporterDialogTest.xtend => CodeCoverageReporterDialogTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java From e32bc117bec9f2bda3748ab4d0b72e95364bdf3e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:23:45 +0200 Subject: [PATCH 196/286] add CodeCoverageReporterDialogTest.java generated by Xtend 2.20.0 --- .../CodeCoverageReporterDialogTest.java | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java index ffd3e963..5a50b977 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,20 +13,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.coverage +package org.utplsql.sqldev.test.coverage; -import org.junit.Test -import org.utplsql.sqldev.coverage.CodeCoverageReporter -import org.utplsql.sqldev.test.AbstractJdbcTest +import java.sql.Connection; +import java.util.Collections; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.junit.Test; +import org.utplsql.sqldev.coverage.CodeCoverageReporter; +import org.utplsql.sqldev.test.AbstractJdbcTest; +import org.utplsql.sqldev.ui.coverage.CodeCoverageReporterDialog; -class CodeCoverageReporterDialogTest extends AbstractJdbcTest{ - - @Test - def void layout() { - val reporter = new CodeCoverageReporter(#["SCOTT"], #['a', 'b', 'c'], dataSource.connection) - reporter.showParameterWindow - Thread.sleep(4 * 1000) - reporter.frame?.exit - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class CodeCoverageReporterDialogTest extends AbstractJdbcTest { + @Test + public void layout() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final CodeCoverageReporter reporter = new CodeCoverageReporter(Collections.unmodifiableList(CollectionLiterals.newArrayList("SCOTT")), Collections.unmodifiableList(CollectionLiterals.newArrayList("a", "b", "c")), _connection); + reporter.showParameterWindow(); + Thread.sleep((4 * 1000)); + CodeCoverageReporterDialog _frame = reporter.getFrame(); + if (_frame!=null) { + _frame.exit(); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } +} From 5491052ac6be5a613f4121e0cff2b71aef81450b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:47:03 +0200 Subject: [PATCH 197/286] add SystemTools.java to wrap Thread.sleep --- .../org/utplsql/sqldev/model/SystemTools.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 sqldev/src/main/java/org/utplsql/sqldev/model/SystemTools.java diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/SystemTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/SystemTools.java new file mode 100644 index 00000000..ab70165c --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/SystemTools.java @@ -0,0 +1,31 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.model; + +public class SystemTools { + // do not instantiate this class + private SystemTools() { + super(); + } + + public static void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } +} From 479692e293fb2dfff464ce42c93a28429a0dc772 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:47:31 +0200 Subject: [PATCH 198/286] add DatabaseTools.java to wrap getConnection() calls --- .../utplsql/sqldev/model/DatabaseTools.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java new file mode 100644 index 00000000..00cd6b93 --- /dev/null +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java @@ -0,0 +1,61 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.model; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.utplsql.sqldev.exception.GenericDatabaseAccessException; + +import oracle.dbtools.raptor.navigator.db.DatabaseConnection; +import oracle.dbtools.raptor.utils.Connections; +import oracle.javatools.db.DBException; + +public class DatabaseTools { + // do not instantiate this class + private DatabaseTools() { + super(); + } + + public static Connection getConnection(DataSource dataSource) { + try { + return dataSource.getConnection(); + } catch (SQLException e) { + throw new GenericDatabaseAccessException("Error getting connection.", e); + } + } + + public static Connection getConnection(DatabaseConnection conn) { + try { + return conn.getConnection(); + } catch (IOException e) { + final String msg = "Error getting connection for " + conn.getConnectionName() + "."; + throw new GenericDatabaseAccessException(msg, e); + } + } + + public static Connection getConnection(String connectionName) { + try { + return Connections.getInstance().getConnection(connectionName); + } catch (DBException e) { + final String msg = "Error getting connection for " + connectionName + "."; + throw new GenericDatabaseAccessException(msg, e); + } + } +} From dfd152c5837218bce4ea26fcacf948d4d8a1ed63 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 14:48:09 +0200 Subject: [PATCH 199/286] convert CodeCoverageReporterDialogTest to Java, removing Xtend dependencies --- .../CodeCoverageReporterDialogTest.java | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java index 5a50b977..5ada53d1 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,30 +15,25 @@ */ package org.utplsql.sqldev.test.coverage; -import java.sql.Connection; -import java.util.Collections; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Exceptions; +import java.util.Arrays; + +import org.junit.Assert; import org.junit.Test; import org.utplsql.sqldev.coverage.CodeCoverageReporter; +import org.utplsql.sqldev.model.DatabaseTools; +import org.utplsql.sqldev.model.SystemTools; import org.utplsql.sqldev.test.AbstractJdbcTest; -import org.utplsql.sqldev.ui.coverage.CodeCoverageReporterDialog; -@SuppressWarnings("all") + public class CodeCoverageReporterDialogTest extends AbstractJdbcTest { - @Test - public void layout() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final CodeCoverageReporter reporter = new CodeCoverageReporter(Collections.unmodifiableList(CollectionLiterals.newArrayList("SCOTT")), Collections.unmodifiableList(CollectionLiterals.newArrayList("a", "b", "c")), _connection); - reporter.showParameterWindow(); - Thread.sleep((4 * 1000)); - CodeCoverageReporterDialog _frame = reporter.getFrame(); - if (_frame!=null) { - _frame.exit(); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + public void layout() { + final CodeCoverageReporter reporter = new CodeCoverageReporter(Arrays.asList("SCOTT"), + Arrays.asList("a", "b", "c"), DatabaseTools.getConnection(dataSource)); + reporter.showParameterWindow(); + SystemTools.sleep(4 * 1000); + Assert.assertNotNull(reporter.getFrame()); + reporter.getFrame().exit(); } - } } From 02fbed86dc360928f41eacd8f165c0a8f5bac764 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 15:25:19 +0200 Subject: [PATCH 200/286] rename CodeCoverageReporterTest.xtend to CodeCoverageReporterTest.java --- ...deCoverageReporterTest.xtend => CodeCoverageReporterTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/coverage/{CodeCoverageReporterTest.xtend => CodeCoverageReporterTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java From 16b9963d3a27fead9f5db07ac4cc51238a4fdfc4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 15:26:09 +0200 Subject: [PATCH 201/286] add add CodeCoverageReporterDialogTest.java generated by Xtend 2.20.0 --- .../coverage/CodeCoverageReporterTest.java | 254 +++++++++++------- 1 file changed, 157 insertions(+), 97 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java index 7f91d53b..79c4454b 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,101 +13,161 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.coverage +package org.utplsql.sqldev.test.coverage; -import java.io.File -import java.nio.charset.StandardCharsets -import java.nio.file.Files -import java.nio.file.Path -import java.util.Comparator -import org.junit.AfterClass -import org.junit.Assert -import org.junit.BeforeClass -import org.junit.Test -import org.springframework.jdbc.BadSqlGrammarException -import org.springframework.jdbc.datasource.SingleConnectionDataSource -import org.utplsql.sqldev.coverage.CodeCoverageReporter -import org.utplsql.sqldev.test.AbstractJdbcTest +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.sql.Connection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.function.ToLongFunction; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.coverage.CodeCoverageReporter; +import org.utplsql.sqldev.test.AbstractJdbcTest; -class CodeCoverageReporterTest extends AbstractJdbcTest{ - - @BeforeClass - def static void setup() { - jdbcTemplate.execute(''' - CREATE OR REPLACE FUNCTION f RETURN INTEGER IS - BEGIN - RETURN 1; - END f; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE test_f IS - --%suite - - --%test - PROCEDURE f; - END test_f; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE BODY test_f IS - --%test - PROCEDURE f IS - l_expected INTEGER := 1; - l_actual INTEGER; - BEGIN - l_actual := scott.f(); - ut.expect(l_actual).to_equal(l_expected); - END f; - END test_f; - ''') - } - - private def Path getNewestOutputFile() { - val file = File.createTempFile("test", ".txt") - val dir = file.parentFile - file.delete - val last = Files.list(dir.toPath) - .filter([f | !f.toFile.directory]) - .filter([f | f.fileName.toString.startsWith("utplsql_")]) - .filter([f | f.fileName.toString.endsWith(".html")]) - .max(Comparator.comparingLong([f|f.toFile().lastModified()])) - return last.get - } - - @Test - def void produceReportAndCloseConnection() { - // create temporary dataSource, closed by reporter - var ds = new SingleConnectionDataSource() - ds.driverClassName = "oracle.jdbc.OracleDriver" - ds.url = dataSource.url - ds.username = dataSource.username - ds.password = dataSource.password - val conn = ds.connection - val pathList=#[':test_f'] - val includeObjectList = #['f'] - val reporter = new CodeCoverageReporter(pathList, includeObjectList, conn) - val run = reporter.runAsync - run.join(20000) - Assert.assertEquals(true, conn.isClosed) - val outputFile = getNewestOutputFile - Assert.assertTrue(outputFile !== null) - val content = new String(Files.readAllBytes(outputFile), StandardCharsets.UTF_8) - Assert.assertTrue(content.contains('

SCOTT.F

100 % lines covered

')) - } - - @AfterClass - def static void teardown() { - try { - jdbcTemplate.execute("DROP PACKAGE test_f") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP FUNCTION f") - } catch (BadSqlGrammarException e) { - // ignore - } - } - - - -} \ No newline at end of file +@SuppressWarnings("all") +public class CodeCoverageReporterTest extends AbstractJdbcTest { + @BeforeClass + public static void setup() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE FUNCTION f RETURN INTEGER IS"); + _builder.newLine(); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("RETURN 1;"); + _builder.newLine(); + _builder.append("END f;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("CREATE OR REPLACE PACKAGE test_f IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("--%suite"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("--%test"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE f;"); + _builder_1.newLine(); + _builder_1.append("END test_f;"); + _builder_1.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("CREATE OR REPLACE PACKAGE BODY test_f IS"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("--%test"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("PROCEDURE f IS"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("l_expected INTEGER := 1;"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("l_actual INTEGER;"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("BEGIN"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("l_actual := scott.f();"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("ut.expect(l_actual).to_equal(l_expected);"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("END f;"); + _builder_2.newLine(); + _builder_2.append("END test_f;"); + _builder_2.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_2.toString()); + } + + private Path getNewestOutputFile() { + try { + final File file = File.createTempFile("test", ".txt"); + final File dir = file.getParentFile(); + file.delete(); + final Predicate _function = (Path f) -> { + boolean _isDirectory = f.toFile().isDirectory(); + return (!_isDirectory); + }; + final Predicate _function_1 = (Path f) -> { + return f.getFileName().toString().startsWith("utplsql_"); + }; + final Predicate _function_2 = (Path f) -> { + return f.getFileName().toString().endsWith(".html"); + }; + final ToLongFunction _function_3 = (Path f) -> { + return f.toFile().lastModified(); + }; + final Optional last = Files.list(dir.toPath()).filter(_function).filter(_function_1).filter(_function_2).max(Comparator.comparingLong(_function_3)); + return last.get(); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void produceReportAndCloseConnection() { + try { + SingleConnectionDataSource ds = new SingleConnectionDataSource(); + ds.setDriverClassName("oracle.jdbc.OracleDriver"); + ds.setUrl(AbstractJdbcTest.dataSource.getUrl()); + ds.setUsername(AbstractJdbcTest.dataSource.getUsername()); + ds.setPassword(AbstractJdbcTest.dataSource.getPassword()); + final Connection conn = ds.getConnection(); + final List pathList = Collections.unmodifiableList(CollectionLiterals.newArrayList(":test_f")); + final List includeObjectList = Collections.unmodifiableList(CollectionLiterals.newArrayList("f")); + final CodeCoverageReporter reporter = new CodeCoverageReporter(pathList, includeObjectList, conn); + final Thread run = reporter.runAsync(); + run.join(20000); + Assert.assertEquals(Boolean.valueOf(true), Boolean.valueOf(conn.isClosed())); + final Path outputFile = this.getNewestOutputFile(); + Assert.assertTrue((outputFile != null)); + byte[] _readAllBytes = Files.readAllBytes(outputFile); + final String content = new String(_readAllBytes, StandardCharsets.UTF_8); + Assert.assertTrue(content.contains("

SCOTT.F

100 % lines covered

")); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @AfterClass + public static void teardown() { + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE test_f"); + } catch (final Throwable _t) { + if (_t instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP FUNCTION f"); + } catch (final Throwable _t_1) { + if (_t_1 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_1); + } + } + } +} From b8c1ab583b5e6313c2318afc227620a3ca8f3ff0 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 16:46:16 +0200 Subject: [PATCH 202/286] add waitForThread method --- .../main/java/org/utplsql/sqldev/model/SystemTools.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/SystemTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/SystemTools.java index ab70165c..30a75172 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/SystemTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/SystemTools.java @@ -28,4 +28,12 @@ public static void sleep(int millis) { Thread.currentThread().interrupt(); } } + + public static void waitForThread(Thread thread, int maxTimeInMillis) { + try { + thread.join(maxTimeInMillis); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } } From 902f5ea44ea38e8c7da924f35055a65968815544 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 16:46:55 +0200 Subject: [PATCH 203/286] add isConnectionClosed method --- .../main/java/org/utplsql/sqldev/model/DatabaseTools.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java index 00cd6b93..511c0a5b 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java @@ -58,4 +58,12 @@ public static Connection getConnection(String connectionName) { throw new GenericDatabaseAccessException(msg, e); } } + + public static boolean isConnectionClosed(Connection conn) { + try { + return conn.isClosed(); + } catch (SQLException e) { + throw new GenericDatabaseAccessException("Error getting status of connection.", e); + } + } } From 6e0d26658e4a77081ef11755beb54578ecf2144a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 16:47:13 +0200 Subject: [PATCH 204/286] add executeAndIgnore method --- .../java/org/utplsql/sqldev/test/AbstractJdbcTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java index f19103a5..c0f16809 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/AbstractJdbcTest.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Properties; +import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.utplsql.sqldev.exception.GenericRuntimeException; @@ -73,4 +74,12 @@ public static List getStatements(final String sqlplusScript) { } return stmts; } + + public static void executeAndIgnore(JdbcTemplate template, String sql) { + try { + template.execute(sql); + } catch (BadSqlGrammarException e) { + // ignore + } + } } From 1f89b8eb0fd5e3c7bf675df1742b9331eda2658a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 16:47:52 +0200 Subject: [PATCH 205/286] convert CodeCoverageReporterTest to Java, removing Xtend dependencies --- .../coverage/CodeCoverageReporterTest.java | 220 +++++++----------- 1 file changed, 86 insertions(+), 134 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java index 79c4454b..37e80ac7 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java @@ -16,158 +16,110 @@ package org.utplsql.sqldev.test.coverage; import java.io.File; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.sql.Connection; -import java.util.Collections; +import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Optional; -import java.util.function.Predicate; -import java.util.function.ToLongFunction; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Exceptions; + import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.utplsql.sqldev.coverage.CodeCoverageReporter; +import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.DatabaseTools; +import org.utplsql.sqldev.model.FileTools; +import org.utplsql.sqldev.model.SystemTools; import org.utplsql.sqldev.test.AbstractJdbcTest; -@SuppressWarnings("all") public class CodeCoverageReporterTest extends AbstractJdbcTest { - @BeforeClass - public static void setup() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE FUNCTION f RETURN INTEGER IS"); - _builder.newLine(); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("RETURN 1;"); - _builder.newLine(); - _builder.append("END f;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("CREATE OR REPLACE PACKAGE test_f IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("--%suite"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("--%test"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE f;"); - _builder_1.newLine(); - _builder_1.append("END test_f;"); - _builder_1.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append("CREATE OR REPLACE PACKAGE BODY test_f IS"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("--%test"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("PROCEDURE f IS"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("l_expected INTEGER := 1;"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("l_actual INTEGER;"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("BEGIN"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("l_actual := scott.f();"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("ut.expect(l_actual).to_equal(l_expected);"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("END f;"); - _builder_2.newLine(); - _builder_2.append("END test_f;"); - _builder_2.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_2.toString()); - } - - private Path getNewestOutputFile() { - try { - final File file = File.createTempFile("test", ".txt"); - final File dir = file.getParentFile(); - file.delete(); - final Predicate _function = (Path f) -> { - boolean _isDirectory = f.toFile().isDirectory(); - return (!_isDirectory); - }; - final Predicate _function_1 = (Path f) -> { - return f.getFileName().toString().startsWith("utplsql_"); - }; - final Predicate _function_2 = (Path f) -> { - return f.getFileName().toString().endsWith(".html"); - }; - final ToLongFunction _function_3 = (Path f) -> { - return f.toFile().lastModified(); - }; - final Optional last = Files.list(dir.toPath()).filter(_function).filter(_function_1).filter(_function_2).max(Comparator.comparingLong(_function_3)); - return last.get(); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @BeforeClass + public static void setup() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE FUNCTION f RETURN INTEGER IS\n"); + sb.append("BEGIN\n"); + sb.append(" RETURN 1;\n"); + sb.append("END f;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE test_f IS\n"); + sb.append(" --%suite\n\n"); + sb.append(" --%test\n"); + sb.append(" PROCEDURE f;\n"); + sb.append("END test_f;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE BODY test_f IS\n"); + sb.append(" --%test\n"); + sb.append(" PROCEDURE f IS\n"); + sb.append(" l_expected INTEGER := 1;\n"); + sb.append(" l_actual INTEGER;\n"); + sb.append(" BEGIN\n"); + sb.append(" l_actual := scott.f();\n"); + sb.append(" ut.expect(l_actual).to_equal(l_expected);\n"); + sb.append(" END f;\n"); + sb.append("END test_f;"); + jdbcTemplate.execute(sb.toString()); + } + + private File createTempFile(String prefix, String suffix) { + try { + return File.createTempFile("test", ".txt"); + } catch (IOException e) { + final String msg = "Cannot create temporary file with prefix '" + prefix + "' and suffix '" + suffix + "'."; + throw new GenericRuntimeException(msg, e); + } } - } - - @Test - public void produceReportAndCloseConnection() { - try { - SingleConnectionDataSource ds = new SingleConnectionDataSource(); - ds.setDriverClassName("oracle.jdbc.OracleDriver"); - ds.setUrl(AbstractJdbcTest.dataSource.getUrl()); - ds.setUsername(AbstractJdbcTest.dataSource.getUsername()); - ds.setPassword(AbstractJdbcTest.dataSource.getPassword()); - final Connection conn = ds.getConnection(); - final List pathList = Collections.unmodifiableList(CollectionLiterals.newArrayList(":test_f")); - final List includeObjectList = Collections.unmodifiableList(CollectionLiterals.newArrayList("f")); - final CodeCoverageReporter reporter = new CodeCoverageReporter(pathList, includeObjectList, conn); - final Thread run = reporter.runAsync(); - run.join(20000); - Assert.assertEquals(Boolean.valueOf(true), Boolean.valueOf(conn.isClosed())); - final Path outputFile = this.getNewestOutputFile(); - Assert.assertTrue((outputFile != null)); - byte[] _readAllBytes = Files.readAllBytes(outputFile); - final String content = new String(_readAllBytes, StandardCharsets.UTF_8); - Assert.assertTrue(content.contains("

SCOTT.F

100 % lines covered

")); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + private Path getNewestOutputFile() { + final File file = createTempFile("test", ".txt"); + final File dir = file.getParentFile(); + file.delete(); + Optional last; + try { + last = Files.list(dir.toPath()) + .filter(f -> !f.toFile().isDirectory() && f.getFileName().toString().startsWith("utplsql_") + && f.getFileName().toString().endsWith(".html")) + .max(Comparator.comparingLong(f -> f.toFile().lastModified())); + } catch (IOException e) { + final String msg = "Cannot get newest output file in " + dir.getAbsolutePath() + "."; + throw new GenericRuntimeException(msg, e); + } + return last.get(); } - } - - @AfterClass - public static void teardown() { - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE test_f"); - } catch (final Throwable _t) { - if (_t instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t); - } + + @Test + public void produceReportAndCloseConnection() { + // create temporary dataSource, closed by reporter + SingleConnectionDataSource ds = new SingleConnectionDataSource(); + ds.setDriverClassName("oracle.jdbc.OracleDriver"); + ds.setUrl(dataSource.getUrl()); + ds.setUsername(dataSource.getUsername()); + ds.setPassword(dataSource.getPassword()); + final Connection conn = DatabaseTools.getConnection(ds); + final List pathList = Arrays.asList(":test_f"); + final List includeObjectList = Arrays.asList("f"); + final CodeCoverageReporter reporter = new CodeCoverageReporter(pathList, includeObjectList, conn); + final Thread run = reporter.runAsync(); + SystemTools.waitForThread(run, 20000); + Assert.assertTrue(DatabaseTools.isConnectionClosed(conn)); + final Path outputFile = this.getNewestOutputFile(); + Assert.assertNotNull(outputFile); + final String content = new String(FileTools.readFile(outputFile), StandardCharsets.UTF_8); + Assert.assertTrue( + content.contains("

SCOTT.F

100 % lines covered

")); } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP FUNCTION f"); - } catch (final Throwable _t_1) { - if (_t_1 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_1); - } + + @AfterClass + public static void teardown() { + executeAndIgnore(jdbcTemplate, "DROP PACKAGE test_f"); + executeAndIgnore(jdbcTemplate, "DROP FUNCTION f"); } - } } From 4897dbe268606ebcfe40832a3a32b1515341068e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 16:49:42 +0200 Subject: [PATCH 206/286] rename DalBugFixTest.xtend to DalBugFixTest.java --- .../sqldev/test/dal/{DalBugFixTest.xtend => DalBugFixTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/dal/{DalBugFixTest.xtend => DalBugFixTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java From d9d3b0d885943f55ad56979abf901333297362bb Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 16:49:58 +0200 Subject: [PATCH 207/286] add add DalBugFixTest.java generated by Xtend 2.20.0 --- .../sqldev/test/dal/DalBugFixTest.java | 236 +++++++++++------- 1 file changed, 145 insertions(+), 91 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java index d53fe158..d19e48f7 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,95 +13,149 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.test.dal +package org.utplsql.sqldev.test.dal; -import org.junit.AfterClass -import org.junit.Assert -import org.junit.BeforeClass -import org.junit.Test -import org.springframework.jdbc.BadSqlGrammarException -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.test.AbstractJdbcTest +import com.google.common.base.Objects; +import java.sql.Connection; +import java.util.List; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.Functions.Function1; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.oddgen.sqldev.generators.model.Node; +import org.springframework.jdbc.BadSqlGrammarException; +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.test.AbstractJdbcTest; -class DalBugFixTest extends AbstractJdbcTest { - - @BeforeClass - @AfterClass - def static void setupAndTeardown() { - try { - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - } - - @Test - // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/54 - def void issue54FolderIconForSuitesWithoutTests() { - setupAndTeardown - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - END junit_utplsql_test_pkg; - ''') - val dao = new UtplsqlDao(dataSource.connection) - val actualNodes = dao.runnables() - Assert.assertEquals(4, actualNodes.size) - val pkg = actualNodes.findFirst[it.id == "SCOTT:junit_utplsql_test_pkg"] - Assert.assertEquals("FOLDER_ICON", pkg.iconName) - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } - - @Test - // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/54 - def void issue54PackageIconForSuitesWithTests() { - setupAndTeardown - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - -- %test - PROCEDURE t1; - - END junit_utplsql_test_pkg; - ''') - val dao = new UtplsqlDao(dataSource.connection) - val actualNodes = dao.runnables() - Assert.assertEquals(6, actualNodes.size) - val pkg = actualNodes.findFirst[it.id == "SCOTT:junit_utplsql_test_pkg"] - Assert.assertEquals("PACKAGE_ICON", pkg.iconName) - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } - - @Test - // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/55 - def void issue55SuiteWithoutTests() { - setupAndTeardown - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - END junit_utplsql_test_pkg; - ''') - val dao = new UtplsqlDao(dataSource.connection) - val actualNodes = dao.runnables() - Assert.assertEquals(4, actualNodes.size) - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } - - @Test - // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/56 - def void issue56SuiteWithoutTests() { - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - END junit_utplsql_test_pkg; - ''') - val dao = new UtplsqlDao(dataSource.connection) - Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")) - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class DalBugFixTest extends AbstractJdbcTest { + @BeforeClass + @AfterClass + public static void setupAndTeardown() { + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (final Throwable _t) { + if (_t instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t); + } + } + } + + @Test + public void issue54FolderIconForSuitesWithoutTests() { + try { + DalBugFixTest.setupAndTeardown(); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + final List actualNodes = dao.runnables(); + Assert.assertEquals(4, actualNodes.size()); + final Function1 _function = (Node it) -> { + String _id = it.getId(); + return Boolean.valueOf(Objects.equal(_id, "SCOTT:junit_utplsql_test_pkg")); + }; + final Node pkg = IterableExtensions.findFirst(actualNodes, _function); + Assert.assertEquals("FOLDER_ICON", pkg.getIconName()); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void issue54PackageIconForSuitesWithTests() { + try { + DalBugFixTest.setupAndTeardown(); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t1;"); + _builder.newLine(); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + final List actualNodes = dao.runnables(); + Assert.assertEquals(6, actualNodes.size()); + final Function1 _function = (Node it) -> { + String _id = it.getId(); + return Boolean.valueOf(Objects.equal(_id, "SCOTT:junit_utplsql_test_pkg")); + }; + final Node pkg = IterableExtensions.findFirst(actualNodes, _function); + Assert.assertEquals("PACKAGE_ICON", pkg.getIconName()); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void issue55SuiteWithoutTests() { + try { + DalBugFixTest.setupAndTeardown(); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + final List actualNodes = dao.runnables(); + Assert.assertEquals(4, actualNodes.size()); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void issue56SuiteWithoutTests() { + try { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } +} From bcab622d7c9e02a6517dedc8b073e69073ab3245 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 17:13:09 +0200 Subject: [PATCH 208/286] convert DalBugFixTest to Java, removing Xtend dependencies --- .../sqldev/test/dal/DalBugFixTest.java | 193 ++++++------------ 1 file changed, 62 insertions(+), 131 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java index d19e48f7..a724a788 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,147 +15,78 @@ */ package org.utplsql.sqldev.test.dal; -import com.google.common.base.Objects; -import java.sql.Connection; import java.util.List; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.Functions.Function1; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.junit.AfterClass; + +import org.junit.After; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; import org.oddgen.sqldev.generators.model.Node; -import org.springframework.jdbc.BadSqlGrammarException; import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.test.AbstractJdbcTest; -@SuppressWarnings("all") public class DalBugFixTest extends AbstractJdbcTest { - @BeforeClass - @AfterClass - public static void setupAndTeardown() { - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (final Throwable _t) { - if (_t instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t); - } + @Before + @After + public void setupAndTeardown() { + executeAndIgnore(jdbcTemplate, "DROP PACKAGE junit_utplsql_test_pkg"); } - } - - @Test - public void issue54FolderIconForSuitesWithoutTests() { - try { - DalBugFixTest.setupAndTeardown(); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - final List actualNodes = dao.runnables(); - Assert.assertEquals(4, actualNodes.size()); - final Function1 _function = (Node it) -> { - String _id = it.getId(); - return Boolean.valueOf(Objects.equal(_id, "SCOTT:junit_utplsql_test_pkg")); - }; - final Node pkg = IterableExtensions.findFirst(actualNodes, _function); - Assert.assertEquals("FOLDER_ICON", pkg.getIconName()); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/54 + public void issue54FolderIconForSuitesWithoutTests() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + final List actualNodes = dao.runnables(); + final Node pkg = actualNodes.stream().filter(it -> it.getId().equals("SCOTT:junit_utplsql_test_pkg")) + .findFirst().get(); + Assert.assertEquals("FOLDER_ICON", pkg.getIconName()); } - } - - @Test - public void issue54PackageIconForSuitesWithTests() { - try { - DalBugFixTest.setupAndTeardown(); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t1;"); - _builder.newLine(); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - final List actualNodes = dao.runnables(); - Assert.assertEquals(6, actualNodes.size()); - final Function1 _function = (Node it) -> { - String _id = it.getId(); - return Boolean.valueOf(Objects.equal(_id, "SCOTT:junit_utplsql_test_pkg")); - }; - final Node pkg = IterableExtensions.findFirst(actualNodes, _function); - Assert.assertEquals("PACKAGE_ICON", pkg.getIconName()); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/54 + public void issue54PackageIconForSuitesWithTests() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE t1;\n\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + final List actualNodes = dao.runnables(); + final Node pkg = actualNodes.stream().filter(it -> it.getId().equals("SCOTT:junit_utplsql_test_pkg")) + .findFirst().get(); + Assert.assertEquals("PACKAGE_ICON", pkg.getIconName()); } - } - - @Test - public void issue55SuiteWithoutTests() { - try { - DalBugFixTest.setupAndTeardown(); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - final List actualNodes = dao.runnables(); - Assert.assertEquals(4, actualNodes.size()); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/55 + public void issue55SuiteWithoutTests() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + final List actualNodes = dao.runnables(); + Assert.assertEquals(4, actualNodes.size()); } - } - - @Test - public void issue56SuiteWithoutTests() { - try { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + public void issue56SuiteWithoutTests() { + // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/56 + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); } - } } From d04132434499eff146a65f42f8186e1fa426201d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:33:35 +0200 Subject: [PATCH 209/286] add methods createDocumentBuilder, parse --- .../org/utplsql/sqldev/model/XMLTools.java | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java index 1367382d..b9f2b982 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/XMLTools.java @@ -15,10 +15,14 @@ */ package org.utplsql.sqldev.model; +import java.io.IOException; import java.io.StringWriter; import java.util.logging.Logger; import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; @@ -32,10 +36,13 @@ import javax.xml.xpath.XPathFactory; import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; public class XMLTools { private static final Logger logger = Logger.getLogger(XMLTools.class.getName()); @@ -47,7 +54,7 @@ public NodeList getNodeList(final Node doc, final String xpathString) { final XPathExpression expr = xpath.compile(xpathString); return ((NodeList) expr.evaluate(doc, XPathConstants.NODESET)); } catch (XPathExpressionException e) { - final String msg = "XPathExpressionException for " + xpathString + " due to " + e.getMessage(); + final String msg = "XPathExpressionException for " + xpathString + "."; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } @@ -58,7 +65,7 @@ public Node getNode(final Node doc, final String xpathString) { final XPathExpression expr = xpath.compile(xpathString); return ((Node) expr.evaluate(doc, XPathConstants.NODE)); } catch (XPathExpressionException e) { - final String msg = "XPathExpressionException for " + xpathString + " due to " + e.getMessage(); + final String msg = "XPathExpressionException for " + xpathString + "."; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } @@ -90,7 +97,7 @@ public String nodeToString(final Node node, final String cdataSectionElements) { final String result = writer.toString(); return result.replaceAll("", ""); } catch (TransformerException e) { - final String msg = "TransformerException for " + cdataSectionElements + " due to " + e.getMessage(); + final String msg = "TransformerException for " + cdataSectionElements + "."; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } @@ -129,4 +136,26 @@ public Node getElementNode(final Node node, final String tagName) { } return resultNode; } + + public DocumentBuilder createDocumentBuilder() { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); + return factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + final String msg = "Could not create no document builder."; + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } + + public Document parse(final DocumentBuilder builder, final InputSource inputSource) { + try { + return builder.parse(inputSource); + } catch (SAXException | IOException e) { + final String msg = "Could not parse XML input."; + logger.severe(() -> msg); + throw new GenericRuntimeException(msg, e); + } + } } From fb6fe363d329f18a00acb16b024cd9e5242417c8 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:34:36 +0200 Subject: [PATCH 210/286] remove unnecessary final --- sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java index d111354d..e17ce69d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/PrefixTools.java @@ -81,7 +81,7 @@ public static String commonPrefix(final List list) { return commonPrefix(list.toArray(testArray), list.size()); } - } catch (final Exception e) { + } catch (Exception e) { return ""; } } From 0dbcad085c3df1c239859aec0396e59fe399124b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:36:38 +0200 Subject: [PATCH 211/286] add various methods cloneConnection, createTemporaryOrPrivateConnection, closeConnection, abortConnection, getSchema, getUser, isSupported --- .../utplsql/sqldev/model/DatabaseTools.java | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java b/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java index 511c0a5b..9c2365ea 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/DatabaseTools.java @@ -21,11 +21,14 @@ import javax.sql.DataSource; +import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.exception.GenericRuntimeException; import oracle.dbtools.raptor.navigator.db.DatabaseConnection; import oracle.dbtools.raptor.utils.Connections; import oracle.javatools.db.DBException; +import oracle.jdeveloper.db.ConnectionException; public class DatabaseTools { // do not instantiate this class @@ -59,6 +62,48 @@ public static Connection getConnection(String connectionName) { } } + public static Connection cloneConnection(String connectionName) { + final Connection conn = getConnection(connectionName); + try { + return Connections.getInstance().cloneConnection(conn); + } catch (ConnectionException e) { + final String msg = "Error cloning connection " + connectionName + "."; + throw new GenericDatabaseAccessException(msg, e); + } + } + + private static String createTemporaryConnection(String connectionName) { + try { + return Connections.getInstance().createTemporaryConnection(connectionName); + } catch (Throwable e) { + final String msg = "Error creating temporary connection based on " + connectionName + "."; + throw new GenericDatabaseAccessException(msg, e); + } + } + + private static String createPrivateConnection(String connectionName) { + try { + return Connections.getInstance().createPrivateConnection(connectionName); + } catch (Throwable e) { + final String msg = "Error creating private connection based on " + connectionName + "."; + throw new GenericDatabaseAccessException(msg, e); + } + } + + public static String createTemporaryOrPrivateConnection(String connectionName) { + // Private connections are closed in SQL Developer < 17.4.0 when the worksheet + // is closed, but in SQL Developer > 17.4.0 private connections are not closed. + // Temporary connections have been introduced in SQL Developer 17.4.0. They will + // be always closed, when a worksheet is closed. + // Hence we try to use temporary connections whenever possible. See also + // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/47 . + try { + return createTemporaryConnection(connectionName); + } catch (GenericDatabaseAccessException e) { + return createPrivateConnection(connectionName); + } + } + public static boolean isConnectionClosed(Connection conn) { try { return conn.isClosed(); @@ -66,4 +111,63 @@ public static boolean isConnectionClosed(Connection conn) { throw new GenericDatabaseAccessException("Error getting status of connection.", e); } } + + public static void closeConnection(Connection conn) { + if (!isConnectionClosed(conn)) { + try { + conn.close(); + } catch (SQLException e) { + throw new GenericDatabaseAccessException("Could not close connection."); + } + } + } + + public static void abortConnection(Connection conn) { + final SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor(); + try { + conn.abort(taskExecutor); + } catch (SQLException e) { + throw new GenericDatabaseAccessException("Could not abort connection."); + } + } + + public static String getSchema(Connection conn) { + try { + return conn.getSchema(); + } catch (SQLException e) { + throw new GenericRuntimeException("Error getting schema name of connection.", e); + } + } + + public static String getUser(Connection conn) { + try { + return conn.getMetaData().getUserName(); + } catch (SQLException e) { + throw new GenericRuntimeException("Error getting user name of connection.", e); + } + } + + public static String getSchema(DatabaseConnection conn) { + return getSchema(getConnection(conn)); + } + + + public static String getSchema(String connectionName) { + return getSchema(getConnection(connectionName)); + } + + public static boolean isSupported(final Connection conn) { + try { + boolean ret = false; + if (conn != null && conn.getMetaData().getDatabaseProductName().startsWith("Oracle") + && (conn.getMetaData().getDatabaseMajorVersion() == 11 + && conn.getMetaData().getDatabaseMinorVersion() >= 2 + || conn.getMetaData().getDatabaseMajorVersion() > 11)) { + ret = true; + } + return ret; + } catch (SQLException e) { + throw new GenericDatabaseAccessException("Error while getting product version of connection.", e); + } + } } From f5cc95119cd4b80b51a369ae280e7abb0c5d021a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:37:58 +0200 Subject: [PATCH 212/286] simplify, use methods from DatabaseTools --- .../sqldev/coverage/CodeCoverageReporter.java | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index 101961b2..9049d295 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -20,7 +20,6 @@ import java.net.URL; import java.nio.charset.StandardCharsets; import java.sql.Connection; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -29,13 +28,10 @@ import org.utplsql.sqldev.dal.UtplsqlDao; import org.utplsql.sqldev.exception.GenericDatabaseAccessException; import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.FileTools; import org.utplsql.sqldev.ui.coverage.CodeCoverageReporterDialog; -import oracle.dbtools.raptor.utils.Connections; -import oracle.javatools.db.DBException; -import oracle.jdeveloper.db.ConnectionException; - public class CodeCoverageReporter { private static final Logger logger = Logger.getLogger(CodeCoverageReporter.class.getName()); @@ -67,19 +63,8 @@ private void setConnection(final String connectionName) { logger.severe(() -> msg); throw new NullPointerException(); } else { - try { - // must be closed manually - conn = Connections.getInstance() - .cloneConnection(Connections.getInstance().getConnection(connectionName)); - } catch (ConnectionException e) { - final String msg = "ConnectionException while setting connection: " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericDatabaseAccessException(msg, e); - } catch (DBException e) { - final String msg = "DBException while setting connection: " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericDatabaseAccessException(msg, e); - } + // must be closed manually + conn = DatabaseTools.cloneConnection(connectionName); } } @@ -115,13 +100,13 @@ private void run() { () -> "Could not launch " + file + "in browser. No default browser defined on this system."); } } catch (Exception e) { - final String msg = "Error while running code coverage: " + e.getMessage(); + final String msg = "Error while running code coverage for " + pathList + "."; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } finally { try { - conn.close(); - } catch (SQLException e) { + DatabaseTools.closeConnection(conn); + } catch (GenericDatabaseAccessException e) { // ignore } if (frame != null) { From b1d6493951584ba4f52da7c676f9826638a1ea64 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:38:25 +0200 Subject: [PATCH 213/286] simplify, use methods from DatabaseTools --- .../coverage/CodeCoverageReporterDialog.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java index 1a97b012..654bb59c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java @@ -28,9 +28,6 @@ import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.WindowEvent; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.JButton; @@ -43,15 +40,13 @@ import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; -import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.utplsql.sqldev.coverage.CodeCoverageReporter; -import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.StringTools; import org.utplsql.sqldev.resources.UtplsqlResources; public class CodeCoverageReporterDialog extends JFrame implements ActionListener, FocusListener { private static final long serialVersionUID = 5503685225300993401L; - private static final Logger logger = Logger.getLogger(CodeCoverageReporterDialog.class.getName()); private CodeCoverageReporter reporter; private JButton runButton; @@ -180,16 +175,6 @@ public void exit() { dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); } - private void abortConnection(final Connection conn, final SimpleAsyncTaskExecutor taskExecutor) { - try { - conn.abort(taskExecutor); - } catch (SQLException e) { - final String msg = "Error aborting connection due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericDatabaseAccessException(msg, e); - } - } - @Override public void actionPerformed(final ActionEvent e) { if (e.getSource() == runButton) { @@ -212,7 +197,7 @@ public void actionPerformed(final ActionEvent e) { // database session is not cancelled. This is not a bug. // to cancel the session you have to kill it via "ALTER SYSTEM KILL SESSION". // However, the abort frees all resources on the client side. - abortConnection(reporter.getConnection(), new SimpleAsyncTaskExecutor()); + DatabaseTools.abortConnection(reporter.getConnection()); } } } From bc703658735a0e35e75ba750244b786998609257 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:39:17 +0200 Subject: [PATCH 214/286] change log message --- .../java/org/utplsql/sqldev/dal/RealtimeReporterDao.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index ec5fb87d..44deab4c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -150,15 +150,15 @@ private RealtimeReporterEvent convert(final String itemType, final String text) } return event; } catch (ParserConfigurationException e) { - final String msg = "cannot create docBuilder, due to " + e.getMessage(); + final String msg = "Cannot create docBuilder for " + itemType + " with content: " + text; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } catch (SAXException e) { - final String msg = "parse error while processing event: " + e.getMessage(); + final String msg = "Parse error while processing " + itemType + " with content: " + text; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } catch (IOException e) { - final String msg = "I/O error while processing event: " + e.getMessage(); + final String msg = "I/O error while processing " + itemType + " with content: " + text; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } From 47306e64c339de3c15b548ef52c51c0cdae67263 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:39:41 +0200 Subject: [PATCH 215/286] simplify, use methods from DatabaseTools --- .../utplsql/sqldev/oddgen/RunGenerator.java | 29 ++----------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java index 15191fbc..215baf2f 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/RunGenerator.java @@ -16,20 +16,18 @@ package org.utplsql.sqldev.oddgen; import java.sql.Connection; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; -import java.util.logging.Logger; import java.util.stream.Collectors; import org.oddgen.sqldev.generators.OddgenGenerator2; import org.oddgen.sqldev.generators.model.Node; import org.utplsql.sqldev.dal.UtplsqlDao; -import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.StringTools; import org.utplsql.sqldev.model.preference.PreferenceModel; import org.utplsql.sqldev.resources.UtplsqlResources; @@ -37,8 +35,6 @@ import oracle.ide.config.Preferences; public class RunGenerator implements OddgenGenerator2 { - private static final Logger logger = Logger.getLogger(RunGenerator.class.getName()); - public static final String YES = "Yes"; public static final String NO = "No"; public static final String RESET_PACKAGE = UtplsqlResources.getString("PREF_RESET_PACKAGE_LABEL"); @@ -50,20 +46,7 @@ public class RunGenerator implements OddgenGenerator2 { @Override public boolean isSupported(final Connection conn) { - try { - boolean ret = false; - if (conn != null && conn.getMetaData().getDatabaseProductName().startsWith("Oracle") - && (conn.getMetaData().getDatabaseMajorVersion() == 11 - && conn.getMetaData().getDatabaseMinorVersion() >= 2 - || conn.getMetaData().getDatabaseMajorVersion() > 11)) { - ret = true; - } - return ret; - } catch (SQLException e) { - final String msg = "SQLException during connection check due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericDatabaseAccessException(msg, e); - } + return DatabaseTools.isSupported(conn); } @Override @@ -129,13 +112,7 @@ public HashMap getParamStates(final Connection conn, final Link private String getPath(final Node node, final Connection conn) { if ("SUITE".equals(node.getId()) || "SUITEPATH".equals(node.getId())) { - try { - return conn.getMetaData().getUserName(); - } catch (SQLException e) { - final String msg = "SQLException during getUserName() due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericDatabaseAccessException(msg, e); - } + return DatabaseTools.getUser(conn); } else { return node.getId(); } From 839f8476cf444bf7ce560b87560fba67a5de9242 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:40:23 +0200 Subject: [PATCH 216/286] simplify, use methods from DatabaseTools, SystemTools --- .../utplsql/sqldev/ui/runner/RunnerPanel.java | 32 +++---------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java index 08b73ace..0e71115e 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java @@ -26,11 +26,9 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.sql.Connection; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -68,9 +66,10 @@ import org.springframework.web.util.HtmlUtils; import org.utplsql.sqldev.dal.UtplsqlDao; -import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.LimitedLinkedHashMap; import org.utplsql.sqldev.model.StringTools; +import org.utplsql.sqldev.model.SystemTools; import org.utplsql.sqldev.model.preference.PreferenceModel; import org.utplsql.sqldev.model.runner.Counter; import org.utplsql.sqldev.model.runner.Expectation; @@ -82,13 +81,10 @@ import org.utplsql.sqldev.runner.UtplsqlWorksheetRunner; import oracle.dbtools.raptor.controls.grid.DefaultDrillLink; -import oracle.dbtools.raptor.utils.Connections; import oracle.ide.config.Preferences; -import oracle.javatools.db.DBException; import oracle.javatools.ui.table.ToolbarButton; public class RunnerPanel { - private static final Logger logger = Logger.getLogger(RunnerPanel.class.getName()); private static final Color GREEN = new Color(0, 153, 0); private static final Color RED = new Color(153, 0, 0); private static final int INDICATOR_WIDTH = 20; @@ -312,18 +308,8 @@ public boolean include(final RowFilter.Entry msg); - throw new GenericDatabaseAccessException(msg, e); - } - } - private void openTest(final Test test) { - final UtplsqlDao dao = new UtplsqlDao(getConnection(currentRun.getConnectionName())); + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(currentRun.getConnectionName())); final String source = dao.getSource(test.getOwnerName(), "PACKAGE", test.getObjectName().toUpperCase()).trim(); final UtplsqlParser parser = new UtplsqlParser(source); final int line = parser.getLineOf(test.getProcedureName()); @@ -381,7 +367,7 @@ private void openLink(final String link) { final String ownerName = parts[1]; final String objectName = parts[2]; int line = Integer.parseInt(parts[3]); - final UtplsqlDao dao = new UtplsqlDao(getConnection(currentRun.getConnectionName())); + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(currentRun.getConnectionName())); final String objectType = "UNKNOWN".equals(type) ? dao.getObjectType(ownerName, objectName) : type; if (parts.length == 5) { final String procedureName = parts[4]; @@ -490,14 +476,6 @@ private void setCurrentRun(final Run run) { elapsedTimeTimer.start(); } } - - private void sleep(int millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } public synchronized void update(final String reporterId) { setCurrentRun(runs.get(reporterId)); @@ -516,7 +494,7 @@ public synchronized void update(final String reporterId) { .getCellRect(testOverviewTable.convertRowIndexToView(row), 0, true); testOverviewTable.scrollRectToVisible(positionOfCurrentTest); testOverviewTableModel.fireTableRowsUpdated(row, row); - sleep(5); + SystemTools.sleep(5); if (!showSuccessfulTestsCheckBoxMenuItem.isSelected() || !showDisabledTestsCheckBoxMenuItem.isSelected()) { applyFilter(showSuccessfulTestsCheckBoxMenuItem.isSelected(), From f6616548b00ee8944d461cb43cf5960085cd9bb2 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:41:10 +0200 Subject: [PATCH 217/286] simplify, use methods from XMLTools --- .../utplsql/sqldev/snippet/SnippetMerger.java | 37 ++----------------- 1 file changed, 3 insertions(+), 34 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java index be2429ef..ce940803 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/snippet/SnippetMerger.java @@ -17,33 +17,24 @@ import java.io.BufferedReader; import java.io.File; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.nio.charset.Charset; import java.nio.file.Paths; -import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import org.utplsql.sqldev.exception.GenericRuntimeException; import org.utplsql.sqldev.model.FileTools; import org.utplsql.sqldev.model.XMLTools; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; -import org.xml.sax.SAXException; import oracle.dbtools.util.Resource; public class SnippetMerger { - private static final Logger logger = Logger.getLogger(SnippetMerger.class.getName()); - private final XMLTools xmlTools = new XMLTools(); private File userSnippetsFile; private String utplsqlSnippets; @@ -65,38 +56,16 @@ public SnippetMerger(final File file) { userSnippetsFile = file; } - private DocumentBuilder createDocumentBuilder() { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - try { - factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); - return factory.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - final String msg = "Could not create no document builder due to " + e.getMessage() + "."; - logger.severe(() -> msg); - throw new GenericRuntimeException(msg, e); - } - } - - private Document parse(final DocumentBuilder builder, final InputSource inputSource) { - try { - return builder.parse(inputSource); - } catch (SAXException | IOException e) { - final String msg = "Could not parse XML input due to " + e.getMessage() + "."; - logger.severe(() -> msg); - throw new GenericRuntimeException(msg, e); - } - } - public void merge() { String result = null; if (userSnippetsFile.exists()) { // file exists, proper merge required final String userSnippets = new String(FileTools.readFile(Paths.get(userSnippetsFile.getAbsolutePath()))); - final DocumentBuilder docBuilder = createDocumentBuilder(); - final Document userSnippetsDoc = parse(docBuilder, new InputSource(new StringReader(userSnippets))); + final DocumentBuilder docBuilder = xmlTools.createDocumentBuilder(); + final Document userSnippetsDoc = xmlTools.parse(docBuilder, new InputSource(new StringReader(userSnippets))); final NodeList userSnippetsGroups = xmlTools.getNodeList(userSnippetsDoc, "/snippets/group[not(@category=\"utPLSQL Annotations\" or @category=\"utPLSQL Expectations\")]"); - final Document utplsqlSnippetsDoc = parse(docBuilder, new InputSource(new StringReader(utplsqlSnippets))); + final Document utplsqlSnippetsDoc = xmlTools.parse(docBuilder, new InputSource(new StringReader(utplsqlSnippets))); final NodeList utplsqlSnippetsGroups = xmlTools.getNodeList(utplsqlSnippetsDoc, "/snippets/group"); StringBuilder sb = new StringBuilder(); sb.append("\n"); From d7bd92dbb70a5c31fc3b83bf04b26c9d428b825c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:41:33 +0200 Subject: [PATCH 218/286] simplify, use methods from DatabaseTools --- .../utplsql/sqldev/oddgen/TestGenerator.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java index 32ef3c23..975c64b0 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/oddgen/TestGenerator.java @@ -17,7 +17,6 @@ import java.io.File; import java.sql.Connection; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -30,7 +29,7 @@ import org.oddgen.sqldev.generators.model.NodeTools; import org.oddgen.sqldev.plugin.templates.TemplateTools; import org.utplsql.sqldev.dal.UtplsqlDao; -import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.oddgen.GenContext; import org.utplsql.sqldev.model.preference.PreferenceModel; import org.utplsql.sqldev.resources.UtplsqlResources; @@ -129,20 +128,7 @@ private CharSequence deleteFiles(final String directory) { @Override public boolean isSupported(final Connection conn) { - try { - boolean ret = false; - if (conn != null && conn.getMetaData().getDatabaseProductName().startsWith("Oracle") - && (conn.getMetaData().getDatabaseMajorVersion() == 11 - && conn.getMetaData().getDatabaseMinorVersion() >= 2 - || conn.getMetaData().getDatabaseMajorVersion() > 11)) { - ret = true; - } - return ret; - } catch (SQLException e) { - final String msg = "SQLException during connection check due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericDatabaseAccessException(msg, e); - } + return DatabaseTools.isSupported(conn); } @Override From fde1909555fef0c4914cda37108768c0e49d7f2a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:42:16 +0200 Subject: [PATCH 219/286] simplify, use methods from DatabaseTools, SystemTools --- .../sqldev/runner/UtplsqlWorksheetRunner.java | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java index 7b492e52..27bee4cd 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java @@ -22,11 +22,12 @@ import javax.swing.JSplitPane; import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.StringTools; +import org.utplsql.sqldev.model.SystemTools; import org.utplsql.sqldev.model.preference.PreferenceModel; import org.utplsql.sqldev.resources.UtplsqlResources; -import oracle.dbtools.raptor.utils.Connections; import oracle.dbtools.worksheet.WorksheetResultPanel; import oracle.dbtools.worksheet.editor.OpenWorksheetWizard; import oracle.dbtools.worksheet.editor.Worksheet; @@ -34,7 +35,6 @@ import oracle.ide.Ide; import oracle.ide.config.Preferences; import oracle.ide.controller.IdeAction; -import oracle.jdeveloper.db.ConnectionException; public class UtplsqlWorksheetRunner { private static final Logger logger = Logger.getLogger(UtplsqlWorksheetRunner.class.getName()); @@ -51,18 +51,12 @@ public UtplsqlWorksheetRunner(final List pathList, final String connecti private void setConnection(final String connectionName) { if (connectionName != null && preferences.isUnsharedWorksheet()) { - // fix for issue #47 - private connections are not closed in SQLDev >= 17.4.0 try { - this.connectionName = Connections.getInstance().createTemporaryConnection(connectionName); - } catch (Throwable t) { - // private connection is closed when worksheet is closed in SQLDev < 17.4.0 - try { - this.connectionName = Connections.getInstance().createPrivateConnection(connectionName); - } catch (ConnectionException e) { - final String msg = "failed to create private connection due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericDatabaseAccessException(msg, e); - } + this.connectionName = DatabaseTools.createTemporaryOrPrivateConnection(connectionName); + } catch (GenericDatabaseAccessException e) { + final String msg = "Failed to create temporary/private connection based on " + connectionName + "."; + logger.severe(() -> msg); + throw new GenericDatabaseAccessException(msg, e); } } else { this.connectionName = connectionName; @@ -103,17 +97,9 @@ private Worksheet openWorksheet() { worksheet.getContext().getNode().markDirty(false); return worksheet; } - - private void sleep(int millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } private void resizeResultPanel(final Worksheet worksheet) { - sleep(200); + SystemTools.sleep(200); Container splitPane = null; WorksheetResultPanel selectedResultPanel = worksheet.getSelectedResultPanel(); if (selectedResultPanel != null && selectedResultPanel.getGUI() != null && selectedResultPanel.getGUI().getParent() != null @@ -131,13 +117,13 @@ private void resizeResultPanel(final Worksheet worksheet) { private void runScript(final Worksheet worksheet) { if (preferences.isAutoExecute()) { - sleep(100); + SystemTools.sleep(100); final IdeAction action = ((IdeAction) Ide.getIdeActionMap().get(Ide.findCmdID("Worksheet.RunScript"))); if ((action != null)) { try { action.performAction(worksheet.getContext()); } catch (Exception e) { - logger.severe(() -> "Could not run script due to " + (e != null ? e.getMessage() : "???") + "."); + logger.severe(() -> "Could not run script in worksheet due to " + (e != null ? e.getMessage() : "???") + "."); } resizeResultPanel(worksheet); } From bae1d0068f7c092e08d07ee6ca5979f3bfead493 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:42:47 +0200 Subject: [PATCH 220/286] simplify, use methods from DatabaseTools --- .../utplsql/sqldev/runner/UtplsqlRunner.java | 39 ++++--------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java index 84bfdc7b..888c26e5 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java @@ -18,7 +18,6 @@ import java.awt.Dimension; import java.awt.Toolkit; import java.sql.Connection; -import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; @@ -30,7 +29,7 @@ import org.utplsql.sqldev.dal.RealtimeReporterDao; import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer; -import org.utplsql.sqldev.exception.GenericDatabaseAccessException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.runner.PostRunEvent; import org.utplsql.sqldev.model.runner.PostSuiteEvent; import org.utplsql.sqldev.model.runner.PostTestEvent; @@ -45,10 +44,6 @@ import org.utplsql.sqldev.ui.runner.RunnerPanel; import org.utplsql.sqldev.ui.runner.RunnerView; -import oracle.dbtools.raptor.utils.Connections; -import oracle.javatools.db.DBException; -import oracle.jdeveloper.db.ConnectionException; - public class UtplsqlRunner implements RealtimeReporterEventConsumer { private static final Logger logger = Logger.getLogger(UtplsqlRunner.class.getName()); @@ -80,34 +75,16 @@ private void setConnection(final String connectionName) { if (connectionName == null) { throw new NullPointerException("Cannot initialize a RealtimeConsumer without a ConnectionName"); } else { - try { - producerConn = Connections.getInstance() - .cloneConnection(Connections.getInstance().getConnection(connectionName)); - consumerConn = Connections.getInstance() - .cloneConnection(Connections.getInstance().getConnection(connectionName)); - } catch (ConnectionException | DBException e) { - final String msg = "Error creating producer and consumer connections due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericDatabaseAccessException(msg, e); - } + producerConn = DatabaseTools.cloneConnection(connectionName); + consumerConn = DatabaseTools.cloneConnection(connectionName); } this.connectionName = connectionName; } - - private void closeConnection(Connection conn) { - try { - if (!conn.isClosed()) { - conn.close(); - } - } catch (SQLException e) { - logger.warning(() -> "could not close connection"); - } - } public void dispose() { // running in SQL Developer - closeConnection(producerConn); - closeConnection(consumerConn); + DatabaseTools.closeConnection(producerConn); + DatabaseTools.closeConnection(consumerConn); } @Override @@ -267,7 +244,7 @@ private void produce() { logger.fine(() -> "All events produced for reporter id " + reporterId + "."); } catch (Exception e) { logger.severe(() -> "Error while producing events for reporter id " + reporterId + ": " - + (e != null ? e.getMessage() : "")); + + (e != null ? e.getMessage() : "???")); } } @@ -277,9 +254,9 @@ private void consume() { final RealtimeReporterDao dao = new RealtimeReporterDao(consumerConn); dao.consumeReport(reporterId, this); logger.fine(() -> "All events consumed."); - } catch (final Exception e) { + } catch (Exception e) { logger.severe(() -> "Error while consuming events for reporter id " + reporterId + ": " - + (e != null ? e.getMessage() : "")); + + (e != null ? e.getMessage() : "???")); } if (run.getTotalNumberOfTests() < 0) { run.setStatus(UtplsqlResources.getString("RUNNER_NO_TESTS_FOUND_TEXT")); From 736c4bf2e3f3726c5df246bc1a21c28b48612980 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:43:05 +0200 Subject: [PATCH 221/286] simplify, use methods from DatabaseTools --- .../org/utplsql/sqldev/parser/UtplsqlParser.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java b/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java index 4bdc897a..d5882a0f 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java @@ -16,7 +16,6 @@ package org.utplsql.sqldev.parser; import java.sql.Connection; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -26,8 +25,8 @@ import javax.swing.text.JTextComponent; import org.utplsql.sqldev.dal.UtplsqlDao; -import org.utplsql.sqldev.exception.GenericDatabaseAccessException; import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.parser.PlsqlObject; import org.utplsql.sqldev.model.parser.Unit; import org.utplsql.sqldev.model.ut.Annotation; @@ -126,14 +125,6 @@ private void populateUnits() { } } - private String getSchema(Connection conn) { - try { - return conn.getSchema(); - } catch (SQLException e) { - throw new GenericDatabaseAccessException("getSchema failed", e); - } - } - private void processAnnotations(final Connection conn, final String owner) { this.owner = owner; if (conn != null) { @@ -141,7 +132,7 @@ private void processAnnotations(final Connection conn, final String owner) { if (dao.isUtAnnotationManagerInstalled()) { for (final PlsqlObject o : objects) { final List segments = Arrays.asList(fixName(o.getName()).split("\\.")); - final String schema = owner != null ? owner : getSchema(conn); + final String schema = owner != null ? owner : DatabaseTools.getSchema(conn); final List annotations = dao.annotations(schema, segments.get(segments.size() - 1).toUpperCase()); if (annotations.stream().anyMatch(it -> it.getName().equals("suite"))) { From 3f42b91bd275b43777fd8a27a53ff4d6939e069d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:44:03 +0200 Subject: [PATCH 222/286] simplify, use methods from DatabaseTools --- .../sqldev/menu/UtplsqlController.java | 58 +++++-------------- 1 file changed, 13 insertions(+), 45 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java index 01b4cea5..0e73d2a1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java @@ -16,10 +16,8 @@ package org.utplsql.sqldev.menu; import java.awt.Component; -import java.io.IOException; import java.net.URL; import java.sql.Connection; -import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -35,6 +33,7 @@ import org.utplsql.sqldev.dal.RealtimeReporterDao; import org.utplsql.sqldev.dal.UtplsqlDao; import org.utplsql.sqldev.exception.GenericRuntimeException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.StringTools; import org.utplsql.sqldev.model.URLTools; import org.utplsql.sqldev.model.oddgen.GenContext; @@ -62,7 +61,6 @@ import oracle.ide.editor.Editor; import oracle.ide.model.Node; import oracle.ide.view.View; -import oracle.javatools.db.DBException; @SuppressWarnings("all") public class UtplsqlController implements Controller { @@ -92,7 +90,7 @@ public boolean handleEvent(final IdeAction action, final Context context) { return true; } } catch (Exception e) { - final String msg = "Failed to handle event due to exception " + (e != null ? e.getMessage() : "") + "."; + final String msg = "Failed to handle event for action " + action.toString() + "."; logger.severe(() -> msg); throw new GenericRuntimeException(msg, e); } @@ -122,7 +120,7 @@ public boolean update(final IdeAction action, final Context context) { } logger.fine("connectionName: " + connectionName); final String text = ((JEditorPane) component).getText(); - final Connection conn = getConnection(connectionName); + final Connection conn = DatabaseTools.getConnection(connectionName); final UtplsqlParser parser = new UtplsqlParser(text, conn, owner); if (!parser.getPathAt(((JEditorPane) component).getCaretPosition()).isEmpty()) { action.setEnabled(true); @@ -141,11 +139,11 @@ public boolean update(final IdeAction action, final Context context) { final Object element = context.getSelection()[i]; final String connectionName = URLTools.getConnectionName(getURL(context)); if (Connections.getInstance().isConnectionOpen(connectionName)) { - Connection conn = getConnection(connectionName); + Connection conn = DatabaseTools.getConnection(connectionName); final UtplsqlDao dao = new UtplsqlDao(conn); if (preferences.isCheckRunUtplsqlTest() && dao.isUtAnnotationManagerInstalled()) { if (element instanceof DatabaseConnection) { - final String schema = getSchema(getConnection((DatabaseConnection) element)); + final String schema = DatabaseTools.getSchema((DatabaseConnection) element); action.setEnabled(dao.containsUtplsqlTest(schema)); } else if ((element instanceof SchemaFolder)) { final String schema = ((SchemaFolder) element).getSchemaName(); @@ -207,7 +205,7 @@ public boolean update(final IdeAction action, final Context context) { private String getPath(final Object element) { String path = null; if (element instanceof DatabaseConnection) { - path = getSchema(getConnection(((DatabaseConnection) element))); + path = DatabaseTools.getSchema((DatabaseConnection) element); } else if (element instanceof SchemaFolder) { path = ((SchemaFolder) element).getSchemaName(); } else if (element instanceof ObjectFolder) { @@ -306,7 +304,7 @@ private GenContext getGenContext(final Context context) { final String connectionName = URLTools.getConnectionName(getURL(context)); final GenContext genContext = new GenContext(); if (Connections.getInstance().isConnectionOpen(connectionName)) { - genContext.setConn(getConnection(connectionName)); + genContext.setConn(DatabaseTools.getConnection(connectionName)); final Object element = context.getSelection()[0]; if ((element instanceof PlSqlNode)) { genContext.setObjectType(((PlSqlNode) element).getObjectType().replace(" BODY", "")); @@ -317,37 +315,7 @@ private GenContext getGenContext(final Context context) { } return genContext; } - - private Connection getConnection(String connectionName) { - try { - return Connections.getInstance().getConnection(connectionName); - } catch (DBException e) { - final String msg = "DBException while getting connection for " + connectionName + " due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericRuntimeException(msg, e); - } - } - - private Connection getConnection(DatabaseConnection dbconn) { - try { - return dbconn.getConnection(); - } catch (IOException e) { - final String msg = "IOException while getting connection for " + dbconn.getConnectionName() + " due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericRuntimeException(msg, e); - } - } - private String getSchema(Connection conn) { - try { - return conn.getSchema(); - } catch (SQLException e) { - final String msg = "SQLException while getting schema for connection due to " + e.getMessage(); - logger.severe(() -> msg); - throw new GenericRuntimeException(msg, e); - } - } - public void runTest(final Context context) { final View view = context.getView(); final Node node = context.getNode(); @@ -373,7 +341,7 @@ public void runTest(final Context context) { } } logger.fine("connectionName: " + connectionName); - final Connection conn = getConnection(connectionName); + final Connection conn = DatabaseTools.getConnection(connectionName); String text = ((JEditorPane) component).getText(); final UtplsqlParser parser = new UtplsqlParser(text, conn, owner); final int position = ((JEditorPane) component).getCaretPosition(); @@ -392,7 +360,7 @@ public void runTest(final Context context) { if ((url != null)) { final String connectionName = URLTools.getConnectionName(url); logger.fine("connectionName: " + connectionName); - final Connection conn = getConnection(connectionName); + final Connection conn = DatabaseTools.getConnection(connectionName); final RealtimeReporterDao rrDao = new RealtimeReporterDao(conn); final ArrayList pathList = dedupPathList(getPathList(context)); if (preferences.isUseRealtimeReporter() && rrDao.isSupported()) { @@ -409,7 +377,7 @@ public void runTest(final Context context) { public List dependencies(final String name, final String connectionName) { List ret = null; if (connectionName != null) { - final String owner = getSchema(getConnection(connectionName)); + final String owner = DatabaseTools.getSchema(connectionName); ret = dependencies(owner, name, connectionName); } return ret; @@ -418,7 +386,7 @@ public List dependencies(final String name, final String connectionName) public List dependencies(final String owner, final String name, final String connectionName) { List ret = null; if (connectionName != null) { - Connection conn = getConnection(connectionName); + Connection conn = DatabaseTools.getConnection(connectionName); final UtplsqlDao dao = new UtplsqlDao(conn); ret = dao.includes(owner, name); } @@ -471,7 +439,7 @@ public void codeCoverage(final Context context) { String text = ((JEditorPane) component).getText(); Connection conn = null; if (preferences.isCheckRunUtplsqlTest()) { - conn = getConnection(connectionName); + conn = DatabaseTools.getConnection(connectionName); } else { conn = null; } @@ -525,7 +493,7 @@ public void generateTest(final Context context) { if (connectionName != null) { if (Connections.getInstance().isConnectionOpen(connectionName)) { final GenContext genContext = new GenContext(); - genContext.setConn(getConnection(connectionName)); + genContext.setConn(DatabaseTools.getConnection(connectionName)); String text = ((JEditorPane) component).getText(); final UtplsqlParser parser = new UtplsqlParser(text); final int position = ((JEditorPane) component).getCaretPosition(); From 84b38e33444b6864a685255b64eb494fdb5b4cbe Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:45:42 +0200 Subject: [PATCH 223/286] rename DalTest.xtend to DalTest.java --- .../org/utplsql/sqldev/test/dal/{DalTest.xtend => DalTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/dal/{DalTest.xtend => DalTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java From 28c9549594eb2c17404c6b00f7a700820d8b5bd5 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 19:46:00 +0200 Subject: [PATCH 224/286] add add DalTest.java generated by Xtend 2.20.0 --- .../org/utplsql/sqldev/test/dal/DalTest.java | 1562 +++++++++++------ 1 file changed, 977 insertions(+), 585 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java index 2a8d5444..36286176 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,587 +13,979 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.test.dal - -import java.util.ArrayList -import java.util.HashMap -import org.junit.AfterClass -import org.junit.Assert -import org.junit.BeforeClass -import org.junit.Test -import org.springframework.jdbc.BadSqlGrammarException -import org.utplsql.sqldev.dal.UtplsqlDao -import org.utplsql.sqldev.model.ut.Annotation -import org.utplsql.sqldev.test.AbstractJdbcTest - -class DalTest extends AbstractJdbcTest { - - @BeforeClass - @AfterClass - def static void setupAndTeardown() { - sysJdbcTemplate.execute("CREATE OR REPLACE PUBLIC SYNONYM ut FOR ut3.ut") - try { - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP PACKAGE BODY junit_utplsql_test_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP PACKAGE junit_no_test_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP TYPE junit_tab1_ot") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP TYPE junit_tab2_ot") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP FUNCTION junit_f") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP PROCEDURE junit_p") - } catch (BadSqlGrammarException e) { - // ignore - } - } - - @Test - def void isDbaViewAccessible() { - val dao = new UtplsqlDao(dataSource.connection) - Assert.assertFalse(dao.dbaViewAccessible) - val sysDao = new UtplsqlDao(sysDataSource.connection) - Assert.assertTrue(sysDao.dbaViewAccessible) - } - - @Test - def void utplsqlSchema() { - sysJdbcTemplate.execute("DROP PUBLIC SYNONYM ut") - val dao = new UtplsqlDao(dataSource.connection) - Assert.assertEquals(null, dao.utplsqlSchema) - setupAndTeardown - Assert.assertEquals("UT3", dao.utplsqlSchema) - } - - @Test - def void isUtAnnotationManagerInstalled() { - val dao = new UtplsqlDao(dataSource.connection) - Assert.assertTrue(dao.utAnnotationManagerInstalled) - } - - def void containsUtplsqlTest(String utPlsqlVersion) { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = utPlsqlVersion - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - -- %test - PROCEDURE t1; - - -- %Test - PROCEDURE t2; - - PROCEDURE t3; - END junit_utplsql_test_pkg; - ''') - Assert.assertTrue(dao.containsUtplsqlTest("scott")) - Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")) - Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t1")) - Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t2")) - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t3")) - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %test - PROCEDURE t1; - - -- %Test - PROCEDURE t2; - - PROCEDURE t3; - END junit_utplsql_test_pkg; - ''') - Assert.assertFalse(dao.containsUtplsqlTest("scott")) - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")) - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t1")) - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t2")) - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t3")) - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } - - @Test - def void containsUtplsqlTest304() { - val dao = new UtplsqlDao(dataSource.connection) - if (dao.normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { - containsUtplsqlTest("3.0.4") - } - } - - @Test - def void containsUtplsqlTest313() { - containsUtplsqlTest("3.1.3") - } - - @Test - def void containsUtplsqlTest318() { - containsUtplsqlTest("3.1.8") - } - - def void annotations(String utPlsqlVersion) { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = utPlsqlVersion - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - -- %test - PROCEDURE t1; - - -- %Test - PROCEDURE t2; - - PROCEDURE t3; - END junit_utplsql_test_pkg; - ''') - val actual = dao.annotations("scott", "junit_utplsql_test_pkg") - val expected = new ArrayList - val suite = new Annotation - suite.objectOwner = "SCOTT" - suite.objectName = "JUNIT_UTPLSQL_TEST_PKG" - suite.name = 'suite' - suite.subobjectName = suite.objectName - expected.add(suite) - val t1 = new Annotation - t1.objectOwner = "SCOTT" - t1.objectName = "JUNIT_UTPLSQL_TEST_PKG" - t1.name = 'test' - t1.subobjectName = 'T1' - expected.add(t1) - val t2 = new Annotation - t2.objectOwner = "SCOTT" - t2.objectName = "JUNIT_UTPLSQL_TEST_PKG" - t2.name = 'test' - t2.subobjectName = 'T2' - expected.add(t2) - Assert.assertEquals(expected.toString, actual.toString) - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } - - @Test - def void annotations304() { - val dao = new UtplsqlDao(dataSource.connection) - if (dao.normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { - annotations("3.0.4") - } - } - - @Test - def void annotations313() { - annotations("3.1.3") - } - - @Test - def void annotations318() { - annotations("3.1.8") - } - - def void testablesPackages(String utPlsqlVersion) { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = utPlsqlVersion - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - -- %test - PROCEDURE t1; - - -- %Test - PROCEDURE t2; - - PROCEDURE t3; - END junit_utplsql_test_pkg; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_no_test_pkg IS - PROCEDURE p1; - - PROCEDURE p2; - END junit_no_test_pkg; - ''') - val actual = dao.testables('PACKAGE') - Assert.assertEquals(1, actual.size) - Assert.assertEquals("PACKAGE.JUNIT_NO_TEST_PKG", actual.get(0).id) - } - - @Test - def void testablesPackages304() { - val dao = new UtplsqlDao(dataSource.connection) - if (dao.normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { - testablesPackages("3.0.4") - } - } - - @Test - def void testablesPackages313() { - testablesPackages("3.1.3") - } - - @Test - def void testablesPackages318() { - testablesPackages("3.1.8") - } - - def void testablesTypes(String utPlsqlVersion) { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = utPlsqlVersion - jdbcTemplate.execute(''' - CREATE OR REPLACE TYPE junit_tab1_ot IS object (a integer, b integer); - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE TYPE junit_tab2_ot IS object ( - a integer, - b integer, - member procedure c( - self in out nocopy junit_tab2_ot, - p integer - ) - ); - ''') - val actual = dao.testables('TYPE') - Assert.assertEquals(1, actual.size) - Assert.assertEquals("TYPE.JUNIT_TAB2_OT", actual.get(0).id) - } - - @Test - def void testablesTypes304() { - val dao = new UtplsqlDao(dataSource.connection) - if (dao.normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { - testablesTypes("3.0.4") - } - } - - @Test - def void testablesTypes313() { - testablesTypes("3.1.3") - } - - @Test - def void testablesTypes318() { - testablesTypes("3.1.8") - } - - def void testablesFunctions(String utPlsqlVersion) { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = utPlsqlVersion - jdbcTemplate.execute(''' - CREATE OR REPLACE FUNCTION junit_f RETURN INTEGER IS - BEGIN - RETURN 1; - END; - ''') - val actual = dao.testables('FUNCTION') - Assert.assertEquals(1, actual.size) - Assert.assertEquals("FUNCTION.JUNIT_F", actual.get(0).id) - } - - @Test - def void testablesFunctions304() { - val dao = new UtplsqlDao(dataSource.connection) - if (dao.normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { - testablesFunctions("3.0.4") - } - } - - @Test - def void testablesFunctions313() { - testablesFunctions("3.1.3") - } - - @Test - def void testablesFunctions318() { - testablesFunctions("3.1.8") - } - - def void testablesProcedures(String utPlsqlVersion) { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = utPlsqlVersion - jdbcTemplate.execute(''' - CREATE OR REPLACE PROCEDURE junit_p RETURN INTEGER IS - BEGIN - NULL; - END; - ''') - val actual = dao.testables('PROCEDURE') - Assert.assertEquals(1, actual.size) - Assert.assertEquals("PROCEDURE.JUNIT_P", actual.get(0).id) - } - - @Test - def void testablesProcedures304() { - val dao = new UtplsqlDao(dataSource.connection) - if (dao.normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { - testablesProcedures("3.0.4") - } - } - - @Test - def void testablesProcedures313() { - testablesProcedures("3.1.3") - } - - @Test - def void testablesProcedures318() { - testablesProcedures("3.1.8") - } - - def void runnables(String utPlsqlVersion) { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = utPlsqlVersion - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - -- %suitepath(a.B.c) - - -- %test - PROCEDURE T0; - - -- %context(myContext) - - -- %test(t1: test One) - PROCEDURE t1; - - -- %test(t2: test Two) - PROCEDURE t2; - - -- %endcontext - - -- %test - PROCEDURE t3; - END junit_utplsql_test_pkg; - ''') - val actualNodes = dao.runnables() - Assert.assertEquals(16, actualNodes.size) - val actual = new HashMap - for (node : actualNodes) { - actual.put(node.id, node.parentId) - } - Assert.assertEquals(null, actual.get("SUITE")) - Assert.assertEquals("SUITE", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG")) - Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T0")) - Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T1")) - Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T2")) - Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T3")) - Assert.assertEquals(null, actual.get("SUITEPATH")) - Assert.assertEquals("SUITEPATH", actual.get("SCOTT:a")) - Assert.assertEquals("SCOTT:a", actual.get("SCOTT:a.b")) - Assert.assertEquals("SCOTT:a.b", actual.get("SCOTT:a.b.c")) - Assert.assertEquals("SCOTT:a.b.c", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg")) - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1")) - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.t0")) - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.t3")) - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1.t1")) - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1.t2")) - } - - @Test - def void runnables304() { - val dao = new UtplsqlDao(dataSource.connection) - if (dao.normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { - runnables("3.0.4") - } - } - - @Test - def void runnables313() { - runnables("3.1.3") - } - - @Test - def void runnables318() { - runnables("3.1.8") - } - - @Test - def void dbmsOutput() { - val dao = new UtplsqlDao(dataSource.connection) - dao.enableDbmsOutput - jdbcTemplate.execute(''' - BEGIN - sys.dbms_output.put_line('line1'); - sys.dbms_output.put_line('line2'); - sys.dbms_output.put_line(null); - sys.dbms_output.put_line('line4'); - sys.dbms_output.put_line('line5'); - END; - ''') - val actual = dao.getDbmsOutput(2) - val expected = ''' - line1 - line2 - - line4 - line5 - ''' - Assert.assertEquals(expected, actual) - } - - @Test - def void htmlCodeCoverage() { - setupAndTeardown - val dao = new UtplsqlDao(dataSource.connection) - val actual = dao.htmlCodeCoverage(#["SCOTT"], #['scott'], #[], #[]) - Assert.assertTrue(actual.startsWith("")) - Assert.assertTrue(actual.trim.endsWith("")) - } - - @Test - def void includes() { - setupAndTeardown - jdbcTemplate.execute(''' - CREATE OR REPLACE FUNCTION junit_f RETURN INTEGER IS - BEGIN - RETURN 1; - END junit_f; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - -- %test - PROCEDURE f1; - END junit_utplsql_test_pkg; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_test_pkg IS - PROCEDURE f1 IS - l_expected INTEGER := 1; - l_actual INTEGER; - BEGIN - l_actual := junit_f; - ut.expect(l_actual).to_equal(l_expected); - END f1; - END junit_utplsql_test_pkg; - ''') - val dao = new UtplsqlDao(dataSource.connection) - val actualEmpty = dao.includes('SCOTT', 'TEST_F1') - Assert.assertEquals(#[], actualEmpty) - val actual = dao.includes('SCOTT', 'junit_utplsql_test_pkg') - Assert.assertTrue(actual.findFirst[it == "SCOTT.JUNIT_UTPLSQL_TEST_PKG"] !== null) - Assert.assertTrue(actual.findFirst[it == "SCOTT.JUNIT_F"] !== null) - Assert.assertTrue(actual.findFirst[it == "UT3.UT_EXPECTATION"] !== null) - } - - @Test - def void normalizedPlsqlVersionOkRelease() { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = "v3.1.10.1234" - val actual = dao.normalizedUtPlsqlVersion() - Assert.assertEquals("3.1.10", actual) - } - - @Test - def void normalizedPlsqlVersionOkDevelop() { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = "v3.1.10.1234-develop" - val actual = dao.normalizedUtPlsqlVersion() - Assert.assertEquals("3.1.10", actual) - } - - @Test - def void normalizedPlsqlVersionNok() { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = "bla bla 1.2" - val actual = dao.normalizedUtPlsqlVersion() - Assert.assertEquals("0.0.0", actual) - } - - @Test - def void normaliedPlsqlVersionNumber() { - val dao = new UtplsqlDao(dataSource.connection) - dao.utPlsqlVersion = "3.14.37" - val actual = dao.normalizedUtPlsqlVersionNumber() - Assert.assertEquals(3014037, actual) - } - - @Test - def void utPlsqlVersion() { - val dao = new UtplsqlDao(dataSource.connection) - val actual = dao.utPlsqlVersion - val sql = "SELECT ut.version FROM DUAL" - val expected = jdbcTemplate.queryForObject(sql, String) - Assert.assertEquals(expected, actual) - - } - - @Test - def void getSourceOfPackage() { - val dao = new UtplsqlDao(dataSource.connection) - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - -- %test - PROCEDURE p1; - END junit_utplsql_test_pkg; - ''') - val actual = dao.getSource("SCOTT", "PACKAGE", "JUNIT_UTPLSQL_TEST_PKG") - Assert.assertTrue(actual.contains("-- %suite")) - Assert.assertTrue(actual.contains("PROCEDURE p1;")) - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } - - @Test - def void getSourceOfPackageBody() { - val dao = new UtplsqlDao(dataSource.connection) - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_test_pkg IS - PROCEDURE p1 IS - l_expected INTEGER := 1; - l_actual INTEGER; - BEGIN - l_actual := junit_f; - ut.expect(l_actual).to_equal(l_expected); - END p1; - END junit_utplsql_test_pkg; - '''); - val actual = dao.getSource("SCOTT", "PACKAGE BODY", "JUNIT_UTPLSQL_TEST_PKG") - Assert.assertTrue(actual.contains("PACKAGE BODY")) - Assert.assertTrue(actual.contains("PROCEDURE p1 IS")) - jdbcTemplate.execute("DROP PACKAGE BODY junit_utplsql_test_pkg") - } - - @Test - def void getObjectType() { - val dao = new UtplsqlDao(dataSource.connection) - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS - -- %suite - - -- %test - PROCEDURE p1; - END junit_utplsql_test_pkg; - ''') - val actual = dao.getObjectType("SCOTT", "JUNIT_UTPLSQL_TEST_PKG") - Assert.assertEquals("PACKAGE", actual) - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg") - } - - @Test - def void normalizedUtPlsqlVersion() { - val dao = new UtplsqlDao(dataSource.connection) - val version = dao.normalizedUtPlsqlVersion - Assert.assertTrue(version !== null) - } - -} \ No newline at end of file +package org.utplsql.sqldev.test.dal; + +import com.google.common.base.Objects; +import java.sql.Connection; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.Functions.Function1; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.oddgen.sqldev.generators.model.Node; +import org.springframework.jdbc.BadSqlGrammarException; +import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.model.ut.Annotation; +import org.utplsql.sqldev.test.AbstractJdbcTest; + +@SuppressWarnings("all") +public class DalTest extends AbstractJdbcTest { + @BeforeClass + @AfterClass + public static void setupAndTeardown() { + AbstractJdbcTest.sysJdbcTemplate.execute("CREATE OR REPLACE PUBLIC SYNONYM ut FOR ut3.ut"); + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (final Throwable _t) { + if (_t instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE BODY junit_utplsql_test_pkg"); + } catch (final Throwable _t_1) { + if (_t_1 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_1); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_no_test_pkg"); + } catch (final Throwable _t_2) { + if (_t_2 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_2); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP TYPE junit_tab1_ot"); + } catch (final Throwable _t_3) { + if (_t_3 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_3); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP TYPE junit_tab2_ot"); + } catch (final Throwable _t_4) { + if (_t_4 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_4); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP FUNCTION junit_f"); + } catch (final Throwable _t_5) { + if (_t_5 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_5); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PROCEDURE junit_p"); + } catch (final Throwable _t_6) { + if (_t_6 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_6); + } + } + } + + @Test + public void isDbaViewAccessible() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + Assert.assertFalse(dao.isDbaViewAccessible()); + Connection _connection_1 = AbstractJdbcTest.sysDataSource.getConnection(); + final UtplsqlDao sysDao = new UtplsqlDao(_connection_1); + Assert.assertTrue(sysDao.isDbaViewAccessible()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void utplsqlSchema() { + try { + AbstractJdbcTest.sysJdbcTemplate.execute("DROP PUBLIC SYNONYM ut"); + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + Assert.assertEquals(null, dao.getUtplsqlSchema()); + DalTest.setupAndTeardown(); + Assert.assertEquals("UT3", dao.getUtplsqlSchema()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void isUtAnnotationManagerInstalled() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + Assert.assertTrue(dao.isUtAnnotationManagerInstalled()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + public void containsUtplsqlTest(final String utPlsqlVersion) { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t1;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %Test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t2;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t3;"); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + Assert.assertTrue(dao.containsUtplsqlTest("scott")); + Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); + Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t1")); + Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t2")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t3")); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("-- %test"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE t1;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("-- %Test"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE t2;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE t3;"); + _builder_1.newLine(); + _builder_1.append("END junit_utplsql_test_pkg;"); + _builder_1.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); + Assert.assertFalse(dao.containsUtplsqlTest("scott")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t1")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t2")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t3")); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void containsUtplsqlTest304() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); + boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); + if (_lessThan) { + this.containsUtplsqlTest("3.0.4"); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void containsUtplsqlTest313() { + this.containsUtplsqlTest("3.1.3"); + } + + @Test + public void containsUtplsqlTest318() { + this.containsUtplsqlTest("3.1.8"); + } + + public void annotations(final String utPlsqlVersion) { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t1;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %Test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t2;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t3;"); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + final List actual = dao.annotations("scott", "junit_utplsql_test_pkg"); + final ArrayList expected = new ArrayList(); + final Annotation suite = new Annotation(); + suite.setObjectOwner("SCOTT"); + suite.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); + suite.setName("suite"); + suite.setSubobjectName(suite.getObjectName()); + expected.add(suite); + final Annotation t1 = new Annotation(); + t1.setObjectOwner("SCOTT"); + t1.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); + t1.setName("test"); + t1.setSubobjectName("T1"); + expected.add(t1); + final Annotation t2 = new Annotation(); + t2.setObjectOwner("SCOTT"); + t2.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); + t2.setName("test"); + t2.setSubobjectName("T2"); + expected.add(t2); + Assert.assertEquals(expected.toString(), actual.toString()); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void annotations304() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); + boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); + if (_lessThan) { + this.annotations("3.0.4"); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void annotations313() { + this.annotations("3.1.3"); + } + + @Test + public void annotations318() { + this.annotations("3.1.8"); + } + + public void testablesPackages(final String utPlsqlVersion) { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t1;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %Test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t2;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t3;"); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("CREATE OR REPLACE PACKAGE junit_no_test_pkg IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE p1;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE p2;"); + _builder_1.newLine(); + _builder_1.append("END junit_no_test_pkg;"); + _builder_1.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); + final List actual = dao.testables("PACKAGE"); + Assert.assertEquals(1, actual.size()); + Assert.assertEquals("PACKAGE.JUNIT_NO_TEST_PKG", actual.get(0).getId()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testablesPackages304() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); + boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); + if (_lessThan) { + this.testablesPackages("3.0.4"); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testablesPackages313() { + this.testablesPackages("3.1.3"); + } + + @Test + public void testablesPackages318() { + this.testablesPackages("3.1.8"); + } + + public void testablesTypes(final String utPlsqlVersion) { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE TYPE junit_tab1_ot IS object (a integer, b integer);"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("CREATE OR REPLACE TYPE junit_tab2_ot IS object ("); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("a integer, "); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("b integer, "); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("member procedure c("); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("self in out nocopy junit_tab2_ot, "); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("p integer"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append(")"); + _builder_1.newLine(); + _builder_1.append(");"); + _builder_1.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); + final List actual = dao.testables("TYPE"); + Assert.assertEquals(1, actual.size()); + Assert.assertEquals("TYPE.JUNIT_TAB2_OT", actual.get(0).getId()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testablesTypes304() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); + boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); + if (_lessThan) { + this.testablesTypes("3.0.4"); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testablesTypes313() { + this.testablesTypes("3.1.3"); + } + + @Test + public void testablesTypes318() { + this.testablesTypes("3.1.8"); + } + + public void testablesFunctions(final String utPlsqlVersion) { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE FUNCTION junit_f RETURN INTEGER IS "); + _builder.newLine(); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("RETURN 1;"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + final List actual = dao.testables("FUNCTION"); + Assert.assertEquals(1, actual.size()); + Assert.assertEquals("FUNCTION.JUNIT_F", actual.get(0).getId()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testablesFunctions304() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); + boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); + if (_lessThan) { + this.testablesFunctions("3.0.4"); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testablesFunctions313() { + this.testablesFunctions("3.1.3"); + } + + @Test + public void testablesFunctions318() { + this.testablesFunctions("3.1.8"); + } + + public void testablesProcedures(final String utPlsqlVersion) { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PROCEDURE junit_p RETURN INTEGER IS "); + _builder.newLine(); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("NULL;"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + final List actual = dao.testables("PROCEDURE"); + Assert.assertEquals(1, actual.size()); + Assert.assertEquals("PROCEDURE.JUNIT_P", actual.get(0).getId()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testablesProcedures304() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); + boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); + if (_lessThan) { + this.testablesProcedures("3.0.4"); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testablesProcedures313() { + this.testablesProcedures("3.1.3"); + } + + @Test + public void testablesProcedures318() { + this.testablesProcedures("3.1.8"); + } + + public void runnables(final String utPlsqlVersion) { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suitepath(a.B.c)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE T0;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %context(myContext)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test(t1: test One)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t1;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test(t2: test Two)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t2;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %endcontext"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE t3;"); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + final List actualNodes = dao.runnables(); + Assert.assertEquals(16, actualNodes.size()); + final HashMap actual = new HashMap(); + for (final Node node : actualNodes) { + actual.put(node.getId(), node.getParentId()); + } + Assert.assertEquals(null, actual.get("SUITE")); + Assert.assertEquals("SUITE", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG")); + Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T0")); + Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T1")); + Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T2")); + Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T3")); + Assert.assertEquals(null, actual.get("SUITEPATH")); + Assert.assertEquals("SUITEPATH", actual.get("SCOTT:a")); + Assert.assertEquals("SCOTT:a", actual.get("SCOTT:a.b")); + Assert.assertEquals("SCOTT:a.b", actual.get("SCOTT:a.b.c")); + Assert.assertEquals("SCOTT:a.b.c", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.t0")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.t3")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1.t1")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1.t2")); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void runnables304() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); + boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); + if (_lessThan) { + this.runnables("3.0.4"); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void runnables313() { + this.runnables("3.1.3"); + } + + @Test + public void runnables318() { + this.runnables("3.1.8"); + } + + @Test + public void dbmsOutput() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.enableDbmsOutput(); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("sys.dbms_output.put_line(\'line1\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("sys.dbms_output.put_line(\'line2\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("sys.dbms_output.put_line(null);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("sys.dbms_output.put_line(\'line4\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("sys.dbms_output.put_line(\'line5\');"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + final String actual = dao.getDbmsOutput(2); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("line1"); + _builder_1.newLine(); + _builder_1.append("line2"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append("line4"); + _builder_1.newLine(); + _builder_1.append("line5"); + _builder_1.newLine(); + final String expected = _builder_1.toString(); + Assert.assertEquals(expected, actual); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void htmlCodeCoverage() { + try { + DalTest.setupAndTeardown(); + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + final String actual = dao.htmlCodeCoverage(Collections.unmodifiableList(CollectionLiterals.newArrayList("SCOTT")), Collections.unmodifiableList(CollectionLiterals.newArrayList("scott")), Collections.unmodifiableList(CollectionLiterals.newArrayList()), Collections.unmodifiableList(CollectionLiterals.newArrayList())); + Assert.assertTrue(actual.startsWith("")); + Assert.assertTrue(actual.trim().endsWith("")); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void includes() { + try { + DalTest.setupAndTeardown(); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE FUNCTION junit_f RETURN INTEGER IS"); + _builder.newLine(); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("RETURN 1;"); + _builder.newLine(); + _builder.append("END junit_f;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("-- %suite"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("-- %test"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE f1;"); + _builder_1.newLine(); + _builder_1.append("END junit_utplsql_test_pkg;"); + _builder_1.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test_pkg IS"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("PROCEDURE f1 IS"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("l_expected INTEGER := 1;"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("l_actual INTEGER;"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("BEGIN"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("l_actual := junit_f;"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("ut.expect(l_actual).to_equal(l_expected);"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("END f1;"); + _builder_2.newLine(); + _builder_2.append("END junit_utplsql_test_pkg;"); + _builder_2.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_2.toString()); + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + final List actualEmpty = dao.includes("SCOTT", "TEST_F1"); + Assert.assertEquals(Collections.unmodifiableList(CollectionLiterals.newArrayList()), actualEmpty); + final List actual = dao.includes("SCOTT", "junit_utplsql_test_pkg"); + final Function1 _function = (String it) -> { + return Boolean.valueOf(Objects.equal(it, "SCOTT.JUNIT_UTPLSQL_TEST_PKG")); + }; + String _findFirst = IterableExtensions.findFirst(actual, _function); + boolean _tripleNotEquals = (_findFirst != null); + Assert.assertTrue(_tripleNotEquals); + final Function1 _function_1 = (String it) -> { + return Boolean.valueOf(Objects.equal(it, "SCOTT.JUNIT_F")); + }; + String _findFirst_1 = IterableExtensions.findFirst(actual, _function_1); + boolean _tripleNotEquals_1 = (_findFirst_1 != null); + Assert.assertTrue(_tripleNotEquals_1); + final Function1 _function_2 = (String it) -> { + return Boolean.valueOf(Objects.equal(it, "UT3.UT_EXPECTATION")); + }; + String _findFirst_2 = IterableExtensions.findFirst(actual, _function_2); + boolean _tripleNotEquals_2 = (_findFirst_2 != null); + Assert.assertTrue(_tripleNotEquals_2); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void normalizedPlsqlVersionOkRelease() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion("v3.1.10.1234"); + final String actual = dao.normalizedUtPlsqlVersion(); + Assert.assertEquals("3.1.10", actual); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void normalizedPlsqlVersionOkDevelop() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion("v3.1.10.1234-develop"); + final String actual = dao.normalizedUtPlsqlVersion(); + Assert.assertEquals("3.1.10", actual); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void normalizedPlsqlVersionNok() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion("bla bla 1.2"); + final String actual = dao.normalizedUtPlsqlVersion(); + Assert.assertEquals("0.0.0", actual); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void normaliedPlsqlVersionNumber() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + dao.setUtPlsqlVersion("3.14.37"); + final int actual = dao.normalizedUtPlsqlVersionNumber(); + Assert.assertEquals(3014037, actual); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void utPlsqlVersion() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + final String actual = dao.getUtPlsqlVersion(); + final String sql = "SELECT ut.version FROM DUAL"; + final String expected = AbstractJdbcTest.jdbcTemplate.queryForObject(sql, String.class); + Assert.assertEquals(expected, actual); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void getSourceOfPackage() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE p1;"); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + final String actual = dao.getSource("SCOTT", "PACKAGE", "JUNIT_UTPLSQL_TEST_PKG"); + Assert.assertTrue(actual.contains("-- %suite")); + Assert.assertTrue(actual.contains("PROCEDURE p1;")); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void getSourceOfPackageBody() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE p1 IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("l_expected INTEGER := 1;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("l_actual INTEGER;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("l_actual := junit_f;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut.expect(l_actual).to_equal(l_expected);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END p1;"); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + final String actual = dao.getSource("SCOTT", "PACKAGE BODY", "JUNIT_UTPLSQL_TEST_PKG"); + Assert.assertTrue(actual.contains("PACKAGE BODY")); + Assert.assertTrue(actual.contains("PROCEDURE p1 IS")); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE BODY junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void getObjectType() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE p1;"); + _builder.newLine(); + _builder.append("END junit_utplsql_test_pkg;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + final String actual = dao.getObjectType("SCOTT", "JUNIT_UTPLSQL_TEST_PKG"); + Assert.assertEquals("PACKAGE", actual); + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void normalizedUtPlsqlVersion() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final UtplsqlDao dao = new UtplsqlDao(_connection); + final String version = dao.normalizedUtPlsqlVersion(); + Assert.assertTrue((version != null)); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } +} From 995363ab28cf145e84ab822f8527d905ecbabf4a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 21:21:04 +0200 Subject: [PATCH 225/286] typo in SQL (change order of newline and comma) --- sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index ccda90a1..d4a47c16 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -436,7 +436,7 @@ public List testables(final String objectType) { sb.append(" object_type || '.' || object_name AS id,\n"); sb.append(" object_type AS parent_id,\n"); sb.append(" 1 AS leaf,\n"); - sb.append(" 1 AS generatable\n,"); + sb.append(" 1 AS generatable,\n"); sb.append(" 1 AS multiselectable\n"); sb.append(" FROM user_procedures\n"); sb.append(" WHERE object_type = ?\n"); From 248fea3d8f9626a53ff8214cf419705bc32c5560 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 21:21:44 +0200 Subject: [PATCH 226/286] convert DalTest to Java, removing Xtend dependencies --- .../org/utplsql/sqldev/test/dal/DalTest.java | 1532 ++++++----------- 1 file changed, 569 insertions(+), 963 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java index 36286176..72155605 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,977 +15,583 @@ */ package org.utplsql.sqldev.test.dal; -import com.google.common.base.Objects; -import java.sql.Connection; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.Functions.Function1; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.junit.AfterClass; + +import org.junit.After; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; import org.oddgen.sqldev.generators.model.Node; -import org.springframework.jdbc.BadSqlGrammarException; import org.utplsql.sqldev.dal.UtplsqlDao; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.ut.Annotation; import org.utplsql.sqldev.test.AbstractJdbcTest; -@SuppressWarnings("all") public class DalTest extends AbstractJdbcTest { - @BeforeClass - @AfterClass - public static void setupAndTeardown() { - AbstractJdbcTest.sysJdbcTemplate.execute("CREATE OR REPLACE PUBLIC SYNONYM ut FOR ut3.ut"); - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (final Throwable _t) { - if (_t instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t); - } - } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE BODY junit_utplsql_test_pkg"); - } catch (final Throwable _t_1) { - if (_t_1 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_1); - } - } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_no_test_pkg"); - } catch (final Throwable _t_2) { - if (_t_2 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_2); - } - } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP TYPE junit_tab1_ot"); - } catch (final Throwable _t_3) { - if (_t_3 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_3); - } - } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP TYPE junit_tab2_ot"); - } catch (final Throwable _t_4) { - if (_t_4 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_4); - } - } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP FUNCTION junit_f"); - } catch (final Throwable _t_5) { - if (_t_5 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_5); - } - } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PROCEDURE junit_p"); - } catch (final Throwable _t_6) { - if (_t_6 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_6); - } - } - } - - @Test - public void isDbaViewAccessible() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - Assert.assertFalse(dao.isDbaViewAccessible()); - Connection _connection_1 = AbstractJdbcTest.sysDataSource.getConnection(); - final UtplsqlDao sysDao = new UtplsqlDao(_connection_1); - Assert.assertTrue(sysDao.isDbaViewAccessible()); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void utplsqlSchema() { - try { - AbstractJdbcTest.sysJdbcTemplate.execute("DROP PUBLIC SYNONYM ut"); - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - Assert.assertEquals(null, dao.getUtplsqlSchema()); - DalTest.setupAndTeardown(); - Assert.assertEquals("UT3", dao.getUtplsqlSchema()); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void isUtAnnotationManagerInstalled() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - Assert.assertTrue(dao.isUtAnnotationManagerInstalled()); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - public void containsUtplsqlTest(final String utPlsqlVersion) { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion(utPlsqlVersion); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t1;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %Test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t2;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t3;"); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - Assert.assertTrue(dao.containsUtplsqlTest("scott")); - Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); - Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t1")); - Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t2")); - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t3")); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("-- %test"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE t1;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("-- %Test"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE t2;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE t3;"); - _builder_1.newLine(); - _builder_1.append("END junit_utplsql_test_pkg;"); - _builder_1.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); - Assert.assertFalse(dao.containsUtplsqlTest("scott")); - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t1")); - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t2")); - Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t3")); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void containsUtplsqlTest304() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); - boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); - if (_lessThan) { - this.containsUtplsqlTest("3.0.4"); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void containsUtplsqlTest313() { - this.containsUtplsqlTest("3.1.3"); - } - - @Test - public void containsUtplsqlTest318() { - this.containsUtplsqlTest("3.1.8"); - } - - public void annotations(final String utPlsqlVersion) { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion(utPlsqlVersion); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t1;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %Test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t2;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t3;"); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - final List actual = dao.annotations("scott", "junit_utplsql_test_pkg"); - final ArrayList expected = new ArrayList(); - final Annotation suite = new Annotation(); - suite.setObjectOwner("SCOTT"); - suite.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); - suite.setName("suite"); - suite.setSubobjectName(suite.getObjectName()); - expected.add(suite); - final Annotation t1 = new Annotation(); - t1.setObjectOwner("SCOTT"); - t1.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); - t1.setName("test"); - t1.setSubobjectName("T1"); - expected.add(t1); - final Annotation t2 = new Annotation(); - t2.setObjectOwner("SCOTT"); - t2.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); - t2.setName("test"); - t2.setSubobjectName("T2"); - expected.add(t2); - Assert.assertEquals(expected.toString(), actual.toString()); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void annotations304() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); - boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); - if (_lessThan) { - this.annotations("3.0.4"); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void annotations313() { - this.annotations("3.1.3"); - } - - @Test - public void annotations318() { - this.annotations("3.1.8"); - } - - public void testablesPackages(final String utPlsqlVersion) { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion(utPlsqlVersion); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t1;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %Test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t2;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t3;"); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("CREATE OR REPLACE PACKAGE junit_no_test_pkg IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE p1;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE p2;"); - _builder_1.newLine(); - _builder_1.append("END junit_no_test_pkg;"); - _builder_1.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); - final List actual = dao.testables("PACKAGE"); - Assert.assertEquals(1, actual.size()); - Assert.assertEquals("PACKAGE.JUNIT_NO_TEST_PKG", actual.get(0).getId()); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void testablesPackages304() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); - boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); - if (_lessThan) { - this.testablesPackages("3.0.4"); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void testablesPackages313() { - this.testablesPackages("3.1.3"); - } - - @Test - public void testablesPackages318() { - this.testablesPackages("3.1.8"); - } - - public void testablesTypes(final String utPlsqlVersion) { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion(utPlsqlVersion); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE TYPE junit_tab1_ot IS object (a integer, b integer);"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("CREATE OR REPLACE TYPE junit_tab2_ot IS object ("); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("a integer, "); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("b integer, "); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("member procedure c("); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("self in out nocopy junit_tab2_ot, "); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("p integer"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append(")"); - _builder_1.newLine(); - _builder_1.append(");"); - _builder_1.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); - final List actual = dao.testables("TYPE"); - Assert.assertEquals(1, actual.size()); - Assert.assertEquals("TYPE.JUNIT_TAB2_OT", actual.get(0).getId()); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void testablesTypes304() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); - boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); - if (_lessThan) { - this.testablesTypes("3.0.4"); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void testablesTypes313() { - this.testablesTypes("3.1.3"); - } - - @Test - public void testablesTypes318() { - this.testablesTypes("3.1.8"); - } - - public void testablesFunctions(final String utPlsqlVersion) { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion(utPlsqlVersion); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE FUNCTION junit_f RETURN INTEGER IS "); - _builder.newLine(); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("RETURN 1;"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - final List actual = dao.testables("FUNCTION"); - Assert.assertEquals(1, actual.size()); - Assert.assertEquals("FUNCTION.JUNIT_F", actual.get(0).getId()); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void testablesFunctions304() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); - boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); - if (_lessThan) { - this.testablesFunctions("3.0.4"); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void testablesFunctions313() { - this.testablesFunctions("3.1.3"); - } - - @Test - public void testablesFunctions318() { - this.testablesFunctions("3.1.8"); - } - - public void testablesProcedures(final String utPlsqlVersion) { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion(utPlsqlVersion); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PROCEDURE junit_p RETURN INTEGER IS "); - _builder.newLine(); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("NULL;"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - final List actual = dao.testables("PROCEDURE"); - Assert.assertEquals(1, actual.size()); - Assert.assertEquals("PROCEDURE.JUNIT_P", actual.get(0).getId()); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void testablesProcedures304() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); - boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); - if (_lessThan) { - this.testablesProcedures("3.0.4"); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void testablesProcedures313() { - this.testablesProcedures("3.1.3"); - } - - @Test - public void testablesProcedures318() { - this.testablesProcedures("3.1.8"); - } - - public void runnables(final String utPlsqlVersion) { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion(utPlsqlVersion); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suitepath(a.B.c)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE T0;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %context(myContext)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test(t1: test One)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t1;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test(t2: test Two)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t2;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %endcontext"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE t3;"); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - final List actualNodes = dao.runnables(); - Assert.assertEquals(16, actualNodes.size()); - final HashMap actual = new HashMap(); - for (final Node node : actualNodes) { - actual.put(node.getId(), node.getParentId()); - } - Assert.assertEquals(null, actual.get("SUITE")); - Assert.assertEquals("SUITE", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG")); - Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T0")); - Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T1")); - Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T2")); - Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T3")); - Assert.assertEquals(null, actual.get("SUITEPATH")); - Assert.assertEquals("SUITEPATH", actual.get("SCOTT:a")); - Assert.assertEquals("SCOTT:a", actual.get("SCOTT:a.b")); - Assert.assertEquals("SCOTT:a.b", actual.get("SCOTT:a.b.c")); - Assert.assertEquals("SCOTT:a.b.c", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg")); - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1")); - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.t0")); - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.t3")); - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1.t1")); - Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1.t2")); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void runnables304() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - int _normalizedUtPlsqlVersionNumber = dao.normalizedUtPlsqlVersionNumber(); - boolean _lessThan = (_normalizedUtPlsqlVersionNumber < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API); - if (_lessThan) { - this.runnables("3.0.4"); - } - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void runnables313() { - this.runnables("3.1.3"); - } - - @Test - public void runnables318() { - this.runnables("3.1.8"); - } - - @Test - public void dbmsOutput() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.enableDbmsOutput(); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("sys.dbms_output.put_line(\'line1\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("sys.dbms_output.put_line(\'line2\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("sys.dbms_output.put_line(null);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("sys.dbms_output.put_line(\'line4\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("sys.dbms_output.put_line(\'line5\');"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - final String actual = dao.getDbmsOutput(2); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("line1"); - _builder_1.newLine(); - _builder_1.append("line2"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append("line4"); - _builder_1.newLine(); - _builder_1.append("line5"); - _builder_1.newLine(); - final String expected = _builder_1.toString(); - Assert.assertEquals(expected, actual); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void htmlCodeCoverage() { - try { - DalTest.setupAndTeardown(); - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - final String actual = dao.htmlCodeCoverage(Collections.unmodifiableList(CollectionLiterals.newArrayList("SCOTT")), Collections.unmodifiableList(CollectionLiterals.newArrayList("scott")), Collections.unmodifiableList(CollectionLiterals.newArrayList()), Collections.unmodifiableList(CollectionLiterals.newArrayList())); - Assert.assertTrue(actual.startsWith("")); - Assert.assertTrue(actual.trim().endsWith("")); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void includes() { - try { - DalTest.setupAndTeardown(); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE FUNCTION junit_f RETURN INTEGER IS"); - _builder.newLine(); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("RETURN 1;"); - _builder.newLine(); - _builder.append("END junit_f;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("-- %suite"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("-- %test"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE f1;"); - _builder_1.newLine(); - _builder_1.append("END junit_utplsql_test_pkg;"); - _builder_1.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test_pkg IS"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("PROCEDURE f1 IS"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("l_expected INTEGER := 1;"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("l_actual INTEGER;"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("BEGIN"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("l_actual := junit_f;"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("ut.expect(l_actual).to_equal(l_expected);"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("END f1;"); - _builder_2.newLine(); - _builder_2.append("END junit_utplsql_test_pkg;"); - _builder_2.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_2.toString()); - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - final List actualEmpty = dao.includes("SCOTT", "TEST_F1"); - Assert.assertEquals(Collections.unmodifiableList(CollectionLiterals.newArrayList()), actualEmpty); - final List actual = dao.includes("SCOTT", "junit_utplsql_test_pkg"); - final Function1 _function = (String it) -> { - return Boolean.valueOf(Objects.equal(it, "SCOTT.JUNIT_UTPLSQL_TEST_PKG")); - }; - String _findFirst = IterableExtensions.findFirst(actual, _function); - boolean _tripleNotEquals = (_findFirst != null); - Assert.assertTrue(_tripleNotEquals); - final Function1 _function_1 = (String it) -> { - return Boolean.valueOf(Objects.equal(it, "SCOTT.JUNIT_F")); - }; - String _findFirst_1 = IterableExtensions.findFirst(actual, _function_1); - boolean _tripleNotEquals_1 = (_findFirst_1 != null); - Assert.assertTrue(_tripleNotEquals_1); - final Function1 _function_2 = (String it) -> { - return Boolean.valueOf(Objects.equal(it, "UT3.UT_EXPECTATION")); - }; - String _findFirst_2 = IterableExtensions.findFirst(actual, _function_2); - boolean _tripleNotEquals_2 = (_findFirst_2 != null); - Assert.assertTrue(_tripleNotEquals_2); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void normalizedPlsqlVersionOkRelease() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion("v3.1.10.1234"); - final String actual = dao.normalizedUtPlsqlVersion(); - Assert.assertEquals("3.1.10", actual); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void normalizedPlsqlVersionOkDevelop() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion("v3.1.10.1234-develop"); - final String actual = dao.normalizedUtPlsqlVersion(); - Assert.assertEquals("3.1.10", actual); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void normalizedPlsqlVersionNok() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion("bla bla 1.2"); - final String actual = dao.normalizedUtPlsqlVersion(); - Assert.assertEquals("0.0.0", actual); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void normaliedPlsqlVersionNumber() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - dao.setUtPlsqlVersion("3.14.37"); - final int actual = dao.normalizedUtPlsqlVersionNumber(); - Assert.assertEquals(3014037, actual); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void utPlsqlVersion() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - final String actual = dao.getUtPlsqlVersion(); - final String sql = "SELECT ut.version FROM DUAL"; - final String expected = AbstractJdbcTest.jdbcTemplate.queryForObject(sql, String.class); - Assert.assertEquals(expected, actual); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void getSourceOfPackage() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE p1;"); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - final String actual = dao.getSource("SCOTT", "PACKAGE", "JUNIT_UTPLSQL_TEST_PKG"); - Assert.assertTrue(actual.contains("-- %suite")); - Assert.assertTrue(actual.contains("PROCEDURE p1;")); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void getSourceOfPackageBody() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE p1 IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("l_expected INTEGER := 1;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("l_actual INTEGER;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("l_actual := junit_f;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut.expect(l_actual).to_equal(l_expected);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END p1;"); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - final String actual = dao.getSource("SCOTT", "PACKAGE BODY", "JUNIT_UTPLSQL_TEST_PKG"); - Assert.assertTrue(actual.contains("PACKAGE BODY")); - Assert.assertTrue(actual.contains("PROCEDURE p1 IS")); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE BODY junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void getObjectType() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE p1;"); - _builder.newLine(); - _builder.append("END junit_utplsql_test_pkg;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - final String actual = dao.getObjectType("SCOTT", "JUNIT_UTPLSQL_TEST_PKG"); - Assert.assertEquals("PACKAGE", actual); - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test_pkg"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - @Test - public void normalizedUtPlsqlVersion() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final UtplsqlDao dao = new UtplsqlDao(_connection); - final String version = dao.normalizedUtPlsqlVersion(); - Assert.assertTrue((version != null)); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } + @Before + @After + public void setupAndTeardown() { + sysJdbcTemplate.execute("CREATE OR REPLACE PUBLIC SYNONYM ut FOR ut3.ut"); + executeAndIgnore(jdbcTemplate, "DROP PACKAGE junit_utplsql_test_pkg"); + executeAndIgnore(jdbcTemplate, "DROP PACKAGE BODY junit_utplsql_test_pkg"); + executeAndIgnore(jdbcTemplate, "DROP PACKAGE junit_no_test_pkg"); + executeAndIgnore(jdbcTemplate, "DROP TYPE junit_tab1_ot"); + executeAndIgnore(jdbcTemplate, "DROP TYPE junit_tab2_ot"); + executeAndIgnore(jdbcTemplate, "DROP FUNCTION junit_f"); + executeAndIgnore(jdbcTemplate, "DROP PROCEDURE junit_p"); + } + + @Test + public void isDbaViewAccessibleAsScott() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + Assert.assertFalse(dao.isDbaViewAccessible()); + } + + @Test + public void isDbaViewAccessibleAsSys() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(sysDataSource)); + Assert.assertTrue(dao.isDbaViewAccessible()); + } + + @Test + public void utplsqlSchemaWithoutPublicSynonym() { + sysJdbcTemplate.execute("DROP PUBLIC SYNONYM ut"); + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + Assert.assertEquals(null, dao.getUtplsqlSchema()); + } + + @Test + public void utplsqlSchemaWithPublicSynonym() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + Assert.assertEquals("UT3", dao.getUtplsqlSchema()); + } + + @Test + public void isUtAnnotationManagerInstalled() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + Assert.assertTrue(dao.isUtAnnotationManagerInstalled()); + } + + private void containsUtplsqlTestWithSuiteAnnotation(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %Test\n"); + sb.append(" PROCEDURE t2;\n\n"); + sb.append(" PROCEDURE t3;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + Assert.assertTrue(dao.containsUtplsqlTest("scott")); + Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); + Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t1")); + Assert.assertTrue(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t2")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t3")); + } + + @Test + public void containsUtplsqlTestWithSuiteAnnotation304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + containsUtplsqlTestWithSuiteAnnotation("3.0.4"); + } + } + + @Test + public void containsUtplsqlTestWithSuiteAnnotation313() { + containsUtplsqlTestWithSuiteAnnotation("3.1.3"); + } + + @Test + public void containsUtplsqlTestWithSuiteAnnotation318() { + containsUtplsqlTestWithSuiteAnnotation("3.1.8"); + } + + private void containsUtplsqlTestWithoutSuiteAnnotation(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %Test\n"); + sb.append(" PROCEDURE t2;\n\n"); + sb.append(" PROCEDURE t3;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + Assert.assertFalse(dao.containsUtplsqlTest("scott")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t1")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t2")); + Assert.assertFalse(dao.containsUtplsqlTest("scott", "junit_utplsql_test_pkg", "t3")); + } + + @Test + public void containsUtplsqlTestWithoutSuiteAnnotation304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + containsUtplsqlTestWithoutSuiteAnnotation("3.0.4"); + } + } + + @Test + public void containsUtplsqlTestWithoutSuiteAnnotation313() { + containsUtplsqlTestWithoutSuiteAnnotation("3.1.3"); + } + + @Test + public void containsUtplsqlTestWithoutSuiteAnnotation318() { + containsUtplsqlTestWithoutSuiteAnnotation("3.1.8"); + } + + private void annotations(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %Test\n"); + sb.append(" PROCEDURE t2;\n\n"); + sb.append(" PROCEDURE t3;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final List actual = dao.annotations("scott", "junit_utplsql_test_pkg"); + final ArrayList expected = new ArrayList(); + final Annotation suite = new Annotation(); + suite.setObjectOwner("SCOTT"); + suite.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); + suite.setName("suite"); + suite.setSubobjectName(suite.getObjectName()); + expected.add(suite); + final Annotation t1 = new Annotation(); + t1.setObjectOwner("SCOTT"); + t1.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); + t1.setName("test"); + t1.setSubobjectName("T1"); + expected.add(t1); + final Annotation t2 = new Annotation(); + t2.setObjectOwner("SCOTT"); + t2.setObjectName("JUNIT_UTPLSQL_TEST_PKG"); + t2.setName("test"); + t2.setSubobjectName("T2"); + expected.add(t2); + Assert.assertEquals(expected.toString(), actual.toString()); + } + + @Test + public void annotations304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + annotations("3.0.4"); + } + } + + @Test + public void annotations313() { + annotations("3.1.3"); + } + + @Test + public void annotations318() { + annotations("3.1.8"); + } + + private void testablesPackagesWithTests(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %Test\n"); + sb.append(" PROCEDURE t2;\n\n"); + sb.append(" PROCEDURE t3;\n\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final List actual = dao.testables("PACKAGE"); + Assert.assertEquals(0, actual.size()); + } + + @Test + public void testablesPackagesWithTests304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + testablesPackagesWithTests("3.0.4"); + } + } + + @Test + public void testablesPackagesWithTests313() { + testablesPackagesWithTests("3.1.3"); + } + + @Test + public void testablesPackagesWithTests318() { + testablesPackagesWithTests("3.1.8"); + } + + private void testablesPackagesWithoutTests(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_no_test_pkg IS\n"); + sb.append(" PROCEDURE p1;\n\n"); + sb.append(" PROCEDURE p2;\n"); + sb.append("END junit_no_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final List actual = dao.testables("PACKAGE"); + Assert.assertEquals(1, actual.size()); + Assert.assertEquals("PACKAGE.JUNIT_NO_TEST_PKG", actual.get(0).getId()); + } + + @Test + public void testablesPackagesWithoutTests304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + testablesPackagesWithoutTests("3.0.4"); + } + } + + @Test + public void testablesPackagesWithoutTests313() { + testablesPackagesWithoutTests("3.1.3"); + } + + @Test + public void testablesPackagesWithoutTests318() { + testablesPackagesWithoutTests("3.1.8"); + } + + private void testablesTypes(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion(utPlsqlVersion); + jdbcTemplate.execute("CREATE OR REPLACE TYPE junit_tab1_ot IS object (a integer, b integer);"); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE TYPE junit_tab2_ot IS object (\n"); + sb.append(" a integer,\n"); + sb.append(" b integer,\n"); + sb.append(" member procedure c(\n"); + sb.append(" self in out nocopy junit_tab2_ot,\n"); + sb.append(" p integer\n"); + sb.append(" )\n"); + sb.append(");"); + jdbcTemplate.execute(sb.toString()); + final List actual = dao.testables("TYPE"); + Assert.assertEquals(1, actual.size()); + Assert.assertEquals("TYPE.JUNIT_TAB2_OT", actual.get(0).getId()); + } + + @Test + public void testablesTypes304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + testablesTypes("3.0.4"); + } + } + + @Test + public void testablesTypes313() { + testablesTypes("3.1.3"); + } + + @Test + public void testablesTypes318() { + testablesTypes("3.1.8"); + } + + private void testablesFunctions(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE FUNCTION junit_f RETURN INTEGER IS\n"); + sb.append("BEGIN\n"); + sb.append(" RETURN 1;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + final List actual = dao.testables("FUNCTION"); + Assert.assertEquals(1, actual.size()); + Assert.assertEquals("FUNCTION.JUNIT_F", actual.get(0).getId()); + } + + @Test + public void testablesFunctions304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + testablesFunctions("3.0.4"); + } + } + + @Test + public void testablesFunctions313() { + testablesFunctions("3.1.3"); + } + + @Test + public void testablesFunctions318() { + testablesFunctions("3.1.8"); + } + + public void testablesProcedures(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion(utPlsqlVersion); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PROCEDURE junit_p RETURN INTEGER IS\n"); + sb.append("BEGIN\n"); + sb.append(" NULL;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + final List actual = dao.testables("PROCEDURE"); + Assert.assertEquals(1, actual.size()); + Assert.assertEquals("PROCEDURE.JUNIT_P", actual.get(0).getId()); + } + + @Test + public void testablesProcedures304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + testablesProcedures("3.0.4"); + } + } + + @Test + public void testablesProcedures313() { + testablesProcedures("3.1.3"); + } + + @Test + public void testablesProcedures318() { + testablesProcedures("3.1.8"); + } + + public void runnables(final String utPlsqlVersion) { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n"); + sb.append(" -- %suitepath(a.B.c)\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE T0;\n\n"); + sb.append(" -- %context(myContext)\n\n"); + sb.append(" -- %test(t1: test One)\n"); + sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %test(t2: test Two)\n"); + sb.append(" PROCEDURE t2;\n\n"); + sb.append(" -- %endcontext\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE t3;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final List actualNodes = dao.runnables(); + Assert.assertEquals(16, actualNodes.size()); + final HashMap actual = new HashMap(); + for (final Node node : actualNodes) { + actual.put(node.getId(), node.getParentId()); + } + Assert.assertEquals(null, actual.get("SUITE")); + Assert.assertEquals("SUITE", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG")); + Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T0")); + Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T1")); + Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T2")); + Assert.assertEquals("SCOTT.JUNIT_UTPLSQL_TEST_PKG", actual.get("SCOTT.JUNIT_UTPLSQL_TEST_PKG.T3")); + Assert.assertEquals(null, actual.get("SUITEPATH")); + Assert.assertEquals("SUITEPATH", actual.get("SCOTT:a")); + Assert.assertEquals("SCOTT:a", actual.get("SCOTT:a.b")); + Assert.assertEquals("SCOTT:a.b", actual.get("SCOTT:a.b.c")); + Assert.assertEquals("SCOTT:a.b.c", actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#", + actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg", + actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.t0")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg", + actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.t3")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1", + actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1.t1")); + Assert.assertEquals("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1", + actual.get("SCOTT:a.b.c.junit_utplsql_test_pkg.nested_context_#1.t2")); + } + + @Test + public void runnables304() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + if (dao.normalizedUtPlsqlVersionNumber() < UtplsqlDao.FIRST_VERSION_WITHOUT_INTERNAL_API) { + runnables("3.0.4"); + } + } + + @Test + public void runnables313() { + runnables("3.1.3"); + } + + @Test + public void runnables318() { + runnables("3.1.8"); + } + + @Test + public void dbmsOutput() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.enableDbmsOutput(); + StringBuilder sb = new StringBuilder(); + sb.append("BEGIN\n"); + sb.append(" sys.dbms_output.put_line(\'line1\');\n"); + sb.append(" sys.dbms_output.put_line(\'line2\');\n"); + sb.append(" sys.dbms_output.put_line(null);\n"); + sb.append(" sys.dbms_output.put_line(\'line4\');\n"); + sb.append(" sys.dbms_output.put_line(\'line5\');\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + final String actual = dao.getDbmsOutput(2); + final String expected = "line1\nline2\n\nline4\nline5\n"; + Assert.assertEquals(expected, actual); + } + + @Test + public void htmlCodeCoverage() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + final String actual = dao.htmlCodeCoverage(Arrays.asList("SCOTT"), Arrays.asList("scott"), Arrays.asList(), + Arrays.asList()); + Assert.assertTrue(actual.startsWith("")); + Assert.assertTrue(actual.trim().endsWith("")); + } + + @Test + public void includes() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE FUNCTION junit_f RETURN INTEGER IS\n"); + sb.append("BEGIN\n"); + sb.append(" RETURN 1;\n"); + sb.append("END junit_f;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE f1;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test_pkg IS\n"); + sb.append(" PROCEDURE f1 IS\n"); + sb.append(" l_expected INTEGER := 1;\n"); + sb.append(" l_actual INTEGER;\n"); + sb.append(" BEGIN\n"); + sb.append(" l_actual := junit_f;\n"); + sb.append(" ut.expect(l_actual).to_equal(l_expected);\n"); + sb.append(" END f1;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + final List actualEmpty = dao.includes("SCOTT", "TEST_F1"); + Assert.assertEquals(Arrays.asList(), actualEmpty); + final List actual = dao.includes("SCOTT", "junit_utplsql_test_pkg"); + Assert.assertTrue(actual.stream().anyMatch(it -> it.equals("SCOTT.JUNIT_UTPLSQL_TEST_PKG"))); + Assert.assertTrue(actual.stream().anyMatch(it -> it.equals("SCOTT.JUNIT_F"))); + Assert.assertTrue(actual.stream().anyMatch(it -> it.equals("UT3.UT_EXPECTATION"))); + } + + @Test + public void normalizedPlsqlVersionOkRelease() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion("v3.1.10.1234"); + final String actual = dao.normalizedUtPlsqlVersion(); + Assert.assertEquals("3.1.10", actual); + } + + @Test + public void normalizedPlsqlVersionOkDevelop() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion("v3.1.10.1234-develop"); + final String actual = dao.normalizedUtPlsqlVersion(); + Assert.assertEquals("3.1.10", actual); + } + + @Test + public void normalizedPlsqlVersionNok() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion("bla bla 1.2"); + final String actual = dao.normalizedUtPlsqlVersion(); + Assert.assertEquals("0.0.0", actual); + } + + @Test + public void normaliedPlsqlVersionNumber() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + dao.setUtPlsqlVersion("3.14.37"); + final int actual = dao.normalizedUtPlsqlVersionNumber(); + Assert.assertEquals(3014037, actual); + } + + @Test + public void utPlsqlVersion() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + final String actual = dao.getUtPlsqlVersion(); + final String sql = "SELECT ut.version FROM DUAL"; + final String expected = jdbcTemplate.queryForObject(sql, String.class); + Assert.assertEquals(expected, actual); + } + + @Test + public void getSourceOfPackage() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE p1;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final String actual = dao.getSource("SCOTT", "PACKAGE", "JUNIT_UTPLSQL_TEST_PKG"); + Assert.assertTrue(actual.contains("-- %suite")); + Assert.assertTrue(actual.contains("PROCEDURE p1;")); + } + + @Test + public void getSourceOfPackageBody() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test_pkg IS\n"); + sb.append(" PROCEDURE p1 IS\n"); + sb.append(" l_expected INTEGER := 1;\n"); + sb.append(" l_actual INTEGER;\n"); + sb.append(" BEGIN\n"); + sb.append(" l_actual := junit_f;\n"); + sb.append(" ut.expect(l_actual).to_equal(l_expected);\n"); + sb.append(" END p1;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final String actual = dao.getSource("SCOTT", "PACKAGE BODY", "JUNIT_UTPLSQL_TEST_PKG"); + Assert.assertTrue(actual.contains("PACKAGE BODY")); + Assert.assertTrue(actual.contains("PROCEDURE p1 IS")); + } + + @Test + public void getObjectType() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); + sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); + sb.append(" PROCEDURE p1;\n"); + sb.append("END junit_utplsql_test_pkg;"); + jdbcTemplate.execute(sb.toString()); + final String actual = dao.getObjectType("SCOTT", "JUNIT_UTPLSQL_TEST_PKG"); + Assert.assertEquals("PACKAGE", actual); + } + + @Test + public void normalizedUtPlsqlVersion() { + final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); + final String version = dao.normalizedUtPlsqlVersion(); + Assert.assertTrue((version != null)); + } } From 54bc152b77dc2e864231e315a63d60db7129eb8b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 21:23:00 +0200 Subject: [PATCH 227/286] rename RealtimeReporterFetchSizeTest.xtend to RealtimeReporterFetchSizeTest.java --- ...rterFetchSizeTest.xtend => RealtimeReporterFetchSizeTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/dal/{RealtimeReporterFetchSizeTest.xtend => RealtimeReporterFetchSizeTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java From d03d21f4af48bf82cb2ef8ee0b9ebb4e28e253e5 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 21:23:20 +0200 Subject: [PATCH 228/286] add add RealtimeReporterFetchSizeTest.java generated by Xtend 2.20.0 --- .../dal/RealtimeReporterFetchSizeTest.java | 342 +++++++++++------- 1 file changed, 214 insertions(+), 128 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java index 0bf3f7d9..7bce0d58 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,132 +13,218 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.test.dal +package org.utplsql.sqldev.test.dal; -import java.util.UUID -import java.util.logging.Logger -import org.junit.AfterClass -import org.junit.Assert -import org.junit.BeforeClass -import org.junit.Test -import org.springframework.jdbc.BadSqlGrammarException -import org.springframework.jdbc.datasource.SingleConnectionDataSource -import org.utplsql.sqldev.dal.RealtimeReporterDao -import org.utplsql.sqldev.test.AbstractJdbcTest +import java.sql.Connection; +import java.util.Collections; +import java.util.UUID; +import java.util.logging.Logger; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.dal.RealtimeReporterDao; +import org.utplsql.sqldev.test.AbstractJdbcTest; +import org.utplsql.sqldev.test.dal.TestRealtimerReporterEventTimedConsumer; -class RealtimeReporterFetchSizeTest extends AbstractJdbcTest { - - static val Logger logger = Logger.getLogger(RealtimeReporterFetchSizeTest.name); - - @BeforeClass - def static void setup() { - - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_fetch_size_pkg is - --%suite(JUnit testing) - - --%test(test 1 - 0 seconds) - PROCEDURE test_1_0; - - --%test(test 2 - 1 seconds) - PROCEDURE test_2_1; - - --%test(test 3 - 2 seconds) - PROCEDURE test_3_2; - - --%test(test 4 - 0 seconds) - PROCEDURE test_4_0; - - --%test(test 5 - 0 seconds) - PROCEDURE test_5_0; - END; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_fetch_size_pkg is - PROCEDURE test_1_0 IS - BEGIN - NULL; - END; - - PROCEDURE test_2_1 IS - BEGIN - dbms_session.sleep(1); - END; - - PROCEDURE test_3_2 IS - BEGIN - dbms_session.sleep(2); - END; - - PROCEDURE test_4_0 IS - BEGIN - NULL; - END; - - PROCEDURE test_5_0 IS - BEGIN - NULL; - END; - END; - ''') - } - - @AfterClass - def static void teardown() { - try { - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_fetch_size_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - } - - private def delayFreeStreamingConsumtionProducer(String reporterId) { - var ds = new SingleConnectionDataSource() - ds.driverClassName = "oracle.jdbc.OracleDriver" - ds.url = dataSource.url - ds.username = dataSource.username - ds.password = dataSource.password - val dao = new RealtimeReporterDao(ds.connection) - dao.produceReport(reporterId, #["junit_utplsql_fetch_size_pkg"]) - } - - @Test - def void delayFreeStreamingConsumtion() { - val long TOLERANCE_MS = 600 - var ds = new SingleConnectionDataSource() - ds.driverClassName = "oracle.jdbc.OracleDriver" - ds.url = dataSource.url - ds.username = dataSource.username - ds.password = dataSource.password - val consumer = new TestRealtimerReporterEventTimedConsumer - val reporterId = UUID.randomUUID().toString.replace("-", ""); - val dao = new RealtimeReporterDao(ds.connection) - val Runnable runnable = [|delayFreeStreamingConsumtionProducer(reporterId)] - val thread = new Thread(runnable) - thread.name = "utPLSQL run test" - thread.start - dao.consumeReport(reporterId, consumer) - logger.fine(consumer.postTestEvents.toString) - Assert.assertEquals(5, consumer.postTestEvents.entrySet.size) - val test_1_0 = consumer.postTestEvents.get("junit_utplsql_fetch_size_pkg.test_1_0") - val test_2_1 = consumer.postTestEvents.get("junit_utplsql_fetch_size_pkg.test_2_1") - val test_3_2 = consumer.postTestEvents.get("junit_utplsql_fetch_size_pkg.test_3_2") - val test_4_0 = consumer.postTestEvents.get("junit_utplsql_fetch_size_pkg.test_4_0") - val test_5_0 = consumer.postTestEvents.get("junit_utplsql_fetch_size_pkg.test_5_0") - val test_2_1_time = test_2_1 - test_1_0 - logger.fine("test_2_1 time [ms]: " + test_2_1_time) - Assert.assertTrue("test_2_1 runtime was too long", test_2_1_time < 1000 + TOLERANCE_MS) - Assert.assertTrue("test_2_1 runtime was too short", test_2_1_time > 1000 - TOLERANCE_MS) - val test_3_2_time = test_3_2 - test_2_1 - logger.fine("test_3_2 time [ms]: " + test_3_2_time) - Assert.assertTrue("test_3_2 runtime was too long", test_3_2_time < 2000 + TOLERANCE_MS) - Assert.assertTrue("test_3_2 runtime was too short", test_3_2_time > 2000 - TOLERANCE_MS) - val test_4_0_time = test_4_0 - test_3_2 - logger.fine("test_4_0 time [ms]: " + test_4_0_time) - Assert.assertTrue("test_4_0 runtime was too long", test_4_0_time < TOLERANCE_MS) - val test_5_0_time = test_5_0 - test_4_0 - logger.fine("test_5_0 time [ms]: " + test_5_0_time) - Assert.assertTrue("test_5_0 runtime was too long", test_5_0_time < TOLERANCE_MS) - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class RealtimeReporterFetchSizeTest extends AbstractJdbcTest { + private static final Logger logger = Logger.getLogger(RealtimeReporterFetchSizeTest.class.getName()); + + @BeforeClass + public static void setup() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_fetch_size_pkg is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suite(JUnit testing)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 1 - 0 seconds) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_1_0;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 2 - 1 seconds) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_2_1;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 3 - 2 seconds) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_3_2;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 4 - 0 seconds) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_4_0;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 5 - 0 seconds) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_5_0;"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_fetch_size_pkg is"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_1_0 IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("NULL;"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_2_1 IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_session.sleep(1);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_3_2 IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_session.sleep(2);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_4_0 IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("NULL;"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_5_0 IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("NULL;"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.append("END;"); + _builder_1.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); + } + + @AfterClass + public static void teardown() { + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_fetch_size_pkg"); + } catch (final Throwable _t) { + if (_t instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t); + } + } + } + + private void delayFreeStreamingConsumtionProducer(final String reporterId) { + try { + SingleConnectionDataSource ds = new SingleConnectionDataSource(); + ds.setDriverClassName("oracle.jdbc.OracleDriver"); + ds.setUrl(AbstractJdbcTest.dataSource.getUrl()); + ds.setUsername(AbstractJdbcTest.dataSource.getUsername()); + ds.setPassword(AbstractJdbcTest.dataSource.getPassword()); + Connection _connection = ds.getConnection(); + final RealtimeReporterDao dao = new RealtimeReporterDao(_connection); + dao.produceReport(reporterId, Collections.unmodifiableList(CollectionLiterals.newArrayList("junit_utplsql_fetch_size_pkg"))); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void delayFreeStreamingConsumtion() { + try { + final long TOLERANCE_MS = 600; + SingleConnectionDataSource ds = new SingleConnectionDataSource(); + ds.setDriverClassName("oracle.jdbc.OracleDriver"); + ds.setUrl(AbstractJdbcTest.dataSource.getUrl()); + ds.setUsername(AbstractJdbcTest.dataSource.getUsername()); + ds.setPassword(AbstractJdbcTest.dataSource.getPassword()); + final TestRealtimerReporterEventTimedConsumer consumer = new TestRealtimerReporterEventTimedConsumer(); + final String reporterId = UUID.randomUUID().toString().replace("-", ""); + Connection _connection = ds.getConnection(); + final RealtimeReporterDao dao = new RealtimeReporterDao(_connection); + final Runnable _function = () -> { + this.delayFreeStreamingConsumtionProducer(reporterId); + }; + final Runnable runnable = _function; + final Thread thread = new Thread(runnable); + thread.setName("utPLSQL run test"); + thread.start(); + dao.consumeReport(reporterId, consumer); + RealtimeReporterFetchSizeTest.logger.fine(consumer.getPostTestEvents().toString()); + Assert.assertEquals(5, consumer.getPostTestEvents().entrySet().size()); + final Long test_1_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_1_0"); + final Long test_2_1 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_2_1"); + final Long test_3_2 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_3_2"); + final Long test_4_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_4_0"); + final Long test_5_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_5_0"); + final long test_2_1_time = ((test_2_1).longValue() - (test_1_0).longValue()); + RealtimeReporterFetchSizeTest.logger.fine(("test_2_1 time [ms]: " + Long.valueOf(test_2_1_time))); + Assert.assertTrue("test_2_1 runtime was too long", (test_2_1_time < (1000 + TOLERANCE_MS))); + Assert.assertTrue("test_2_1 runtime was too short", (test_2_1_time > (1000 - TOLERANCE_MS))); + final long test_3_2_time = ((test_3_2).longValue() - (test_2_1).longValue()); + RealtimeReporterFetchSizeTest.logger.fine(("test_3_2 time [ms]: " + Long.valueOf(test_3_2_time))); + Assert.assertTrue("test_3_2 runtime was too long", (test_3_2_time < (2000 + TOLERANCE_MS))); + Assert.assertTrue("test_3_2 runtime was too short", (test_3_2_time > (2000 - TOLERANCE_MS))); + final long test_4_0_time = ((test_4_0).longValue() - (test_3_2).longValue()); + RealtimeReporterFetchSizeTest.logger.fine(("test_4_0 time [ms]: " + Long.valueOf(test_4_0_time))); + Assert.assertTrue("test_4_0 runtime was too long", (test_4_0_time < TOLERANCE_MS)); + final long test_5_0_time = ((test_5_0).longValue() - (test_4_0).longValue()); + RealtimeReporterFetchSizeTest.logger.fine(("test_5_0 time [ms]: " + Long.valueOf(test_5_0_time))); + Assert.assertTrue("test_5_0 runtime was too long", (test_5_0_time < TOLERANCE_MS)); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } +} From 639399321557b43cfe9ebde81ced5a6eb7c20ed7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 21:42:32 +0200 Subject: [PATCH 229/286] convert RealtimeReporterFetchSizeTest to Java, removing Xtend dependencies --- .../dal/RealtimeReporterFetchSizeTest.java | 301 ++++++------------ 1 file changed, 100 insertions(+), 201 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java index 7bce0d58..686c8464 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,216 +15,115 @@ */ package org.utplsql.sqldev.test.dal; -import java.sql.Connection; -import java.util.Collections; +import java.util.Arrays; import java.util.UUID; import java.util.logging.Logger; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.junit.AfterClass; + +import org.junit.After; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.utplsql.sqldev.dal.RealtimeReporterDao; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.test.AbstractJdbcTest; -import org.utplsql.sqldev.test.dal.TestRealtimerReporterEventTimedConsumer; -@SuppressWarnings("all") public class RealtimeReporterFetchSizeTest extends AbstractJdbcTest { - private static final Logger logger = Logger.getLogger(RealtimeReporterFetchSizeTest.class.getName()); - - @BeforeClass - public static void setup() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_fetch_size_pkg is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suite(JUnit testing)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 1 - 0 seconds) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_1_0;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 2 - 1 seconds) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_2_1;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 3 - 2 seconds) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_3_2;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 4 - 0 seconds) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_4_0;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 5 - 0 seconds) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_5_0;"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_fetch_size_pkg is"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_1_0 IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("NULL;"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_2_1 IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_session.sleep(1);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_3_2 IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_session.sleep(2);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_4_0 IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("NULL;"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_5_0 IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("NULL;"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.append("END;"); - _builder_1.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); - } - - @AfterClass - public static void teardown() { - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_fetch_size_pkg"); - } catch (final Throwable _t) { - if (_t instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t); - } + private static final Logger logger = Logger.getLogger(RealtimeReporterFetchSizeTest.class.getName()); + + @Before + public void setup() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_fetch_size_pkg is\n"); + sb.append(" --%suite(JUnit testing)\n\n"); + sb.append(" --%test(test 1 - 0 seconds)\n"); + sb.append(" PROCEDURE test_1_0;\n\n"); + sb.append(" --%test(test 2 - 1 seconds)\n"); + sb.append(" PROCEDURE test_2_1;\n\n"); + sb.append(" --%test(test 3 - 2 seconds)\n"); + sb.append(" PROCEDURE test_3_2;\n\n"); + sb.append(" --%test(test 4 - 0 seconds)\n"); + sb.append(" PROCEDURE test_4_0;\n\n"); + sb.append(" --%test(test 5 - 0 seconds)\n"); + sb.append(" PROCEDURE test_5_0;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_fetch_size_pkg is\n"); + sb.append(" PROCEDURE test_1_0 IS\n"); + sb.append(" BEGIN\n"); + sb.append(" NULL;\n"); + sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_2_1 IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_session.sleep(1);\n"); + sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_3_2 IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_session.sleep(2);\n"); + sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_4_0 IS\n"); + sb.append(" BEGIN\n"); + sb.append(" NULL;\n"); + sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_5_0 IS\n"); + sb.append(" BEGIN\n"); + sb.append(" NULL;\n"); + sb.append(" END;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + } + + @After + public void teardown() { + executeAndIgnore(jdbcTemplate, "DROP PACKAGE junit_utplsql_fetch_size_pkg"); } - } - - private void delayFreeStreamingConsumtionProducer(final String reporterId) { - try { - SingleConnectionDataSource ds = new SingleConnectionDataSource(); - ds.setDriverClassName("oracle.jdbc.OracleDriver"); - ds.setUrl(AbstractJdbcTest.dataSource.getUrl()); - ds.setUsername(AbstractJdbcTest.dataSource.getUsername()); - ds.setPassword(AbstractJdbcTest.dataSource.getPassword()); - Connection _connection = ds.getConnection(); - final RealtimeReporterDao dao = new RealtimeReporterDao(_connection); - dao.produceReport(reporterId, Collections.unmodifiableList(CollectionLiterals.newArrayList("junit_utplsql_fetch_size_pkg"))); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + private void delayFreeStreamingConsumtionProducer(final String reporterId) { + SingleConnectionDataSource ds = new SingleConnectionDataSource(); + ds.setDriverClassName("oracle.jdbc.OracleDriver"); + ds.setUrl(dataSource.getUrl()); + ds.setUsername(dataSource.getUsername()); + ds.setPassword(dataSource.getPassword()); + final RealtimeReporterDao dao = new RealtimeReporterDao(DatabaseTools.getConnection(ds)); + dao.produceReport(reporterId, Arrays.asList("junit_utplsql_fetch_size_pkg")); } - } - - @Test - public void delayFreeStreamingConsumtion() { - try { - final long TOLERANCE_MS = 600; - SingleConnectionDataSource ds = new SingleConnectionDataSource(); - ds.setDriverClassName("oracle.jdbc.OracleDriver"); - ds.setUrl(AbstractJdbcTest.dataSource.getUrl()); - ds.setUsername(AbstractJdbcTest.dataSource.getUsername()); - ds.setPassword(AbstractJdbcTest.dataSource.getPassword()); - final TestRealtimerReporterEventTimedConsumer consumer = new TestRealtimerReporterEventTimedConsumer(); - final String reporterId = UUID.randomUUID().toString().replace("-", ""); - Connection _connection = ds.getConnection(); - final RealtimeReporterDao dao = new RealtimeReporterDao(_connection); - final Runnable _function = () -> { - this.delayFreeStreamingConsumtionProducer(reporterId); - }; - final Runnable runnable = _function; - final Thread thread = new Thread(runnable); - thread.setName("utPLSQL run test"); - thread.start(); - dao.consumeReport(reporterId, consumer); - RealtimeReporterFetchSizeTest.logger.fine(consumer.getPostTestEvents().toString()); - Assert.assertEquals(5, consumer.getPostTestEvents().entrySet().size()); - final Long test_1_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_1_0"); - final Long test_2_1 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_2_1"); - final Long test_3_2 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_3_2"); - final Long test_4_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_4_0"); - final Long test_5_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_5_0"); - final long test_2_1_time = ((test_2_1).longValue() - (test_1_0).longValue()); - RealtimeReporterFetchSizeTest.logger.fine(("test_2_1 time [ms]: " + Long.valueOf(test_2_1_time))); - Assert.assertTrue("test_2_1 runtime was too long", (test_2_1_time < (1000 + TOLERANCE_MS))); - Assert.assertTrue("test_2_1 runtime was too short", (test_2_1_time > (1000 - TOLERANCE_MS))); - final long test_3_2_time = ((test_3_2).longValue() - (test_2_1).longValue()); - RealtimeReporterFetchSizeTest.logger.fine(("test_3_2 time [ms]: " + Long.valueOf(test_3_2_time))); - Assert.assertTrue("test_3_2 runtime was too long", (test_3_2_time < (2000 + TOLERANCE_MS))); - Assert.assertTrue("test_3_2 runtime was too short", (test_3_2_time > (2000 - TOLERANCE_MS))); - final long test_4_0_time = ((test_4_0).longValue() - (test_3_2).longValue()); - RealtimeReporterFetchSizeTest.logger.fine(("test_4_0 time [ms]: " + Long.valueOf(test_4_0_time))); - Assert.assertTrue("test_4_0 runtime was too long", (test_4_0_time < TOLERANCE_MS)); - final long test_5_0_time = ((test_5_0).longValue() - (test_4_0).longValue()); - RealtimeReporterFetchSizeTest.logger.fine(("test_5_0 time [ms]: " + Long.valueOf(test_5_0_time))); - Assert.assertTrue("test_5_0 runtime was too long", (test_5_0_time < TOLERANCE_MS)); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + public void delayFreeStreamingConsumtion() { + final long TOLERANCE_MS = 600; + SingleConnectionDataSource ds = new SingleConnectionDataSource(); + ds.setDriverClassName("oracle.jdbc.OracleDriver"); + ds.setUrl(dataSource.getUrl()); + ds.setUsername(dataSource.getUsername()); + ds.setPassword(dataSource.getPassword()); + final TestRealtimerReporterEventTimedConsumer consumer = new TestRealtimerReporterEventTimedConsumer(); + final String reporterId = UUID.randomUUID().toString().replace("-", ""); + final RealtimeReporterDao dao = new RealtimeReporterDao(DatabaseTools.getConnection(ds)); + final Thread thread = new Thread(() -> delayFreeStreamingConsumtionProducer(reporterId)); + thread.setName("utPLSQL run test"); + thread.start(); + dao.consumeReport(reporterId, consumer); + logger.fine(consumer.getPostTestEvents().toString()); + Assert.assertEquals(5, consumer.getPostTestEvents().entrySet().size()); + final Long test_1_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_1_0"); + final Long test_2_1 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_2_1"); + final Long test_3_2 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_3_2"); + final Long test_4_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_4_0"); + final Long test_5_0 = consumer.getPostTestEvents().get("junit_utplsql_fetch_size_pkg.test_5_0"); + final long test_2_1_time = test_2_1 - test_1_0; + logger.fine("test_2_1 time [ms]: " + test_2_1_time); + Assert.assertTrue("test_2_1 runtime was too long", test_2_1_time < 1000 + TOLERANCE_MS); + Assert.assertTrue("test_2_1 runtime was too short", test_2_1_time > 1000 - TOLERANCE_MS); + final long test_3_2_time = test_3_2 - test_2_1; + logger.fine("test_3_2 time [ms]: " + test_3_2_time); + Assert.assertTrue("test_3_2 runtime was too long", test_3_2_time < 2000 + TOLERANCE_MS); + Assert.assertTrue("test_3_2 runtime was too short", test_3_2_time > 2000 - TOLERANCE_MS); + final long test_4_0_time = test_4_0 - test_3_2; + logger.fine("test_4_0 time [ms]: " + test_4_0_time); + Assert.assertTrue("test_4_0 runtime was too long", test_4_0_time < TOLERANCE_MS); + final long test_5_0_time = test_5_0 - test_4_0; + logger.fine("test_5_0 time [ms]: " + test_5_0_time); + Assert.assertTrue("test_5_0 runtime was too long", test_5_0_time < TOLERANCE_MS); } - } } From 57d6276ea08bdd992223d9dc7b7bf5fff68f99a7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 21:45:44 +0200 Subject: [PATCH 230/286] rename RealtimeReporterTest.xtend to RealtimeReporterTest.java --- .../dal/{RealtimeReporterTest.xtend => RealtimeReporterTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/dal/{RealtimeReporterTest.xtend => RealtimeReporterTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java From 16ecbe418e4d890aeeb96121d5aa3caa886892eb Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 21:46:09 +0200 Subject: [PATCH 231/286] add add RealtimeReporterTest.java generated by Xtend 2.20.0 --- .../sqldev/test/dal/RealtimeReporterTest.java | 515 ++++++++++++------ 1 file changed, 348 insertions(+), 167 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java index 908fe3f2..2ee6d9fc 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,171 +13,352 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.test.dal +package org.utplsql.sqldev.test.dal; -import java.util.UUID -import java.util.logging.Logger -import org.junit.AfterClass -import org.junit.Assert -import org.junit.BeforeClass -import org.junit.Test -import org.springframework.jdbc.BadSqlGrammarException -import org.utplsql.sqldev.dal.RealtimeReporterDao -import org.utplsql.sqldev.model.runner.PostRunEvent -import org.utplsql.sqldev.model.runner.PostSuiteEvent -import org.utplsql.sqldev.model.runner.PostTestEvent -import org.utplsql.sqldev.model.runner.PreRunEvent -import org.utplsql.sqldev.model.runner.PreSuiteEvent -import org.utplsql.sqldev.model.runner.PreTestEvent -import org.utplsql.sqldev.test.AbstractJdbcTest +import java.sql.Connection; +import java.util.Collections; +import java.util.UUID; +import java.util.logging.Logger; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.Functions.Function1; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.jdbc.BadSqlGrammarException; +import org.utplsql.sqldev.dal.RealtimeReporterDao; +import org.utplsql.sqldev.model.runner.PostRunEvent; +import org.utplsql.sqldev.model.runner.PostSuiteEvent; +import org.utplsql.sqldev.model.runner.PostTestEvent; +import org.utplsql.sqldev.model.runner.PreRunEvent; +import org.utplsql.sqldev.model.runner.PreSuiteEvent; +import org.utplsql.sqldev.model.runner.PreTestEvent; +import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; +import org.utplsql.sqldev.test.AbstractJdbcTest; +import org.utplsql.sqldev.test.dal.TestRealtimerReporterEventConsumer; -class RealtimeReporterTest extends AbstractJdbcTest { - - static val Logger logger = Logger.getLogger(RealtimeReporterTest.name); - - @BeforeClass - def static void setup() { - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is - --%suite(JUnit testing) - --%suitepath(a) - - --%context(test context) - - --%test(test 1 - OK) - PROCEDURE test_1_ok; - - --%test(test 2 - NOK) - PROCEDURE test_2_nok; - - --%endcontext - END; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS - PROCEDURE test_1_ok IS - BEGIN - ut.expect(1).to_equal(1); - END; - - PROCEDURE test_2_nok IS - BEGIN - ut.expect(1).to_equal(2); - END; - END; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test2_pkg IS - --%suite - --%suitepath(b) - - --%test - PROCEDURE test_3_ok; - - --%test - PROCEDURE test_4_nok; - - --%test - --%disabled - PROCEDURE test_5; - end; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_test2_pkg IS - PROCEDURE test_3_ok IS - BEGIN - ut3.ut.expect(2).to_equal(2); - END; - - PROCEDURE test_4_nok IS - BEGIN - ut3.ut.expect(2).to_equal(3); - ut3.ut.expect(2).to_equal(4); - END; - - PROCEDURE test_5 IS - BEGIN - null; - END; - END; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test3_pkg IS - --%suite - --%suitepath(b) - - --%test - PROCEDURE test_6_with_runtime_error; - - --%test - PROCEDURE test_7_with_serveroutput; - - --%afterall - PROCEDURE print_and_raise; - END; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_test3_pkg IS - PROCEDURE test_6_with_runtime_error is - l_actual INTEGER; - BEGIN - EXECUTE IMMEDIATE 'select 6 from non_existing_table' INTO l_actual; - ut3.ut.expect(6).to_equal(l_actual); - END; - - PROCEDURE test_7_with_serveroutput IS - BEGIN - dbms_output.put_line('before test 7'); - ut3.ut.expect(7).to_equal(7); - dbms_output.put_line('after test 7'); - END; - - PROCEDURE print_and_raise IS - BEGIN - dbms_output.put_line('Now, a no_data_found exception is raised'); - dbms_output.put_line('dbms_output and error stack is reported for this suite.'); - dbms_output.put_line('A runtime error in afterall is counted as a warning.'); - raise no_data_found; - END; - END; - ''') - } - - @AfterClass - def static void teardown() { - try { - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test1_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test2_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - try { - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test3_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - } - - @Test - def void produceAndConsume() { - val dao = new RealtimeReporterDao(dataSource.connection) - val reporterId = UUID.randomUUID().toString.replace("-", ""); - val consumer = new TestRealtimerReporterEventConsumer - dao.produceReport(reporterId, #[":a", ":b"]) - dao.consumeReport(reporterId, consumer) - logger.fine(consumer.consumedList.toString) - Assert.assertEquals(1, consumer.consumedList.filter[it instanceof PreRunEvent].size) - Assert.assertEquals(1, consumer.consumedList.filter[it instanceof PostRunEvent].size) - // 2 suitepaths (a, b), 1 context, 3 packages -> 6 suites - Assert.assertEquals(6, consumer.consumedList.filter[it instanceof PreSuiteEvent].size) - Assert.assertEquals(6, consumer.consumedList.filter[it instanceof PostSuiteEvent].size) - Assert.assertEquals(7, consumer.consumedList.filter[it instanceof PreTestEvent].size) - Assert.assertEquals(7, consumer.consumedList.filter[it instanceof PostTestEvent].size) - Assert.assertEquals(28, consumer.consumedList.size) - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class RealtimeReporterTest extends AbstractJdbcTest { + private static final Logger logger = Logger.getLogger(RealtimeReporterTest.class.getName()); + + @BeforeClass + public static void setup() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suite(JUnit testing)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suitepath(a)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%context(test context)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 1 - OK) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_1_ok;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 2 - NOK)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_2_nok;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%endcontext"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_1_ok IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("ut.expect(1).to_equal(1);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_2_nok IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("ut.expect(1).to_equal(2);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.append("END;"); + _builder_1.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("CREATE OR REPLACE PACKAGE junit_utplsql_test2_pkg IS"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("--%suite"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("--%suitepath(b)"); + _builder_2.newLine(); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("--%test "); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("PROCEDURE test_3_ok;"); + _builder_2.newLine(); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("--%test"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("PROCEDURE test_4_nok;"); + _builder_2.newLine(); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("--%test"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("--%disabled"); + _builder_2.newLine(); + _builder_2.append(" "); + _builder_2.append("PROCEDURE test_5;"); + _builder_2.newLine(); + _builder_2.append("end;"); + _builder_2.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_2.toString()); + StringConcatenation _builder_3 = new StringConcatenation(); + _builder_3.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test2_pkg IS"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("PROCEDURE test_3_ok IS"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("BEGIN"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("ut3.ut.expect(2).to_equal(2);"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("END;"); + _builder_3.newLine(); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("PROCEDURE test_4_nok IS"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("BEGIN"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("ut3.ut.expect(2).to_equal(3);"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("ut3.ut.expect(2).to_equal(4);"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("END;"); + _builder_3.newLine(); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("PROCEDURE test_5 IS"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("BEGIN"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("null;"); + _builder_3.newLine(); + _builder_3.append(" "); + _builder_3.append("END;"); + _builder_3.newLine(); + _builder_3.append("END;"); + _builder_3.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_3.toString()); + StringConcatenation _builder_4 = new StringConcatenation(); + _builder_4.append("CREATE OR REPLACE PACKAGE junit_utplsql_test3_pkg IS"); + _builder_4.newLine(); + _builder_4.append(" "); + _builder_4.append("--%suite"); + _builder_4.newLine(); + _builder_4.append(" "); + _builder_4.append("--%suitepath(b)"); + _builder_4.newLine(); + _builder_4.newLine(); + _builder_4.append(" "); + _builder_4.append("--%test "); + _builder_4.newLine(); + _builder_4.append(" "); + _builder_4.append("PROCEDURE test_6_with_runtime_error;"); + _builder_4.newLine(); + _builder_4.newLine(); + _builder_4.append(" "); + _builder_4.append("--%test"); + _builder_4.newLine(); + _builder_4.append(" "); + _builder_4.append("PROCEDURE test_7_with_serveroutput;"); + _builder_4.newLine(); + _builder_4.newLine(); + _builder_4.append(" "); + _builder_4.append("--%afterall"); + _builder_4.newLine(); + _builder_4.append(" "); + _builder_4.append("PROCEDURE print_and_raise;"); + _builder_4.newLine(); + _builder_4.append("END;"); + _builder_4.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_4.toString()); + StringConcatenation _builder_5 = new StringConcatenation(); + _builder_5.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test3_pkg IS"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("PROCEDURE test_6_with_runtime_error is"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("l_actual INTEGER;"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("BEGIN"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("EXECUTE IMMEDIATE \'select 6 from non_existing_table\' INTO l_actual;"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("ut3.ut.expect(6).to_equal(l_actual);"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("END;"); + _builder_5.newLine(); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("PROCEDURE test_7_with_serveroutput IS"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("BEGIN"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("dbms_output.put_line(\'before test 7\');"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("ut3.ut.expect(7).to_equal(7);"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("dbms_output.put_line(\'after test 7\');"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("END;"); + _builder_5.newLine(); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("PROCEDURE print_and_raise IS"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("BEGIN"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("dbms_output.put_line(\'Now, a no_data_found exception is raised\');"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("dbms_output.put_line(\'dbms_output and error stack is reported for this suite.\');"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("dbms_output.put_line(\'A runtime error in afterall is counted as a warning.\');"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("raise no_data_found;"); + _builder_5.newLine(); + _builder_5.append(" "); + _builder_5.append("END;"); + _builder_5.newLine(); + _builder_5.append("END;"); + _builder_5.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_5.toString()); + } + + @AfterClass + public static void teardown() { + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test1_pkg"); + } catch (final Throwable _t) { + if (_t instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test2_pkg"); + } catch (final Throwable _t_1) { + if (_t_1 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_1); + } + } + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test3_pkg"); + } catch (final Throwable _t_2) { + if (_t_2 instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t_2); + } + } + } + + @Test + public void produceAndConsume() { + try { + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + final RealtimeReporterDao dao = new RealtimeReporterDao(_connection); + final String reporterId = UUID.randomUUID().toString().replace("-", ""); + final TestRealtimerReporterEventConsumer consumer = new TestRealtimerReporterEventConsumer(); + dao.produceReport(reporterId, Collections.unmodifiableList(CollectionLiterals.newArrayList(":a", ":b"))); + dao.consumeReport(reporterId, consumer); + RealtimeReporterTest.logger.fine(consumer.getConsumedList().toString()); + final Function1 _function = (RealtimeReporterEvent it) -> { + return Boolean.valueOf((it instanceof PreRunEvent)); + }; + Assert.assertEquals(1, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function))); + final Function1 _function_1 = (RealtimeReporterEvent it) -> { + return Boolean.valueOf((it instanceof PostRunEvent)); + }; + Assert.assertEquals(1, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_1))); + final Function1 _function_2 = (RealtimeReporterEvent it) -> { + return Boolean.valueOf((it instanceof PreSuiteEvent)); + }; + Assert.assertEquals(6, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_2))); + final Function1 _function_3 = (RealtimeReporterEvent it) -> { + return Boolean.valueOf((it instanceof PostSuiteEvent)); + }; + Assert.assertEquals(6, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_3))); + final Function1 _function_4 = (RealtimeReporterEvent it) -> { + return Boolean.valueOf((it instanceof PreTestEvent)); + }; + Assert.assertEquals(7, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_4))); + final Function1 _function_5 = (RealtimeReporterEvent it) -> { + return Boolean.valueOf((it instanceof PostTestEvent)); + }; + Assert.assertEquals(7, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_5))); + Assert.assertEquals(28, consumer.getConsumedList().size()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } +} From 33a55eb401d8e6eeb391ad36cf537113f36ae40f Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:08:28 +0200 Subject: [PATCH 232/286] convert RealtimeReporterTest to Java, removing Xtend dependencies --- .../sqldev/test/dal/RealtimeReporterTest.java | 452 +++++------------- 1 file changed, 122 insertions(+), 330 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java index 2ee6d9fc..f2a7e403 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,350 +15,142 @@ */ package org.utplsql.sqldev.test.dal; -import java.sql.Connection; -import java.util.Collections; +import java.util.Arrays; import java.util.UUID; import java.util.logging.Logger; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.Functions.Function1; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.junit.AfterClass; + +import org.junit.After; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.jdbc.BadSqlGrammarException; import org.utplsql.sqldev.dal.RealtimeReporterDao; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.runner.PostRunEvent; import org.utplsql.sqldev.model.runner.PostSuiteEvent; import org.utplsql.sqldev.model.runner.PostTestEvent; import org.utplsql.sqldev.model.runner.PreRunEvent; import org.utplsql.sqldev.model.runner.PreSuiteEvent; import org.utplsql.sqldev.model.runner.PreTestEvent; -import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; import org.utplsql.sqldev.test.AbstractJdbcTest; -import org.utplsql.sqldev.test.dal.TestRealtimerReporterEventConsumer; -@SuppressWarnings("all") public class RealtimeReporterTest extends AbstractJdbcTest { - private static final Logger logger = Logger.getLogger(RealtimeReporterTest.class.getName()); - - @BeforeClass - public static void setup() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suite(JUnit testing)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suitepath(a)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%context(test context)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 1 - OK) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_1_ok;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 2 - NOK)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_2_nok;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%endcontext"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_1_ok IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("ut.expect(1).to_equal(1);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_2_nok IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("ut.expect(1).to_equal(2);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.append("END;"); - _builder_1.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append("CREATE OR REPLACE PACKAGE junit_utplsql_test2_pkg IS"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("--%suite"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("--%suitepath(b)"); - _builder_2.newLine(); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("--%test "); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("PROCEDURE test_3_ok;"); - _builder_2.newLine(); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("--%test"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("PROCEDURE test_4_nok;"); - _builder_2.newLine(); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("--%test"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("--%disabled"); - _builder_2.newLine(); - _builder_2.append(" "); - _builder_2.append("PROCEDURE test_5;"); - _builder_2.newLine(); - _builder_2.append("end;"); - _builder_2.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_2.toString()); - StringConcatenation _builder_3 = new StringConcatenation(); - _builder_3.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test2_pkg IS"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("PROCEDURE test_3_ok IS"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("BEGIN"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("ut3.ut.expect(2).to_equal(2);"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("END;"); - _builder_3.newLine(); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("PROCEDURE test_4_nok IS"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("BEGIN"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("ut3.ut.expect(2).to_equal(3);"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("ut3.ut.expect(2).to_equal(4);"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("END;"); - _builder_3.newLine(); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("PROCEDURE test_5 IS"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("BEGIN"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("null;"); - _builder_3.newLine(); - _builder_3.append(" "); - _builder_3.append("END;"); - _builder_3.newLine(); - _builder_3.append("END;"); - _builder_3.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_3.toString()); - StringConcatenation _builder_4 = new StringConcatenation(); - _builder_4.append("CREATE OR REPLACE PACKAGE junit_utplsql_test3_pkg IS"); - _builder_4.newLine(); - _builder_4.append(" "); - _builder_4.append("--%suite"); - _builder_4.newLine(); - _builder_4.append(" "); - _builder_4.append("--%suitepath(b)"); - _builder_4.newLine(); - _builder_4.newLine(); - _builder_4.append(" "); - _builder_4.append("--%test "); - _builder_4.newLine(); - _builder_4.append(" "); - _builder_4.append("PROCEDURE test_6_with_runtime_error;"); - _builder_4.newLine(); - _builder_4.newLine(); - _builder_4.append(" "); - _builder_4.append("--%test"); - _builder_4.newLine(); - _builder_4.append(" "); - _builder_4.append("PROCEDURE test_7_with_serveroutput;"); - _builder_4.newLine(); - _builder_4.newLine(); - _builder_4.append(" "); - _builder_4.append("--%afterall"); - _builder_4.newLine(); - _builder_4.append(" "); - _builder_4.append("PROCEDURE print_and_raise;"); - _builder_4.newLine(); - _builder_4.append("END;"); - _builder_4.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_4.toString()); - StringConcatenation _builder_5 = new StringConcatenation(); - _builder_5.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test3_pkg IS"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("PROCEDURE test_6_with_runtime_error is"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("l_actual INTEGER;"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("BEGIN"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("EXECUTE IMMEDIATE \'select 6 from non_existing_table\' INTO l_actual;"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("ut3.ut.expect(6).to_equal(l_actual);"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("END;"); - _builder_5.newLine(); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("PROCEDURE test_7_with_serveroutput IS"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("BEGIN"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("dbms_output.put_line(\'before test 7\');"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("ut3.ut.expect(7).to_equal(7);"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("dbms_output.put_line(\'after test 7\');"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("END;"); - _builder_5.newLine(); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("PROCEDURE print_and_raise IS"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("BEGIN"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("dbms_output.put_line(\'Now, a no_data_found exception is raised\');"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("dbms_output.put_line(\'dbms_output and error stack is reported for this suite.\');"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("dbms_output.put_line(\'A runtime error in afterall is counted as a warning.\');"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("raise no_data_found;"); - _builder_5.newLine(); - _builder_5.append(" "); - _builder_5.append("END;"); - _builder_5.newLine(); - _builder_5.append("END;"); - _builder_5.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_5.toString()); - } - - @AfterClass - public static void teardown() { - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test1_pkg"); - } catch (final Throwable _t) { - if (_t instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t); - } - } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test2_pkg"); - } catch (final Throwable _t_1) { - if (_t_1 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_1); - } + private static final Logger logger = Logger.getLogger(RealtimeReporterTest.class.getName()); + + @Before + public void setup() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is\n"); + sb.append(" --%suite(JUnit testing)\n"); + sb.append(" --%suitepath(a)\n\n"); + sb.append(" --%context(test context)\n\n"); + sb.append(" --%test(test 1 - OK)\n"); + sb.append(" PROCEDURE test_1_ok;\n\n"); + sb.append(" --%test(test 2 - NOK)\n"); + sb.append(" PROCEDURE test_2_nok;\n\n"); + sb.append(" --%endcontext\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS\n"); + sb.append(" PROCEDURE test_1_ok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" ut.expect(1).to_equal(1);\n"); + sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_2_nok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" ut.expect(1).to_equal(2);\n"); + sb.append(" END;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test2_pkg IS\n"); + sb.append(" --%suite\n"); + sb.append(" --%suitepath(b)\n\n"); + sb.append(" --%test\n"); + sb.append(" PROCEDURE test_3_ok;\n\n"); + sb.append(" --%test\n"); + sb.append(" PROCEDURE test_4_nok;\n\n"); + sb.append(" --%test\n"); + sb.append(" --%disabled\n"); + sb.append(" PROCEDURE test_5;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test2_pkg IS\n"); + sb.append(" PROCEDURE test_3_ok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" ut3.ut.expect(2).to_equal(2);\n"); + sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_4_nok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" ut3.ut.expect(2).to_equal(3);\n"); + sb.append(" ut3.ut.expect(2).to_equal(4);\n"); + sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_5 IS\n"); + sb.append(" BEGIN\n"); + sb.append(" NULL;\n"); + sb.append(" END;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test3_pkg IS\n"); + sb.append(" --%suite\n"); + sb.append(" --%suitepath(b)\n\n"); + sb.append(" --%test\n"); + sb.append(" PROCEDURE test_6_with_runtime_error;\n\n"); + sb.append(" --%test\n"); + sb.append(" PROCEDURE test_7_with_serveroutput;\n\n"); + sb.append(" --%afterall\n"); + sb.append(" PROCEDURE print_and_raise;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test3_pkg IS\n"); + sb.append(" PROCEDURE test_6_with_runtime_error IS\n"); + sb.append(" l_actual INTEGER;\n"); + sb.append(" BEGIN\n"); + sb.append(" EXECUTE IMMEDIATE \'select 6 from non_existing_table\' INTO l_actual;\n"); + sb.append(" ut3.ut.expect(6).to_equal(l_actual);\n"); + sb.append(" END\n\n;"); + sb.append(" PROCEDURE test_7_with_serveroutput IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line(\'before test 7\');\n"); + sb.append(" ut3.ut.expect(7).to_equal(7);\n"); + sb.append(" dbms_output.put_line(\'after test 7\');\n"); + sb.append(" END;\n\n"); + sb.append(" PROCEDURE print_and_raise IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line(\'Now, a no_data_found exception is raised\');\n"); + sb.append(" dbms_output.put_line(\'dbms_output and error stack is reported for this suite.\');\n"); + sb.append(" dbms_output.put_line(\'A runtime error in afterall is counted as a warning.\');\n"); + sb.append(" RAISE no_data_found;\n"); + sb.append(" END;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); } - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test3_pkg"); - } catch (final Throwable _t_2) { - if (_t_2 instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t_2); - } + + @After + public void teardown() { + executeAndIgnore(jdbcTemplate, "DROP PACKAGE junit_utplsql_test1_pkg"); + executeAndIgnore(jdbcTemplate, "DROP PACKAGE junit_utplsql_test2_pkg"); + executeAndIgnore(jdbcTemplate, "DROP PACKAGE junit_utplsql_test3_pkg"); } - } - - @Test - public void produceAndConsume() { - try { - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - final RealtimeReporterDao dao = new RealtimeReporterDao(_connection); - final String reporterId = UUID.randomUUID().toString().replace("-", ""); - final TestRealtimerReporterEventConsumer consumer = new TestRealtimerReporterEventConsumer(); - dao.produceReport(reporterId, Collections.unmodifiableList(CollectionLiterals.newArrayList(":a", ":b"))); - dao.consumeReport(reporterId, consumer); - RealtimeReporterTest.logger.fine(consumer.getConsumedList().toString()); - final Function1 _function = (RealtimeReporterEvent it) -> { - return Boolean.valueOf((it instanceof PreRunEvent)); - }; - Assert.assertEquals(1, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function))); - final Function1 _function_1 = (RealtimeReporterEvent it) -> { - return Boolean.valueOf((it instanceof PostRunEvent)); - }; - Assert.assertEquals(1, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_1))); - final Function1 _function_2 = (RealtimeReporterEvent it) -> { - return Boolean.valueOf((it instanceof PreSuiteEvent)); - }; - Assert.assertEquals(6, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_2))); - final Function1 _function_3 = (RealtimeReporterEvent it) -> { - return Boolean.valueOf((it instanceof PostSuiteEvent)); - }; - Assert.assertEquals(6, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_3))); - final Function1 _function_4 = (RealtimeReporterEvent it) -> { - return Boolean.valueOf((it instanceof PreTestEvent)); - }; - Assert.assertEquals(7, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_4))); - final Function1 _function_5 = (RealtimeReporterEvent it) -> { - return Boolean.valueOf((it instanceof PostTestEvent)); - }; - Assert.assertEquals(7, IterableExtensions.size(IterableExtensions.filter(consumer.getConsumedList(), _function_5))); - Assert.assertEquals(28, consumer.getConsumedList().size()); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + public void produceAndConsume() { + final RealtimeReporterDao dao = new RealtimeReporterDao(DatabaseTools.getConnection(dataSource)); + final String reporterId = UUID.randomUUID().toString().replace("-", ""); + final TestRealtimerReporterEventConsumer consumer = new TestRealtimerReporterEventConsumer(); + dao.produceReport(reporterId, Arrays.asList(":a", ":b")); + dao.consumeReport(reporterId, consumer); + logger.fine(consumer.getConsumedList().toString()); + Assert.assertEquals(1, consumer.getConsumedList().stream().filter(it -> it instanceof PreRunEvent).count()); + Assert.assertEquals(1, consumer.getConsumedList().stream().filter(it -> it instanceof PostRunEvent).count()); + // 2 suitepaths (a, b), 1 context, 3 packages -> 6 suites + Assert.assertEquals(6, consumer.getConsumedList().stream().filter(it -> it instanceof PreSuiteEvent).count()); + Assert.assertEquals(6, consumer.getConsumedList().stream().filter(it -> it instanceof PostSuiteEvent).count()); + Assert.assertEquals(7, consumer.getConsumedList().stream().filter(it -> it instanceof PreTestEvent).count()); + Assert.assertEquals(7, consumer.getConsumedList().stream().filter(it -> it instanceof PostTestEvent).count()); + Assert.assertEquals(28, consumer.getConsumedList().size()); } - } } From 0b7b883e0c2eb4cd44097b9ff5cae68eec14a932 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:11:21 +0200 Subject: [PATCH 233/286] rename TestRealtimerReporterEventConsumer.xtend to TestRealtimerReporterEventConsumer.java --- ...ventConsumer.xtend => TestRealtimerReporterEventConsumer.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/dal/{TestRealtimerReporterEventConsumer.xtend => TestRealtimerReporterEventConsumer.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java From 66a6a571b88989559cfcaf445e99f3307ad2d145 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:11:42 +0200 Subject: [PATCH 234/286] add TestRealtimerReporterEventConsumer.java generated by Xtend 2.20.0 --- .../TestRealtimerReporterEventConsumer.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java index caa75d71..888e3f07 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,22 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.dal +package org.utplsql.sqldev.test.dal; -import java.util.ArrayList -import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer -import org.utplsql.sqldev.model.runner.RealtimeReporterEvent +import java.util.ArrayList; +import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer; +import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; -class TestRealtimerReporterEventConsumer implements RealtimeReporterEventConsumer { - - val consumedList = new ArrayList - - def getConsumedList() { - return consumedList - } - - override void process(RealtimeReporterEvent event) { - consumedList.add(event) - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class TestRealtimerReporterEventConsumer implements RealtimeReporterEventConsumer { + private final ArrayList consumedList = new ArrayList(); + + public ArrayList getConsumedList() { + return this.consumedList; + } + + @Override + public void process(final RealtimeReporterEvent event) { + this.consumedList.add(event); + } +} From 1003e2be5d7e6cc5661f8750b48fa13844786bc7 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:15:11 +0200 Subject: [PATCH 235/286] convert TestRealtimerReporterEventConsumer to Java, removing Xtend dependencies 33a55eb --- .../TestRealtimerReporterEventConsumer.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java index 888e3f07..da1c4c90 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventConsumer.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,19 +16,19 @@ package org.utplsql.sqldev.test.dal; import java.util.ArrayList; + import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer; import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; -@SuppressWarnings("all") public class TestRealtimerReporterEventConsumer implements RealtimeReporterEventConsumer { - private final ArrayList consumedList = new ArrayList(); - - public ArrayList getConsumedList() { - return this.consumedList; - } - - @Override - public void process(final RealtimeReporterEvent event) { - this.consumedList.add(event); - } + private final ArrayList consumedList = new ArrayList<>(); + + public ArrayList getConsumedList() { + return consumedList; + } + + @Override + public void process(final RealtimeReporterEvent event) { + consumedList.add(event); + } } From f878245d124302ab9898ee0ecdac46881fd23232 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:16:41 +0200 Subject: [PATCH 236/286] rename TestRealtimerReporterEventTimedConsumer.xtend to TestRealtimerReporterEventTimedConsumer.java --- ...onsumer.xtend => TestRealtimerReporterEventTimedConsumer.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/dal/{TestRealtimerReporterEventTimedConsumer.xtend => TestRealtimerReporterEventTimedConsumer.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java From 4cbdbe8a40b4d9416f253b8306c5a9a2f31a2b54 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:17:17 +0200 Subject: [PATCH 237/286] add TestRealtimerReporterEventTimedConsumer.java generated by Xtend 2.20.0 --- ...stRealtimerReporterEventTimedConsumer.java | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java index ff46d749..8c525dd2 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,25 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.dal +package org.utplsql.sqldev.test.dal; -import java.util.HashMap -import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer -import org.utplsql.sqldev.model.runner.RealtimeReporterEvent -import org.utplsql.sqldev.model.runner.PostTestEvent +import java.util.HashMap; +import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer; +import org.utplsql.sqldev.model.runner.PostTestEvent; +import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; -class TestRealtimerReporterEventTimedConsumer implements RealtimeReporterEventConsumer { - - val postTestEvents = new HashMap - - def getPostTestEvents() { - return postTestEvents - } - - override void process(RealtimeReporterEvent event) { - if (event instanceof PostTestEvent) { - postTestEvents.put(event.id, System.currentTimeMillis) - } - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class TestRealtimerReporterEventTimedConsumer implements RealtimeReporterEventConsumer { + private final HashMap postTestEvents = new HashMap(); + + public HashMap getPostTestEvents() { + return this.postTestEvents; + } + + @Override + public void process(final RealtimeReporterEvent event) { + if ((event instanceof PostTestEvent)) { + this.postTestEvents.put(((PostTestEvent)event).getId(), Long.valueOf(System.currentTimeMillis())); + } + } +} From bc78605b019f9132728e33b16bbaca93dcd3719f Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:23:04 +0200 Subject: [PATCH 238/286] convert TestRealtimerReporterEventTimedConsumer to Java, removing Xtend dependencies --- ...stRealtimerReporterEventTimedConsumer.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java index 8c525dd2..e08ba728 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/TestRealtimerReporterEventTimedConsumer.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,22 +16,22 @@ package org.utplsql.sqldev.test.dal; import java.util.HashMap; + import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer; import org.utplsql.sqldev.model.runner.PostTestEvent; import org.utplsql.sqldev.model.runner.RealtimeReporterEvent; -@SuppressWarnings("all") public class TestRealtimerReporterEventTimedConsumer implements RealtimeReporterEventConsumer { - private final HashMap postTestEvents = new HashMap(); - - public HashMap getPostTestEvents() { - return this.postTestEvents; - } - - @Override - public void process(final RealtimeReporterEvent event) { - if ((event instanceof PostTestEvent)) { - this.postTestEvents.put(((PostTestEvent)event).getId(), Long.valueOf(System.currentTimeMillis())); + private final HashMap postTestEvents = new HashMap<>(); + + public HashMap getPostTestEvents() { + return postTestEvents; + } + + @Override + public void process(final RealtimeReporterEvent event) { + if (event instanceof PostTestEvent) { + postTestEvents.put(((PostTestEvent) event).getId(), System.currentTimeMillis()); + } } - } } From 0e4b3fd7ff9a0ed831b1e819fc245d8c276e8948 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:26:50 +0200 Subject: [PATCH 239/286] rename SqlDevParserTest.xtend to SqlDevParserTest.java --- .../test/parser/{SqlDevParserTest.xtend => SqlDevParserTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/parser/{SqlDevParserTest.xtend => SqlDevParserTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java From 3a8f2297f244d8b00da6b71984c377ae963db690 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 22:27:07 +0200 Subject: [PATCH 240/286] add SqlDevParserTest.java generated by Xtend 2.20.0 --- .../sqldev/test/parser/SqlDevParserTest.java | 353 ++++++++++++------ 1 file changed, 232 insertions(+), 121 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java index a424e7d2..a3664e2c 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java @@ -1,123 +1,234 @@ -package org.utplsql.sqldev.test.parser +package org.utplsql.sqldev.test.parser; -import org.junit.Assert -import org.junit.Test -import org.utplsql.sqldev.parser.SqlDevParser +import java.util.Set; +import oracle.dbtools.raptor.navigator.plsql.Member; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Conversions; +import org.eclipse.xtext.xbase.lib.Functions.Function0; +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.parser.SqlDevParser; -class SqlDevParserTest { - val packageSpec = ''' - CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is - --%suite(JUnit testing) - --%suitepath(a) - - --%context(test context) - - --%test(test 1 - OK) - PRoCeDURE test_1_ok; - - --%test(test 2 - NOK) - PROCEDURE test_2_nok; - - --%test(test 3 - disabled) - --%disabled - PROCEDURE test_3_disabled; - - --%test(test 4 - errored) - PROCEDURE test_4_errored; - - --%test(test 5 - warnings) - PROCEDURE test_5_warnings; - --%endcontext - - function my_Func (p IN number) RETURN BOOLEAN; - END; - ''' - - val packageBody = ''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS - PROCEDURE test_1_ok IS - BEGIN - dbms_output.put_line('start test 1'); - dbms_session.sleep(1); - ut.expect(1).to_equal(1); - dbms_output.put_line('end test 1'); - END; - - PROCEDURE test_2_nok IS - BEGIN - dbms_output.put_line('start test 2'); - dbms_session.sleep(2); - ut.expect(1, 'first assert.').to_equal(2); - ut.expect(1, 'second assert.').to_equal(2); - dbms_output.put_line('end test 2'); - END; - - PROCEDURE test_3_disabled IS - BEGIN - NULL; - END; - - PROCEDURE test_4_errored IS - BEGIN - EXECUTE IMMEDIATE 'bla bla'; - END; - - PROCEDURE test_5_warnings IS - BEGIN - COMMIT; -- will raise a warning - ut.expect(1).to_equal(1); - END; - - FUNCTION my_Func (p IN number) RETURN BOOLEAN IS - RETURN TRUE; - END; - END; - ''' - - @Test - def void packageSpecMembers() { - val parser = new SqlDevParser - val actual = parser.getMembers(packageSpec) - Assert.assertEquals(6, actual.length) - val first = actual.get(0) - Assert.assertEquals("PROCEDURE", first.type) - Assert.assertEquals("test_1_ok", first.name) - val last = actual.get(5) - Assert.assertEquals("FUNCTION", last.type) - Assert.assertEquals("my_Func", last.name) - } - - @Test - def void packageBodyMembers() { - val parser = new SqlDevParser - val actual = parser.getMembers(packageBody) - Assert.assertEquals(6, actual.length) - val first = actual.get(0) - Assert.assertEquals("PROCEDURE", first.type) - Assert.assertEquals("test_1_ok", first.name) - val last = actual.get(5) - Assert.assertEquals("FUNCTION", last.type) - Assert.assertEquals("my_Func", last.name) - } - - @Test - def void StartLineSpec() { - val parser = new SqlDevParser - val first = parser.getMemberStartLine(packageSpec, 'test_1_ok') - Assert.assertEquals(8, first) - val last = parser.getMemberStartLine(packageSpec, 'my_func') - Assert.assertEquals(24, last) - } - - @Test - def void StartLineBody() { - val parser = new SqlDevParser - val first = parser.getMemberStartLine(packageBody, 'test_1_ok') - Assert.assertEquals(2, first) - val last = parser.getMemberStartLine(packageBody, 'my_func') - Assert.assertEquals(35, last) - } - - - -} \ No newline at end of file +@SuppressWarnings("all") +public class SqlDevParserTest { + private final String packageSpec = new Function0() { + public String apply() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suite(JUnit testing)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suitepath(a)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%context(test context)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 1 - OK) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PRoCeDURE test_1_ok;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 2 - NOK)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_2_nok;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 3 - disabled)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%disabled"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_3_disabled;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 4 - errored)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_4_errored;"); + _builder.newLine(); + _builder.append(" "); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 5 - warnings)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_5_warnings;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%endcontext"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("function my_Func (p IN number) RETURN BOOLEAN;"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + return _builder.toString(); + } + }.apply(); + + private final String packageBody = new Function0() { + public String apply() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_1_ok IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_output.put_line(\'start test 1\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_session.sleep(1);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut.expect(1).to_equal(1);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_output.put_line(\'end test 1\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_2_nok IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_output.put_line(\'start test 2\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_session.sleep(2);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut.expect(1, \'first assert.\').to_equal(2);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut.expect(1, \'second assert.\').to_equal(2);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_output.put_line(\'end test 2\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.append(" "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_3_disabled IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("NULL;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_4_errored IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("EXECUTE IMMEDIATE \'bla bla\';"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_5_warnings IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("COMMIT; -- will raise a warning"); + _builder.newLine(); + _builder.append("\t "); + _builder.append("ut.expect(1).to_equal(1);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("FUNCTION my_Func (p IN number) RETURN BOOLEAN IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("RETURN TRUE;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + return _builder.toString(); + } + }.apply(); + + @Test + public void packageSpecMembers() { + final SqlDevParser parser = new SqlDevParser(); + final Set actual = parser.getMembers(this.packageSpec); + Assert.assertEquals(6, ((Object[])Conversions.unwrapArray(actual, Object.class)).length); + final Member first = ((Member[])Conversions.unwrapArray(actual, Member.class))[0]; + Assert.assertEquals("PROCEDURE", first.type); + Assert.assertEquals("test_1_ok", first.name); + final Member last = ((Member[])Conversions.unwrapArray(actual, Member.class))[5]; + Assert.assertEquals("FUNCTION", last.type); + Assert.assertEquals("my_Func", last.name); + } + + @Test + public void packageBodyMembers() { + final SqlDevParser parser = new SqlDevParser(); + final Set actual = parser.getMembers(this.packageBody); + Assert.assertEquals(6, ((Object[])Conversions.unwrapArray(actual, Object.class)).length); + final Member first = ((Member[])Conversions.unwrapArray(actual, Member.class))[0]; + Assert.assertEquals("PROCEDURE", first.type); + Assert.assertEquals("test_1_ok", first.name); + final Member last = ((Member[])Conversions.unwrapArray(actual, Member.class))[5]; + Assert.assertEquals("FUNCTION", last.type); + Assert.assertEquals("my_Func", last.name); + } + + @Test + public void StartLineSpec() { + final SqlDevParser parser = new SqlDevParser(); + final int first = parser.getMemberStartLine(this.packageSpec, "test_1_ok"); + Assert.assertEquals(8, first); + final int last = parser.getMemberStartLine(this.packageSpec, "my_func"); + Assert.assertEquals(24, last); + } + + @Test + public void StartLineBody() { + final SqlDevParser parser = new SqlDevParser(); + final int first = parser.getMemberStartLine(this.packageBody, "test_1_ok"); + Assert.assertEquals(2, first); + final int last = parser.getMemberStartLine(this.packageBody, "my_func"); + Assert.assertEquals(35, last); + } +} From 590ca8e8be29cf42755efb61cbd55bd341d02887 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 23:04:09 +0200 Subject: [PATCH 241/286] convert SqlDevParserTest to Java, removing Xtend dependencies --- .../sqldev/test/parser/SqlDevParserTest.java | 356 +++++++----------- 1 file changed, 133 insertions(+), 223 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java index a3664e2c..a219bdfd 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java @@ -1,234 +1,144 @@ +/* + * Copyright 2019 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.utplsql.sqldev.test.parser; import java.util.Set; -import oracle.dbtools.raptor.navigator.plsql.Member; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.Conversions; -import org.eclipse.xtext.xbase.lib.Functions.Function0; + import org.junit.Assert; import org.junit.Test; import org.utplsql.sqldev.parser.SqlDevParser; -@SuppressWarnings("all") +import oracle.dbtools.raptor.navigator.plsql.Member; + public class SqlDevParserTest { - private final String packageSpec = new Function0() { - public String apply() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suite(JUnit testing)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suitepath(a)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%context(test context)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 1 - OK) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PRoCeDURE test_1_ok;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 2 - NOK)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_2_nok;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 3 - disabled)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%disabled"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_3_disabled;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 4 - errored)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_4_errored;"); - _builder.newLine(); - _builder.append(" "); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 5 - warnings)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_5_warnings;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%endcontext"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("function my_Func (p IN number) RETURN BOOLEAN;"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - return _builder.toString(); + + private String getPackageSpec() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg IS\n"); + sb.append(" --%suite(JUnit testing)\n"); + sb.append(" --%suitepath(a)\n\n"); + + sb.append(" --%context(test context)\n\n"); + + sb.append(" --%test(test 1 - OK)\n"); + sb.append(" PRoCeDURE test_1_ok;\n\n"); + + sb.append(" --%test(test 2 - NOK)\n"); + sb.append(" PROCEDURE test_2_nok;\n\n"); + + sb.append(" --%test(test 3 - disabled)\n"); + sb.append(" --%disabled\n"); + sb.append(" PROCEDURE test_3_disabled;\n\n"); + + sb.append(" --%test(test 4 - errored)\n"); + sb.append(" PROCEDURE test_4_errored;\n\n"); + + sb.append(" --%test(test 5 - warnings)\n"); + sb.append(" PROCEDURE test_5_warnings;\n"); + sb.append(" --%endcontext\n\n"); + + sb.append(" function my_Func (p IN number) RETURN BOOLEAN;\n"); + sb.append("END;"); + return sb.toString(); } - }.apply(); - - private final String packageBody = new Function0() { - public String apply() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_1_ok IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_output.put_line(\'start test 1\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_session.sleep(1);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut.expect(1).to_equal(1);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_output.put_line(\'end test 1\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_2_nok IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_output.put_line(\'start test 2\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_session.sleep(2);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut.expect(1, \'first assert.\').to_equal(2);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut.expect(1, \'second assert.\').to_equal(2);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_output.put_line(\'end test 2\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.append(" "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_3_disabled IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("NULL;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_4_errored IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("EXECUTE IMMEDIATE \'bla bla\';"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_5_warnings IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("COMMIT; -- will raise a warning"); - _builder.newLine(); - _builder.append("\t "); - _builder.append("ut.expect(1).to_equal(1);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("FUNCTION my_Func (p IN number) RETURN BOOLEAN IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("RETURN TRUE;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - return _builder.toString(); + + private String getPackageBody() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS\n"); + sb.append(" PROCEDURE test_1_ok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line('start test 1');\n"); + sb.append(" dbms_session.sleep(1);\n"); + sb.append(" ut.expect(1).to_equal(1);\n"); + sb.append(" dbms_output.put_line('end test 1');\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_2_nok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line('start test 2');\n"); + sb.append(" dbms_session.sleep(2);\n"); + sb.append(" ut.expect(1, 'first assert.').to_equal(2);\n"); + sb.append(" ut.expect(1, 'second assert.').to_equal(2);\n"); + sb.append(" dbms_output.put_line('end test 2');\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_3_disabled IS\n"); + sb.append(" BEGIN\n"); + sb.append(" NULL;\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_4_errored IS\n"); + sb.append(" BEGIN\n"); + sb.append(" EXECUTE IMMEDIATE 'bla bla';\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_5_warnings IS\n"); + sb.append(" BEGIN\n"); + sb.append(" COMMIT; -- will raise a warning\n"); + sb.append(" ut.expect(1).to_equal(1);\n"); + sb.append(" END;\n\n"); + + sb.append(" FUNCTION my_Func (p IN number) RETURN BOOLEAN IS\n"); + sb.append(" RETURN TRUE;\n"); + sb.append(" END;\n"); + sb.append("END;"); + return sb.toString(); + } + + @Test + public void packageSpecMembers() { + final SqlDevParser parser = new SqlDevParser(); + final Set actual = parser.getMembers(getPackageSpec()); + Assert.assertEquals(6, actual.size()); + final Member first = actual.stream().findFirst().get(); + Assert.assertEquals("PROCEDURE", first.type); + Assert.assertEquals("test_1_ok", first.name); + final Member last = actual.stream().reduce((m1, m2) -> m2).get(); + Assert.assertEquals("FUNCTION", last.type); + Assert.assertEquals("my_Func", last.name); + } + + @Test + public void packageBodyMembers() { + final SqlDevParser parser = new SqlDevParser(); + final Set actual = parser.getMembers(getPackageBody()); + Assert.assertEquals(6, actual.size()); + final Member first = actual.stream().findFirst().get(); + Assert.assertEquals("PROCEDURE", first.type); + Assert.assertEquals("test_1_ok", first.name); + final Member last = actual.stream().reduce((m1, m2) -> m2).get(); + Assert.assertEquals("FUNCTION", last.type); + Assert.assertEquals("my_Func", last.name); + } + + @Test + public void StartLineSpec() { + final SqlDevParser parser = new SqlDevParser(); + final int first = parser.getMemberStartLine(getPackageSpec(), "test_1_ok"); + Assert.assertEquals(8, first); + final int last = parser.getMemberStartLine(getPackageSpec(), "my_func"); + Assert.assertEquals(24, last); + } + + @Test + public void StartLineBody() { + final SqlDevParser parser = new SqlDevParser(); + final int first = parser.getMemberStartLine(getPackageBody(), "test_1_ok"); + Assert.assertEquals(2, first); + final int last = parser.getMemberStartLine(getPackageBody(), "my_func"); + Assert.assertEquals(35, last); } - }.apply(); - - @Test - public void packageSpecMembers() { - final SqlDevParser parser = new SqlDevParser(); - final Set actual = parser.getMembers(this.packageSpec); - Assert.assertEquals(6, ((Object[])Conversions.unwrapArray(actual, Object.class)).length); - final Member first = ((Member[])Conversions.unwrapArray(actual, Member.class))[0]; - Assert.assertEquals("PROCEDURE", first.type); - Assert.assertEquals("test_1_ok", first.name); - final Member last = ((Member[])Conversions.unwrapArray(actual, Member.class))[5]; - Assert.assertEquals("FUNCTION", last.type); - Assert.assertEquals("my_Func", last.name); - } - - @Test - public void packageBodyMembers() { - final SqlDevParser parser = new SqlDevParser(); - final Set actual = parser.getMembers(this.packageBody); - Assert.assertEquals(6, ((Object[])Conversions.unwrapArray(actual, Object.class)).length); - final Member first = ((Member[])Conversions.unwrapArray(actual, Member.class))[0]; - Assert.assertEquals("PROCEDURE", first.type); - Assert.assertEquals("test_1_ok", first.name); - final Member last = ((Member[])Conversions.unwrapArray(actual, Member.class))[5]; - Assert.assertEquals("FUNCTION", last.type); - Assert.assertEquals("my_Func", last.name); - } - - @Test - public void StartLineSpec() { - final SqlDevParser parser = new SqlDevParser(); - final int first = parser.getMemberStartLine(this.packageSpec, "test_1_ok"); - Assert.assertEquals(8, first); - final int last = parser.getMemberStartLine(this.packageSpec, "my_func"); - Assert.assertEquals(24, last); - } - - @Test - public void StartLineBody() { - final SqlDevParser parser = new SqlDevParser(); - final int first = parser.getMemberStartLine(this.packageBody, "test_1_ok"); - Assert.assertEquals(2, first); - final int last = parser.getMemberStartLine(this.packageBody, "my_func"); - Assert.assertEquals(35, last); - } } From 721d2f6505fe54a216845f95b2d816bb9e045f81 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 23:27:03 +0200 Subject: [PATCH 242/286] add empty line to visualize SQL better --- .../coverage/CodeCoverageReporterTest.java | 1 + .../sqldev/test/dal/DalBugFixTest.java | 5 ++++ .../org/utplsql/sqldev/test/dal/DalTest.java | 30 ++++++++++++++++--- .../dal/RealtimeReporterFetchSizeTest.java | 9 ++++++ .../sqldev/test/dal/RealtimeReporterTest.java | 27 +++++++++++++---- 5 files changed, 62 insertions(+), 10 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java index 37e80ac7..5f8f0bd9 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java @@ -51,6 +51,7 @@ public static void setup() { sb.setLength(0); sb.append("CREATE OR REPLACE PACKAGE test_f IS\n"); sb.append(" --%suite\n\n"); + sb.append(" --%test\n"); sb.append(" PROCEDURE f;\n"); sb.append("END test_f;"); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java index a724a788..5b474c00 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java @@ -39,6 +39,7 @@ public void issue54FolderIconForSuitesWithoutTests() { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append("END junit_utplsql_test_pkg;"); jdbcTemplate.execute(sb.toString()); final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); @@ -54,8 +55,10 @@ public void issue54PackageIconForSuitesWithTests() { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE t1;\n\n"); + sb.append("END junit_utplsql_test_pkg;"); jdbcTemplate.execute(sb.toString()); final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); @@ -71,6 +74,7 @@ public void issue55SuiteWithoutTests() { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append("END junit_utplsql_test_pkg;"); jdbcTemplate.execute(sb.toString()); final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); @@ -84,6 +88,7 @@ public void issue56SuiteWithoutTests() { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append("END junit_utplsql_test_pkg;"); jdbcTemplate.execute(sb.toString()); final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java index 72155605..aa6920cc 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java @@ -81,10 +81,13 @@ private void containsUtplsqlTestWithSuiteAnnotation(final String utPlsqlVersion) StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %Test\n"); sb.append(" PROCEDURE t2;\n\n"); + sb.append(" PROCEDURE t3;\n"); sb.append("END junit_utplsql_test_pkg;"); jdbcTemplate.execute(sb.toString()); @@ -120,8 +123,10 @@ private void containsUtplsqlTestWithoutSuiteAnnotation(final String utPlsqlVersi sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %test\n"); sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %Test\n"); sb.append(" PROCEDURE t2;\n\n"); + sb.append(" PROCEDURE t3;\n"); sb.append("END junit_utplsql_test_pkg;"); jdbcTemplate.execute(sb.toString()); @@ -156,10 +161,13 @@ private void annotations(final String utPlsqlVersion) { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %Test\n"); sb.append(" PROCEDURE t2;\n\n"); + sb.append(" PROCEDURE t3;\n"); sb.append("END junit_utplsql_test_pkg;"); jdbcTemplate.execute(sb.toString()); @@ -210,11 +218,15 @@ private void testablesPackagesWithTests(final String utPlsqlVersion) { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %Test\n"); sb.append(" PROCEDURE t2;\n\n"); + sb.append(" PROCEDURE t3;\n\n"); + sb.append("END junit_utplsql_test_pkg;"); jdbcTemplate.execute(sb.toString()); final List actual = dao.testables("PACKAGE"); @@ -245,6 +257,7 @@ private void testablesPackagesWithoutTests(final String utPlsqlVersion) { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_no_test_pkg IS\n"); sb.append(" PROCEDURE p1;\n\n"); + sb.append(" PROCEDURE p2;\n"); sb.append("END junit_no_test_pkg;"); jdbcTemplate.execute(sb.toString()); @@ -378,14 +391,20 @@ public void runnables(final String utPlsqlVersion) { sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n"); sb.append(" -- %suitepath(a.B.c)\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE T0;\n\n"); + sb.append(" -- %context(myContext)\n\n"); + sb.append(" -- %test(t1: test One)\n"); sb.append(" PROCEDURE t1;\n\n"); + sb.append(" -- %test(t2: test Two)\n"); sb.append(" PROCEDURE t2;\n\n"); + sb.append(" -- %endcontext\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE t3;\n"); sb.append("END junit_utplsql_test_pkg;"); @@ -443,11 +462,11 @@ public void dbmsOutput() { dao.enableDbmsOutput(); StringBuilder sb = new StringBuilder(); sb.append("BEGIN\n"); - sb.append(" sys.dbms_output.put_line(\'line1\');\n"); - sb.append(" sys.dbms_output.put_line(\'line2\');\n"); + sb.append(" sys.dbms_output.put_line('line1');\n"); + sb.append(" sys.dbms_output.put_line('line2');\n"); sb.append(" sys.dbms_output.put_line(null);\n"); - sb.append(" sys.dbms_output.put_line(\'line4\');\n"); - sb.append(" sys.dbms_output.put_line(\'line5\');\n"); + sb.append(" sys.dbms_output.put_line('line4');\n"); + sb.append(" sys.dbms_output.put_line('line5');\n"); sb.append("END;"); jdbcTemplate.execute(sb.toString()); final String actual = dao.getDbmsOutput(2); @@ -475,6 +494,7 @@ public void includes() { sb.setLength(0); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE f1;\n"); sb.append("END junit_utplsql_test_pkg;"); @@ -546,6 +566,7 @@ public void getSourceOfPackage() { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE p1;\n"); sb.append("END junit_utplsql_test_pkg;"); @@ -580,6 +601,7 @@ public void getObjectType() { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test_pkg IS\n"); sb.append(" -- %suite\n\n"); + sb.append(" -- %test\n"); sb.append(" PROCEDURE p1;\n"); sb.append("END junit_utplsql_test_pkg;"); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java index 686c8464..94064821 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.java @@ -36,14 +36,19 @@ public void setup() { StringBuilder sb = new StringBuilder(); sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_fetch_size_pkg is\n"); sb.append(" --%suite(JUnit testing)\n\n"); + sb.append(" --%test(test 1 - 0 seconds)\n"); sb.append(" PROCEDURE test_1_0;\n\n"); + sb.append(" --%test(test 2 - 1 seconds)\n"); sb.append(" PROCEDURE test_2_1;\n\n"); + sb.append(" --%test(test 3 - 2 seconds)\n"); sb.append(" PROCEDURE test_3_2;\n\n"); + sb.append(" --%test(test 4 - 0 seconds)\n"); sb.append(" PROCEDURE test_4_0;\n\n"); + sb.append(" --%test(test 5 - 0 seconds)\n"); sb.append(" PROCEDURE test_5_0;\n"); sb.append("END;"); @@ -54,18 +59,22 @@ public void setup() { sb.append(" BEGIN\n"); sb.append(" NULL;\n"); sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_2_1 IS\n"); sb.append(" BEGIN\n"); sb.append(" dbms_session.sleep(1);\n"); sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_3_2 IS\n"); sb.append(" BEGIN\n"); sb.append(" dbms_session.sleep(2);\n"); sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_4_0 IS\n"); sb.append(" BEGIN\n"); sb.append(" NULL;\n"); sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_5_0 IS\n"); sb.append(" BEGIN\n"); sb.append(" NULL;\n"); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java index f2a7e403..ee975abd 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterTest.java @@ -42,11 +42,15 @@ public void setup() { sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is\n"); sb.append(" --%suite(JUnit testing)\n"); sb.append(" --%suitepath(a)\n\n"); + sb.append(" --%context(test context)\n\n"); + sb.append(" --%test(test 1 - OK)\n"); sb.append(" PROCEDURE test_1_ok;\n\n"); + sb.append(" --%test(test 2 - NOK)\n"); sb.append(" PROCEDURE test_2_nok;\n\n"); + sb.append(" --%endcontext\n"); sb.append("END;"); jdbcTemplate.execute(sb.toString()); @@ -56,6 +60,7 @@ public void setup() { sb.append(" BEGIN\n"); sb.append(" ut.expect(1).to_equal(1);\n"); sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_2_nok IS\n"); sb.append(" BEGIN\n"); sb.append(" ut.expect(1).to_equal(2);\n"); @@ -66,10 +71,13 @@ public void setup() { sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test2_pkg IS\n"); sb.append(" --%suite\n"); sb.append(" --%suitepath(b)\n\n"); + sb.append(" --%test\n"); sb.append(" PROCEDURE test_3_ok;\n\n"); + sb.append(" --%test\n"); sb.append(" PROCEDURE test_4_nok;\n\n"); + sb.append(" --%test\n"); sb.append(" --%disabled\n"); sb.append(" PROCEDURE test_5;\n"); @@ -81,11 +89,13 @@ public void setup() { sb.append(" BEGIN\n"); sb.append(" ut3.ut.expect(2).to_equal(2);\n"); sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_4_nok IS\n"); sb.append(" BEGIN\n"); sb.append(" ut3.ut.expect(2).to_equal(3);\n"); sb.append(" ut3.ut.expect(2).to_equal(4);\n"); sb.append(" END;\n\n"); + sb.append(" PROCEDURE test_5 IS\n"); sb.append(" BEGIN\n"); sb.append(" NULL;\n"); @@ -96,10 +106,13 @@ public void setup() { sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test3_pkg IS\n"); sb.append(" --%suite\n"); sb.append(" --%suitepath(b)\n\n"); + sb.append(" --%test\n"); sb.append(" PROCEDURE test_6_with_runtime_error;\n\n"); + sb.append(" --%test\n"); sb.append(" PROCEDURE test_7_with_serveroutput;\n\n"); + sb.append(" --%afterall\n"); sb.append(" PROCEDURE print_and_raise;\n"); sb.append("END;"); @@ -109,20 +122,22 @@ public void setup() { sb.append(" PROCEDURE test_6_with_runtime_error IS\n"); sb.append(" l_actual INTEGER;\n"); sb.append(" BEGIN\n"); - sb.append(" EXECUTE IMMEDIATE \'select 6 from non_existing_table\' INTO l_actual;\n"); + sb.append(" EXECUTE IMMEDIATE 'select 6 from non_existing_table' INTO l_actual;\n"); sb.append(" ut3.ut.expect(6).to_equal(l_actual);\n"); sb.append(" END\n\n;"); + sb.append(" PROCEDURE test_7_with_serveroutput IS\n"); sb.append(" BEGIN\n"); - sb.append(" dbms_output.put_line(\'before test 7\');\n"); + sb.append(" dbms_output.put_line('before test 7');\n"); sb.append(" ut3.ut.expect(7).to_equal(7);\n"); - sb.append(" dbms_output.put_line(\'after test 7\');\n"); + sb.append(" dbms_output.put_line('after test 7');\n"); sb.append(" END;\n\n"); + sb.append(" PROCEDURE print_and_raise IS\n"); sb.append(" BEGIN\n"); - sb.append(" dbms_output.put_line(\'Now, a no_data_found exception is raised\');\n"); - sb.append(" dbms_output.put_line(\'dbms_output and error stack is reported for this suite.\');\n"); - sb.append(" dbms_output.put_line(\'A runtime error in afterall is counted as a warning.\');\n"); + sb.append(" dbms_output.put_line('Now, a no_data_found exception is raised');\n"); + sb.append(" dbms_output.put_line('dbms_output and error stack is reported for this suite.');\n"); + sb.append(" dbms_output.put_line('A runtime error in afterall is counted as a warning.');\n"); sb.append(" RAISE no_data_found;\n"); sb.append(" END;\n"); sb.append("END;"); From 72b0b82ad73d721e660e6536ef33c8039148ea33 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 23:27:28 +0200 Subject: [PATCH 243/286] remove unnecessary escaping of apostrophe --- sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java index d03a1816..b3ebeb49 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/SnippetTest.java @@ -67,7 +67,7 @@ public void mergeKeepExisting() { public void mergeRemoveExisting() { USER_SNIPPETS_FILE.delete(); StringBuilder sb = new StringBuilder(); - sb.append("\n"); + sb.append("\n"); sb.append("\n"); sb.append(" \n"); sb.append(" \n"); From 48c406080141b3e6f9970e0fb3d98e97a09e6ba2 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 23:35:57 +0200 Subject: [PATCH 244/286] rename UtplsqlParserBugFixTest.xtend to UtplsqlParserBugFixTest.java --- ...UtplsqlParserBugFixTest.xtend => UtplsqlParserBugFixTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/parser/{UtplsqlParserBugFixTest.xtend => UtplsqlParserBugFixTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java From 7bd2c80229f12b1b09284c4ff8ca542c2a1fc2f9 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 23:36:17 +0200 Subject: [PATCH 245/286] add UtplsqlParserBugFixTest.java generated by Xtend 2.20.0 --- .../test/parser/UtplsqlParserBugFixTest.java | 294 ++++++++++++------ 1 file changed, 196 insertions(+), 98 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java index 3ec0c926..05cfedbe 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,103 +13,201 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.parser +package org.utplsql.sqldev.test.parser; -import org.junit.Assert -import org.junit.Test -import org.utplsql.sqldev.parser.UtplsqlParser - -class UtplsqlParserBugFixTest { - - @Test - // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/1 - def issue1MatchingExprInStringLiterals() { - val plsql = ''' - create or replace package body test_expect_not_to_be_null - is - gc_object_name constant varchar2(30) := 't_not_to_be_null_test'; - gc_nested_table_name constant varchar2(30) := 'tt_not_to_be_null_test'; - gc_varray_name constant varchar2(30) := 'tv_not_to_be_null_test'; - - procedure cleanup_expectations - is - begin - ut3.ut_expectation_processor.clear_expectations(); - end; - - procedure create_types - is - pragma autonomous_transaction; - begin - execute immediate 'create type '||gc_object_name||' is object (dummy number)'; - execute immediate ' create type '||gc_nested_table_name||' is table of number'; - execute immediate ' - create type '||gc_varray_name||' is varray(1) of number'; - end; - - procedure drop_types - is - pragma autonomous_transaction; - begin - execute immediate 'drop type '||gc_object_name; - execute immediate ' drop type '||gc_nested_table_name; - execute immediate ' - drop type '||gc_varray_name; - end; - - procedure blob_not_null - is - begin - --Act - execute immediate expectations_helpers.unary_expectation_block('not_to_be_null', 'blob', 'to_blob(''abc'')'); - --Assert - ut.expect(anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations())).to_be_empty(); - end; - - --and so on... - - end; - ''' - val parser = new UtplsqlParser(plsql) - Assert.assertEquals("test_expect_not_to_be_null.cleanup_expectations", parser.getPathAt(parser.toPosition(7,1))) - Assert.assertEquals("test_expect_not_to_be_null.create_types", parser.getPathAt(parser.toPosition(13,1))) - // was: '||gc_varray_name||'.drop_types - Assert.assertEquals("test_expect_not_to_be_null.drop_types", parser.getPathAt(parser.toPosition(23,1))) - // was: '||gc_varray_name||'.blob_not_null - Assert.assertEquals("test_expect_not_to_be_null.blob_not_null", parser.getPathAt(parser.toPosition(33,1))) - } - - @Test - // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/7 - def issue7WrongPositionWithWindowsLineSeparator() { - val plsql = ''' - create or replace package test_expect_not_to_be_null - is - --%suite(expectations - not_to_be_null) - --%suitepath(utplsql.core.expectations.unary) - - --%aftereach - procedure cleanup_expectations; - - --%beforeall - procedure create_types; - - --%afterall - procedure drop_types; - - --%test(Gives success for not null blob) - procedure blob_not_null; - - --%test(Gives success for blob with length 0) - procedure blob_0_length; - - -- ... - end test_expect_not_to_be_null; - / - ''' - val parser = new UtplsqlParser(plsql) - // was: test_expect_not_to_be_null.create_types - Assert.assertEquals("test_expect_not_to_be_null.blob_not_null", parser.getPathAt(parser.toPosition(13,26))) - } +import org.eclipse.xtend2.lib.StringConcatenation; +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.parser.UtplsqlParser; +@SuppressWarnings("all") +public class UtplsqlParserBugFixTest { + @Test + public void issue1MatchingExprInStringLiterals() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("create or replace package body test_expect_not_to_be_null"); + _builder.newLine(); + _builder.append("is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("gc_object_name constant varchar2(30) := \'t_not_to_be_null_test\';"); + _builder.newLine(); + _builder.append(" "); + _builder.append("gc_nested_table_name constant varchar2(30) := \'tt_not_to_be_null_test\';"); + _builder.newLine(); + _builder.append(" "); + _builder.append("gc_varray_name constant varchar2(30) := \'tv_not_to_be_null_test\';"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure cleanup_expectations"); + _builder.newLine(); + _builder.append(" "); + _builder.append("is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("begin"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut3.ut_expectation_processor.clear_expectations();"); + _builder.newLine(); + _builder.append(" "); + _builder.append("end;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure create_types"); + _builder.newLine(); + _builder.append(" "); + _builder.append("is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("pragma autonomous_transaction;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("begin"); + _builder.newLine(); + _builder.append(" "); + _builder.append("execute immediate \'create type \'||gc_object_name||\' is object (dummy number)\';"); + _builder.newLine(); + _builder.append(" "); + _builder.append("execute immediate \' create type \'||gc_nested_table_name||\' is table of number\';"); + _builder.newLine(); + _builder.append(" "); + _builder.append("execute immediate \'"); + _builder.newLine(); + _builder.append(" "); + _builder.append("create type \'||gc_varray_name||\' is varray(1) of number\';"); + _builder.newLine(); + _builder.append(" "); + _builder.append("end;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure drop_types"); + _builder.newLine(); + _builder.append(" "); + _builder.append("is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("pragma autonomous_transaction;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("begin"); + _builder.newLine(); + _builder.append(" "); + _builder.append("execute immediate \'drop type \'||gc_object_name;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("execute immediate \' drop type \'||gc_nested_table_name;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("execute immediate \'"); + _builder.newLine(); + _builder.append(" "); + _builder.append("drop type \'||gc_varray_name;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("end;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure blob_not_null"); + _builder.newLine(); + _builder.append(" "); + _builder.append("is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("begin"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--Act"); + _builder.newLine(); + _builder.append(" "); + _builder.append("execute immediate expectations_helpers.unary_expectation_block(\'not_to_be_null\', \'blob\', \'to_blob(\'\'abc\'\')\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--Assert"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut.expect(anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations())).to_be_empty();"); + _builder.newLine(); + _builder.append(" "); + _builder.append("end;"); + _builder.newLine(); + _builder.newLine(); + _builder.append("--and so on..."); + _builder.newLine(); + _builder.newLine(); + _builder.append("end;"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("test_expect_not_to_be_null.cleanup_expectations", parser.getPathAt(parser.toPosition(7, 1))); + Assert.assertEquals("test_expect_not_to_be_null.create_types", parser.getPathAt(parser.toPosition(13, 1))); + Assert.assertEquals("test_expect_not_to_be_null.drop_types", parser.getPathAt(parser.toPosition(23, 1))); + Assert.assertEquals("test_expect_not_to_be_null.blob_not_null", parser.getPathAt(parser.toPosition(33, 1))); + } + + @Test + public void issue7WrongPositionWithWindowsLineSeparator() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("create or replace package test_expect_not_to_be_null"); + _builder.newLine(); + _builder.append("is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suite(expectations - not_to_be_null)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suitepath(utplsql.core.expectations.unary)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%aftereach"); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure cleanup_expectations;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%beforeall"); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure create_types;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%afterall"); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure drop_types;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(Gives success for not null blob)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure blob_not_null;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(Gives success for blob with length 0)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure blob_0_length;"); + _builder.newLine(); + _builder.append(" "); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- ..."); + _builder.newLine(); + _builder.append("end test_expect_not_to_be_null;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("test_expect_not_to_be_null.blob_not_null", parser.getPathAt(parser.toPosition(13, 26))); + } } From a7cb66efc76faf0c560c4012367339099f85f69e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 23:55:06 +0200 Subject: [PATCH 246/286] convert UtplsqlParserBugFixTest to Java, removing Xtend dependencies --- .../test/parser/UtplsqlParserBugFixTest.java | 283 ++++++------------ 1 file changed, 92 insertions(+), 191 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java index 05cfedbe..5bae6026 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserBugFixTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,199 +15,100 @@ */ package org.utplsql.sqldev.test.parser; -import org.eclipse.xtend2.lib.StringConcatenation; import org.junit.Assert; import org.junit.Test; import org.utplsql.sqldev.parser.UtplsqlParser; -@SuppressWarnings("all") public class UtplsqlParserBugFixTest { - @Test - public void issue1MatchingExprInStringLiterals() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("create or replace package body test_expect_not_to_be_null"); - _builder.newLine(); - _builder.append("is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("gc_object_name constant varchar2(30) := \'t_not_to_be_null_test\';"); - _builder.newLine(); - _builder.append(" "); - _builder.append("gc_nested_table_name constant varchar2(30) := \'tt_not_to_be_null_test\';"); - _builder.newLine(); - _builder.append(" "); - _builder.append("gc_varray_name constant varchar2(30) := \'tv_not_to_be_null_test\';"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure cleanup_expectations"); - _builder.newLine(); - _builder.append(" "); - _builder.append("is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("begin"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut3.ut_expectation_processor.clear_expectations();"); - _builder.newLine(); - _builder.append(" "); - _builder.append("end;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure create_types"); - _builder.newLine(); - _builder.append(" "); - _builder.append("is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("pragma autonomous_transaction;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("begin"); - _builder.newLine(); - _builder.append(" "); - _builder.append("execute immediate \'create type \'||gc_object_name||\' is object (dummy number)\';"); - _builder.newLine(); - _builder.append(" "); - _builder.append("execute immediate \' create type \'||gc_nested_table_name||\' is table of number\';"); - _builder.newLine(); - _builder.append(" "); - _builder.append("execute immediate \'"); - _builder.newLine(); - _builder.append(" "); - _builder.append("create type \'||gc_varray_name||\' is varray(1) of number\';"); - _builder.newLine(); - _builder.append(" "); - _builder.append("end;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure drop_types"); - _builder.newLine(); - _builder.append(" "); - _builder.append("is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("pragma autonomous_transaction;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("begin"); - _builder.newLine(); - _builder.append(" "); - _builder.append("execute immediate \'drop type \'||gc_object_name;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("execute immediate \' drop type \'||gc_nested_table_name;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("execute immediate \'"); - _builder.newLine(); - _builder.append(" "); - _builder.append("drop type \'||gc_varray_name;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("end;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure blob_not_null"); - _builder.newLine(); - _builder.append(" "); - _builder.append("is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("begin"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--Act"); - _builder.newLine(); - _builder.append(" "); - _builder.append("execute immediate expectations_helpers.unary_expectation_block(\'not_to_be_null\', \'blob\', \'to_blob(\'\'abc\'\')\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--Assert"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut.expect(anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations())).to_be_empty();"); - _builder.newLine(); - _builder.append(" "); - _builder.append("end;"); - _builder.newLine(); - _builder.newLine(); - _builder.append("--and so on..."); - _builder.newLine(); - _builder.newLine(); - _builder.append("end;"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - Assert.assertEquals("test_expect_not_to_be_null.cleanup_expectations", parser.getPathAt(parser.toPosition(7, 1))); - Assert.assertEquals("test_expect_not_to_be_null.create_types", parser.getPathAt(parser.toPosition(13, 1))); - Assert.assertEquals("test_expect_not_to_be_null.drop_types", parser.getPathAt(parser.toPosition(23, 1))); - Assert.assertEquals("test_expect_not_to_be_null.blob_not_null", parser.getPathAt(parser.toPosition(33, 1))); - } - - @Test - public void issue7WrongPositionWithWindowsLineSeparator() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("create or replace package test_expect_not_to_be_null"); - _builder.newLine(); - _builder.append("is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suite(expectations - not_to_be_null)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suitepath(utplsql.core.expectations.unary)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%aftereach"); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure cleanup_expectations;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%beforeall"); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure create_types;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%afterall"); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure drop_types;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(Gives success for not null blob)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure blob_not_null;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(Gives success for blob with length 0)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure blob_0_length;"); - _builder.newLine(); - _builder.append(" "); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- ..."); - _builder.newLine(); - _builder.append("end test_expect_not_to_be_null;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - Assert.assertEquals("test_expect_not_to_be_null.blob_not_null", parser.getPathAt(parser.toPosition(13, 26))); - } + + // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/1 + @Test + public void issue1MatchingExprInStringLiterals() { + StringBuilder sb = new StringBuilder(); + sb.append("create or replace package body test_expect_not_to_be_null\n"); + sb.append("is\n"); + sb.append(" gc_object_name constant varchar2(30) := 't_not_to_be_null_test';\n"); + sb.append(" gc_nested_table_name constant varchar2(30) := 'tt_not_to_be_null_test';\n"); + sb.append(" gc_varray_name constant varchar2(30) := 'tv_not_to_be_null_test';\n\n"); + + sb.append(" procedure cleanup_expectations\n"); + sb.append(" is\n"); + sb.append(" begin\n"); + sb.append(" ut3.ut_expectation_processor.clear_expectations();\n"); + sb.append(" end;\n\n"); + + sb.append(" procedure create_types\n"); + sb.append(" is"); + sb.append(" pragma autonomous_transaction;\n"); + sb.append(" begin\n"); + sb.append(" execute immediate 'create type '||gc_object_name||' is object (dummy number)'\n;"); + sb.append(" execute immediate ' create type '||gc_nested_table_name||' is table of number';\n"); + sb.append(" execute immediate '\n"); + sb.append(" create type '||gc_varray_name||' is varray(1) of number';\n"); + sb.append(" end;\n\n"); + + sb.append(" procedure drop_types\n"); + sb.append(" is\n"); + sb.append(" pragma autonomous_transaction;\n"); + sb.append(" begin\n"); + sb.append(" execute immediate 'drop type '||gc_object_name;\n"); + sb.append(" execute immediate ' drop type '||gc_nested_table_name;\n"); + sb.append(" execute immediate '\n"); + sb.append(" drop type '||gc_varray_name;\n"); + sb.append(" end;\n\n"); + + sb.append(" procedure blob_not_null\n"); + sb.append(" is\n"); + sb.append(" begin\n"); + sb.append(" --Act\n"); + sb.append(" execute immediate expectations_helpers.unary_expectation_block('not_to_be_null', 'blob', 'to_blob(''abc'')');\n"); + sb.append(" --Assert\n"); + sb.append(" ut.expect(anydata.convertCollection(ut3.ut_expectation_processor.get_failed_expectations())).to_be_empty();\n"); + sb.append(" end;\n\n"); + + sb.append("--and so on...\n\n"); + + sb.append("end;"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("test_expect_not_to_be_null.cleanup_expectations", + parser.getPathAt(parser.toPosition(7, 1))); + Assert.assertEquals("test_expect_not_to_be_null.create_types", parser.getPathAt(parser.toPosition(13, 1))); + // was: '||gc_varray_name||'.drop_types + Assert.assertEquals("test_expect_not_to_be_null.drop_types", parser.getPathAt(parser.toPosition(23, 1))); + // was: '||gc_varray_name||'.blob_not_null + Assert.assertEquals("test_expect_not_to_be_null.blob_not_null", parser.getPathAt(parser.toPosition(33, 1))); + } + + @Test + // https://github.com/utPLSQL/utPLSQL-SQLDeveloper/issues/7 + public void issue7WrongPositionWithWindowsLineSeparator() { + StringBuilder sb = new StringBuilder(); + sb.append("create or replace package test_expect_not_to_be_null\n"); + sb.append("is\n"); + sb.append(" --%suite(expectations - not_to_be_null)\n"); + sb.append(" --%suitepath(utplsql.core.expectations.unary)\n\n"); + + sb.append(" --%aftereach\n"); + sb.append(" procedure cleanup_expectations;\n\n"); + + sb.append(" --%beforeall\n"); + sb.append(" procedure create_types;\n\n"); + + sb.append(" --%afterallv"); + sb.append(" procedure drop_types;\n\n"); + + sb.append(" --%test(Gives success for not null blob)\n"); + sb.append(" procedure blob_not_null;\n\n"); + + sb.append(" --%test(Gives success for blob with length 0)\n"); + sb.append(" procedure blob_0_length;\n\n"); + + sb.append(" -- ...\n"); + sb.append("end test_expect_not_to_be_null;\n"); + sb.append("/\n"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("test_expect_not_to_be_null.blob_not_null", parser.getPathAt(parser.toPosition(13, 26))); + } } From 8fe2cbd361686c49484739abce5fadca166a59bb Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 23:56:52 +0200 Subject: [PATCH 247/286] rename UtplsqlParserTest.xtend to UtplsqlParserTest.java --- .../parser/{UtplsqlParserTest.xtend => UtplsqlParserTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/parser/{UtplsqlParserTest.xtend => UtplsqlParserTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java From f000d8d8e19ddc8d80ff6a316e70bf482954e169 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Thu, 28 May 2020 23:57:11 +0200 Subject: [PATCH 248/286] add UtplsqlParserTest.java generated by Xtend 2.20.0 --- .../sqldev/test/parser/UtplsqlParserTest.java | 805 ++++++++++++------ 1 file changed, 525 insertions(+), 280 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java index b49293ac..17287368 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,285 +13,530 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.parser +package org.utplsql.sqldev.test.parser; -import org.junit.AfterClass -import org.junit.Assert -import org.junit.BeforeClass -import org.junit.Test -import org.springframework.jdbc.BadSqlGrammarException -import org.utplsql.sqldev.parser.UtplsqlParser -import org.utplsql.sqldev.test.AbstractJdbcTest - -class UtplsqlParserTest extends AbstractJdbcTest { - - static val sqlScript = ''' - PROMPT - PROMPT Install utPLSQL test package - PROMPT - - /* - * some comment - */ - CREATE OR REPLACE PACKAGE pkg IS - -- %suite - -- %rollback(manual) - - -- %test - PROCEDURE p (in_p1 INTEGER); - FUNCTION f (in_p1 INTEGER) RETURN INTEGER; - END pkg; - / - SHOW ERRORS - - CREATE OR REPLACE PACKAGE BODY "SCOTT"."PKG" IS - PROCEDURE "P" (in_p1 INTEGER) IS - BEGIN - NULL; - END p; - - /* comment 1 */ - -- comment 2 - /* comment 3 */ - -- comment 4 - - FUNCTION "F" (in_p1 INTEGER) RETURN INTEGER IS - BEGIN - RETURN 1; - END f; - END pkg; - / - SHOW ERRORS - ''' - - @BeforeClass - @AfterClass - def static void setupAndTeardown() { - try { - jdbcTemplate.execute("DROP PACKAGE pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - } - - @Test - def packageWithoutConnection() { - val parser = new UtplsqlParser(sqlScript) - val objects = parser.getObjects - Assert.assertEquals(2, objects.size) - Assert.assertEquals("pkg", objects.get(0).name) - Assert.assertEquals('''"SCOTT"."PKG"'''.toString, objects.get(1).name) - Assert.assertTrue(objects.get(0).position < objects.get(1).position) - val units = parser.getUnits - Assert.assertEquals(2, units.size) - Assert.assertEquals("p", units.get(0).name) - Assert.assertEquals('''"P"'''.toString, units.get(1).name) - Assert.assertTrue(units.get(0).position < units.get(1).position) - Assert.assertEquals("", parser.getPathAt(0)) - Assert.assertEquals("", parser.getPathAt(parser.toPosition(3,6))) - Assert.assertEquals("pkg", parser.getPathAt(parser.toPosition(4,1))) - Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(10,33))) - Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(13,1))) - Assert.assertEquals("SCOTT.PKG.p", parser.getPathAt(parser.toPosition(19,1))) - Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(22,9))) - Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(22,10))) - Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(29,1))) - } - - @Test - def packageWithConnection() { - val plsql = ''' - CREATE OR REPLACE PACKAGE pkg IS - -- %suite - -- %rollback(manual) - - -- %test - PROCEDURE p (in_p1 INTEGER); - FUNCTION f (in_p1 INTEGER) RETURN INTEGER; - END pkg; - ''' - var parser = new UtplsqlParser(plsql, dataSource.connection, null) - Assert.assertEquals(0, parser.getObjects.size) - Assert.assertEquals(0, parser.getUnits.size) - jdbcTemplate.execute(plsql) - parser = new UtplsqlParser(plsql, dataSource.connection, null) - Assert.assertEquals(1, parser.getObjects.size) - Assert.assertEquals(1, parser.getUnits.size) - for (stmt : getStatements(sqlScript)) { - jdbcTemplate.execute(stmt) - } - parser = new UtplsqlParser(sqlScript, dataSource.connection, null) - Assert.assertEquals(2, parser.getObjects.size) - Assert.assertEquals(2, parser.getUnits.size) - Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(13,1))) - Assert.assertEquals("SCOTT.PKG.p", parser.getPathAt(parser.toPosition(19,1))) - setupAndTeardown - } - - @Test - def procedure() { - val plsql = ''' - create or replace procedure z - is - null; - end; - / - ''' - val parser = new UtplsqlParser(plsql) - Assert.assertEquals("z", parser.getObjectAt(0).name) - Assert.assertEquals("PROCEDURE", parser.getObjectAt(0).type) - } - - @Test - def function() { - val plsql = ''' - create or replace procedure z - is - null; - end; - / - - create or replace function f return number is - begin - null; - end; - / - ''' - val parser = new UtplsqlParser(plsql) - Assert.assertEquals("f", parser.getObjectAt(parser.toPosition(8,1)).name) - Assert.assertEquals("FUNCTION", parser.getObjectAt(parser.toPosition(8,1)).type) - } - - @Test - def type() { - val plsql = ''' - create or replace type t force is - object ( - a number, - b number, - c varchar2(10), - member procedure p(self in t) - ) - end; - / - ''' - val parser = new UtplsqlParser(plsql) - Assert.assertEquals("t", parser.getObjectAt(0).name) - Assert.assertEquals("TYPE", parser.getObjectAt(0).type) - } - - @Test - def typeBody() { - val plsql = ''' - create or replace type body t force is - member procedure p(self in t) is - begin - null; - end; - end; - / - ''' - val parser = new UtplsqlParser(plsql) - Assert.assertEquals("t", parser.getObjectAt(0).name) - Assert.assertEquals("TYPE", parser.getObjectAt(0).type) - } - - @Test - def unknown() { - val plsql = ''' - create or replace unknown u is - begin - null; - end; - / - ''' - val parser = new UtplsqlParser(plsql) - Assert.assertEquals(null, parser.getObjectAt(0)) - } - - @Test - def void StartLineSpec() { - val plsql = ''' - CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is - --%suite(JUnit testing) - --%suitepath(a) - - --%context(test context) - - --%test(test 1 - OK) - PRoCeDURE test_1_ok; - - --%test(test 2 - NOK) - PROCEDURE test_2_nok; - - --%test(test 3 - disabled) - --%disabled - PROCEDURE test_3_disabled; - - --%test(test 4 - errored) - PROCEDURE test_4_errored; - - --%test(test 5 - warnings) - PROCEDURE test_5_warnings; - --%endcontext - - function my_Func (p IN number) RETURN BOOLEAN; - END; - ''' - val parser = new UtplsqlParser(plsql) - val first = parser.getLineOf('test_1_ok') - Assert.assertEquals(8, first) - val last = parser.getLineOf('test_5_warnings') - Assert.assertEquals(21, last) - } - - @Test - def void StartLineBody() { - val plsql = ''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS - PROCEDURE test_1_ok IS - BEGIN - dbms_output.put_line('start test 1'); - dbms_session.sleep(1); - ut.expect(1).to_equal(1); - dbms_output.put_line('end test 1'); - END; - - PROCEDURE test_2_nok IS - BEGIN - dbms_output.put_line('start test 2'); - dbms_session.sleep(2); - ut.expect(1, 'first assert.').to_equal(2); - ut.expect(1, 'second assert.').to_equal(2); - dbms_output.put_line('end test 2'); - END; - - PROCEDURE test_3_disabled IS - BEGIN - NULL; - END; - - PROCEDURE test_4_errored IS - BEGIN - EXECUTE IMMEDIATE 'bla bla'; - END; - - PROCEDURE test_5_warnings IS - BEGIN - COMMIT; -- will raise a warning - ut.expect(1).to_equal(1); - END; - - FUNCTION my_Func (p IN number) RETURN BOOLEAN IS - RETURN TRUE; - END; - END; - ''' - val parser = new UtplsqlParser(plsql) - val first = parser.getLineOf('test_1_ok') - Assert.assertEquals(2, first) - val last = parser.getLineOf('test_5_warnings') - Assert.assertEquals(29, last) - } +import java.sql.Connection; +import java.util.List; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.Functions.Function0; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.jdbc.BadSqlGrammarException; +import org.utplsql.sqldev.model.parser.PlsqlObject; +import org.utplsql.sqldev.model.parser.Unit; +import org.utplsql.sqldev.parser.UtplsqlParser; +import org.utplsql.sqldev.test.AbstractJdbcTest; +@SuppressWarnings("all") +public class UtplsqlParserTest extends AbstractJdbcTest { + private static final String sqlScript = new Function0() { + public String apply() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("PROMPT"); + _builder.newLine(); + _builder.append("PROMPT Install utPLSQL test package"); + _builder.newLine(); + _builder.append("PROMPT"); + _builder.newLine(); + _builder.newLine(); + _builder.append("/*"); + _builder.newLine(); + _builder.append(" "); + _builder.append("* some comment"); + _builder.newLine(); + _builder.append(" "); + _builder.append("*/"); + _builder.newLine(); + _builder.append("CREATE OR REPLACE PACKAGE pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %rollback(manual)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE p (in_p1 INTEGER);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("FUNCTION f (in_p1 INTEGER) RETURN INTEGER;"); + _builder.newLine(); + _builder.append("END pkg;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + _builder.append("SHOW ERRORS"); + _builder.newLine(); + _builder.newLine(); + _builder.append("CREATE OR REPLACE PACKAGE BODY \"SCOTT\".\"PKG\" IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE \"P\" (in_p1 INTEGER) IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("NULL;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END p;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("/* comment 1 */"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- comment 2"); + _builder.newLine(); + _builder.append(" "); + _builder.append("/* comment 3 */"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- comment 4"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("FUNCTION \"F\" (in_p1 INTEGER) RETURN INTEGER IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("RETURN 1;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END f;"); + _builder.newLine(); + _builder.append("END pkg;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + _builder.append("SHOW ERRORS"); + _builder.newLine(); + return _builder.toString(); + } + }.apply(); + + @BeforeClass + @AfterClass + public static void setupAndTeardown() { + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE pkg"); + } catch (final Throwable _t) { + if (_t instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t); + } + } + } + + @Test + public void packageWithoutConnection() { + final UtplsqlParser parser = new UtplsqlParser(UtplsqlParserTest.sqlScript); + final List objects = parser.getObjects(); + Assert.assertEquals(2, objects.size()); + Assert.assertEquals("pkg", objects.get(0).getName()); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("\"SCOTT\".\"PKG\""); + Assert.assertEquals(_builder.toString(), objects.get(1).getName()); + Integer _position = objects.get(0).getPosition(); + Integer _position_1 = objects.get(1).getPosition(); + boolean _lessThan = (_position.compareTo(_position_1) < 0); + Assert.assertTrue(_lessThan); + final List units = parser.getUnits(); + Assert.assertEquals(2, units.size()); + Assert.assertEquals("p", units.get(0).getName()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("\"P\""); + Assert.assertEquals(_builder_1.toString(), units.get(1).getName()); + Integer _position_2 = units.get(0).getPosition(); + Integer _position_3 = units.get(1).getPosition(); + boolean _lessThan_1 = (_position_2.compareTo(_position_3) < 0); + Assert.assertTrue(_lessThan_1); + Assert.assertEquals("", parser.getPathAt(0)); + Assert.assertEquals("", parser.getPathAt(parser.toPosition(3, 6))); + Assert.assertEquals("pkg", parser.getPathAt(parser.toPosition(4, 1))); + Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(10, 33))); + Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(13, 1))); + Assert.assertEquals("SCOTT.PKG.p", parser.getPathAt(parser.toPosition(19, 1))); + Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(22, 9))); + Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(22, 10))); + Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(29, 1))); + } + + @Test + public void packageWithConnection() { + try { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %suite"); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %rollback(manual)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("-- %test"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE p (in_p1 INTEGER);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("FUNCTION f (in_p1 INTEGER) RETURN INTEGER;"); + _builder.newLine(); + _builder.append("END pkg;"); + _builder.newLine(); + final String plsql = _builder.toString(); + Connection _connection = AbstractJdbcTest.dataSource.getConnection(); + UtplsqlParser parser = new UtplsqlParser(plsql, _connection, null); + Assert.assertEquals(0, parser.getObjects().size()); + Assert.assertEquals(0, parser.getUnits().size()); + AbstractJdbcTest.jdbcTemplate.execute(plsql); + Connection _connection_1 = AbstractJdbcTest.dataSource.getConnection(); + UtplsqlParser _utplsqlParser = new UtplsqlParser(plsql, _connection_1, null); + parser = _utplsqlParser; + Assert.assertEquals(1, parser.getObjects().size()); + Assert.assertEquals(1, parser.getUnits().size()); + List _statements = AbstractJdbcTest.getStatements(UtplsqlParserTest.sqlScript); + for (final String stmt : _statements) { + AbstractJdbcTest.jdbcTemplate.execute(stmt); + } + Connection _connection_2 = AbstractJdbcTest.dataSource.getConnection(); + UtplsqlParser _utplsqlParser_1 = new UtplsqlParser(UtplsqlParserTest.sqlScript, _connection_2, null); + parser = _utplsqlParser_1; + Assert.assertEquals(2, parser.getObjects().size()); + Assert.assertEquals(2, parser.getUnits().size()); + Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(13, 1))); + Assert.assertEquals("SCOTT.PKG.p", parser.getPathAt(parser.toPosition(19, 1))); + UtplsqlParserTest.setupAndTeardown(); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void procedure() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("create or replace procedure z"); + _builder.newLine(); + _builder.append("is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("null;"); + _builder.newLine(); + _builder.append("end;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("z", parser.getObjectAt(0).getName()); + Assert.assertEquals("PROCEDURE", parser.getObjectAt(0).getType()); + } + + @Test + public void function() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("create or replace procedure z"); + _builder.newLine(); + _builder.append("is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("null;"); + _builder.newLine(); + _builder.append("end;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + _builder.newLine(); + _builder.append("create or replace function f return number is"); + _builder.newLine(); + _builder.append("begin"); + _builder.newLine(); + _builder.append(" "); + _builder.append("null;"); + _builder.newLine(); + _builder.append("end;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("f", parser.getObjectAt(parser.toPosition(8, 1)).getName()); + Assert.assertEquals("FUNCTION", parser.getObjectAt(parser.toPosition(8, 1)).getType()); + } + + @Test + public void type() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("create or replace type t force is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("object ("); + _builder.newLine(); + _builder.append(" "); + _builder.append("a number,"); + _builder.newLine(); + _builder.append(" "); + _builder.append("b number,"); + _builder.newLine(); + _builder.append(" "); + _builder.append("c varchar2(10),"); + _builder.newLine(); + _builder.append(" "); + _builder.append("member procedure p(self in t)"); + _builder.newLine(); + _builder.append(" "); + _builder.append(")"); + _builder.newLine(); + _builder.append("end;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("t", parser.getObjectAt(0).getName()); + Assert.assertEquals("TYPE", parser.getObjectAt(0).getType()); + } + + @Test + public void typeBody() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("create or replace type body t force is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("member procedure p(self in t) is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("begin"); + _builder.newLine(); + _builder.append(" "); + _builder.append("null;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("end;"); + _builder.newLine(); + _builder.append("end;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("t", parser.getObjectAt(0).getName()); + Assert.assertEquals("TYPE", parser.getObjectAt(0).getType()); + } + + @Test + public void unknown() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("create or replace unknown u is"); + _builder.newLine(); + _builder.append("begin"); + _builder.newLine(); + _builder.append(" "); + _builder.append("null;"); + _builder.newLine(); + _builder.append("end;"); + _builder.newLine(); + _builder.append("/"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals(null, parser.getObjectAt(0)); + } + + @Test + public void StartLineSpec() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suite(JUnit testing)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suitepath(a)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%context(test context)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 1 - OK) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PRoCeDURE test_1_ok;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 2 - NOK)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_2_nok;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 3 - disabled)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%disabled"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_3_disabled;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 4 - errored)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_4_errored;"); + _builder.newLine(); + _builder.append(" "); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 5 - warnings)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_5_warnings;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%endcontext"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("function my_Func (p IN number) RETURN BOOLEAN;"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + final int first = parser.getLineOf("test_1_ok"); + Assert.assertEquals(8, first); + final int last = parser.getLineOf("test_5_warnings"); + Assert.assertEquals(21, last); + } + + @Test + public void StartLineBody() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_1_ok IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_output.put_line(\'start test 1\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_session.sleep(1);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut.expect(1).to_equal(1);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_output.put_line(\'end test 1\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_2_nok IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_output.put_line(\'start test 2\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_session.sleep(2);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut.expect(1, \'first assert.\').to_equal(2);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("ut.expect(1, \'second assert.\').to_equal(2);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("dbms_output.put_line(\'end test 2\');"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.append(" "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_3_disabled IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("NULL;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_4_errored IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("EXECUTE IMMEDIATE \'bla bla\';"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_5_warnings IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("BEGIN"); + _builder.newLine(); + _builder.append(" "); + _builder.append("COMMIT; -- will raise a warning"); + _builder.newLine(); + _builder.append("\t "); + _builder.append("ut.expect(1).to_equal(1);"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("FUNCTION my_Func (p IN number) RETURN BOOLEAN IS"); + _builder.newLine(); + _builder.append(" "); + _builder.append("RETURN TRUE;"); + _builder.newLine(); + _builder.append(" "); + _builder.append("END;"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + final String plsql = _builder.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + final int first = parser.getLineOf("test_1_ok"); + Assert.assertEquals(2, first); + final int last = parser.getLineOf("test_5_warnings"); + Assert.assertEquals(29, last); + } } From b617a36afc6dbc357a92bd1ac6106096dfe448f5 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 01:17:03 +0200 Subject: [PATCH 249/286] convert UtplsqlParserTest to Java, removing Xtend dependencies --- .../sqldev/test/parser/UtplsqlParserTest.java | 783 ++++++------------ 1 file changed, 270 insertions(+), 513 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java index 17287368..5694eb3f 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/UtplsqlParserTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,528 +15,285 @@ */ package org.utplsql.sqldev.test.parser; -import java.sql.Connection; import java.util.List; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.Functions.Function0; -import org.junit.AfterClass; + +import org.junit.After; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.jdbc.BadSqlGrammarException; +import org.utplsql.sqldev.model.DatabaseTools; import org.utplsql.sqldev.model.parser.PlsqlObject; import org.utplsql.sqldev.model.parser.Unit; import org.utplsql.sqldev.parser.UtplsqlParser; import org.utplsql.sqldev.test.AbstractJdbcTest; -@SuppressWarnings("all") public class UtplsqlParserTest extends AbstractJdbcTest { - private static final String sqlScript = new Function0() { - public String apply() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("PROMPT"); - _builder.newLine(); - _builder.append("PROMPT Install utPLSQL test package"); - _builder.newLine(); - _builder.append("PROMPT"); - _builder.newLine(); - _builder.newLine(); - _builder.append("/*"); - _builder.newLine(); - _builder.append(" "); - _builder.append("* some comment"); - _builder.newLine(); - _builder.append(" "); - _builder.append("*/"); - _builder.newLine(); - _builder.append("CREATE OR REPLACE PACKAGE pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %rollback(manual)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE p (in_p1 INTEGER);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("FUNCTION f (in_p1 INTEGER) RETURN INTEGER;"); - _builder.newLine(); - _builder.append("END pkg;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - _builder.append("SHOW ERRORS"); - _builder.newLine(); - _builder.newLine(); - _builder.append("CREATE OR REPLACE PACKAGE BODY \"SCOTT\".\"PKG\" IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE \"P\" (in_p1 INTEGER) IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("NULL;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END p;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("/* comment 1 */"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- comment 2"); - _builder.newLine(); - _builder.append(" "); - _builder.append("/* comment 3 */"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- comment 4"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("FUNCTION \"F\" (in_p1 INTEGER) RETURN INTEGER IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("RETURN 1;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END f;"); - _builder.newLine(); - _builder.append("END pkg;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - _builder.append("SHOW ERRORS"); - _builder.newLine(); - return _builder.toString(); + + private String getSqlScript() { + StringBuilder sb = new StringBuilder(); + sb.append("PROMPT\n"); + sb.append("PROMPT Install utPLSQL test package\n"); + sb.append("PROMPT\n\n"); + + sb.append("/*\n"); + sb.append(" * some comment\n"); + sb.append(" */\n"); + sb.append("CREATE OR REPLACE PACKAGE pkg IS\n"); + sb.append(" -- %suite\n"); + sb.append(" -- %rollback(manual)\n\n"); + + sb.append(" -- %test\n"); + sb.append(" PROCEDURE p (in_p1 INTEGER);\n"); + sb.append(" FUNCTION f (in_p1 INTEGER) RETURN INTEGER;\n"); + sb.append("END pkg;\n"); + sb.append("/\n"); + sb.append("SHOW ERRORS\n\n"); + + sb.append("CREATE OR REPLACE PACKAGE BODY \"SCOTT\".\"PKG\" IS\n"); + sb.append(" PROCEDURE \"P\" (in_p1 INTEGER) IS\n"); + sb.append(" BEGIN\n"); + sb.append(" NULL;\n"); + sb.append(" END p;\n\n"); + + sb.append(" /* comment 1 */\n"); + sb.append(" -- comment 2\n"); + sb.append(" /* comment 3 */\n"); + sb.append(" -- comment 4\n\n"); + + sb.append(" FUNCTION \"F\" (in_p1 INTEGER) RETURN INTEGER IS\n"); + sb.append(" BEGIN\n"); + sb.append(" RETURN 1;\n"); + sb.append(" END f;\n"); + sb.append("END pkg;\n"); + sb.append("/\n"); + sb.append("SHOW ERRORS\n"); + return sb.toString(); + } + + @Before + @After + public void setupAndTeardown() { + executeAndIgnore(jdbcTemplate, "DROP PACKAGE pkg"); + } + + @Test + public void packageWithoutConnection() { + final UtplsqlParser parser = new UtplsqlParser(getSqlScript()); + final List objects = parser.getObjects(); + Assert.assertEquals(2, objects.size()); + Assert.assertEquals("pkg", objects.get(0).getName()); + Assert.assertEquals("\"SCOTT\".\"PKG\"", objects.get(1).getName()); + Assert.assertTrue(objects.get(0).getPosition() < objects.get(1).getPosition()); + final List units = parser.getUnits(); + Assert.assertEquals(2, units.size()); + Assert.assertEquals("p", units.get(0).getName()); + Assert.assertEquals("\"P\"", units.get(1).getName()); + Assert.assertTrue(units.get(0).getPosition() < units.get(1).getPosition()); + Assert.assertEquals("", parser.getPathAt(0)); + Assert.assertEquals("", parser.getPathAt(parser.toPosition(3, 6))); + Assert.assertEquals("pkg", parser.getPathAt(parser.toPosition(4, 1))); + Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(10, 33))); + Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(13, 1))); + Assert.assertEquals("SCOTT.PKG.p", parser.getPathAt(parser.toPosition(19, 1))); + Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(22, 9))); + Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(22, 10))); + Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(29, 1))); } - }.apply(); - - @BeforeClass - @AfterClass - public static void setupAndTeardown() { - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE pkg"); - } catch (final Throwable _t) { - if (_t instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t); - } + + @Test + public void packageWithConnection() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE pkg IS\n"); + sb.append(" -- %suite\n"); + sb.append(" -- %rollback(manual)\n\n"); + + sb.append(" -- %test\n"); + sb.append(" PROCEDURE p (in_p1 INTEGER);\n"); + sb.append(" FUNCTION f (in_p1 INTEGER) RETURN INTEGER;\n"); + sb.append("END pkg;"); + final String plsql = sb.toString(); + UtplsqlParser parser = new UtplsqlParser(plsql, DatabaseTools.getConnection(dataSource), null); + Assert.assertEquals(0, parser.getObjects().size()); + Assert.assertEquals(0, parser.getUnits().size()); + + jdbcTemplate.execute(plsql); + parser = new UtplsqlParser(plsql, DatabaseTools.getConnection(dataSource), null); + Assert.assertEquals(1, parser.getObjects().size()); + Assert.assertEquals(1, parser.getUnits().size()); + + for (final String stmt : getStatements(getSqlScript())) { + jdbcTemplate.execute(stmt); + } + parser = new UtplsqlParser(getSqlScript(), DatabaseTools.getConnection(dataSource), null); + Assert.assertEquals(2, parser.getObjects().size()); + Assert.assertEquals(2, parser.getUnits().size()); + Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(13, 1))); + Assert.assertEquals("SCOTT.PKG.p", parser.getPathAt(parser.toPosition(19, 1))); + } + + @Test + public void procedure() { + StringBuilder sb = new StringBuilder(); + sb.append("create or replace procedure z\n"); + sb.append("is\n"); + sb.append(" null;\n"); + sb.append("end;\n"); + sb.append("/\n"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("z", parser.getObjectAt(0).getName()); + Assert.assertEquals("PROCEDURE", parser.getObjectAt(0).getType()); } - } - - @Test - public void packageWithoutConnection() { - final UtplsqlParser parser = new UtplsqlParser(UtplsqlParserTest.sqlScript); - final List objects = parser.getObjects(); - Assert.assertEquals(2, objects.size()); - Assert.assertEquals("pkg", objects.get(0).getName()); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("\"SCOTT\".\"PKG\""); - Assert.assertEquals(_builder.toString(), objects.get(1).getName()); - Integer _position = objects.get(0).getPosition(); - Integer _position_1 = objects.get(1).getPosition(); - boolean _lessThan = (_position.compareTo(_position_1) < 0); - Assert.assertTrue(_lessThan); - final List units = parser.getUnits(); - Assert.assertEquals(2, units.size()); - Assert.assertEquals("p", units.get(0).getName()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("\"P\""); - Assert.assertEquals(_builder_1.toString(), units.get(1).getName()); - Integer _position_2 = units.get(0).getPosition(); - Integer _position_3 = units.get(1).getPosition(); - boolean _lessThan_1 = (_position_2.compareTo(_position_3) < 0); - Assert.assertTrue(_lessThan_1); - Assert.assertEquals("", parser.getPathAt(0)); - Assert.assertEquals("", parser.getPathAt(parser.toPosition(3, 6))); - Assert.assertEquals("pkg", parser.getPathAt(parser.toPosition(4, 1))); - Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(10, 33))); - Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(13, 1))); - Assert.assertEquals("SCOTT.PKG.p", parser.getPathAt(parser.toPosition(19, 1))); - Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(22, 9))); - Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(22, 10))); - Assert.assertEquals("SCOTT.PKG.P", parser.getPathAt(parser.toPosition(29, 1))); - } - - @Test - public void packageWithConnection() { - try { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %suite"); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %rollback(manual)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("-- %test"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE p (in_p1 INTEGER);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("FUNCTION f (in_p1 INTEGER) RETURN INTEGER;"); - _builder.newLine(); - _builder.append("END pkg;"); - _builder.newLine(); - final String plsql = _builder.toString(); - Connection _connection = AbstractJdbcTest.dataSource.getConnection(); - UtplsqlParser parser = new UtplsqlParser(plsql, _connection, null); - Assert.assertEquals(0, parser.getObjects().size()); - Assert.assertEquals(0, parser.getUnits().size()); - AbstractJdbcTest.jdbcTemplate.execute(plsql); - Connection _connection_1 = AbstractJdbcTest.dataSource.getConnection(); - UtplsqlParser _utplsqlParser = new UtplsqlParser(plsql, _connection_1, null); - parser = _utplsqlParser; - Assert.assertEquals(1, parser.getObjects().size()); - Assert.assertEquals(1, parser.getUnits().size()); - List _statements = AbstractJdbcTest.getStatements(UtplsqlParserTest.sqlScript); - for (final String stmt : _statements) { - AbstractJdbcTest.jdbcTemplate.execute(stmt); - } - Connection _connection_2 = AbstractJdbcTest.dataSource.getConnection(); - UtplsqlParser _utplsqlParser_1 = new UtplsqlParser(UtplsqlParserTest.sqlScript, _connection_2, null); - parser = _utplsqlParser_1; - Assert.assertEquals(2, parser.getObjects().size()); - Assert.assertEquals(2, parser.getUnits().size()); - Assert.assertEquals("pkg.p", parser.getPathAt(parser.toPosition(13, 1))); - Assert.assertEquals("SCOTT.PKG.p", parser.getPathAt(parser.toPosition(19, 1))); - UtplsqlParserTest.setupAndTeardown(); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + public void function() { + StringBuilder sb = new StringBuilder(); + sb.append("create or replace procedure z\n"); + sb.append("is\n"); + sb.append(" null;\n"); + sb.append("end;\n"); + sb.append("/\n\n"); + + sb.append("create or replace function f return number is\n"); + sb.append("begin\n"); + sb.append(" null;\n"); + sb.append("end;\n"); + sb.append("/\n"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("f", parser.getObjectAt(parser.toPosition(8, 1)).getName()); + Assert.assertEquals("FUNCTION", parser.getObjectAt(parser.toPosition(8, 1)).getType()); + } + + @Test + public void type() { + StringBuilder sb = new StringBuilder(); + sb.append("create or replace type t force is\n"); + sb.append(" object (\n"); + sb.append(" a number,\n"); + sb.append(" b number,\n"); + sb.append(" c varchar2(10),\n"); + sb.append(" member procedure p(self in t)\n"); + sb.append(" )\n"); + sb.append("end;\n"); + sb.append("/\n"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("t", parser.getObjectAt(0).getName()); + Assert.assertEquals("TYPE", parser.getObjectAt(0).getType()); + } + + @Test + public void typeBody() { + StringBuilder sb = new StringBuilder(); + sb.append("create or replace type body t force is\n"); + sb.append(" member procedure p(self in t) is\n"); + sb.append(" begin\n"); + sb.append(" null;\n"); + sb.append(" end;\n"); + sb.append("end;\n"); + sb.append("/\n"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals("t", parser.getObjectAt(0).getName()); + Assert.assertEquals("TYPE", parser.getObjectAt(0).getType()); + } + + @Test + public void unknown() { + StringBuilder sb = new StringBuilder(); + sb.append("create or replace unknown u is\n"); + sb.append("begin\n"); + sb.append(" null;\n"); + sb.append("end;\n"); + sb.append("/\n"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + Assert.assertEquals(null, parser.getObjectAt(0)); + } + + @Test + public void StartLineSpec() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is\n"); + sb.append(" --%suite(JUnit testing)\n"); + sb.append(" --%suitepath(a)\n\n"); + + sb.append(" --%context(test context)\n\n"); + + sb.append(" --%test(test 1 - OK)\n"); + sb.append(" PRoCeDURE test_1_ok;\n\n"); + + sb.append(" --%test(test 2 - NOK)\n"); + sb.append(" PROCEDURE test_2_nok;\n\n"); + + sb.append(" --%test(test 3 - disabled)\n"); + sb.append(" --%disabled\n"); + sb.append(" PROCEDURE test_3_disabled;\n\n"); + + sb.append(" --%test(test 4 - errored)\n"); + sb.append(" PROCEDURE test_4_errored;\n\n"); + + sb.append(" --%test(test 5 - warnings)\n"); + sb.append(" PROCEDURE test_5_warnings;\n"); + sb.append(" --%endcontext\n\n"); + + sb.append(" function my_Func (p IN number) RETURN BOOLEAN;\n"); + sb.append("END;"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + final int first = parser.getLineOf("test_1_ok"); + Assert.assertEquals(8, first); + final int last = parser.getLineOf("test_5_warnings"); + Assert.assertEquals(21, last); + } + + @Test + public void StartLineBody() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS\n"); + sb.append(" PROCEDURE test_1_ok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line('start test 1');\n"); + sb.append(" dbms_session.sleep(1);\n"); + sb.append(" ut.expect(1).to_equal(1);\n"); + sb.append(" dbms_output.put_line('end test 1');\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_2_nok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line('start test 2');\n"); + sb.append(" dbms_session.sleep(2);\n"); + sb.append(" ut.expect(1, 'first assert.').to_equal(2);\n"); + sb.append(" ut.expect(1, 'second assert.').to_equal(2);\n"); + sb.append(" dbms_output.put_line('end test 2');\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_3_disabled IS\n"); + sb.append(" BEGIN\n"); + sb.append(" NULL;\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_4_errored IS\n"); + sb.append(" BEGIN\n"); + sb.append(" EXECUTE IMMEDIATE 'bla bla';\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_5_warnings IS\n"); + sb.append(" BEGIN\n"); + sb.append(" COMMIT; -- will raise a warning\n"); + sb.append(" ut.expect(1).to_equal(1);\n"); + sb.append(" END;\n\n"); + + sb.append(" FUNCTION my_Func (p IN number) RETURN BOOLEAN IS\n"); + sb.append(" RETURN TRUE;\n"); + sb.append(" END;\n"); + sb.append("END;"); + final String plsql = sb.toString(); + final UtplsqlParser parser = new UtplsqlParser(plsql); + final int first = parser.getLineOf("test_1_ok"); + Assert.assertEquals(2, first); + final int last = parser.getLineOf("test_5_warnings"); + Assert.assertEquals(29, last); } - } - - @Test - public void procedure() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("create or replace procedure z"); - _builder.newLine(); - _builder.append("is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("null;"); - _builder.newLine(); - _builder.append("end;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - Assert.assertEquals("z", parser.getObjectAt(0).getName()); - Assert.assertEquals("PROCEDURE", parser.getObjectAt(0).getType()); - } - - @Test - public void function() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("create or replace procedure z"); - _builder.newLine(); - _builder.append("is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("null;"); - _builder.newLine(); - _builder.append("end;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - _builder.newLine(); - _builder.append("create or replace function f return number is"); - _builder.newLine(); - _builder.append("begin"); - _builder.newLine(); - _builder.append(" "); - _builder.append("null;"); - _builder.newLine(); - _builder.append("end;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - Assert.assertEquals("f", parser.getObjectAt(parser.toPosition(8, 1)).getName()); - Assert.assertEquals("FUNCTION", parser.getObjectAt(parser.toPosition(8, 1)).getType()); - } - - @Test - public void type() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("create or replace type t force is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("object ("); - _builder.newLine(); - _builder.append(" "); - _builder.append("a number,"); - _builder.newLine(); - _builder.append(" "); - _builder.append("b number,"); - _builder.newLine(); - _builder.append(" "); - _builder.append("c varchar2(10),"); - _builder.newLine(); - _builder.append(" "); - _builder.append("member procedure p(self in t)"); - _builder.newLine(); - _builder.append(" "); - _builder.append(")"); - _builder.newLine(); - _builder.append("end;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - Assert.assertEquals("t", parser.getObjectAt(0).getName()); - Assert.assertEquals("TYPE", parser.getObjectAt(0).getType()); - } - - @Test - public void typeBody() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("create or replace type body t force is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("member procedure p(self in t) is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("begin"); - _builder.newLine(); - _builder.append(" "); - _builder.append("null;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("end;"); - _builder.newLine(); - _builder.append("end;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - Assert.assertEquals("t", parser.getObjectAt(0).getName()); - Assert.assertEquals("TYPE", parser.getObjectAt(0).getType()); - } - - @Test - public void unknown() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("create or replace unknown u is"); - _builder.newLine(); - _builder.append("begin"); - _builder.newLine(); - _builder.append(" "); - _builder.append("null;"); - _builder.newLine(); - _builder.append("end;"); - _builder.newLine(); - _builder.append("/"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - Assert.assertEquals(null, parser.getObjectAt(0)); - } - - @Test - public void StartLineSpec() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suite(JUnit testing)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suitepath(a)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%context(test context)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 1 - OK) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PRoCeDURE test_1_ok;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 2 - NOK)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_2_nok;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 3 - disabled)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%disabled"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_3_disabled;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 4 - errored)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_4_errored;"); - _builder.newLine(); - _builder.append(" "); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 5 - warnings)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_5_warnings;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%endcontext"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("function my_Func (p IN number) RETURN BOOLEAN;"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - final int first = parser.getLineOf("test_1_ok"); - Assert.assertEquals(8, first); - final int last = parser.getLineOf("test_5_warnings"); - Assert.assertEquals(21, last); - } - - @Test - public void StartLineBody() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_1_ok IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_output.put_line(\'start test 1\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_session.sleep(1);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut.expect(1).to_equal(1);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_output.put_line(\'end test 1\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_2_nok IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_output.put_line(\'start test 2\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_session.sleep(2);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut.expect(1, \'first assert.\').to_equal(2);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("ut.expect(1, \'second assert.\').to_equal(2);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("dbms_output.put_line(\'end test 2\');"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.append(" "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_3_disabled IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("NULL;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_4_errored IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("EXECUTE IMMEDIATE \'bla bla\';"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_5_warnings IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("BEGIN"); - _builder.newLine(); - _builder.append(" "); - _builder.append("COMMIT; -- will raise a warning"); - _builder.newLine(); - _builder.append("\t "); - _builder.append("ut.expect(1).to_equal(1);"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("FUNCTION my_Func (p IN number) RETURN BOOLEAN IS"); - _builder.newLine(); - _builder.append(" "); - _builder.append("RETURN TRUE;"); - _builder.newLine(); - _builder.append(" "); - _builder.append("END;"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - final String plsql = _builder.toString(); - final UtplsqlParser parser = new UtplsqlParser(plsql); - final int first = parser.getLineOf("test_1_ok"); - Assert.assertEquals(2, first); - final int last = parser.getLineOf("test_5_warnings"); - Assert.assertEquals(29, last); - } } From d9e1a04fbfd264567e41532aff0a1ed279bd425d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 01:58:05 +0200 Subject: [PATCH 250/286] use orElse instead of get to handle !isPresent() for Optionals --- .../test/coverage/CodeCoverageReporterTest.java | 2 +- .../org/utplsql/sqldev/test/dal/DalBugFixTest.java | 6 ++++-- .../utplsql/sqldev/test/parser/SqlDevParserTest.java | 12 ++++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java index 5f8f0bd9..05757517 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java @@ -93,7 +93,7 @@ private Path getNewestOutputFile() { final String msg = "Cannot get newest output file in " + dir.getAbsolutePath() + "."; throw new GenericRuntimeException(msg, e); } - return last.get(); + return last.orElse(null); } @Test diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java index 5b474c00..78fafe57 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalBugFixTest.java @@ -45,7 +45,8 @@ public void issue54FolderIconForSuitesWithoutTests() { final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); final List actualNodes = dao.runnables(); final Node pkg = actualNodes.stream().filter(it -> it.getId().equals("SCOTT:junit_utplsql_test_pkg")) - .findFirst().get(); + .findFirst().orElse(null); + Assert.assertNotNull(pkg); Assert.assertEquals("FOLDER_ICON", pkg.getIconName()); } @@ -64,7 +65,8 @@ public void issue54PackageIconForSuitesWithTests() { final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); final List actualNodes = dao.runnables(); final Node pkg = actualNodes.stream().filter(it -> it.getId().equals("SCOTT:junit_utplsql_test_pkg")) - .findFirst().get(); + .findFirst().orElse(null); + Assert.assertNotNull(pkg); Assert.assertEquals("PACKAGE_ICON", pkg.getIconName()); } diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java index a219bdfd..802843e7 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/parser/SqlDevParserTest.java @@ -103,10 +103,12 @@ public void packageSpecMembers() { final SqlDevParser parser = new SqlDevParser(); final Set actual = parser.getMembers(getPackageSpec()); Assert.assertEquals(6, actual.size()); - final Member first = actual.stream().findFirst().get(); + final Member first = actual.stream().findFirst().orElse(null); + Assert.assertNotNull(first); Assert.assertEquals("PROCEDURE", first.type); Assert.assertEquals("test_1_ok", first.name); - final Member last = actual.stream().reduce((m1, m2) -> m2).get(); + final Member last = actual.stream().reduce((m1, m2) -> m2).orElse(null); + Assert.assertNotNull(last); Assert.assertEquals("FUNCTION", last.type); Assert.assertEquals("my_Func", last.name); } @@ -116,10 +118,12 @@ public void packageBodyMembers() { final SqlDevParser parser = new SqlDevParser(); final Set actual = parser.getMembers(getPackageBody()); Assert.assertEquals(6, actual.size()); - final Member first = actual.stream().findFirst().get(); + final Member first = actual.stream().findFirst().orElse(null); + Assert.assertNotNull(first); Assert.assertEquals("PROCEDURE", first.type); Assert.assertEquals("test_1_ok", first.name); - final Member last = actual.stream().reduce((m1, m2) -> m2).get(); + final Member last = actual.stream().reduce((m1, m2) -> m2).orElse(null); + Assert.assertNotNull(last); Assert.assertEquals("FUNCTION", last.type); Assert.assertEquals("my_Func", last.name); } From 26d8fc33c2ac213d2b5c73473a959d88cf96b41f Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:20:30 +0200 Subject: [PATCH 251/286] rename PreferenceModelTest.xtend to PreferenceModelTest.java --- .../{PreferenceModelTest.xtend => PreferenceModelTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/preference/{PreferenceModelTest.xtend => PreferenceModelTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java From 4642b021273dc8f48aaaa1474cb972836b150c4e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:20:48 +0200 Subject: [PATCH 252/286] add PreferenceModelTest.java generated by Xtend 2.20.0 --- .../test/preference/PreferenceModelTest.java | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java index ca5b7142..a6188197 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,47 +13,47 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.preference +package org.utplsql.sqldev.test.preference; -import org.junit.Assert -import org.junit.Test -import org.utplsql.sqldev.model.preference.PreferenceModel +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.model.preference.PreferenceModel; -class PreferenceModelTest { - - @Test - def defaultValues() { - val PreferenceModel model = PreferenceModel.getInstance(null) - Assert.assertTrue(model.useRealtimeReporter) - Assert.assertTrue(model.unsharedWorksheet) - Assert.assertFalse(model.resetPackage) - Assert.assertFalse(model.clearScreen) - Assert.assertTrue(model.autoExecute) - Assert.assertFalse(model.checkRunUtplsqlTest) - Assert.assertFalse(model.useSmartTimes) - Assert.assertEquals(model.numberOfRunsInHistory, 10) - Assert.assertFalse(model.showDisabledCounter) - Assert.assertFalse(model.showWarningsCounter) - Assert.assertFalse(model.showInfoCounter) - Assert.assertFalse(model.showWarningIndicator) - Assert.assertFalse(model.showInfoIndicator) - Assert.assertTrue(model.showSuccessfulTests) - Assert.assertTrue(model.showDisabledTests) - Assert.assertFalse(model.isShowTestDescription) - Assert.assertTrue(model.syncDetailTab) - Assert.assertEquals("test_", model.testPackagePrefix) - Assert.assertEquals("", model.testPackageSuffix) - Assert.assertEquals("", model.testUnitPrefix) - Assert.assertEquals("", model.testUnitSuffix) - Assert.assertEquals(1, model.numberOfTestsPerUnit) - Assert.assertFalse(model.checkGenerateUtplsqlTest) - Assert.assertTrue(model.generateComments) - Assert.assertFalse(model.disableTests) - Assert.assertEquals("alltests", model.suitePath) - Assert.assertEquals(3, model.indentSpaces) - Assert.assertTrue(model.generateFiles) - Assert.assertEquals(PreferenceModel.DEFAULT_OUTPUT_DIRECTORY, model.outputDirectory) - Assert.assertEquals(false, model.deleteExistingFiles) - Assert.assertEquals("utPLSQL", model.rootFolderInOddgenView) - } +@SuppressWarnings("all") +public class PreferenceModelTest { + @Test + public void defaultValues() { + final PreferenceModel model = PreferenceModel.getInstance(null); + Assert.assertTrue(model.isUseRealtimeReporter()); + Assert.assertTrue(model.isUnsharedWorksheet()); + Assert.assertFalse(model.isResetPackage()); + Assert.assertFalse(model.isClearScreen()); + Assert.assertTrue(model.isAutoExecute()); + Assert.assertFalse(model.isCheckRunUtplsqlTest()); + Assert.assertFalse(model.isUseSmartTimes()); + Assert.assertEquals(model.getNumberOfRunsInHistory(), 10); + Assert.assertFalse(model.isShowDisabledCounter()); + Assert.assertFalse(model.isShowWarningsCounter()); + Assert.assertFalse(model.isShowInfoCounter()); + Assert.assertFalse(model.isShowWarningIndicator()); + Assert.assertFalse(model.isShowInfoIndicator()); + Assert.assertTrue(model.isShowSuccessfulTests()); + Assert.assertTrue(model.isShowDisabledTests()); + Assert.assertFalse(model.isShowTestDescription()); + Assert.assertTrue(model.isSyncDetailTab()); + Assert.assertEquals("test_", model.getTestPackagePrefix()); + Assert.assertEquals("", model.getTestPackageSuffix()); + Assert.assertEquals("", model.getTestUnitPrefix()); + Assert.assertEquals("", model.getTestUnitSuffix()); + Assert.assertEquals(1, model.getNumberOfTestsPerUnit()); + Assert.assertFalse(model.isCheckGenerateUtplsqlTest()); + Assert.assertTrue(model.isGenerateComments()); + Assert.assertFalse(model.isDisableTests()); + Assert.assertEquals("alltests", model.getSuitePath()); + Assert.assertEquals(3, model.getIndentSpaces()); + Assert.assertTrue(model.isGenerateFiles()); + Assert.assertEquals(PreferenceModel.DEFAULT_OUTPUT_DIRECTORY, model.getOutputDirectory()); + Assert.assertEquals(Boolean.valueOf(false), Boolean.valueOf(model.isDeleteExistingFiles())); + Assert.assertEquals("utPLSQL", model.getRootFolderInOddgenView()); + } } From 32850f4561b393db4998cedea0dae3e1d6b5a7e4 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:23:30 +0200 Subject: [PATCH 253/286] convert PreferenceModelTest to Java, removing Xtend dependencies --- .../test/preference/PreferenceModelTest.java | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java index a6188197..172eb656 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,41 +19,41 @@ import org.junit.Test; import org.utplsql.sqldev.model.preference.PreferenceModel; -@SuppressWarnings("all") public class PreferenceModelTest { - @Test - public void defaultValues() { - final PreferenceModel model = PreferenceModel.getInstance(null); - Assert.assertTrue(model.isUseRealtimeReporter()); - Assert.assertTrue(model.isUnsharedWorksheet()); - Assert.assertFalse(model.isResetPackage()); - Assert.assertFalse(model.isClearScreen()); - Assert.assertTrue(model.isAutoExecute()); - Assert.assertFalse(model.isCheckRunUtplsqlTest()); - Assert.assertFalse(model.isUseSmartTimes()); - Assert.assertEquals(model.getNumberOfRunsInHistory(), 10); - Assert.assertFalse(model.isShowDisabledCounter()); - Assert.assertFalse(model.isShowWarningsCounter()); - Assert.assertFalse(model.isShowInfoCounter()); - Assert.assertFalse(model.isShowWarningIndicator()); - Assert.assertFalse(model.isShowInfoIndicator()); - Assert.assertTrue(model.isShowSuccessfulTests()); - Assert.assertTrue(model.isShowDisabledTests()); - Assert.assertFalse(model.isShowTestDescription()); - Assert.assertTrue(model.isSyncDetailTab()); - Assert.assertEquals("test_", model.getTestPackagePrefix()); - Assert.assertEquals("", model.getTestPackageSuffix()); - Assert.assertEquals("", model.getTestUnitPrefix()); - Assert.assertEquals("", model.getTestUnitSuffix()); - Assert.assertEquals(1, model.getNumberOfTestsPerUnit()); - Assert.assertFalse(model.isCheckGenerateUtplsqlTest()); - Assert.assertTrue(model.isGenerateComments()); - Assert.assertFalse(model.isDisableTests()); - Assert.assertEquals("alltests", model.getSuitePath()); - Assert.assertEquals(3, model.getIndentSpaces()); - Assert.assertTrue(model.isGenerateFiles()); - Assert.assertEquals(PreferenceModel.DEFAULT_OUTPUT_DIRECTORY, model.getOutputDirectory()); - Assert.assertEquals(Boolean.valueOf(false), Boolean.valueOf(model.isDeleteExistingFiles())); - Assert.assertEquals("utPLSQL", model.getRootFolderInOddgenView()); - } + + @Test + public void defaultValues() { + final PreferenceModel model = PreferenceModel.getInstance(null); + Assert.assertTrue(model.isUseRealtimeReporter()); + Assert.assertTrue(model.isUnsharedWorksheet()); + Assert.assertFalse(model.isResetPackage()); + Assert.assertFalse(model.isClearScreen()); + Assert.assertTrue(model.isAutoExecute()); + Assert.assertFalse(model.isCheckRunUtplsqlTest()); + Assert.assertFalse(model.isUseSmartTimes()); + Assert.assertEquals(10, model.getNumberOfRunsInHistory()); + Assert.assertFalse(model.isShowDisabledCounter()); + Assert.assertFalse(model.isShowWarningsCounter()); + Assert.assertFalse(model.isShowInfoCounter()); + Assert.assertFalse(model.isShowWarningIndicator()); + Assert.assertFalse(model.isShowInfoIndicator()); + Assert.assertTrue(model.isShowSuccessfulTests()); + Assert.assertTrue(model.isShowDisabledTests()); + Assert.assertFalse(model.isShowTestDescription()); + Assert.assertTrue(model.isSyncDetailTab()); + Assert.assertEquals("test_", model.getTestPackagePrefix()); + Assert.assertEquals("", model.getTestPackageSuffix()); + Assert.assertEquals("", model.getTestUnitPrefix()); + Assert.assertEquals("", model.getTestUnitSuffix()); + Assert.assertEquals(1, model.getNumberOfTestsPerUnit()); + Assert.assertFalse(model.isCheckGenerateUtplsqlTest()); + Assert.assertTrue(model.isGenerateComments()); + Assert.assertFalse(model.isDisableTests()); + Assert.assertEquals("alltests", model.getSuitePath()); + Assert.assertEquals(3, model.getIndentSpaces()); + Assert.assertTrue(model.isGenerateFiles()); + Assert.assertEquals(PreferenceModel.DEFAULT_OUTPUT_DIRECTORY, model.getOutputDirectory()); + Assert.assertEquals(Boolean.valueOf(false), Boolean.valueOf(model.isDeleteExistingFiles())); + Assert.assertEquals("utPLSQL", model.getRootFolderInOddgenView()); + } } From 7429f280a623956ff684036018ddc94f1ed14270 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:24:28 +0200 Subject: [PATCH 254/286] rename PreferencePanelTest.xtend to PreferencePanelTest.java --- .../{PreferencePanelTest.xtend => PreferencePanelTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/preference/{PreferencePanelTest.xtend => PreferencePanelTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java From cf83c214abdc9a28bf0fd1d01614b9bf4b2e9e48 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:24:46 +0200 Subject: [PATCH 255/286] add PreferencePanelTest.java generated by Xtend 2.20.0 --- .../test/preference/PreferencePanelTest.java | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java index 2f5b66f9..53e134a4 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,33 +13,39 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.preference +package org.utplsql.sqldev.test.preference; -import java.awt.Dimension -import java.awt.Toolkit -import javax.swing.JFrame -import javax.swing.SwingUtilities -import org.junit.Test -import org.utplsql.sqldev.ui.preference.PreferencePanel +import java.awt.Dimension; +import java.awt.Toolkit; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.junit.Test; +import org.utplsql.sqldev.ui.preference.PreferencePanel; -class PreferencePanelTest { - - @Test - def void layout() { - val frame = new JFrame("Preference Panel") - SwingUtilities.invokeLater(new Runnable() { - override run() { - val panel = new PreferencePanel - frame.add(panel) - frame.preferredSize = new Dimension(600, 400) - frame.pack - val dim = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2); - frame.setVisible(true) - } - }); - Thread.sleep(4 * 1000) - frame.dispose - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class PreferencePanelTest { + @Test + public void layout() { + try { + final JFrame frame = new JFrame("Preference Panel"); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + final PreferencePanel panel = new PreferencePanel(); + frame.add(panel); + Dimension _dimension = new Dimension(600, 400); + frame.setPreferredSize(_dimension); + frame.pack(); + final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setLocation(((dim.width / 2) - (frame.getSize().width / 2)), ((dim.height / 2) - (frame.getSize().height / 2))); + frame.setVisible(true); + } + }); + Thread.sleep((4 * 1000)); + frame.dispose(); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } +} From 82e630ebfcb1f825b7fb23d3c1a386ab297ede9d Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:32:23 +0200 Subject: [PATCH 256/286] convert PreferencePanelTest to Java, removing Xtend dependencies --- .../test/preference/PreferencePanelTest.java | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java index 53e134a4..bf060d96 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,35 +17,31 @@ import java.awt.Dimension; import java.awt.Toolkit; + import javax.swing.JFrame; import javax.swing.SwingUtilities; -import org.eclipse.xtext.xbase.lib.Exceptions; + +import org.junit.Assert; import org.junit.Test; +import org.utplsql.sqldev.model.SystemTools; import org.utplsql.sqldev.ui.preference.PreferencePanel; -@SuppressWarnings("all") public class PreferencePanelTest { - @Test - public void layout() { - try { - final JFrame frame = new JFrame("Preference Panel"); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - final PreferencePanel panel = new PreferencePanel(); - frame.add(panel); - Dimension _dimension = new Dimension(600, 400); - frame.setPreferredSize(_dimension); - frame.pack(); - final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(((dim.width / 2) - (frame.getSize().width / 2)), ((dim.height / 2) - (frame.getSize().height / 2))); - frame.setVisible(true); - } - }); - Thread.sleep((4 * 1000)); - frame.dispose(); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @Test + public void layout() { + final JFrame frame = new JFrame("Preference Panel"); + SwingUtilities.invokeLater(() -> { + final PreferencePanel panel = new PreferencePanel(); + frame.add(panel); + frame.setPreferredSize(new Dimension(600, 400)); + frame.pack(); + final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2); + frame.setVisible(true); + }); + SystemTools.sleep((4 * 1000)); + Assert.assertNotNull(frame); + frame.dispose(); } - } } From 738c947a6c74c6ea05459028ab9474bc85f62ae6 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:33:34 +0200 Subject: [PATCH 257/286] rename ExpectationTest.xtend to ExpectationTest.java --- .../test/runner/{ExpectationTest.xtend => ExpectationTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/runner/{ExpectationTest.xtend => ExpectationTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java From 42ab75940ac4fb98a134da6724a1fd0cc6167993 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:34:09 +0200 Subject: [PATCH 258/286] add ExpectationTest generated by Xtend 2.20.0 --- .../sqldev/test/runner/ExpectationTest.java | 104 ++++++++++-------- 1 file changed, 59 insertions(+), 45 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java index 7c4cff39..f453ff72 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,49 +13,63 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.runner +package org.utplsql.sqldev.test.runner; -import org.junit.Assert -import org.junit.Before -import org.junit.Test -import org.utplsql.sqldev.model.runner.Expectation +import org.eclipse.xtend2.lib.StringConcatenation; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.utplsql.sqldev.model.runner.Expectation; -class ExpectationTest { - var Expectation exceptionWithDescription - var Expectation exceptionWithoutDescription - - @Before - def void setup() { - exceptionWithDescription = new Expectation - exceptionWithDescription.description = '''This assert must fail''' - exceptionWithDescription.message = '''at: 1 (number) was expected to equal: 2 (number)''' - exceptionWithDescription.caller = '''"SCOTT.JUNIT_UTPLSQL_TEST1_PKG.TEST_2_NOK", line 14 ut.expect(1, 'This assert must fail').to_equal(2);''' - exceptionWithoutDescription = new Expectation - exceptionWithoutDescription.message = exceptionWithDescription.message - exceptionWithoutDescription.caller = exceptionWithDescription.caller - exceptionWithoutDescription.message = '''at: 1 (number) was expected to equal: 2 (number)''' - exceptionWithoutDescription.caller = '''"SCOTT.JUNIT_UTPLSQL_TEST1_PKG.TEST_3_NOK", line 42 ut.expect(1).to_equal(2);''' - } - - @Test - def void failedExpectationCallerLine() { - val actual = exceptionWithDescription.callerLine - val expected = new Integer(14) - Assert.assertEquals(expected, actual) - } - - @Test - def void shortFailureTextWithDescription() { - val actual = exceptionWithDescription.shortFailureText - val expected = 'This assert must fail (line 14)' - Assert.assertEquals(expected, actual) - } - - @Test - def void shortFailureTextWithoutDescription() { - val actual = exceptionWithoutDescription.shortFailureText - val expected = 'Line 42' - Assert.assertEquals(expected, actual) - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class ExpectationTest { + private Expectation exceptionWithDescription; + + private Expectation exceptionWithoutDescription; + + @Before + public void setup() { + Expectation _expectation = new Expectation(); + this.exceptionWithDescription = _expectation; + StringConcatenation _builder = new StringConcatenation(); + _builder.append("This assert must fail"); + this.exceptionWithDescription.setDescription(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("at: 1 (number) was expected to equal: 2 (number)"); + this.exceptionWithDescription.setMessage(_builder_1.toString()); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("\"SCOTT.JUNIT_UTPLSQL_TEST1_PKG.TEST_2_NOK\", line 14 ut.expect(1, \'This assert must fail\').to_equal(2);"); + this.exceptionWithDescription.setCaller(_builder_2.toString()); + Expectation _expectation_1 = new Expectation(); + this.exceptionWithoutDescription = _expectation_1; + this.exceptionWithoutDescription.setMessage(this.exceptionWithDescription.getMessage()); + this.exceptionWithoutDescription.setCaller(this.exceptionWithDescription.getCaller()); + StringConcatenation _builder_3 = new StringConcatenation(); + _builder_3.append("at: 1 (number) was expected to equal: 2 (number)"); + this.exceptionWithoutDescription.setMessage(_builder_3.toString()); + StringConcatenation _builder_4 = new StringConcatenation(); + _builder_4.append("\"SCOTT.JUNIT_UTPLSQL_TEST1_PKG.TEST_3_NOK\", line 42 ut.expect(1).to_equal(2);"); + this.exceptionWithoutDescription.setCaller(_builder_4.toString()); + } + + @Test + public void failedExpectationCallerLine() { + final Integer actual = this.exceptionWithDescription.getCallerLine(); + final Integer expected = new Integer(14); + Assert.assertEquals(expected, actual); + } + + @Test + public void shortFailureTextWithDescription() { + final String actual = this.exceptionWithDescription.getShortFailureText(); + final String expected = "This assert must fail (line 14)"; + Assert.assertEquals(expected, actual); + } + + @Test + public void shortFailureTextWithoutDescription() { + final String actual = this.exceptionWithoutDescription.getShortFailureText(); + final String expected = "Line 42"; + Assert.assertEquals(expected, actual); + } +} From 9aab4fd28ec0da02ae850682da773172ba8d3a8c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:43:50 +0200 Subject: [PATCH 259/286] convert ExpectationTest to Java, removing Xtend dependencies --- .../sqldev/test/runner/ExpectationTest.java | 86 ++++++++----------- 1 file changed, 35 insertions(+), 51 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java index f453ff72..facd25cf 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java @@ -15,61 +15,45 @@ */ package org.utplsql.sqldev.test.runner; -import org.eclipse.xtend2.lib.StringConcatenation; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import org.utplsql.sqldev.model.runner.Expectation; -@SuppressWarnings("all") public class ExpectationTest { - private Expectation exceptionWithDescription; - - private Expectation exceptionWithoutDescription; - - @Before - public void setup() { - Expectation _expectation = new Expectation(); - this.exceptionWithDescription = _expectation; - StringConcatenation _builder = new StringConcatenation(); - _builder.append("This assert must fail"); - this.exceptionWithDescription.setDescription(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("at: 1 (number) was expected to equal: 2 (number)"); - this.exceptionWithDescription.setMessage(_builder_1.toString()); - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append("\"SCOTT.JUNIT_UTPLSQL_TEST1_PKG.TEST_2_NOK\", line 14 ut.expect(1, \'This assert must fail\').to_equal(2);"); - this.exceptionWithDescription.setCaller(_builder_2.toString()); - Expectation _expectation_1 = new Expectation(); - this.exceptionWithoutDescription = _expectation_1; - this.exceptionWithoutDescription.setMessage(this.exceptionWithDescription.getMessage()); - this.exceptionWithoutDescription.setCaller(this.exceptionWithDescription.getCaller()); - StringConcatenation _builder_3 = new StringConcatenation(); - _builder_3.append("at: 1 (number) was expected to equal: 2 (number)"); - this.exceptionWithoutDescription.setMessage(_builder_3.toString()); - StringConcatenation _builder_4 = new StringConcatenation(); - _builder_4.append("\"SCOTT.JUNIT_UTPLSQL_TEST1_PKG.TEST_3_NOK\", line 42 ut.expect(1).to_equal(2);"); - this.exceptionWithoutDescription.setCaller(_builder_4.toString()); - } - - @Test - public void failedExpectationCallerLine() { - final Integer actual = this.exceptionWithDescription.getCallerLine(); - final Integer expected = new Integer(14); - Assert.assertEquals(expected, actual); - } - - @Test - public void shortFailureTextWithDescription() { - final String actual = this.exceptionWithDescription.getShortFailureText(); - final String expected = "This assert must fail (line 14)"; - Assert.assertEquals(expected, actual); - } + + private Expectation getExpectationWithDescription() { + Expectation ex = new Expectation(); + ex.setDescription("This assert must fail"); + ex.setMessage("at: 1 (number) was expected to equal: 2 (number)"); + ex.setCaller("\"SCOTT.JUNIT_UTPLSQL_TEST1_PKG.TEST_2_NOK\", line 14 ut.expect(1, 'This assert must fail').to_equal(2);"); + return ex; + } + + private Expectation getExpectationWithoutDescription() { + Expectation ex = new Expectation(); + ex.setMessage("at: 1 (number) was expected to equal: 2 (number)"); + ex.setCaller("\"SCOTT.JUNIT_UTPLSQL_TEST1_PKG.TEST_3_NOK\", line 42 ut.expect(1).to_equal(2);"); + return ex; + } - @Test - public void shortFailureTextWithoutDescription() { - final String actual = this.exceptionWithoutDescription.getShortFailureText(); - final String expected = "Line 42"; - Assert.assertEquals(expected, actual); - } + @Test + public void failedExpectationCallerLine() { + final Integer actual = getExpectationWithDescription().getCallerLine(); + final Integer expected = Integer.valueOf(14); + Assert.assertEquals(expected, actual); + } + + @Test + public void shortFailureTextWithDescription() { + final String actual = getExpectationWithDescription().getShortFailureText(); + final String expected = "This assert must fail (line 14)"; + Assert.assertEquals(expected, actual); + } + + @Test + public void shortFailureTextWithoutDescription() { + final String actual = getExpectationWithoutDescription().getShortFailureText(); + final String expected = "Line 42"; + Assert.assertEquals(expected, actual); + } } From a9992345da847ddedb8eb70df19eba542c5a429e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:47:46 +0200 Subject: [PATCH 260/286] rename SmartTimeTest.xtend to SmartTimeTest.java --- .../test/runner/{SmartTimeTest.xtend => SmartTimeTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/runner/{SmartTimeTest.xtend => SmartTimeTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java From 5a44e2c91b31c012bb09431386939ace8219d704 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:48:03 +0200 Subject: [PATCH 261/286] add SmartTimeTest generated by Xtend 2.20.0 --- .../sqldev/test/runner/SmartTimeTest.java | 262 +++++++++--------- 1 file changed, 129 insertions(+), 133 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java index 8b104e27..b3a39911 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,135 +13,131 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.utplsql.sqldev.test.runner - -import org.junit.Assert -import org.junit.Test -import org.utplsql.sqldev.ui.runner.SmartTime - -class SmartTimeTest { - - @Test - def null_default() { - val effective = (new SmartTime(null, false)).toString - Assert.assertEquals(null, effective); - } - - @Test - def null_smart() { - val effective = (new SmartTime(null, true)).toString - Assert.assertEquals(null, effective); - } - - @Test - def ms_0_default() { - val effective = (new SmartTime(0.0, false)).toString - Assert.assertEquals("0.000", effective); - } - - @Test - def ms_0_smart() { - val effective = (new SmartTime(0.0, true)).toString - Assert.assertEquals("0 ms", effective); - } - - @Test - def ms_999_default() { - val effective = (new SmartTime(0.999, false)).toString - Assert.assertEquals("0.999", effective); - } - - @Test - def ms_999_smart() { - val effective = (new SmartTime(0.999, true)).toString - Assert.assertEquals("999 ms", effective); - } - - @Test - def s_1_default() { - val effective = (new SmartTime(1.0, false)).toString - Assert.assertEquals("1.000", effective); - } - - @Test - def s_1_smart() { - val effective = (new SmartTime(1.0, true)).toString - Assert.assertEquals("1.000 s", effective); - } - - @Test - def s_59_default() { - val effective = (new SmartTime(59.999, false)).toString - Assert.assertEquals("59.999", effective); - } - - @Test - def s_59_smart() { - val effective = (new SmartTime(59.999, true)).toString - Assert.assertEquals("59.999 s", effective); - } - - @Test - def min_1_default() { - val effective = (new SmartTime(60.0, false)).toString - Assert.assertEquals("60.000", effective); - } - - @Test - def min_1_smart() { - val effective = (new SmartTime(60.0, true)).toString - Assert.assertEquals("1.00 min", effective); - } - - @Test - def min_59_default() { - val effective = (new SmartTime(3599.999, false)).toString - Assert.assertEquals("3,599.999", effective); - } - - @Test - def min_59_smart_and_rounded() { - val effective = (new SmartTime(3599.999, true)).toString - Assert.assertEquals("60.00 min", effective); - } - - @Test - def h_1_default() { - val effective = (new SmartTime(3600.0, false)).toString - Assert.assertEquals("3,600.000", effective); - } - - @Test - def h_1_smart() { - val effective = (new SmartTime(3600.0, true)).toString - Assert.assertEquals("1.00 h", effective); - } - - @Test - def h_max_default() { - val effective = (new SmartTime(99999.999, false)).toString - Assert.assertEquals("99,999.999", effective); - } - - @Test - def h_max_smart() { - val effective = (new SmartTime(99999.999, true)).toString - Assert.assertEquals("27.78 h", effective); - } - - @Test - def h_higher_than_max_default() { - // larger than format mask - // grouping separator applied, even if not specified in format mask - val effective = (new SmartTime(100000000.0, false)).toString - Assert.assertEquals("100,000,000.000", effective); - } - - @Test - def h_higher_than_max_smart() { - // larger than format mask - // no grouping separator applied (that's ok) - val effective = (new SmartTime(100000000.0, true)).toString - Assert.assertEquals("27777.78 h", effective); - } -} \ No newline at end of file +package org.utplsql.sqldev.test.runner; + +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.ui.runner.SmartTime; + +@SuppressWarnings("all") +public class SmartTimeTest { + @Test + public void null_default() { + final String effective = new SmartTime(null, false).toString(); + Assert.assertEquals(null, effective); + } + + @Test + public void null_smart() { + final String effective = new SmartTime(null, true).toString(); + Assert.assertEquals(null, effective); + } + + @Test + public void ms_0_default() { + final String effective = new SmartTime(Double.valueOf(0.0), false).toString(); + Assert.assertEquals("0.000", effective); + } + + @Test + public void ms_0_smart() { + final String effective = new SmartTime(Double.valueOf(0.0), true).toString(); + Assert.assertEquals("0 ms", effective); + } + + @Test + public void ms_999_default() { + final String effective = new SmartTime(Double.valueOf(0.999), false).toString(); + Assert.assertEquals("0.999", effective); + } + + @Test + public void ms_999_smart() { + final String effective = new SmartTime(Double.valueOf(0.999), true).toString(); + Assert.assertEquals("999 ms", effective); + } + + @Test + public void s_1_default() { + final String effective = new SmartTime(Double.valueOf(1.0), false).toString(); + Assert.assertEquals("1.000", effective); + } + + @Test + public void s_1_smart() { + final String effective = new SmartTime(Double.valueOf(1.0), true).toString(); + Assert.assertEquals("1.000 s", effective); + } + + @Test + public void s_59_default() { + final String effective = new SmartTime(Double.valueOf(59.999), false).toString(); + Assert.assertEquals("59.999", effective); + } + + @Test + public void s_59_smart() { + final String effective = new SmartTime(Double.valueOf(59.999), true).toString(); + Assert.assertEquals("59.999 s", effective); + } + + @Test + public void min_1_default() { + final String effective = new SmartTime(Double.valueOf(60.0), false).toString(); + Assert.assertEquals("60.000", effective); + } + + @Test + public void min_1_smart() { + final String effective = new SmartTime(Double.valueOf(60.0), true).toString(); + Assert.assertEquals("1.00 min", effective); + } + + @Test + public void min_59_default() { + final String effective = new SmartTime(Double.valueOf(3599.999), false).toString(); + Assert.assertEquals("3,599.999", effective); + } + + @Test + public void min_59_smart_and_rounded() { + final String effective = new SmartTime(Double.valueOf(3599.999), true).toString(); + Assert.assertEquals("60.00 min", effective); + } + + @Test + public void h_1_default() { + final String effective = new SmartTime(Double.valueOf(3600.0), false).toString(); + Assert.assertEquals("3,600.000", effective); + } + + @Test + public void h_1_smart() { + final String effective = new SmartTime(Double.valueOf(3600.0), true).toString(); + Assert.assertEquals("1.00 h", effective); + } + + @Test + public void h_max_default() { + final String effective = new SmartTime(Double.valueOf(99999.999), false).toString(); + Assert.assertEquals("99,999.999", effective); + } + + @Test + public void h_max_smart() { + final String effective = new SmartTime(Double.valueOf(99999.999), true).toString(); + Assert.assertEquals("27.78 h", effective); + } + + @Test + public void h_higher_than_max_default() { + final String effective = new SmartTime(Double.valueOf(100000000.0), false).toString(); + Assert.assertEquals("100,000,000.000", effective); + } + + @Test + public void h_higher_than_max_smart() { + final String effective = new SmartTime(Double.valueOf(100000000.0), true).toString(); + Assert.assertEquals("27777.78 h", effective); + } +} From 6a4dc52f8489aef2e240aaaeebd4c25c9477d2d9 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 09:59:21 +0200 Subject: [PATCH 262/286] convert SmartTimeTest to Java, removing Xtend dependencies --- .../sqldev/test/runner/SmartTimeTest.java | 246 +++++++++--------- 1 file changed, 125 insertions(+), 121 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java index b3a39911..640e9ad3 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,125 +19,129 @@ import org.junit.Test; import org.utplsql.sqldev.ui.runner.SmartTime; -@SuppressWarnings("all") public class SmartTimeTest { - @Test - public void null_default() { - final String effective = new SmartTime(null, false).toString(); - Assert.assertEquals(null, effective); - } - - @Test - public void null_smart() { - final String effective = new SmartTime(null, true).toString(); - Assert.assertEquals(null, effective); - } - - @Test - public void ms_0_default() { - final String effective = new SmartTime(Double.valueOf(0.0), false).toString(); - Assert.assertEquals("0.000", effective); - } - - @Test - public void ms_0_smart() { - final String effective = new SmartTime(Double.valueOf(0.0), true).toString(); - Assert.assertEquals("0 ms", effective); - } - - @Test - public void ms_999_default() { - final String effective = new SmartTime(Double.valueOf(0.999), false).toString(); - Assert.assertEquals("0.999", effective); - } - - @Test - public void ms_999_smart() { - final String effective = new SmartTime(Double.valueOf(0.999), true).toString(); - Assert.assertEquals("999 ms", effective); - } - - @Test - public void s_1_default() { - final String effective = new SmartTime(Double.valueOf(1.0), false).toString(); - Assert.assertEquals("1.000", effective); - } - - @Test - public void s_1_smart() { - final String effective = new SmartTime(Double.valueOf(1.0), true).toString(); - Assert.assertEquals("1.000 s", effective); - } - - @Test - public void s_59_default() { - final String effective = new SmartTime(Double.valueOf(59.999), false).toString(); - Assert.assertEquals("59.999", effective); - } - - @Test - public void s_59_smart() { - final String effective = new SmartTime(Double.valueOf(59.999), true).toString(); - Assert.assertEquals("59.999 s", effective); - } - - @Test - public void min_1_default() { - final String effective = new SmartTime(Double.valueOf(60.0), false).toString(); - Assert.assertEquals("60.000", effective); - } - - @Test - public void min_1_smart() { - final String effective = new SmartTime(Double.valueOf(60.0), true).toString(); - Assert.assertEquals("1.00 min", effective); - } - - @Test - public void min_59_default() { - final String effective = new SmartTime(Double.valueOf(3599.999), false).toString(); - Assert.assertEquals("3,599.999", effective); - } - - @Test - public void min_59_smart_and_rounded() { - final String effective = new SmartTime(Double.valueOf(3599.999), true).toString(); - Assert.assertEquals("60.00 min", effective); - } - - @Test - public void h_1_default() { - final String effective = new SmartTime(Double.valueOf(3600.0), false).toString(); - Assert.assertEquals("3,600.000", effective); - } - - @Test - public void h_1_smart() { - final String effective = new SmartTime(Double.valueOf(3600.0), true).toString(); - Assert.assertEquals("1.00 h", effective); - } - - @Test - public void h_max_default() { - final String effective = new SmartTime(Double.valueOf(99999.999), false).toString(); - Assert.assertEquals("99,999.999", effective); - } - - @Test - public void h_max_smart() { - final String effective = new SmartTime(Double.valueOf(99999.999), true).toString(); - Assert.assertEquals("27.78 h", effective); - } - - @Test - public void h_higher_than_max_default() { - final String effective = new SmartTime(Double.valueOf(100000000.0), false).toString(); - Assert.assertEquals("100,000,000.000", effective); - } - - @Test - public void h_higher_than_max_smart() { - final String effective = new SmartTime(Double.valueOf(100000000.0), true).toString(); - Assert.assertEquals("27777.78 h", effective); - } + + @Test + public void null_default() { + final String effective = new SmartTime(null, false).toString(); + Assert.assertEquals(null, effective); + } + + @Test + public void null_smart() { + final String effective = new SmartTime(null, true).toString(); + Assert.assertEquals(null, effective); + } + + @Test + public void ms_0_default() { + final String effective = new SmartTime(0.0, false).toString(); + Assert.assertEquals("0.000", effective); + } + + @Test + public void ms_0_smart() { + final String effective = new SmartTime(0.0, true).toString(); + Assert.assertEquals("0 ms", effective); + } + + @Test + public void ms_999_default() { + final String effective = new SmartTime(0.999, false).toString(); + Assert.assertEquals("0.999", effective); + } + + @Test + public void ms_999_smart() { + final String effective = new SmartTime(0.999, true).toString(); + Assert.assertEquals("999 ms", effective); + } + + @Test + public void s_1_default() { + final String effective = new SmartTime(1.0, false).toString(); + Assert.assertEquals("1.000", effective); + } + + @Test + public void s_1_smart() { + final String effective = new SmartTime(1.0, true).toString(); + Assert.assertEquals("1.000 s", effective); + } + + @Test + public void s_59_default() { + final String effective = new SmartTime(59.999, false).toString(); + Assert.assertEquals("59.999", effective); + } + + @Test + public void s_59_smart() { + final String effective = new SmartTime(59.999, true).toString(); + Assert.assertEquals("59.999 s", effective); + } + + @Test + public void min_1_default() { + final String effective = new SmartTime(60.0, false).toString(); + Assert.assertEquals("60.000", effective); + } + + @Test + public void min_1_smart() { + final String effective = new SmartTime(60.0, true).toString(); + Assert.assertEquals("1.00 min", effective); + } + + @Test + public void min_59_default() { + final String effective = new SmartTime(3599.999, false).toString(); + Assert.assertEquals("3,599.999", effective); + } + + @Test + public void min_59_smart_and_rounded() { + final String effective = new SmartTime(3599.999, true).toString(); + Assert.assertEquals("60.00 min", effective); + } + + @Test + public void h_1_default() { + final String effective = new SmartTime(3600.0, false).toString(); + Assert.assertEquals("3,600.000", effective); + } + + @Test + public void h_1_smart() { + final String effective = new SmartTime(3600.0, true).toString(); + Assert.assertEquals("1.00 h", effective); + } + + @Test + public void h_max_default() { + final String effective = new SmartTime(99999.999, false).toString(); + Assert.assertEquals("99,999.999", effective); + } + + @Test + public void h_max_smart() { + final String effective = new SmartTime(99999.999, true).toString(); + Assert.assertEquals("27.78 h", effective); + } + + @Test + public void h_higher_than_max_default() { + // larger than format mask + // grouping separator applied, even if not specified in format mask + final String effective = new SmartTime(100000000.0, false).toString(); + Assert.assertEquals("100,000,000.000", effective); + } + + @Test + public void h_higher_than_max_smart() { + // larger than format mask + // no grouping separator applied (that's ok) + final String effective = new SmartTime(100000000.0, true).toString(); + Assert.assertEquals("27777.78 h", effective); + } } From 645e2c2570d9accb0bf145ecfba4902494fd5073 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 10:00:19 +0200 Subject: [PATCH 263/286] rename UtplsqlRunnerPanelTest.xtend to UtplsqlRunnerPanelTest.java --- .../{UtplsqlRunnerPanelTest.xtend => UtplsqlRunnerPanelTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/runner/{UtplsqlRunnerPanelTest.xtend => UtplsqlRunnerPanelTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java From 431e37744ff2029a7aeeaad9c2165638b9ae2b6b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 10:00:42 +0200 Subject: [PATCH 264/286] add UtplsqlRunnerPanelTest generated by Xtend 2.20.0 --- .../test/runner/UtplsqlRunnerPanelTest.java | 191 ++++++++++-------- 1 file changed, 109 insertions(+), 82 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java index c83d8950..85aaf09e 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,86 +13,113 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.test.runner +package org.utplsql.sqldev.test.runner; -import java.awt.Toolkit -import java.util.UUID -import javax.swing.JFrame -import javax.swing.SwingUtilities -import org.junit.Before -import org.junit.Test -import org.utplsql.sqldev.model.runner.Run -import org.utplsql.sqldev.resources.UtplsqlResources -import org.utplsql.sqldev.ui.runner.RunnerPanel +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.util.Collections; +import java.util.UUID; +import javax.swing.JFrame; +import javax.swing.SwingUtilities; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.junit.Before; +import org.junit.Test; +import org.utplsql.sqldev.model.runner.Counter; +import org.utplsql.sqldev.model.runner.Run; +import org.utplsql.sqldev.resources.UtplsqlResources; +import org.utplsql.sqldev.ui.runner.RunnerPanel; -class UtplsqlRunnerPanelTest { - var Run run - - @Before - def void setup() { - val reporterId = UUID.randomUUID().toString.replace("-", "") - run = new Run(null, reporterId, #[]) - run.startTime = "2019-06-09T13:42:42.123456" - run.counter.disabled = 0 - run.counter.success = 0 - run.counter.failure = 0 - run.counter.error = 0 - run.counter.warning = 0 - run.totalNumberOfTests = 5 - run.currentTestNumber = 0 - } - - @Test - def void showGUI() { - val start = System.currentTimeMillis - val frame = new JFrame("utPLSQL Runner Panel") - frame.defaultCloseOperation = JFrame.EXIT_ON_CLOSE; - val panel = new RunnerPanel - val gui = panel.getGUI - panel.model = run - - SwingUtilities.invokeLater(new Runnable() { - override run() { - frame.add(gui) - frame.pack - val dim = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2); - frame.setVisible(true) - } - }); - - run.status="starting" - panel.update(run.reporterId) - Thread.sleep(3000); - - run.counter.success = run.counter.success + 1 - run.status="utplsql.test.a" - panel.update(run.reporterId) - Thread.sleep(500); - - run.counter.success = run.counter.success + 1 - run.status="utplsql.test.b" - panel.update(run.reporterId) - Thread.sleep(500); - - run.counter.success = run.counter.success + 1 - run.status="utplsql.test.c" - panel.update(run.reporterId) - Thread.sleep(500); - - run.counter.failure = run.counter.failure + 1 - run.status="utplsql.test.d" - panel.update(run.reporterId) - Thread.sleep(500); - - run.counter.success = run.counter.success + 1 - run.status="utplsql.test.e" - val end = System.currentTimeMillis - run.executionTime = new Double(end-start)/1000 - run.status = UtplsqlResources.getString("RUNNER_FINNISHED_TEXT") - panel.update(run.reporterId) - Thread.sleep(2000); - frame.dispose - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class UtplsqlRunnerPanelTest { + private Run run; + + @Before + public void setup() { + final String reporterId = UUID.randomUUID().toString().replace("-", ""); + Run _run = new Run(null, reporterId, Collections.unmodifiableList(CollectionLiterals.newArrayList())); + this.run = _run; + this.run.setStartTime("2019-06-09T13:42:42.123456"); + Counter _counter = this.run.getCounter(); + _counter.setDisabled(Integer.valueOf(0)); + Counter _counter_1 = this.run.getCounter(); + _counter_1.setSuccess(Integer.valueOf(0)); + Counter _counter_2 = this.run.getCounter(); + _counter_2.setFailure(Integer.valueOf(0)); + Counter _counter_3 = this.run.getCounter(); + _counter_3.setError(Integer.valueOf(0)); + Counter _counter_4 = this.run.getCounter(); + _counter_4.setWarning(Integer.valueOf(0)); + this.run.setTotalNumberOfTests(Integer.valueOf(5)); + this.run.setCurrentTestNumber(Integer.valueOf(0)); + } + + @Test + public void showGUI() { + try { + final long start = System.currentTimeMillis(); + final JFrame frame = new JFrame("utPLSQL Runner Panel"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + final RunnerPanel panel = new RunnerPanel(); + final Component gui = panel.getGUI(); + panel.setModel(this.run); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + frame.add(gui); + frame.pack(); + final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setLocation(((dim.width / 2) - (frame.getSize().width / 2)), ((dim.height / 2) - (frame.getSize().height / 2))); + frame.setVisible(true); + } + }); + this.run.setStatus("starting"); + panel.update(this.run.getReporterId()); + Thread.sleep(3000); + Counter _counter = this.run.getCounter(); + Integer _success = this.run.getCounter().getSuccess(); + int _plus = ((_success).intValue() + 1); + _counter.setSuccess(Integer.valueOf(_plus)); + this.run.setStatus("utplsql.test.a"); + panel.update(this.run.getReporterId()); + Thread.sleep(500); + Counter _counter_1 = this.run.getCounter(); + Integer _success_1 = this.run.getCounter().getSuccess(); + int _plus_1 = ((_success_1).intValue() + 1); + _counter_1.setSuccess(Integer.valueOf(_plus_1)); + this.run.setStatus("utplsql.test.b"); + panel.update(this.run.getReporterId()); + Thread.sleep(500); + Counter _counter_2 = this.run.getCounter(); + Integer _success_2 = this.run.getCounter().getSuccess(); + int _plus_2 = ((_success_2).intValue() + 1); + _counter_2.setSuccess(Integer.valueOf(_plus_2)); + this.run.setStatus("utplsql.test.c"); + panel.update(this.run.getReporterId()); + Thread.sleep(500); + Counter _counter_3 = this.run.getCounter(); + Integer _failure = this.run.getCounter().getFailure(); + int _plus_3 = ((_failure).intValue() + 1); + _counter_3.setFailure(Integer.valueOf(_plus_3)); + this.run.setStatus("utplsql.test.d"); + panel.update(this.run.getReporterId()); + Thread.sleep(500); + Counter _counter_4 = this.run.getCounter(); + Integer _success_3 = this.run.getCounter().getSuccess(); + int _plus_4 = ((_success_3).intValue() + 1); + _counter_4.setSuccess(Integer.valueOf(_plus_4)); + this.run.setStatus("utplsql.test.e"); + final long end = System.currentTimeMillis(); + Double _double = new Double((end - start)); + double _divide = ((_double).doubleValue() / 1000); + this.run.setExecutionTime(Double.valueOf(_divide)); + this.run.setStatus(UtplsqlResources.getString("RUNNER_FINNISHED_TEXT")); + panel.update(this.run.getReporterId()); + Thread.sleep(2000); + frame.dispose(); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } +} From 68dcbf21c8157d4cbb5c402efa6e686787d9bff2 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 10:21:39 +0200 Subject: [PATCH 265/286] convert UtplsqlRunnerPanelTest to Java, removing Xtend dependencies --- .../test/runner/UtplsqlRunnerPanelTest.java | 167 ++++++++---------- 1 file changed, 73 insertions(+), 94 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java index 85aaf09e..59776833 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerPanelTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,108 +18,87 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.Toolkit; -import java.util.Collections; +import java.util.Arrays; import java.util.UUID; + import javax.swing.JFrame; import javax.swing.SwingUtilities; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Exceptions; + +import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.utplsql.sqldev.model.runner.Counter; +import org.utplsql.sqldev.model.SystemTools; import org.utplsql.sqldev.model.runner.Run; import org.utplsql.sqldev.resources.UtplsqlResources; import org.utplsql.sqldev.ui.runner.RunnerPanel; -@SuppressWarnings("all") public class UtplsqlRunnerPanelTest { - private Run run; - - @Before - public void setup() { - final String reporterId = UUID.randomUUID().toString().replace("-", ""); - Run _run = new Run(null, reporterId, Collections.unmodifiableList(CollectionLiterals.newArrayList())); - this.run = _run; - this.run.setStartTime("2019-06-09T13:42:42.123456"); - Counter _counter = this.run.getCounter(); - _counter.setDisabled(Integer.valueOf(0)); - Counter _counter_1 = this.run.getCounter(); - _counter_1.setSuccess(Integer.valueOf(0)); - Counter _counter_2 = this.run.getCounter(); - _counter_2.setFailure(Integer.valueOf(0)); - Counter _counter_3 = this.run.getCounter(); - _counter_3.setError(Integer.valueOf(0)); - Counter _counter_4 = this.run.getCounter(); - _counter_4.setWarning(Integer.valueOf(0)); - this.run.setTotalNumberOfTests(Integer.valueOf(5)); - this.run.setCurrentTestNumber(Integer.valueOf(0)); - } - - @Test - public void showGUI() { - try { - final long start = System.currentTimeMillis(); - final JFrame frame = new JFrame("utPLSQL Runner Panel"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - final RunnerPanel panel = new RunnerPanel(); - final Component gui = panel.getGUI(); - panel.setModel(this.run); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - frame.add(gui); - frame.pack(); - final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - frame.setLocation(((dim.width / 2) - (frame.getSize().width / 2)), ((dim.height / 2) - (frame.getSize().height / 2))); - frame.setVisible(true); - } - }); - this.run.setStatus("starting"); - panel.update(this.run.getReporterId()); - Thread.sleep(3000); - Counter _counter = this.run.getCounter(); - Integer _success = this.run.getCounter().getSuccess(); - int _plus = ((_success).intValue() + 1); - _counter.setSuccess(Integer.valueOf(_plus)); - this.run.setStatus("utplsql.test.a"); - panel.update(this.run.getReporterId()); - Thread.sleep(500); - Counter _counter_1 = this.run.getCounter(); - Integer _success_1 = this.run.getCounter().getSuccess(); - int _plus_1 = ((_success_1).intValue() + 1); - _counter_1.setSuccess(Integer.valueOf(_plus_1)); - this.run.setStatus("utplsql.test.b"); - panel.update(this.run.getReporterId()); - Thread.sleep(500); - Counter _counter_2 = this.run.getCounter(); - Integer _success_2 = this.run.getCounter().getSuccess(); - int _plus_2 = ((_success_2).intValue() + 1); - _counter_2.setSuccess(Integer.valueOf(_plus_2)); - this.run.setStatus("utplsql.test.c"); - panel.update(this.run.getReporterId()); - Thread.sleep(500); - Counter _counter_3 = this.run.getCounter(); - Integer _failure = this.run.getCounter().getFailure(); - int _plus_3 = ((_failure).intValue() + 1); - _counter_3.setFailure(Integer.valueOf(_plus_3)); - this.run.setStatus("utplsql.test.d"); - panel.update(this.run.getReporterId()); - Thread.sleep(500); - Counter _counter_4 = this.run.getCounter(); - Integer _success_3 = this.run.getCounter().getSuccess(); - int _plus_4 = ((_success_3).intValue() + 1); - _counter_4.setSuccess(Integer.valueOf(_plus_4)); - this.run.setStatus("utplsql.test.e"); - final long end = System.currentTimeMillis(); - Double _double = new Double((end - start)); - double _divide = ((_double).doubleValue() / 1000); - this.run.setExecutionTime(Double.valueOf(_divide)); - this.run.setStatus(UtplsqlResources.getString("RUNNER_FINNISHED_TEXT")); - panel.update(this.run.getReporterId()); - Thread.sleep(2000); - frame.dispose(); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + private Run run; + + @Before + public void setup() { + final String reporterId = UUID.randomUUID().toString().replace("-", ""); + run = new Run(null, reporterId, Arrays.asList()); + run.setStartTime("2019-06-09T13:42:42.123456"); + run.getCounter().setDisabled(0); + run.getCounter().setSuccess(0); + run.getCounter().setFailure(0); + run.getCounter().setError(0); + run.getCounter().setWarning(0); + run.setTotalNumberOfTests(5); + run.setCurrentTestNumber(0); + } + + @Test + public void showGUI() { + final long start = System.currentTimeMillis(); + final JFrame frame = new JFrame("utPLSQL Runner Panel"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + final RunnerPanel panel = new RunnerPanel(); + final Component gui = panel.getGUI(); + panel.setModel(run); + + SwingUtilities.invokeLater(() -> { + frame.add(gui); + frame.pack(); + final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setSize(600, 600); + frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2); + frame.setVisible(true); + }); + + run.setStatus("starting"); + panel.update(run.getReporterId()); + SystemTools.sleep(3000); + + run.getCounter().setSuccess(run.getCounter().getSuccess() + 1); + run.setStatus("utplsql.test.a"); + panel.update(run.getReporterId()); + SystemTools.sleep(500); + + run.getCounter().setSuccess(run.getCounter().getSuccess() + 1); + run.setStatus("utplsql.test.b"); + panel.update(run.getReporterId()); + SystemTools.sleep(500); + + run.getCounter().setSuccess(run.getCounter().getSuccess() + 1); + run.setStatus("utplsql.test.c"); + panel.update(run.getReporterId()); + SystemTools.sleep(500); + + run.getCounter().setFailure(run.getCounter().getFailure() + 1); + run.setStatus("utplsql.test.d"); + panel.update(run.getReporterId()); + SystemTools.sleep(500); + + run.getCounter().setSuccess(run.getCounter().getSuccess() + 1); + run.setStatus("utplsql.test.e"); + final long end = System.currentTimeMillis(); + run.setExecutionTime(Double.valueOf(end - start) / 1000); + run.setStatus(UtplsqlResources.getString("RUNNER_FINNISHED_TEXT")); + panel.update(run.getReporterId()); + SystemTools.sleep(2000); + Assert.assertNotNull(frame); + frame.dispose(); } - } } From d05dac87d839cec256f929ac43e56a7ce2321a85 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 10:26:54 +0200 Subject: [PATCH 266/286] rename UtplsqlRunnerTest.xtend to UtplsqlRunnerTest.java --- .../runner/{UtplsqlRunnerTest.xtend => UtplsqlRunnerTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/test/java/org/utplsql/sqldev/test/runner/{UtplsqlRunnerTest.xtend => UtplsqlRunnerTest.java} (100%) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java similarity index 100% rename from sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.xtend rename to sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java From ec0ae722855f92626110e34693c42936e4c37c56 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 10:27:14 +0200 Subject: [PATCH 267/286] add UtplsqlRunnerTest generated by Xtend 2.20.0 --- .../sqldev/test/runner/UtplsqlRunnerTest.java | 367 ++++++++++++------ 1 file changed, 247 insertions(+), 120 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java index 23b840b5..c0931840 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java @@ -1,4 +1,4 @@ -/* +/** * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,124 +13,251 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.utplsql.sqldev.test.runner +package org.utplsql.sqldev.test.runner; -import org.junit.AfterClass -import org.junit.BeforeClass -import org.junit.Test -import org.springframework.jdbc.BadSqlGrammarException -import org.springframework.jdbc.datasource.SingleConnectionDataSource -import org.utplsql.sqldev.runner.UtplsqlRunner -import org.utplsql.sqldev.test.AbstractJdbcTest +import java.sql.Connection; +import java.util.Collections; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.runner.UtplsqlRunner; +import org.utplsql.sqldev.test.AbstractJdbcTest; -class UtplsqlRunnerTest extends AbstractJdbcTest { - - @BeforeClass - def static void setup() { - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is - --%suite(JUnit testing) - --%suitepath(a) - /* tags annotation without parameter will raise a warning */ - --%tags - - --%context(test context) - - --%test(test 1 - OK) - PROCEDURE test_1_ok; - - --%test(test 2 - NOK) - PROCEDURE test_2_nok; - - --%test(test 3 - disabled) - --%disabled - PROCEDURE test_3_disabled; - - --%test(test 4 - errored) - PROCEDURE test_4_errored; - - --%test(test 5 - warnings) - PROCEDURE test_5_warnings; - - --%endcontext - - --%afterall - procedure print_and_raise; - END; - ''') - jdbcTemplate.execute(''' - CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS - PROCEDURE test_1_ok IS - BEGIN - dbms_output.put_line('start test 1'); - dbms_session.sleep(1); - ut.expect(1).to_equal(1); - dbms_output.put_line('end test 1'); - END; - - PROCEDURE test_2_nok IS - BEGIN - dbms_output.put_line('start test 2'); - dbms_session.sleep(2); - ut.expect(1, 'first assert.').to_equal(2); - ut.expect(1, 'second assert.').to_equal(2); - dbms_output.put_line('end test 2'); - END; - - PROCEDURE test_3_disabled IS - BEGIN - NULL; - END; - - PROCEDURE test_4_errored IS - BEGIN - EXECUTE IMMEDIATE 'bla bla'; - END; - - PROCEDURE test_5_warnings IS - BEGIN - COMMIT; -- will raise a warning - ut.expect(1).to_equal(1); - END; - - PROCEDURE print_and_raise IS - BEGIN - dbms_output.put_line('Now, a no_data_found exception is raised'); - dbms_output.put_line('dbms_output and error stack is reported for this suite.'); - dbms_output.put_line('A runtime error in afterall is counted as a warning.'); - RAISE no_data_found; - END; - END; - ''') - } - - @AfterClass - def static void teardown() { - try { - jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test1_pkg") - } catch (BadSqlGrammarException e) { - // ignore - } - } - - @Test - def void runTestsWithMaxTime() { - var ds1 = new SingleConnectionDataSource() - ds1.driverClassName = "oracle.jdbc.OracleDriver" - ds1.url = dataSource.url - ds1.username = dataSource.username - ds1.password = dataSource.password - var ds2 = new SingleConnectionDataSource() - ds2.driverClassName = "oracle.jdbc.OracleDriver" - ds2.url = dataSource.url - ds2.username = dataSource.username - ds2.password = dataSource.password - var runner = new UtplsqlRunner(#[":a"], ds1.connection, ds2.connection) - runner.runTestAsync - runner.producerThread.join(200000) - runner.consumerThread.join(200000) - Thread.sleep(4 * 1000) - runner.dispose - } - -} \ No newline at end of file +@SuppressWarnings("all") +public class UtplsqlRunnerTest extends AbstractJdbcTest { + @BeforeClass + public static void setup() { + StringConcatenation _builder = new StringConcatenation(); + _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suite(JUnit testing)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%suitepath(a)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("/* tags annotation without parameter will raise a warning */"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%tags"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%context(test context)"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 1 - OK) "); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_1_ok;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 2 - NOK)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_2_nok;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 3 - disabled)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%disabled"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_3_disabled;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 4 - errored)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_4_errored;"); + _builder.newLine(); + _builder.append(" "); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%test(test 5 - warnings)"); + _builder.newLine(); + _builder.append(" "); + _builder.append("PROCEDURE test_5_warnings;"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%endcontext"); + _builder.newLine(); + _builder.newLine(); + _builder.append(" "); + _builder.append("--%afterall"); + _builder.newLine(); + _builder.append(" "); + _builder.append("procedure print_and_raise;"); + _builder.newLine(); + _builder.append("END;"); + _builder.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_1_ok IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_output.put_line(\'start test 1\');"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_session.sleep(1);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("ut.expect(1).to_equal(1);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_output.put_line(\'end test 1\');"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_2_nok IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_output.put_line(\'start test 2\');"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_session.sleep(2);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("ut.expect(1, \'first assert.\').to_equal(2);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("ut.expect(1, \'second assert.\').to_equal(2);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_output.put_line(\'end test 2\');"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_3_disabled IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("NULL;"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_4_errored IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("EXECUTE IMMEDIATE \'bla bla\';"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE test_5_warnings IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("COMMIT; -- will raise a warning"); + _builder_1.newLine(); + _builder_1.append("\t "); + _builder_1.append("ut.expect(1).to_equal(1);"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("PROCEDURE print_and_raise IS"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("BEGIN"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_output.put_line(\'Now, a no_data_found exception is raised\');"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_output.put_line(\'dbms_output and error stack is reported for this suite.\');"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("dbms_output.put_line(\'A runtime error in afterall is counted as a warning.\');"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("RAISE no_data_found;"); + _builder_1.newLine(); + _builder_1.append(" "); + _builder_1.append("END;"); + _builder_1.newLine(); + _builder_1.append("END;"); + _builder_1.newLine(); + AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); + } + + @AfterClass + public static void teardown() { + try { + AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test1_pkg"); + } catch (final Throwable _t) { + if (_t instanceof BadSqlGrammarException) { + } else { + throw Exceptions.sneakyThrow(_t); + } + } + } + + @Test + public void runTestsWithMaxTime() { + try { + SingleConnectionDataSource ds1 = new SingleConnectionDataSource(); + ds1.setDriverClassName("oracle.jdbc.OracleDriver"); + ds1.setUrl(AbstractJdbcTest.dataSource.getUrl()); + ds1.setUsername(AbstractJdbcTest.dataSource.getUsername()); + ds1.setPassword(AbstractJdbcTest.dataSource.getPassword()); + SingleConnectionDataSource ds2 = new SingleConnectionDataSource(); + ds2.setDriverClassName("oracle.jdbc.OracleDriver"); + ds2.setUrl(AbstractJdbcTest.dataSource.getUrl()); + ds2.setUsername(AbstractJdbcTest.dataSource.getUsername()); + ds2.setPassword(AbstractJdbcTest.dataSource.getPassword()); + Connection _connection = ds1.getConnection(); + Connection _connection_1 = ds2.getConnection(); + UtplsqlRunner runner = new UtplsqlRunner(Collections.unmodifiableList(CollectionLiterals.newArrayList(":a")), _connection, _connection_1); + runner.runTestAsync(); + runner.getProducerThread().join(200000); + runner.getConsumerThread().join(200000); + Thread.sleep((4 * 1000)); + runner.dispose(); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } +} From 99b4d2426e41e42efa4592abc0b27ee4961cafb0 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 10:58:48 +0200 Subject: [PATCH 268/286] convert UtplsqlRunnerTest to Java, removing Xtend dependencies --- .../sqldev/test/runner/UtplsqlRunnerTest.java | 354 ++++++------------ 1 file changed, 117 insertions(+), 237 deletions(-) diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java index c0931840..c3531381 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/UtplsqlRunnerTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,248 +16,128 @@ package org.utplsql.sqldev.test.runner; import java.sql.Connection; -import java.util.Collections; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import java.util.Arrays; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; -import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.datasource.SingleConnectionDataSource; +import org.utplsql.sqldev.model.DatabaseTools; +import org.utplsql.sqldev.model.SystemTools; import org.utplsql.sqldev.runner.UtplsqlRunner; import org.utplsql.sqldev.test.AbstractJdbcTest; -@SuppressWarnings("all") public class UtplsqlRunnerTest extends AbstractJdbcTest { - @BeforeClass - public static void setup() { - StringConcatenation _builder = new StringConcatenation(); - _builder.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suite(JUnit testing)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%suitepath(a)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("/* tags annotation without parameter will raise a warning */"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%tags"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%context(test context)"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 1 - OK) "); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_1_ok;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 2 - NOK)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_2_nok;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 3 - disabled)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%disabled"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_3_disabled;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 4 - errored)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_4_errored;"); - _builder.newLine(); - _builder.append(" "); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%test(test 5 - warnings)"); - _builder.newLine(); - _builder.append(" "); - _builder.append("PROCEDURE test_5_warnings;"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%endcontext"); - _builder.newLine(); - _builder.newLine(); - _builder.append(" "); - _builder.append("--%afterall"); - _builder.newLine(); - _builder.append(" "); - _builder.append("procedure print_and_raise;"); - _builder.newLine(); - _builder.append("END;"); - _builder.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder.toString()); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_1_ok IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_output.put_line(\'start test 1\');"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_session.sleep(1);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("ut.expect(1).to_equal(1);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_output.put_line(\'end test 1\');"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_2_nok IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_output.put_line(\'start test 2\');"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_session.sleep(2);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("ut.expect(1, \'first assert.\').to_equal(2);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("ut.expect(1, \'second assert.\').to_equal(2);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_output.put_line(\'end test 2\');"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_3_disabled IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("NULL;"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_4_errored IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("EXECUTE IMMEDIATE \'bla bla\';"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE test_5_warnings IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("COMMIT; -- will raise a warning"); - _builder_1.newLine(); - _builder_1.append("\t "); - _builder_1.append("ut.expect(1).to_equal(1);"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("PROCEDURE print_and_raise IS"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("BEGIN"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_output.put_line(\'Now, a no_data_found exception is raised\');"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_output.put_line(\'dbms_output and error stack is reported for this suite.\');"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("dbms_output.put_line(\'A runtime error in afterall is counted as a warning.\');"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("RAISE no_data_found;"); - _builder_1.newLine(); - _builder_1.append(" "); - _builder_1.append("END;"); - _builder_1.newLine(); - _builder_1.append("END;"); - _builder_1.newLine(); - AbstractJdbcTest.jdbcTemplate.execute(_builder_1.toString()); - } - - @AfterClass - public static void teardown() { - try { - AbstractJdbcTest.jdbcTemplate.execute("DROP PACKAGE junit_utplsql_test1_pkg"); - } catch (final Throwable _t) { - if (_t instanceof BadSqlGrammarException) { - } else { - throw Exceptions.sneakyThrow(_t); - } + + @Before + public void setup() { + StringBuilder sb = new StringBuilder(); + sb.append("CREATE OR REPLACE PACKAGE junit_utplsql_test1_pkg is\n"); + sb.append(" --%suite(JUnit testing)\n"); + sb.append(" --%suitepath(a)\n"); + sb.append(" /* tags annotation without parameter will raise a warning */\n"); + sb.append(" --%tags\n\n"); + + sb.append(" --%context(test context)\n\n"); + + sb.append(" --%test(test 1 - OK)\n"); + sb.append(" PROCEDURE test_1_ok;\n\n"); + + sb.append(" --%test(test 2 - NOK)\n"); + sb.append(" PROCEDURE test_2_nok;\n\n"); + + sb.append(" --%test(test 3 - disabled)\n"); + sb.append(" --%disabled\n"); + sb.append(" PROCEDURE test_3_disabled;\n\n"); + + sb.append(" --%test(test 4 - errored)\n"); + sb.append(" PROCEDURE test_4_errored;\n\n"); + + sb.append(" --%test(test 5 - warnings)\n"); + sb.append(" PROCEDURE test_5_warnings;\n\n"); + + sb.append(" --%endcontext\n\n"); + + sb.append(" --%afterall\n"); + sb.append(" procedure print_and_raise;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); + + sb.setLength(0); + sb.append("CREATE OR REPLACE PACKAGE BODY junit_utplsql_test1_pkg IS\n"); + sb.append(" PROCEDURE test_1_ok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line('start test 1');\n"); + sb.append(" dbms_session.sleep(1);\n"); + sb.append(" ut.expect(1).to_equal(1);\n"); + sb.append(" dbms_output.put_line('end test 1');\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_2_nok IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line('start test 2');\n"); + sb.append(" dbms_session.sleep(2);\n"); + sb.append(" ut.expect(1, 'first assert.').to_equal(2);\n"); + sb.append(" ut.expect(1, 'second assert.').to_equal(2);\n"); + sb.append(" dbms_output.put_line('end test 2');\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_3_disabled IS\n"); + sb.append(" BEGIN\n"); + sb.append(" NULL;\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_4_errored IS\n"); + sb.append(" BEGIN\n"); + sb.append(" EXECUTE IMMEDIATE 'bla bla';\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE test_5_warnings IS\n"); + sb.append(" BEGIN\n"); + sb.append(" COMMIT; -- will raise a warning\n"); + sb.append(" ut.expect(1).to_equal(1);\n"); + sb.append(" END;\n\n"); + + sb.append(" PROCEDURE print_and_raise IS\n"); + sb.append(" BEGIN\n"); + sb.append(" dbms_output.put_line('Now, a no_data_found exception is raised');\n"); + sb.append(" dbms_output.put_line('dbms_output and error stack is reported for this suite.');\n"); + sb.append(" dbms_output.put_line('A runtime error in afterall is counted as a warning.');\n"); + sb.append(" RAISE no_data_found;\n"); + sb.append(" END;\n"); + sb.append("END;"); + jdbcTemplate.execute(sb.toString()); } - } - - @Test - public void runTestsWithMaxTime() { - try { - SingleConnectionDataSource ds1 = new SingleConnectionDataSource(); - ds1.setDriverClassName("oracle.jdbc.OracleDriver"); - ds1.setUrl(AbstractJdbcTest.dataSource.getUrl()); - ds1.setUsername(AbstractJdbcTest.dataSource.getUsername()); - ds1.setPassword(AbstractJdbcTest.dataSource.getPassword()); - SingleConnectionDataSource ds2 = new SingleConnectionDataSource(); - ds2.setDriverClassName("oracle.jdbc.OracleDriver"); - ds2.setUrl(AbstractJdbcTest.dataSource.getUrl()); - ds2.setUsername(AbstractJdbcTest.dataSource.getUsername()); - ds2.setPassword(AbstractJdbcTest.dataSource.getPassword()); - Connection _connection = ds1.getConnection(); - Connection _connection_1 = ds2.getConnection(); - UtplsqlRunner runner = new UtplsqlRunner(Collections.unmodifiableList(CollectionLiterals.newArrayList(":a")), _connection, _connection_1); - runner.runTestAsync(); - runner.getProducerThread().join(200000); - runner.getConsumerThread().join(200000); - Thread.sleep((4 * 1000)); - runner.dispose(); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); + + @After + public void teardown() { + executeAndIgnore(jdbcTemplate, "DROP PACKAGE junit_utplsql_test1_pkg"); + } + + @Test + public void runTestsWithMaxTime() { + final SingleConnectionDataSource ds1 = new SingleConnectionDataSource(); + ds1.setDriverClassName("oracle.jdbc.OracleDriver"); + ds1.setUrl(dataSource.getUrl()); + ds1.setUsername(dataSource.getUsername()); + ds1.setPassword(dataSource.getPassword()); + final Connection producerConn = DatabaseTools.getConnection(ds1); + + final SingleConnectionDataSource ds2 = new SingleConnectionDataSource(); + ds2.setDriverClassName("oracle.jdbc.OracleDriver"); + ds2.setUrl(dataSource.getUrl()); + ds2.setUsername(dataSource.getUsername()); + ds2.setPassword(dataSource.getPassword()); + final Connection consumerConn = DatabaseTools.getConnection(ds2); + + UtplsqlRunner runner = new UtplsqlRunner(Arrays.asList(":a"), producerConn, consumerConn); + runner.runTestAsync(); + + SystemTools.waitForThread(runner.getProducerThread(), 200000); + SystemTools.waitForThread(runner.getConsumerThread(), 200000); + SystemTools.sleep(4 * 1000); + Assert.assertNotNull(runner); + runner.dispose(); } - } } From 4b3be10654205a6857f5bdeaa97c459d8f1e2d84 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 11:25:56 +0200 Subject: [PATCH 269/286] remove Xtend, update Sprint, change version to 1.2.0-SNAPSHOT --- sqldev/pom.xml | 42 +++--------------------------------------- 1 file changed, 3 insertions(+), 39 deletions(-) diff --git a/sqldev/pom.xml b/sqldev/pom.xml index f04528cb..df133ec5 100644 --- a/sqldev/pom.xml +++ b/sqldev/pom.xml @@ -5,13 +5,12 @@ org.utplsql org.utplsql.sqldev - 1.1.2-SNAPSHOT + 1.2.0-SNAPSHOT bundle UTF-8 1.8 1.8 - 2.20.0 /Applications/SQLDeveloper19.4.0.app/Contents/Resources/sqldeveloper utplsql_for_SQLDev_${project.version} @@ -161,21 +160,15 @@ provided - - - org.eclipse.xtend - org.eclipse.xtend.lib - ${xtend.version} - org.springframework spring-jdbc - 5.2.4.RELEASE + 5.2.6.RELEASE org.springframework spring-web - 5.2.4.RELEASE + 5.2.6.RELEASE org.oddgen @@ -204,34 +197,6 @@ - - org.eclipse.xtend - xtend-maven-plugin - - ${xtend.version} - - - main - - compile - - - ${jdk.version} - ${project.basedir}/src/main/xtend-gen - - - - test - - testCompile - - - ${jdk.version.test} - ${project.basedir}/src/test/xtend-gen - - - - org.apache.maven.plugins 3.8.1 @@ -424,7 +389,6 @@ org.utplsql.sqldev.resources <_exportcontents> - org.eclipse.xtext.xbase.lib, org.aspectj.runtime.internal, org.aspectj.lang, org.aspectj.runtime, From 56547c14b3fcc79b861165e501cceca24092bd9b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 11:59:46 +0200 Subject: [PATCH 270/286] replace StringConcatenation usages with StringBuilder --- .../src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java | 7 +++---- .../java/org/utplsql/sqldev/menu/UtplsqlController.java | 7 +++---- .../java/org/utplsql/sqldev/model/runner/Expectation.java | 3 +-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index d4a47c16..15415ce8 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -23,7 +23,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.eclipse.xtend2.lib.StringConcatenation; import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.oddgen.sqldev.generators.model.Node; import org.springframework.dao.DataAccessException; @@ -254,7 +253,7 @@ public Boolean doInCallableStatement(final CallableStatement cs) throws SQLExcep return found > 0; } else { // using internal API (deprecated, not accessible in latest version) - StringConcatenation sb = new StringConcatenation(); + StringBuilder sb = new StringBuilder(); sb.append("SELECT count(\n"); sb.append(" CASE\n"); sb.append(" WHEN a.name = 'test'\n"); @@ -428,7 +427,7 @@ public List units(final String objectType, final String objectName) { * if there is a problem */ public List testables(final String objectType) { - StringConcatenation sb = new StringConcatenation(); + StringBuilder sb = new StringBuilder(); if ("PACKAGE".equals(objectType)) { if (normalizedUtPlsqlVersionNumber() >= FIRST_VERSION_WITH_ANNOTATION_API) { // using API available since 3.1.3 @@ -1049,7 +1048,7 @@ public String doInCallableStatement(final CallableStatement cs) throws SQLExcept * @return the object type, e.g. PACKAGE BODY, TYPE BODY, PROCEDURE, FUNCTION */ public String getObjectType(final String owner, final String objectName) { - StringConcatenation sb = new StringConcatenation(); + StringBuilder sb = new StringBuilder(); sb.append("SELECT object_type\n"); sb.append(" FROM (\n"); sb.append(" SELECT object_type\n"); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java index 0e73d2a1..698f993d 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java @@ -28,7 +28,6 @@ import javax.swing.JEditorPane; -import org.eclipse.xtend2.lib.StringConcatenation; import org.utplsql.sqldev.coverage.CodeCoverageReporter; import org.utplsql.sqldev.dal.RealtimeReporterDao; import org.utplsql.sqldev.dal.UtplsqlDao; @@ -320,7 +319,7 @@ public void runTest(final Context context) { final View view = context.getView(); final Node node = context.getNode(); final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); - final StringConcatenation sb = new StringConcatenation(); + final StringBuilder sb = new StringBuilder(); sb.append("Run utPLSQL from view "); sb.append(view != null ? view.getClass().getName() : "???"); sb.append(" and node "); @@ -417,7 +416,7 @@ public List dependencies(final Context context, final String connectionN public void codeCoverage(final Context context) { final View view = context.getView(); final Node node = context.getNode(); - final StringConcatenation sb = new StringConcatenation(); + final StringBuilder sb = new StringBuilder(); sb.append("Code coverage from view "); sb.append(view != null ? view.getClass().getName() : "???"); sb.append(" and node "); @@ -474,7 +473,7 @@ public void codeCoverage(final Context context) { public void generateTest(final Context context) { final View view = context.getView(); final Node node = context.getNode(); - final StringConcatenation sb = new StringConcatenation(); + final StringBuilder sb = new StringBuilder(); sb.append("Generate utPLSQL test from view "); sb.append(view != null ? view.getClass().getName() : "???"); sb.append(" and node "); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java index 041a247d..ba15d857 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java @@ -18,7 +18,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.eclipse.xtend2.lib.StringConcatenation; import org.springframework.core.style.ToStringCreator; import org.utplsql.sqldev.model.UtplsqlToStringStyler; @@ -50,7 +49,7 @@ public String getFailureText() { } public String getShortFailureText() { - final StringConcatenation sb = new StringConcatenation(); + final StringBuilder sb = new StringBuilder(); if (description != null) { sb.append(description); sb.append(" (line "); From ead372976f37230f2b4ccf8c21bf7906efb069f3 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 12:05:17 +0200 Subject: [PATCH 271/286] replace CollectionLiterals.newArrayList with Arrays.asList --- sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index 15415ce8..c3ff33f1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -19,11 +19,11 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.Types; +import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.oddgen.sqldev.generators.model.Node; import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; @@ -409,7 +409,7 @@ public List units(final String objectType, final String objectName) { final Object[] binds = new Object[] {objectType, objectName}; return jdbcTemplate.queryForList(sql, String.class, binds); } else { - return CollectionLiterals.newArrayList(objectName); + return Arrays.asList(objectName); } } From b58c7f509be0f75b86f1c810cbf644880ca74663 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 13:24:01 +0200 Subject: [PATCH 272/286] update versions, fix build warnings, add comments --- sqldev/pom.xml | 59 ++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/sqldev/pom.xml b/sqldev/pom.xml index df133ec5..ecf35ff3 100644 --- a/sqldev/pom.xml +++ b/sqldev/pom.xml @@ -16,123 +16,126 @@ utplsql_for_SQLDev_${project.version} - + + + + oracle idert - 12.2.0 + 13.0.0 system ${sqldev.basedir}/ide/lib/idert.jar oracle javatools-nodeps - 12.2.0 + 13.0.0 system ${sqldev.basedir}/modules/oracle.javatools/javatools-nodeps.jar oracle javatools - 12.2.0 + 13.0.0 system ${sqldev.basedir}/ide/lib/javatools.jar oracle oracle.ide.ceditor - 12.2.0 + 13.0.0 system ${sqldev.basedir}/ide/extensions/oracle.ide.ceditor.jar oracle oracle.ide - 12.2.0 + 13.0.0 system ${sqldev.basedir}/ide/extensions/oracle.ide.jar oracle uic - 12.2.2 + 13.0.0 system ${sqldev.basedir}/ide/lib/uic.jar oracle oracle.ide.navigator - 12.2.0 + 13.0.0 system ${sqldev.basedir}/ide/extensions/oracle.ide.navigator.jar oracle javax-ide - 12.2.0 + 13.0.0 system ${sqldev.basedir}/ide/lib/javax-ide.jar oracle oracle.dbtools-common - 12.2.0 + 19.4.0 system ${sqldev.basedir}/sqldeveloper/lib/dbtools-common.jar oracle oracle.sqldeveloper - 12.2.0 + 19.3.0 system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.jar oracle oracle.sqldeveloper.utils - 12.2.0 + 19.3.0 system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.utils.jar oracle oracle.sqldeveloper.worksheet - 12.2.0 + 19.3.0 system ${sqldev.basedir}/sqldeveloper/extensions/oracle.sqldeveloper.worksheet.jar oracle ojdbc8 - 12.2.0.1.0 + 19.3.0 system ${sqldev.basedir}/jdbc/lib/ojdbc8.jar oracle dbapi - 12.2.1 + 19.3.0 system ${sqldev.basedir}/ide/lib/dbapi.jar oracle oracle.ide.db - 12.2.1 + 19.3.0 system ${sqldev.basedir}/ide/extensions/oracle.ide.db.jar oracle oracle.jdeveloper.db.connection - 12.2.1 + 19.3.0 system ${sqldev.basedir}/jdev/extensions/oracle.jdeveloper.db.connection.jar oracle oracle.jdeveloper.java.core.jar - 12.2.1 + 13.0.0 system ${sqldev.basedir}/jdev/extensions/oracle.jdeveloper.java.core.jar @@ -140,14 +143,14 @@ oracle jewt4.jar - 12.2.1 + 13.0.0 system ${sqldev.basedir}/modules/oracle.bali.jewt/jewt4.jar oracle share.jar - 12.2.1 + 13.0.0 system ${sqldev.basedir}/modules/oracle.bali.share/share.jar @@ -161,16 +164,19 @@ + org.springframework spring-jdbc 5.2.6.RELEASE + org.springframework spring-web 5.2.6.RELEASE + org.oddgen org.oddgen.sqldev 0.3.1 @@ -261,7 +267,7 @@ org.apache.maven.plugins maven-antrun-plugin - 1.8 + 3.0.0 prepare-package @@ -395,7 +401,7 @@ org.aspectj.lang.reflect - oracle.javatools-nodeps, + oracle.javatools, oracle.jdeveloper.db.connection, oracle.idert, oracle.ide, @@ -414,7 +420,7 @@ maven-assembly-plugin - 3.2.0 + 3.3.0 ${final.name} false @@ -436,7 +442,7 @@ net.nicoulaj.maven.plugins checksum-maven-plugin - 1.8 + 1.9 calculate-checksums @@ -451,6 +457,7 @@ + org.eclipse.m2e lifecycle-mapping 1.0.0 @@ -461,7 +468,7 @@ org.apache.maven.plugins maven-dependency-plugin - [3.1.1,) + [3.1.2,) copy-dependencies @@ -479,7 +486,7 @@ build-helper-maven-plugin - [3.0.0,) + [3.1.0,) parse-version From d9b89b22606bf83049efaa2e39ac4a726b85fb4c Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 13:29:50 +0200 Subject: [PATCH 273/286] show "n/a" instead of null when connection name is not available --- sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java index 7b733322..02caa3e6 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java @@ -78,7 +78,7 @@ public void setStartTime(final String startTime) { public String getName() { final String time = startTime.substring(11, 19); - final String conn = connectionName != null ? connectionName.substring(15) : null; + final String conn = connectionName != null ? connectionName.substring(15) : "n/a"; final StringBuilder sb = new StringBuilder(); sb.append(time); sb.append(" ("); From 3a615cd5df4ca03ed35035f6a92dfdf3b4f8cc2b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 15:04:05 +0200 Subject: [PATCH 274/286] add jococo plugin for code coverage with "mvn jacoco:report" --- sqldev/pom.xml | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/sqldev/pom.xml b/sqldev/pom.xml index ecf35ff3..dc7106c8 100644 --- a/sqldev/pom.xml +++ b/sqldev/pom.xml @@ -14,6 +14,9 @@ /Applications/SQLDeveloper19.4.0.app/Contents/Resources/sqldeveloper utplsql_for_SQLDev_${project.version} + + + -noverify -Djava.util.logging.config.file=${project.basedir}/src/test/resources/logging.conf @@ -237,9 +240,7 @@ maven-surefire-plugin 2.22.2 - - -noverify - -Djava.util.logging.config.file=${project.basedir}/src/test/resources/logging.conf + **/*.java @@ -453,6 +454,25 @@ + + org.jacoco + jacoco-maven-plugin + 0.8.5 + + + + prepare-agent + + + + report + prepare-package + + report + + + + From 6b60d473288d9d3626f4f1e4d48932de1e199abd Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 19:36:52 +0200 Subject: [PATCH 275/286] rename UtplsqlToStringStyler to JsonToStringStyler --- .../model/{UtplsqlToStringStyler.java => JsonToStringStyler.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sqldev/src/main/java/org/utplsql/sqldev/model/{UtplsqlToStringStyler.java => JsonToStringStyler.java} (100%) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/JsonToStringStyler.java similarity index 100% rename from sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlToStringStyler.java rename to sqldev/src/main/java/org/utplsql/sqldev/model/JsonToStringStyler.java From 9b70d256022343d56cd3085ac7b0afbc8179ee51 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 19:39:09 +0200 Subject: [PATCH 276/286] JsonToStringStyler for model classes used in the utPLSQL project --- .../sqldev/model/JsonToStringStyler.java | 141 ++++++++++++++++-- 1 file changed, 130 insertions(+), 11 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/JsonToStringStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/JsonToStringStyler.java index b538b501..2fd04e73 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/JsonToStringStyler.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/JsonToStringStyler.java @@ -15,30 +15,149 @@ */ package org.utplsql.sqldev.model; -import org.springframework.core.style.DefaultToStringStyler; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; + +import javax.annotation.Nullable; + import org.springframework.core.style.ToStringStyler; -import org.springframework.util.ClassUtils; +import org.springframework.core.style.ValueStyler; -public class UtplsqlToStringStyler extends DefaultToStringStyler { - public static final ToStringStyler INSTANCE = new UtplsqlToStringStyler(); +public class JsonToStringStyler implements ToStringStyler, ValueStyler{ + public static final ToStringStyler INSTANCE = new JsonToStringStyler(); + public static final String INDENT_SPACES = " "; + private int indent = 0; + + private void newLine(StringBuilder buffer) { + buffer.append('\n'); + buffer.append(getIndentSpaces(0)); + } + + private String getIndentSpaces(int indentOffset) { + StringBuilder sb = new StringBuilder(); + for (int i=0; i list) { + if (list.isEmpty()) { + return "[]"; + } + + StringJoiner result = new StringJoiner(",\n" + getIndentSpaces(1), "[\n" + getIndentSpaces(1) , "\n" + getIndentSpaces(0) + "]"); + indent++; + for (Object o : list) { + result.add(style(o)); + } + indent--; + return result.toString(); + } + + private String getMapStyle(Map map) { + if (map.isEmpty()) { + return "[]"; + } + + StringJoiner result = new StringJoiner(",\n" + getIndentSpaces(1), "[\n" + getIndentSpaces(1) , "\n" + getIndentSpaces(0) + "]"); + indent++; + for (Object o : map.values()) { + result.add(style(o)); + } + indent--; + return result.toString(); + } + + private String getDefaultStyle(Object value) { + return String.valueOf(value); + } + @Override public void styleStart(StringBuilder buffer, Object obj) { + indent++; if (!obj.getClass().isArray()) { - buffer.append("[").append(ClassUtils.getShortName(obj.getClass())); - buffer.append('\n'); + buffer.append("{"); + newLine(buffer); + buffer.append("\"className\": "); + buffer.append('"'); + buffer.append(obj.getClass().getSimpleName()); + buffer.append('"'); + buffer.append(','); } else { buffer.append('['); styleValue(buffer, obj); } } + + @Override + public void styleEnd(StringBuilder buffer, Object obj) { + indent--; + newLine(buffer); + if (!obj.getClass().isArray()) { + buffer.append('}'); + } else { + buffer.append(']'); + } + } + + @Override + public void styleField(StringBuilder buffer, String fieldName, @Nullable Object value) { + newLine(buffer); + buffer.append('"'); + buffer.append(fieldName); + buffer.append('"'); + buffer.append(": "); + styleValue(buffer, value); + } + + @Override + public void styleValue(StringBuilder buffer, Object value) { + buffer.append(style(value)); + } + + @Override + public void styleFieldSeparator(StringBuilder buffer) { + buffer.append(","); + } + + @Override + public String style(Object value) { + if (value == null) { + return "null"; + } else if (value instanceof String) { + return getStringStyle((String) value); + } else if (value instanceof Object[]) { + return getArrayStyle((Object[]) value); + } else if (value instanceof List) { + return getListStyle((List) value); + } else if (value instanceof Map) { + return getMapStyle((Map) value); + } else { + return getDefaultStyle(value); + } + } } From 773d17433c167d2e60aeae186756e19ab26f931e Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 19:40:40 +0200 Subject: [PATCH 277/286] using JsonToStringStyler --- .../main/java/org/utplsql/sqldev/model/oddgen/GenContext.java | 4 ++-- .../java/org/utplsql/sqldev/model/parser/PlsqlObject.java | 4 ++-- .../src/main/java/org/utplsql/sqldev/model/parser/Unit.java | 4 ++-- .../org/utplsql/sqldev/model/preference/PreferenceModel.java | 4 ++-- .../main/java/org/utplsql/sqldev/model/runner/Counter.java | 4 ++-- .../java/org/utplsql/sqldev/model/runner/Expectation.java | 4 ++-- .../src/main/java/org/utplsql/sqldev/model/runner/Item.java | 4 ++-- .../main/java/org/utplsql/sqldev/model/runner/PostEvent.java | 4 ++-- .../java/org/utplsql/sqldev/model/runner/PostRunEvent.java | 4 ++-- .../java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java | 4 ++-- .../java/org/utplsql/sqldev/model/runner/PostTestEvent.java | 4 ++-- .../java/org/utplsql/sqldev/model/runner/PreRunEvent.java | 4 ++-- .../java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java | 4 ++-- .../java/org/utplsql/sqldev/model/runner/PreTestEvent.java | 4 ++-- .../src/main/java/org/utplsql/sqldev/model/runner/Suite.java | 4 ++-- .../src/main/java/org/utplsql/sqldev/model/runner/Test.java | 4 ++-- .../src/main/java/org/utplsql/sqldev/model/ut/Annotation.java | 4 ++-- .../main/java/org/utplsql/sqldev/model/ut/OutputLines.java | 4 ++-- 18 files changed, 36 insertions(+), 36 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java index cd13c16c..30fdfbf9 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/oddgen/GenContext.java @@ -18,7 +18,7 @@ import java.sql.Connection; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class GenContext { private Connection conn; @@ -40,7 +40,7 @@ public Connection getConn() { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("conn", conn) .append("objectType", objectType) .append("objectName", objectName) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java index 316d1af9..122cfc1c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/PlsqlObject.java @@ -18,7 +18,7 @@ import java.util.List; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; import org.utplsql.sqldev.model.ut.Annotation; public class PlsqlObject { @@ -29,7 +29,7 @@ public class PlsqlObject { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("name", name) .append("type", type) .append("position", position) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java index afd48346..990e877c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/parser/Unit.java @@ -16,7 +16,7 @@ package org.utplsql.sqldev.model.parser; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class Unit { private String name; @@ -25,7 +25,7 @@ public class Unit { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("name", name) .append("position", position) .append("positionOfName", positionOfName) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java index 26081163..693ace05 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.java @@ -18,7 +18,7 @@ import java.io.File; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; import oracle.javatools.data.HashStructure; import oracle.javatools.data.HashStructureAdapter; @@ -70,7 +70,7 @@ public static PreferenceModel getInstance(final PropertyStorage prefs) { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append(KEY_USE_REALTIME_REPORTER, isUseRealtimeReporter()) .append(KEY_UNSHARED_WORKSHEET, isUnsharedWorksheet()) .append(KEY_RESET_PACKAGE, isResetPackage()) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java index 8ec2c329..77ffceb9 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Counter.java @@ -16,7 +16,7 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class Counter { private Integer disabled; @@ -27,7 +27,7 @@ public class Counter { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("disabled", disabled) .append("success", success) .append("failure", failure) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java index ba15d857..2738bce1 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Expectation.java @@ -19,7 +19,7 @@ import java.util.regex.Pattern; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class Expectation { private String description; @@ -28,7 +28,7 @@ public class Expectation { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("description", description) .append("message", message) .append("caller", caller) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java index b4d81f0b..70bcef0c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Item.java @@ -16,7 +16,7 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public abstract class Item { private String id; @@ -30,7 +30,7 @@ public abstract class Item { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("id", id) .append("startTime", startTime) .append("endTime", endTime) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java index 4055a1ac..f24f8f52 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostEvent.java @@ -16,7 +16,7 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public abstract class PostEvent extends RealtimeReporterEvent { private String startTime; @@ -29,7 +29,7 @@ public abstract class PostEvent extends RealtimeReporterEvent { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("startTime", startTime) .append("endTime", endTime) .append("executionTime", executionTime) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java index 1e4f43c6..8c8dbe2f 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostRunEvent.java @@ -16,13 +16,13 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class PostRunEvent extends PostEvent { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) // ancestor .append("startTime", getStartTime()) .append("endTime", getEndTime()) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java index 9d757391..292671c4 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostSuiteEvent.java @@ -16,14 +16,14 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class PostSuiteEvent extends PostEvent { private String id; @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) // ancestor .append("startTime", getStartTime()) .append("endTime", getEndTime()) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java index 84c3c2ff..92a43484 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PostTestEvent.java @@ -19,7 +19,7 @@ import java.util.List; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class PostTestEvent extends PostEvent { private String id; @@ -29,7 +29,7 @@ public class PostTestEvent extends PostEvent { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) // ancestor .append("startTime", getStartTime()) .append("endTime", getEndTime()) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java index db68f264..dd1f0db8 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreRunEvent.java @@ -19,7 +19,7 @@ import java.util.List; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class PreRunEvent extends RealtimeReporterEvent { private List items; @@ -27,7 +27,7 @@ public class PreRunEvent extends RealtimeReporterEvent { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("items", items) .append("totalNumberOfTests", totalNumberOfTests) .toString(); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java index c1abf6fb..7b3ccf5c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreSuiteEvent.java @@ -16,14 +16,14 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class PreSuiteEvent extends RealtimeReporterEvent { private String id; @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("id", id) .toString(); } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java index 9d4643c9..1fdbd362 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/PreTestEvent.java @@ -16,7 +16,7 @@ package org.utplsql.sqldev.model.runner; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class PreTestEvent extends RealtimeReporterEvent { private String id; @@ -25,7 +25,7 @@ public class PreTestEvent extends RealtimeReporterEvent { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("id", id) .append("testNumber", testNumber) .append("totalNumberOfTests", totalNumberOfTests) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java index e9ac19b0..b6ec4be2 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Suite.java @@ -19,7 +19,7 @@ import java.util.List; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class Suite extends Item { private String name; @@ -32,7 +32,7 @@ public Suite() { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) // ancestor .append("id", getId()) .append("startTime", getStartTime()) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java index 2255b5ec..9e7d78ad 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Test.java @@ -20,7 +20,7 @@ import javax.swing.Icon; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; import org.utplsql.sqldev.resources.UtplsqlResources; public class Test extends Item { @@ -36,7 +36,7 @@ public class Test extends Item { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) // ancestor .append("id", getId()) .append("startTime", getStartTime()) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java index cdeff854..3f69ef77 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/Annotation.java @@ -16,7 +16,7 @@ package org.utplsql.sqldev.model.ut; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class Annotation { private String objectOwner; @@ -27,7 +27,7 @@ public class Annotation { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("objectOwner", objectOwner) .append("objectName", objectName) .append("name", name) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java index 01efa471..a8a041ae 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/ut/OutputLines.java @@ -16,7 +16,7 @@ package org.utplsql.sqldev.model.ut; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class OutputLines { private String[] lines; @@ -24,7 +24,7 @@ public class OutputLines { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("lines", lines) .append("numlines", numlines) .toString(); From f771414e8fbfba1b921038cf3a207d0ff5946eed Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 19:41:32 +0200 Subject: [PATCH 278/286] using JsonToStringStyler, handle nulls in getTotalNumberOfCompletedTests --- .../main/java/org/utplsql/sqldev/model/runner/Run.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java index 02caa3e6..cc0076c7 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java @@ -19,7 +19,7 @@ import java.util.List; import org.springframework.core.style.ToStringCreator; -import org.utplsql.sqldev.model.UtplsqlToStringStyler; +import org.utplsql.sqldev.model.JsonToStringStyler; public class Run { private String reporterId; @@ -41,7 +41,7 @@ public class Run { @Override public String toString() { - return new ToStringCreator(this, UtplsqlToStringStyler.INSTANCE) + return new ToStringCreator(this, JsonToStringStyler.INSTANCE) .append("reporterId", reporterId) .append("connectionName", connectionName) .append("pathList", pathList) @@ -103,6 +103,10 @@ public Test getTest(final String id) { } public int getTotalNumberOfCompletedTests() { + if (counter.getDisabled() == null || counter.getSuccess() == null || counter.getFailure() == null + || counter.getError() == null) { + return -1; + } return counter.getDisabled() + counter.getSuccess() + counter.getFailure() + counter.getError(); } From 5a822241f9d9890c6dfa1517e7e25d8c021572d1 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 19:41:51 +0200 Subject: [PATCH 279/286] remove unused UtplsqlValueStyler --- .../sqldev/model/UtplsqlValueStyler.java | 109 ------------------ 1 file changed, 109 deletions(-) delete mode 100644 sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java b/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java deleted file mode 100644 index b5b639be..00000000 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/UtplsqlValueStyler.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2020 Philipp Salvisberg - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.utplsql.sqldev.model; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringJoiner; - -import org.springframework.core.style.DefaultValueStyler; -import org.springframework.lang.Nullable; -import org.springframework.util.ClassUtils; -import org.springframework.util.ObjectUtils; - -public class UtplsqlValueStyler extends DefaultValueStyler { - private static final String EMPTY = "[[empty]]"; - private static final String COLLECTION = "collection"; - private static final String SET = "set"; - private static final String LIST = "list"; - private static final String MAP = "map"; - private static final String EMPTY_MAP = MAP + EMPTY; - private static final String ARRAY = "array"; - - @Override - public String style(@Nullable Object value) { - if (value == null) { - return super.style(value); - } else if (value instanceof String) { - return super.style(value); - } else if (value instanceof Class) { - return super.style(value); - } else if (value instanceof Method) { - return super.style(value); - } else if (value instanceof Map) { - return style((Map) value); - } else if (value instanceof Map.Entry) { - return style((Map.Entry) value); - } else if (value instanceof Collection) { - return style((Collection) value); - } else if (value.getClass().isArray()) { - return style(ObjectUtils.toObjectArray(value)); - } else { - return super.style(value); - } - } - - private String style(Map value) { - if (value.isEmpty()) { - return EMPTY_MAP; - } - StringJoiner result = new StringJoiner(",\n", "[\n", "]"); - for (Map.Entry entry : value.entrySet()) { - result.add(style(entry)); - } - return MAP + result; - } - - private String style(Map.Entry value) { - return style(value.getKey()) + " -> " + style(value.getValue()); - } - - private String style(Collection value) { - String collectionType = getCollectionTypeString(value); - if (value.isEmpty()) { - return collectionType + EMPTY; - } - StringJoiner result = new StringJoiner(",\n", "[\n", "]"); - for (Object o : value) { - result.add(style(o)); - } - return collectionType + result; - } - - private String getCollectionTypeString(Collection value) { - if (value instanceof List) { - return LIST; - } else if (value instanceof Set) { - return SET; - } else { - return COLLECTION; - } - } - - private String style(Object[] array) { - if (array.length == 0) { - return ARRAY + '<' + ClassUtils.getShortName(array.getClass().getComponentType()) + '>' + EMPTY; - } - StringJoiner result = new StringJoiner(",\n", "[\n", "]"); - for (Object o : array) { - result.add(style(o)); - } - return ARRAY + '<' + ClassUtils.getShortName(array.getClass().getComponentType()) + '>' + result; - } -} From 0de9b5925665db302ffad4e6a11b57ef05c2d11a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 19:42:22 +0200 Subject: [PATCH 280/286] add tests for JsonToStringStyler --- .../sqldev/test/JsonToStringStylerTest.java | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 sqldev/src/test/java/org/utplsql/sqldev/test/JsonToStringStylerTest.java diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/JsonToStringStylerTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/JsonToStringStylerTest.java new file mode 100644 index 00000000..2a0433cb --- /dev/null +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/JsonToStringStylerTest.java @@ -0,0 +1,196 @@ +/* + * Copyright 2020 Philipp Salvisberg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.utplsql.sqldev.test; + +import java.util.Arrays; + +import org.junit.Assert; +import org.junit.Test; +import org.utplsql.sqldev.model.runner.Run; +import org.utplsql.sqldev.model.ut.OutputLines; + +public class JsonToStringStylerTest { + + @Test + public void outputLinesWithTreeLines() { + final OutputLines o = new OutputLines(); + o.setLines(new String[] { "line \"1\"", "line2", "line3" }); + o.setNumlines(3); + + final String actual = o.toString(); + + final StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + sb.append(" \"className\": \"OutputLines\",\n"); + sb.append(" \"lines\": [\n"); + sb.append(" \"line \\\"1\\\"\",\n"); + sb.append(" \"line2\",\n"); + sb.append(" \"line3\"\n"); + sb.append(" ],\n"); + sb.append(" \"numlines\": 3\n"); + sb.append("}"); + Assert.assertEquals(sb.toString(), actual); + } + + @Test + public void outputLinesWithoutLines() { + final OutputLines o = new OutputLines(); + o.setLines(new String[] {}); + o.setNumlines(0); + + final String actual = o.toString(); + + final StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + sb.append(" \"className\": \"OutputLines\",\n"); + sb.append(" \"lines\": [],\n"); + sb.append(" \"numlines\": 0\n"); + sb.append("}"); + Assert.assertEquals(sb.toString(), actual); + } + + @Test + public void emptyRun() { + final Run r = new Run("1", "MyConnection", Arrays.asList()); + + final String actual = r.toString(); + + final StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + sb.append(" \"className\": \"Run\",\n"); + sb.append(" \"reporterId\": \"1\",\n"); + sb.append(" \"connectionName\": \"MyConnection\",\n"); + sb.append(" \"pathList\": [],\n"); + sb.append(" \"currentTestNumber\": null,\n"); + sb.append(" \"currentTest\": null,\n"); + sb.append(" \"totalNumberOfTests\": null,\n"); + sb.append(" \"startTime\": null,\n"); + sb.append(" \"endTime\": null,\n"); + sb.append(" \"executionTime\": null,\n"); + sb.append(" \"counter\": {\n"); + sb.append(" \"className\": \"Counter\",\n"); + sb.append(" \"disabled\": null,\n"); + sb.append(" \"success\": null,\n"); + sb.append(" \"failure\": null,\n"); + sb.append(" \"error\": null,\n"); + sb.append(" \"warning\": null\n"); + sb.append(" },\n"); + sb.append(" \"infoCount\": null,\n"); + sb.append(" \"errorStack\": null,\n"); + sb.append(" \"serverOutput\": null,\n"); + sb.append(" \"tests\": [],\n"); + sb.append(" \"status\": null,\n"); + sb.append(" \"start\": null,\n"); + sb.append(" \"endTime\": null,\n"); + sb.append(" \"totalNumberOfCompletedTests\": -1\n"); + sb.append("}"); + Assert.assertEquals(sb.toString(), actual.toString()); + } + + + @Test + public void runWithTests() { + final Run r = new Run("1", "MyConnection", Arrays.asList()); + final org.utplsql.sqldev.model.runner.Test t1 = new org.utplsql.sqldev.model.runner.Test(); + t1.setId("1"); + t1.setName("Test One"); + r.getTests().put(t1.getId(), t1); + final org.utplsql.sqldev.model.runner.Test t2 = new org.utplsql.sqldev.model.runner.Test(); + t2.setId("2"); + t2.setName("Test Two"); + r.getTests().put(t2.getId(), t2); + + final String actual = r.toString(); + + final StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + sb.append(" \"className\": \"Run\",\n"); + sb.append(" \"reporterId\": \"1\",\n"); + sb.append(" \"connectionName\": \"MyConnection\",\n"); + sb.append(" \"pathList\": [],\n"); + sb.append(" \"currentTestNumber\": null,\n"); + sb.append(" \"currentTest\": null,\n"); + sb.append(" \"totalNumberOfTests\": null,\n"); + sb.append(" \"startTime\": null,\n"); + sb.append(" \"endTime\": null,\n"); + sb.append(" \"executionTime\": null,\n"); + sb.append(" \"counter\": {\n"); + sb.append(" \"className\": \"Counter\",\n"); + sb.append(" \"disabled\": null,\n"); + sb.append(" \"success\": null,\n"); + sb.append(" \"failure\": null,\n"); + sb.append(" \"error\": null,\n"); + sb.append(" \"warning\": null\n"); + sb.append(" },\n"); + sb.append(" \"infoCount\": null,\n"); + sb.append(" \"errorStack\": null,\n"); + sb.append(" \"serverOutput\": null,\n"); + sb.append(" \"tests\": [\n"); + sb.append(" {\n"); + sb.append(" \"className\": \"Test\",\n"); + sb.append(" \"id\": \"1\",\n"); + sb.append(" \"startTime\": null,\n"); + sb.append(" \"endTime\": null,\n"); + sb.append(" \"executionTime\": null,\n"); + sb.append(" \"counter\": null,\n"); + sb.append(" \"errorStack\": null,\n"); + sb.append(" \"serverOutput\": null,\n"); + sb.append(" \"warnings\": null,\n"); + sb.append(" \"executableType\": null,\n"); + sb.append(" \"ownerName\": null,\n"); + sb.append(" \"objectName\": null,\n"); + sb.append(" \"procedureName\": null,\n"); + sb.append(" \"disabled\": null,\n"); + sb.append(" \"name\": \"Test One\",\n"); + sb.append(" \"description\": null,\n"); + sb.append(" \"testNumber\": null,\n"); + sb.append(" \"failedExpectations\": null,\n"); + sb.append(" \"statusIcon\": null,\n"); + sb.append(" \"warningIcon\": null,\n"); + sb.append(" \"infoIcon\": null\n"); + sb.append(" },\n"); + sb.append(" {\n"); + sb.append(" \"className\": \"Test\",\n"); + sb.append(" \"id\": \"2\",\n"); + sb.append(" \"startTime\": null,\n"); + sb.append(" \"endTime\": null,\n"); + sb.append(" \"executionTime\": null,\n"); + sb.append(" \"counter\": null,\n"); + sb.append(" \"errorStack\": null,\n"); + sb.append(" \"serverOutput\": null,\n"); + sb.append(" \"warnings\": null,\n"); + sb.append(" \"executableType\": null,\n"); + sb.append(" \"ownerName\": null,\n"); + sb.append(" \"objectName\": null,\n"); + sb.append(" \"procedureName\": null,\n"); + sb.append(" \"disabled\": null,\n"); + sb.append(" \"name\": \"Test Two\",\n"); + sb.append(" \"description\": null,\n"); + sb.append(" \"testNumber\": null,\n"); + sb.append(" \"failedExpectations\": null,\n"); + sb.append(" \"statusIcon\": null,\n"); + sb.append(" \"warningIcon\": null,\n"); + sb.append(" \"infoIcon\": null\n"); + sb.append(" }\n"); + sb.append(" ],\n"); + sb.append(" \"status\": null,\n"); + sb.append(" \"start\": null,\n"); + sb.append(" \"endTime\": null,\n"); + sb.append(" \"totalNumberOfCompletedTests\": -1\n"); + sb.append("}"); + Assert.assertEquals(sb.toString(), actual.toString()); + } +} From 90e29cfe1a6c824a93bcc1b328f9d364fec24741 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 20:15:49 +0200 Subject: [PATCH 281/286] add bundle oracle.javatools-nodeps to avoid ClassNotFoundException (HashStructureAdapter). Preference dialog cannot be loaded in SQL Developer. The following build warning must be ignored: [WARNING] Bundle org.utplsql:org.utplsql.sqldev:bundle:1.2.0-SNAPSHOT : Host oracle.javatools-nodeps= for this fragment/require bundle cannot be found on the classpath --- sqldev/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/sqldev/pom.xml b/sqldev/pom.xml index dc7106c8..86c63539 100644 --- a/sqldev/pom.xml +++ b/sqldev/pom.xml @@ -403,6 +403,7 @@ oracle.javatools, + oracle.javatools-nodeps, oracle.jdeveloper.db.connection, oracle.idert, oracle.ide, From 5cc114e63d48af7998004a04868463167268c075 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 20:17:17 +0200 Subject: [PATCH 282/286] use XMLTools to create DocumentBuilder (less redundancy) --- .../org/utplsql/sqldev/dal/RealtimeReporterDao.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index 44deab4c..d4e01682 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -25,10 +25,7 @@ import java.util.List; import java.util.logging.Logger; -import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.JdbcTemplate; @@ -130,9 +127,7 @@ public Void doInCallableStatement(final CallableStatement cs) throws SQLExceptio private RealtimeReporterEvent convert(final String itemType, final String text) { logger.fine(() -> "\n---- " + itemType + " ----\n" + text); try { - final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); - final DocumentBuilder docBuilder = factory.newDocumentBuilder(); + final DocumentBuilder docBuilder = xmlTools.createDocumentBuilder(); final Document doc = docBuilder.parse(new InputSource(new StringReader(text))); RealtimeReporterEvent event = null; if ("pre-run".equals(itemType)) { @@ -149,10 +144,6 @@ private RealtimeReporterEvent convert(final String itemType, final String text) event = convertToPostTestEvent(doc); } return event; - } catch (ParserConfigurationException e) { - final String msg = "Cannot create docBuilder for " + itemType + " with content: " + text; - logger.severe(() -> msg); - throw new GenericRuntimeException(msg, e); } catch (SAXException e) { final String msg = "Parse error while processing " + itemType + " with content: " + text; logger.severe(() -> msg); From f798f67f209e38737adb1f2ea7b41cd4ac0fcf7b Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 21:00:59 +0200 Subject: [PATCH 283/286] use SystemTools.sleep (reduce redundant code) --- .../main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java index 888c26e5..bf0628af 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.java @@ -30,6 +30,7 @@ import org.utplsql.sqldev.dal.RealtimeReporterDao; import org.utplsql.sqldev.dal.RealtimeReporterEventConsumer; import org.utplsql.sqldev.model.DatabaseTools; +import org.utplsql.sqldev.model.SystemTools; import org.utplsql.sqldev.model.runner.PostRunEvent; import org.utplsql.sqldev.model.runner.PostSuiteEvent; import org.utplsql.sqldev.model.runner.PostTestEvent; @@ -308,11 +309,7 @@ public void runTestAsync() { consumerThread.setName("realtime consumer"); consumerThread.start(); // avoid concurrency on output header table to fix issue #80 - try { - Thread.sleep(100); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } + SystemTools.sleep(100); // the producer producerThread = new Thread(() -> produce()); producerThread.setName("realtime producer"); From e9cd7e22ce52532cdd1e99e717c42629e74605f9 Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 21:12:25 +0200 Subject: [PATCH 284/286] remove usage of com.google.common.base.Objects (not provided) causes ClassNotFoundException in SQL Developer --- .../src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index c3ff33f1..b059d88c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -35,8 +35,6 @@ import org.utplsql.sqldev.model.ut.Annotation; import org.utplsql.sqldev.model.ut.OutputLines; -import com.google.common.base.Objects; - public class UtplsqlDao { public static final String UTPLSQL_PACKAGE_NAME = "UT"; public static final int NOT_INSTALLED = 0; @@ -237,7 +235,7 @@ public Boolean doInCallableStatement(final CallableStatement cs) throws SQLExcep cs.registerOutParameter(4, Types.VARCHAR); cs.execute(); final String ret = cs.getString(4); - return Boolean.valueOf(Objects.equal(ret, "1")); + return Boolean.valueOf("1".equals(ret)); } }); } else if (normalizedUtPlsqlVersionNumber() >= FIRST_VERSION_WITH_ANNOTATION_API) { @@ -309,7 +307,7 @@ public Boolean doInCallableStatement(final CallableStatement cs) cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); final String ret = cs.getString(2); - return Boolean.valueOf(Objects.equal(ret, "1")); + return Boolean.valueOf("1".equals(ret)); } }); } else { @@ -338,7 +336,7 @@ public Boolean doInCallableStatement(final CallableStatement cs) cs.registerOutParameter(3, Types.VARCHAR); cs.execute(); final String ret = cs.getString(3); - return Boolean.valueOf(Objects.equal(ret, "1")); + return Boolean.valueOf("1".equals(ret)); } }); } else { From 9d2c6235532003cedb0e7e0c10941f2c0e2b94db Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 21:54:25 +0200 Subject: [PATCH 285/286] remove unnecessary parenthesis, valueOf calls for readability --- .../sqldev/coverage/CodeCoverageReporter.java | 2 +- .../sqldev/dal/RealtimeReporterDao.java | 4 +-- .../org/utplsql/sqldev/dal/UtplsqlDao.java | 18 ++++++------- .../sqldev/menu/UtplsqlController.java | 18 ++++++------- .../org/utplsql/sqldev/model/runner/Run.java | 2 +- .../utplsql/sqldev/oddgen/TestGenerator.java | 26 +++++++++---------- .../utplsql/sqldev/parser/UtplsqlParser.java | 2 +- .../sqldev/runner/UtplsqlWorksheetRunner.java | 4 +-- .../sqldev/ui/preference/PreferencePanel.java | 6 ++--- .../utplsql/sqldev/ui/runner/RunnerPanel.java | 2 +- .../org/utplsql/sqldev/test/dal/DalTest.java | 2 +- .../test/preference/PreferenceModelTest.java | 2 +- .../test/preference/PreferencePanelTest.java | 2 +- 13 files changed, 45 insertions(+), 45 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java index 9049d295..c00a0473 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/coverage/CodeCoverageReporter.java @@ -132,7 +132,7 @@ public List getPathList() { } public List getIncludeObjectList() { - if ((includeObjectList == null)) { + if (includeObjectList == null) { return new ArrayList<>(); } else { return includeObjectList; diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java index d4e01682..87be783c 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/RealtimeReporterDao.java @@ -114,7 +114,7 @@ public Void doInCallableStatement(final CallableStatement cs) throws SQLExceptio final Clob textClob = rs.getClob("text"); final String textString = textClob.getSubString(1, ((int) textClob.length())); final RealtimeReporterEvent event = convert(itemType, textString); - if ((event != null)) { + if (event != null) { consumer.process(event); } } @@ -264,7 +264,7 @@ private void populate(final Test test, final Node node) { test.setOwnerName(xmlTools.getElementValue(node, "ownerName")); test.setObjectName(xmlTools.getElementValue(node, "objectName")); test.setProcedureName(xmlTools.getElementValue(node, "procedureName")); - test.setDisabled(Boolean.valueOf("true".equals(xmlTools.getElementValue(node, "disabled")))); + test.setDisabled("true".equals(xmlTools.getElementValue(node, "disabled"))); test.setName(xmlTools.getElementValue(node, "name")); test.setDescription(xmlTools.getElementValue(node, "description")); test.setTestNumber(Integer.valueOf(xmlTools.getElementValue(node, "testNumber"))); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java index b059d88c..be4d6d09 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/dal/UtplsqlDao.java @@ -64,7 +64,7 @@ public void setUtPlsqlVersion(final String utPlsqlVersion) { */ public String normalizedUtPlsqlVersion() { final String version = this.getUtPlsqlVersion(); - if ((version != null)) { + if (version != null) { final Pattern p = Pattern.compile("(\\d+\\.\\d+\\.\\d+)"); final Matcher m = p.matcher(version); if (m.find()) { @@ -117,7 +117,7 @@ public String doInCallableStatement(final CallableStatement cs) throws SQLExcept } public boolean isDbaViewAccessible() { - if ((cachedDbaViewAccessible == null)) { + if (cachedDbaViewAccessible == null) { try { final StringBuilder sb = new StringBuilder(); sb.append("SELECT 1 AS dummy\n"); @@ -161,7 +161,7 @@ public String getDbaView(String viewName) { * if there is a problem */ public String getUtplsqlSchema() { - if ((cachedUtplsqlSchema == null)) { + if (cachedUtplsqlSchema == null) { final StringBuilder sb = new StringBuilder(); sb.append("SELECT table_owner\n"); sb.append(" FROM "); @@ -235,7 +235,7 @@ public Boolean doInCallableStatement(final CallableStatement cs) throws SQLExcep cs.registerOutParameter(4, Types.VARCHAR); cs.execute(); final String ret = cs.getString(4); - return Boolean.valueOf("1".equals(ret)); + return "1".equals(ret); } }); } else if (normalizedUtPlsqlVersionNumber() >= FIRST_VERSION_WITH_ANNOTATION_API) { @@ -307,7 +307,7 @@ public Boolean doInCallableStatement(final CallableStatement cs) cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); final String ret = cs.getString(2); - return Boolean.valueOf("1".equals(ret)); + return "1".equals(ret); } }); } else { @@ -336,7 +336,7 @@ public Boolean doInCallableStatement(final CallableStatement cs) cs.registerOutParameter(3, Types.VARCHAR); cs.execute(); final String ret = cs.getString(3); - return Boolean.valueOf("1".equals(ret)); + return "1".equals(ret); } }); } else { @@ -876,14 +876,14 @@ public OutputLines doInCallableStatement(final CallableStatement cs) throws SQLE cs.execute(); final OutputLines out = new OutputLines(); Object array = cs.getArray(1).getArray(); - out.setLines(((String[]) array)); - out.setNumlines(Integer.valueOf(cs.getInt(2))); + out.setLines((String[]) array); + out.setNumlines(cs.getInt(2)); return out; } }); for (int i = 0; i < ret.getNumlines(); i++) { final String line = ret.getLines()[i]; - if ((line != null)) { + if (line != null) { resultSb.append(ret.getLines()[i]); } resultSb.append(System.lineSeparator()); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java index 698f993d..a7e74654 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/menu/UtplsqlController.java @@ -113,7 +113,7 @@ public boolean update(final IdeAction action, final Context context) { connectionName = ((DatabaseSourceNode) node).getConnectionName(); owner = ((DatabaseSourceNode) node).getOwner(); } else { - if ((view instanceof Worksheet)) { + if (view instanceof Worksheet) { connectionName = ((Worksheet) view).getConnectionName(); } } @@ -144,17 +144,17 @@ public boolean update(final IdeAction action, final Context context) { if (element instanceof DatabaseConnection) { final String schema = DatabaseTools.getSchema((DatabaseConnection) element); action.setEnabled(dao.containsUtplsqlTest(schema)); - } else if ((element instanceof SchemaFolder)) { + } else if (element instanceof SchemaFolder) { final String schema = ((SchemaFolder) element).getSchemaName(); action.setEnabled(dao.containsUtplsqlTest(schema)); - } else if ((element instanceof ObjectFolder)) { + } else if (element instanceof ObjectFolder) { final String schema = URLTools.getSchema(((ObjectFolder) element).getURL()); action.setEnabled(dao.containsUtplsqlTest(schema)); - } else if ((element instanceof PlSqlNode)) { + } else if (element instanceof PlSqlNode) { final String schema = ((PlSqlNode) element).getOwner(); final String objectName = ((PlSqlNode) element).getObjectName(); action.setEnabled(dao.containsUtplsqlTest(schema, objectName)); - } else if ((element instanceof ChildObjectElement)) { + } else if (element instanceof ChildObjectElement) { final String schema = URLTools.getSchema(((ChildObjectElement) element).getURL()); final String objectName = URLTools.getMemberObject(((ChildObjectElement) element).getURL()); final String subObjectName = ((ChildObjectElement) element).getShortLabel(); @@ -305,7 +305,7 @@ private GenContext getGenContext(final Context context) { if (Connections.getInstance().isConnectionOpen(connectionName)) { genContext.setConn(DatabaseTools.getConnection(connectionName)); final Object element = context.getSelection()[0]; - if ((element instanceof PlSqlNode)) { + if (element instanceof PlSqlNode) { genContext.setObjectType(((PlSqlNode) element).getObjectType().replace(" BODY", "")); genContext.setObjectName(((PlSqlNode) element).getObjectName()); final PreferenceModel preferences = PreferenceModel.getInstance(Preferences.getPreferences()); @@ -326,7 +326,7 @@ public void runTest(final Context context) { sb.append(node != null ? node.getClass().getName() : "???"); sb.append("."); logger.finer(() -> sb.toString()); - if ((view instanceof Editor)) { + if (view instanceof Editor) { final Component component = ((Editor) view).getDefaultFocusComponent(); if (component instanceof JEditorPane) { String connectionName = null; @@ -356,7 +356,7 @@ public void runTest(final Context context) { } } else if (view instanceof DBNavigatorWindow) { final URL url = getURL(context); - if ((url != null)) { + if (url != null) { final String connectionName = URLTools.getConnectionName(url); logger.fine("connectionName: " + connectionName); final Connection conn = DatabaseTools.getConnection(connectionName); @@ -450,7 +450,7 @@ public void codeCoverage(final Context context) { final CodeCoverageReporter reporter = new CodeCoverageReporter(getPathList(path), includeObjectList, connectionName); reporter.showParameterWindow(); } - } else if ((view instanceof DBNavigatorWindow)) { + } else if (view instanceof DBNavigatorWindow) { logger.finer("Code coverage from DB navigator"); final URL url = getURL(context); if (url != null) { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java index cc0076c7..ed775d36 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/model/runner/Run.java @@ -73,7 +73,7 @@ public Run(final String reporterId, final String connectionName, final List getNodes(final Connection conn, final String parentNodeId) { final Node packageNode = new Node(); packageNode.setId("PACKAGE"); packageNode.setParams(params); - packageNode.setLeaf(Boolean.valueOf(false)); - packageNode.setGeneratable(Boolean.valueOf(true)); - packageNode.setMultiselectable(Boolean.valueOf(true)); + packageNode.setLeaf(false); + packageNode.setGeneratable(true); + packageNode.setMultiselectable(true); final Node typeNode = new Node(); typeNode.setId("TYPE"); typeNode.setParams(params); - typeNode.setLeaf(Boolean.valueOf(false)); - typeNode.setGeneratable(Boolean.valueOf(true)); - typeNode.setMultiselectable(Boolean.valueOf(true)); + typeNode.setLeaf(false); + typeNode.setGeneratable(true); + typeNode.setMultiselectable(true); final Node functionNode = new Node(); functionNode.setId("FUNCTION"); functionNode.setParams(params); - functionNode.setLeaf(Boolean.valueOf(false)); - functionNode.setGeneratable(Boolean.valueOf(true)); - functionNode.setMultiselectable(Boolean.valueOf(true)); + functionNode.setLeaf(false); + functionNode.setGeneratable(true); + functionNode.setMultiselectable(true); final Node procedureNode = new Node(); procedureNode.setId("PROCEDURE"); procedureNode.setParams(params); - procedureNode.setLeaf(Boolean.valueOf(false)); - procedureNode.setGeneratable(Boolean.valueOf(true)); - procedureNode.setMultiselectable(Boolean.valueOf(true)); + procedureNode.setLeaf(false); + procedureNode.setGeneratable(true); + procedureNode.setMultiselectable(true); return Arrays.asList(packageNode, typeNode, functionNode, procedureNode); } else { final UtplsqlDao dao = new UtplsqlDao(conn); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java b/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java index d5882a0f..8eb5c9ef 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/parser/UtplsqlParser.java @@ -108,7 +108,7 @@ private void populateObjects() { final PlsqlObject o = new PlsqlObject(); o.setType(m.group(4).toUpperCase()); o.setName(m.group(6)); - o.setPosition(Integer.valueOf(m.start())); + o.setPosition(m.start()); objects.add(o); } } diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java index 27bee4cd..b56b06fa 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlWorksheetRunner.java @@ -106,7 +106,7 @@ private void resizeResultPanel(final Worksheet worksheet) { && selectedResultPanel.getGUI().getParent().getParent() != null && selectedResultPanel.getGUI().getParent().getParent().getParent() != null) { splitPane = selectedResultPanel.getGUI().getParent().getParent().getParent(); } - if ((splitPane instanceof JSplitPane)) { + if (splitPane instanceof JSplitPane) { ((JSplitPane) splitPane).setDividerLocation(0.15); } else { final String msg = "Could not adjust size of worksheet. Expected JSplitPane but got " @@ -119,7 +119,7 @@ private void runScript(final Worksheet worksheet) { if (preferences.isAutoExecute()) { SystemTools.sleep(100); final IdeAction action = ((IdeAction) Ide.getIdeActionMap().get(Ide.findCmdID("Worksheet.RunScript"))); - if ((action != null)) { + if (action != null) { try { action.performAction(worksheet.getContext()); } catch (Exception e) { diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java index 1285ba3b..89786dae 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.java @@ -367,7 +367,7 @@ public void onEntry(final TraversableContext traversableContext) { autoExecuteCheckBox.setSelected(info.isAutoExecute()); checkRunUtplsqlTestCheckBox.setSelected(info.isCheckRunUtplsqlTest()); useSmartTimesCheckBox.setSelected(info.isUseSmartTimes()); - numberOfRunsInHistorySpinner.setValue(Integer.valueOf(info.getNumberOfRunsInHistory())); + numberOfRunsInHistorySpinner.setValue(info.getNumberOfRunsInHistory()); showDisabledCounterCheckBox.setSelected(info.isShowDisabledCounter()); showWarningsCounterCheckBox.setSelected(info.isShowWarningsCounter()); showInfoCounterCheckBox.setSelected(info.isShowInfoCounter()); @@ -381,13 +381,13 @@ public void onEntry(final TraversableContext traversableContext) { testPackageSuffixTextField.setText(info.getTestPackageSuffix()); testUnitPrefixTextField.setText(info.getTestUnitPrefix()); testUnitSuffixTextField.setText(info.getTestUnitSuffix()); - numberOfTestsPerUnitSpinner.setValue(Integer.valueOf(info.getNumberOfTestsPerUnit())); + numberOfTestsPerUnitSpinner.setValue(info.getNumberOfTestsPerUnit()); checkGenerateUtplsqlTestCheckBox.setSelected(info.isCheckGenerateUtplsqlTest()); loadCodeTemplates(); generateCommentsCheckBox.setSelected(info.isGenerateComments()); disableTestsCheckBox.setSelected(info.isDisableTests()); suitePathTextField.setText(info.getSuitePath()); - indentSpacesSpinner.setValue(Integer.valueOf(info.getIndentSpaces())); + indentSpacesSpinner.setValue(info.getIndentSpaces()); rootFolderInOddgenViewTextField.setText(info.getRootFolderInOddgenView()); generateFilesCheckBox.setSelected(info.isGenerateFiles()); outputDirectoryTextField.setText(info.getOutputDirectory()); diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java index 0e71115e..783b6415 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.java @@ -570,7 +570,7 @@ private void comboBoxAction() { } private String getLinkedAndFormattedText(final String text) { - if ((text == null)) { + if (text == null) { return ""; } // Patterns (primarily Asserts, Errors, ServerOutput): diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java index aa6920cc..d67019d6 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/DalTest.java @@ -614,6 +614,6 @@ public void getObjectType() { public void normalizedUtPlsqlVersion() { final UtplsqlDao dao = new UtplsqlDao(DatabaseTools.getConnection(dataSource)); final String version = dao.normalizedUtPlsqlVersion(); - Assert.assertTrue((version != null)); + Assert.assertTrue(version != null); } } diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java index 172eb656..d246c315 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.java @@ -53,7 +53,7 @@ public void defaultValues() { Assert.assertEquals(3, model.getIndentSpaces()); Assert.assertTrue(model.isGenerateFiles()); Assert.assertEquals(PreferenceModel.DEFAULT_OUTPUT_DIRECTORY, model.getOutputDirectory()); - Assert.assertEquals(Boolean.valueOf(false), Boolean.valueOf(model.isDeleteExistingFiles())); + Assert.assertEquals(false, model.isDeleteExistingFiles()); Assert.assertEquals("utPLSQL", model.getRootFolderInOddgenView()); } } diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java index bf060d96..a27f8498 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferencePanelTest.java @@ -40,7 +40,7 @@ public void layout() { frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2); frame.setVisible(true); }); - SystemTools.sleep((4 * 1000)); + SystemTools.sleep(4 * 1000); Assert.assertNotNull(frame); frame.dispose(); } From df98a06fa7dbba7885e64a6ab591889bb7aeca4a Mon Sep 17 00:00:00 2001 From: Philipp Salvisberg Date: Fri, 29 May 2020 22:05:32 +0200 Subject: [PATCH 286/286] change copyright notice from JavaDoc to normal comment --- .../utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java | 2 +- .../utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java | 2 +- .../java/org/utplsql/sqldev/test/runner/ExpectationTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java index 654bb59c..029c8264 100644 --- a/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java +++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/coverage/CodeCoverageReporterDialog.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java index 05757517..6aa90a94 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java index facd25cf..554e3741 100644 --- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java +++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2019 Philipp Salvisberg * * Licensed under the Apache License, Version 2.0 (the "License");