Skip to content

Commit edf9be5

Browse files
committed
[ARQ-1300] Improved comments handling by introducing regex.
1 parent 0911f58 commit edf9be5

File tree

4 files changed

+110
-58
lines changed

4 files changed

+110
-58
lines changed

impl/src/main/java/org/jboss/arquillian/persistence/script/ScriptExecutor.java

Lines changed: 36 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
import java.sql.Connection;
3838
import java.sql.SQLException;
3939
import java.sql.Statement;
40+
import java.util.ArrayList;
41+
import java.util.List;
4042
import java.util.StringTokenizer;
4143

4244
import org.jboss.arquillian.persistence.dbunit.exception.DBUnitDataSetHandlingException;
@@ -56,6 +58,8 @@
5658
public class ScriptExecutor
5759
{
5860

61+
private static final String ANSI_SQL_COMMENTS_PATTERN = "--.*|//.*|(?s)/\\\\*.*?\\\\*/|(?s)\\{.*?\\}";
62+
5963
private static final String LINE_SEPARATOR = System.getProperty("line.separator", "\n");
6064

6165
private static final String DEFAULT_SQL_DELIMITER = ";";
@@ -66,6 +70,8 @@ public class ScriptExecutor
6670

6771
private boolean fullLineDelimiter = false;
6872

73+
private List<String> statements = new ArrayList<String>();
74+
6975
public ScriptExecutor(final Connection connection)
7076
{
7177
this.connection = connection;
@@ -75,39 +81,51 @@ public void execute(String script)
7581
{
7682
try
7783
{
84+
script = removeComments(script);
7885
final BufferedReader lineReader = new BufferedReader(new StringReader(script));
79-
final StringBuilder sql = new StringBuilder();
86+
final StringBuilder readSqlStatement = new StringBuilder();
8087
String line = null;
88+
statements.clear();
8189
while ((line = lineReader.readLine()) != null)
8290
{
83-
boolean shouldExecute = parseLine(line, sql);
84-
if (shouldExecute)
91+
boolean isFullCommand = parseLine(line, readSqlStatement);
92+
if (isFullCommand)
8593
{
8694
if(multipleInlineStatements(line))
8795
{
88-
executeMultipleInlineStatements(line, sql);
96+
splitInlineStatements(line);
8997
}
9098
else
9199
{
92-
executeStatements(sql);
100+
addStatement(readSqlStatement.toString());
93101
}
102+
readSqlStatement.setLength(0);
94103
}
95104
}
96-
if (shouldExecuteRemainingStatements(sql))
105+
if (shouldExecuteRemainingStatements(readSqlStatement))
97106
{
98-
executeStatements(sql);
107+
addStatement(readSqlStatement.toString());
99108
}
100109
}
101110
catch (Exception e)
102111
{
103-
throw new RuntimeException("Failed parsing file. ", e);
112+
throw new RuntimeException("Failed parsing file.", e);
113+
}
114+
115+
for (String statement : statements)
116+
{
117+
executeStatement(statement);
104118
}
105119
}
106120

121+
private String removeComments(String script)
122+
{
123+
return script.replaceAll(ANSI_SQL_COMMENTS_PATTERN, "");
124+
}
125+
107126
void executeStatement(String sqlStatement)
108127
{
109128
Statement statement = null;
110-
sqlStatement = removeTrailingComment(sqlStatement).trim();
111129
try
112130
{
113131
statement = connection.createStatement();
@@ -137,15 +155,10 @@ void executeStatement(String sqlStatement)
137155

138156
private boolean parseLine(final String line, final StringBuilder sql)
139157
{
140-
if (isComment(line))
141-
{
142-
return false;
143-
}
144-
String trimmedLine = trim(removeTrailingComment(line));
145-
sql.append(trimmedLine)
146-
.append(LINE_SEPARATOR);
158+
String trimmedLine = trim(line);
159+
sql.append(trimmedLine).append(LINE_SEPARATOR);
147160

148-
return commandShouldBeExecuted(trimmedLine);
161+
return isFullCommand(trimmedLine);
149162
}
150163

151164
private String trim(final String line)
@@ -163,20 +176,18 @@ private boolean isNewLineStatementDelimiter()
163176
return ScriptingConfiguration.NEW_LINE_SYMBOL.equals(getStatementDelimiter());
164177
}
165178

166-
private void executeMultipleInlineStatements(String line, StringBuilder sql)
179+
private void splitInlineStatements(String line)
167180
{
168181
final StringTokenizer sqlStatements = new StringTokenizer(line, getStatementDelimiter());
169182
while (sqlStatements.hasMoreElements())
170183
{
171-
sql.append(sqlStatements.nextToken());
172-
executeStatements(sql);
184+
addStatement(sqlStatements.nextToken());
173185
}
174186
}
175187

176-
private void executeStatements(final StringBuilder sql)
188+
private void addStatement(String statement)
177189
{
178-
executeStatement(sql.toString());
179-
sql.setLength(0);
190+
statements.add(statement.trim());
180191
}
181192

182193
private boolean multipleInlineStatements(String line)
@@ -185,25 +196,10 @@ private boolean multipleInlineStatements(String line)
185196
{
186197
return false;
187198
}
188-
return new StringTokenizer(removeTrailingComment(line), getStatementDelimiter()).countTokens() > 1;
199+
return new StringTokenizer(line, getStatementDelimiter()).countTokens() > 1;
189200
}
190201

191-
private String removeTrailingComment(String line)
192-
{
193-
if (line.contains("--"))
194-
{
195-
line = line.substring(0, line.indexOf("--") - 1);
196-
}
197-
198-
if (line.contains("//"))
199-
{
200-
line = line.substring(0, line.indexOf("//") - 1);
201-
}
202-
203-
return line;
204-
}
205-
206-
private boolean commandShouldBeExecuted(String line)
202+
private boolean isFullCommand(String line)
207203
{
208204
return !fullLineDelimiter && lineEndsWithStatementDelimiter(line)
209205
|| fullLineDelimiter && lineIsStatementDelimiter(line);
@@ -230,11 +226,6 @@ private boolean lineEndsWithStatementDelimiter(String line)
230226
}
231227

232228

233-
private boolean isComment(final String line)
234-
{
235-
return line.startsWith("--") || line.startsWith("//");
236-
}
237-
238229
// -- Accessors
239230

240231
public String getStatementDelimiter()

impl/src/test/java/org/jboss/arquillian/persistence/script/ScriptExecutorTest.java

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,11 @@ public void should_execute_script_with_new_line_as_statement_delimiter_ommiting_
149149
verify(connection, times(6)).createStatement();
150150
verify(connection.createStatement(), times(6)).execute(statementsCaptor.capture());
151151
assertThat(statementsCaptor.getAllValues()).containsSequence("create table address (id bigint not null, city varchar(255) not null, houseNumber integer, streetName varchar(255) not null, version bigint, zipCode integer not null, primary key (id))",
152-
"create table useraccount (id bigint generated by default as identity, firstname varchar(128) not null, lastname varchar(128) not null, nickname varchar(128), password varchar(255) not null, openDate date, username varchar(32) not null, primary key (id))",
153-
"create table useraccount_address (useraccount_id bigint not null, addresses_id bigint not null, primary key (useraccount_id, addresses_id), unique (addresses_id))",
154-
"alter table useraccount_address add constraint FK538F4B7EC498202 foreign key (useraccount_id) references useraccount",
155-
"alter table useraccount_address add constraint FK538F4B757E57A74 foreign key (addresses_id) references address",
156-
"create sequence hibernate_sequence start with 1 increment by 1");
152+
"create table useraccount (id bigint generated by default as identity, firstname varchar(128) not null, lastname varchar(128) not null, nickname varchar(128), password varchar(255) not null, openDate date, username varchar(32) not null, primary key (id))",
153+
"create table useraccount_address (useraccount_id bigint not null, addresses_id bigint not null, primary key (useraccount_id, addresses_id), unique (addresses_id))",
154+
"alter table useraccount_address add constraint FK538F4B7EC498202 foreign key (useraccount_id) references useraccount",
155+
"alter table useraccount_address add constraint FK538F4B757E57A74 foreign key (addresses_id) references address",
156+
"create sequence hibernate_sequence start with 1 increment by 1");
157157
}
158158

159159
@Test
@@ -166,13 +166,55 @@ public void should_execute_the_whole_script_if_delimiter_not_found() throws Exce
166166
verify(connection, times(1)).createStatement();
167167
}
168168

169-
/**
170-
* TODO
171-
* BEGIN
172-
* script
173-
* END
174-
* should contain all statements (begin & end)
175-
*
176-
*/
169+
@Test
170+
public void should_execute_script_with_begin_and_end() throws Exception
171+
{
172+
// given
173+
ArgumentCaptor<String> statementsCaptor = ArgumentCaptor.forClass(String.class);
174+
scriptExecutor.setStatementDelimiter(ScriptingConfiguration.NEW_LINE_SYMBOL);
175+
176+
// when
177+
scriptExecutor.execute(FileLoader.loadAsString("scripts/new-line-delimiter-begin-end.sql"));
178+
179+
// then
180+
verify(connection, times(8)).createStatement();
181+
verify(connection.createStatement(), times(8)).execute(statementsCaptor.capture());
182+
assertThat(statementsCaptor.getAllValues())
183+
.containsSequence(
184+
"BEGIN",
185+
"create table address (id bigint not null, city varchar(255) not null, houseNumber integer, streetName varchar(255) not null, version bigint, zipCode integer not null, primary key (id))",
186+
"create table useraccount (id bigint generated by default as identity, firstname varchar(128) not null, lastname varchar(128) not null, nickname varchar(128), password varchar(255) not null, openDate date, username varchar(32) not null, primary key (id))",
187+
"create table useraccount_address (useraccount_id bigint not null, addresses_id bigint not null, primary key (useraccount_id, addresses_id), unique (addresses_id))",
188+
"alter table useraccount_address add constraint FK538F4B7EC498202 foreign key (useraccount_id) references useraccount",
189+
"alter table useraccount_address add constraint FK538F4B757E57A74 foreign key (addresses_id) references address",
190+
"create sequence hibernate_sequence start with 1 increment by 1",
191+
"END");
192+
}
193+
194+
@Test
195+
public void should_execute_script_with_multiple_line_comment() throws Exception
196+
{
197+
// given
198+
ArgumentCaptor<String> statementsCaptor = ArgumentCaptor.forClass(String.class);
199+
scriptExecutor.setStatementDelimiter(ScriptingConfiguration.NEW_LINE_SYMBOL);
200+
201+
// when
202+
scriptExecutor.execute(FileLoader.loadAsString("scripts/new-line-delimiter-with-multiple-line-comment.sql"));
203+
204+
// then
205+
verify(connection, times(8)).createStatement();
206+
verify(connection.createStatement(), times(8)).execute(statementsCaptor.capture());
207+
assertThat(statementsCaptor.getAllValues())
208+
.containsSequence(
209+
"BEGIN",
210+
"create table address (id bigint not null, city varchar(255) not null, houseNumber integer, streetName varchar(255) not null, version bigint, zipCode integer not null, primary key (id))",
211+
"create table useraccount (id bigint generated by default as identity, firstname varchar(128) not null, lastname varchar(128) not null, nickname varchar(128), password varchar(255) not null, openDate date, username varchar(32) not null, primary key (id))",
212+
"create table useraccount_address (useraccount_id bigint not null, addresses_id bigint not null, primary key (useraccount_id, addresses_id), unique (addresses_id))",
213+
"alter table useraccount_address add constraint FK538F4B7EC498202 foreign key (useraccount_id) references useraccount",
214+
"alter table useraccount_address add constraint FK538F4B757E57A74 foreign key (addresses_id) references address",
215+
"create sequence hibernate_sequence start with 1 increment by 1",
216+
"END");
217+
}
218+
177219

178220
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
BEGIN
2+
create table address (id bigint not null, city varchar(255) not null, houseNumber integer, streetName varchar(255) not null, version bigint, zipCode integer not null, primary key (id))
3+
create table useraccount (id bigint generated by default as identity, firstname varchar(128) not null, lastname varchar(128) not null, nickname varchar(128), password varchar(255) not null, openDate date, username varchar(32) not null, primary key (id))
4+
create table useraccount_address (useraccount_id bigint not null, addresses_id bigint not null, primary key (useraccount_id, addresses_id), unique (addresses_id))
5+
alter table useraccount_address add constraint FK538F4B7EC498202 foreign key (useraccount_id) references useraccount -- creates fk
6+
alter table useraccount_address add constraint FK538F4B757E57A74 foreign key (addresses_id) references address
7+
create sequence hibernate_sequence start with 1 increment by 1 -- creates sequence
8+
END
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/*
2+
SQL COmmEnt
3+
*/
4+
BEGIN
5+
create table address (id bigint not null, city varchar(255) not null, houseNumber integer, streetName varchar(255) not null, version bigint, zipCode integer not null, primary key (id))
6+
create table useraccount (id bigint generated by default as identity, firstname varchar(128) not null, lastname varchar(128) not null, nickname varchar(128), password varchar(255) not null, openDate date, username varchar(32) not null, primary key (id))
7+
create table /*this is comment */useraccount_address (useraccount_id bigint not null, addresses_id bigint not null, primary key (useraccount_id, addresses_id), unique (addresses_id))
8+
{yet another comment}alter table useraccount_address add constraint FK538F4B7EC498202 foreign key (useraccount_id) references useraccount -- creates fk
9+
alter table useraccount_address add constraint FK538F4B757E57A74 foreign key (addresses_id) references address
10+
create sequence hibernate_sequence start with 1 increment by 1 -- creates sequence
11+
END { /* comment */ } -- // comment

0 commit comments

Comments
 (0)