Skip to content

Commit e7c289a

Browse files
committed
Provide fluent API to build DbElement
1 parent 3ec0466 commit e7c289a

File tree

473 files changed

+3649
-4862
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

473 files changed

+3649
-4862
lines changed

pom.xml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -206,14 +206,5 @@
206206
</executions>
207207
</plugin>
208208
</plugins>
209-
<pluginManagement>
210-
<plugins>
211-
<plugin>
212-
<groupId>org.sonarsource.scanner.maven</groupId>
213-
<artifactId>sonar-maven-plugin</artifactId>
214-
<version>4.0.0.4121</version>
215-
</plugin>
216-
</plugins>
217-
</pluginManagement>
218209
</build>
219210
</project>

src/main/java/org/assertj/db/api/ErrorCollector.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,16 @@ public class ErrorCollector {
3434
private static final String INTERCEPT_METHOD_NAME = "intercept";
3535

3636
private static final String CLASS_NAME = ErrorCollector.class.getName();
37-
37+
// scope : the current soft-assertion object
38+
private final List<Throwable> errors = new ArrayList<>();
39+
// scope : the last assertion call (might be nested)
40+
private final LastResult lastResult = new LastResult();
3841
/**
3942
* Construct empty error collector.
4043
*/
4144
public ErrorCollector() {
4245
}
4346

44-
// scope : the current soft-assertion object
45-
private final List<Throwable> errors = new ArrayList<>();
46-
// scope : the last assertion call (might be nested)
47-
private final LastResult lastResult = new LastResult();
48-
4947
private static int countErrorCollectorProxyCalls() {
5048
int nbCalls = 0;
5149
for (StackTraceElement stackTraceElement : Thread.currentThread().getStackTrace()) {

src/main/java/org/assertj/db/type/AbstractDbData.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,6 @@ public abstract class AbstractDbData<D extends AbstractDbData<D>> extends Abstra
6363
*/
6464
private List<Column> columnsList;
6565

66-
/**
67-
* Default constructor.
68-
*
69-
* @param dataType The type of the data on which is the change.
70-
* @param selfType Class of this element : a subclass of {@code AbstractDbData}.
71-
*/
72-
AbstractDbData(Class<D> selfType, DataType dataType) {
73-
super(selfType);
74-
this.dataType = dataType;
75-
}
76-
7766
/**
7867
* Constructor with a {@link JdbcUrlConnectionProvider}.
7968
*
@@ -82,11 +71,22 @@ public abstract class AbstractDbData<D extends AbstractDbData<D>> extends Abstra
8271
* @param connectionProvider The {@link JdbcUrlConnectionProvider} to connect to the database (must be not {@code null}).
8372
* @throws NullPointerException If {@code connectionProvider} is {@code null}.
8473
*/
85-
AbstractDbData(Class<D> selfType, DataType dataType, ConnectionProvider connectionProvider) {
74+
protected AbstractDbData(Class<D> selfType, DataType dataType, ConnectionProvider connectionProvider) {
8675
super(selfType, connectionProvider);
8776
this.dataType = dataType;
8877
}
8978

79+
/**
80+
* Only used for tests.
81+
*
82+
* @param selfType Class of DbElement.
83+
* @param dataType Type of DbData.
84+
*/
85+
protected AbstractDbData(Class<D> selfType, DataType dataType) {
86+
super(selfType);
87+
this.dataType = dataType;
88+
}
89+
9090
/**
9191
* Returns the type of the data on which is the change.
9292
*

src/main/java/org/assertj/db/type/AbstractDbElement.java

Lines changed: 14 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -36,35 +36,7 @@ public abstract class AbstractDbElement<D extends AbstractDbElement<D>> implemen
3636
/**
3737
* Database connection provider.
3838
*/
39-
private ConnectionProvider connectionProvider;
40-
/**
41-
* Letter case of the tables.
42-
*
43-
* @since 1.1.0
44-
*/
45-
private LetterCase tableLetterCase = LetterCase.TABLE_DEFAULT;
46-
/**
47-
* Letter case of the columns.
48-
*
49-
* @since 1.1.0
50-
*/
51-
private LetterCase columnLetterCase = LetterCase.COLUMN_DEFAULT;
52-
/**
53-
* Letter case of the primary keys.
54-
*
55-
* @since 1.1.0
56-
*/
57-
private LetterCase primaryKeyLetterCase = LetterCase.PRIMARY_KEY_DEFAULT;
58-
59-
/**
60-
* Default constructor.
61-
*
62-
* @param selfType Class of this element : a sub-class of {@code AbstractDbElement}.
63-
*/
64-
AbstractDbElement(Class<D> selfType) {
65-
myself = selfType.cast(this);
66-
setLetterCases();
67-
}
39+
private final ConnectionProvider connectionProvider;
6840

6941
/**
7042
* Constructor.
@@ -73,89 +45,57 @@ public abstract class AbstractDbElement<D extends AbstractDbElement<D>> implemen
7345
* @param connectionProvider The {@link ConnectionProvider} to connect to the database (must be not {@code null}).
7446
* @throws NullPointerException If {@code connectionProvider} is {@code null}.
7547
*/
76-
AbstractDbElement(Class<D> selfType, ConnectionProvider connectionProvider) {
77-
this(selfType);
48+
protected AbstractDbElement(Class<D> selfType, ConnectionProvider connectionProvider) {
49+
this.myself = selfType.cast(this);
50+
if (connectionProvider == null) {
51+
throw new IllegalArgumentException("connectionProvider can not be null");
52+
}
7853
this.connectionProvider = connectionProvider;
79-
setLetterCases();
8054
}
8155

8256
/**
83-
* Sets the letter cases from information in parameters.
57+
* Only used for tests.
8458
*
85-
* @param tableLetterCase Letter case of the tables.
86-
* @param columnLetterCase Letter case of the columns.
87-
* @param primaryKeyLetterCase Letter case of the primary keys.
88-
* @return The actual instance.
59+
* @param selfType Class of DbElement.
8960
*/
90-
D setLetterCases(LetterCase tableLetterCase, LetterCase columnLetterCase, LetterCase primaryKeyLetterCase) {
91-
this.tableLetterCase = tableLetterCase;
92-
this.columnLetterCase = columnLetterCase;
93-
this.primaryKeyLetterCase = primaryKeyLetterCase;
94-
return myself;
95-
}
96-
97-
/**
98-
* Sets the letter cases from information in {@code connectionProvider}.
99-
*/
100-
private void setLetterCases() {
101-
if (connectionProvider == null) {
102-
return;
103-
}
104-
tableLetterCase = connectionProvider.getTableLetterCase();
105-
columnLetterCase = connectionProvider.getColumnLetterCase();
106-
primaryKeyLetterCase = connectionProvider.getPrimaryKeyLetterCase();
61+
protected AbstractDbElement(Class<D> selfType) {
62+
this.myself = selfType.cast(this);
63+
this.connectionProvider = null;
10764
}
10865

10966
/**
11067
* {@inheritDoc}
11168
*/
11269
@Override
11370
public LetterCase getColumnLetterCase() {
114-
return columnLetterCase;
71+
return this.connectionProvider.getColumnLetterCase();
11572
}
11673

11774
/**
11875
* {@inheritDoc}
11976
*/
12077
@Override
12178
public LetterCase getPrimaryKeyLetterCase() {
122-
return primaryKeyLetterCase;
79+
return this.connectionProvider.getPrimaryKeyLetterCase();
12380
}
12481

12582
/**
12683
* {@inheritDoc}
12784
*/
12885
@Override
12986
public LetterCase getTableLetterCase() {
130-
return tableLetterCase;
87+
return this.connectionProvider.getTableLetterCase();
13188
}
13289

13390
/**
13491
* Return the connectionProvider.
13592
*
13693
* @return The {@link ConnectionProvider} to connect.
137-
* @see #setConnectionProvider(ConnectionProvider)
13894
*/
13995
public ConnectionProvider getConnectionProvider() {
14096
return connectionProvider;
14197
}
14298

143-
/**
144-
* Sets the connectionProvider.
145-
*
146-
* @param connectionProvider {@link ConnectionProvider} to connect to the database (must be not {@code null}).
147-
* @return The actual instance.
148-
* @throws NullPointerException If {@code connectionProvider} is {@code null}.
149-
*/
150-
public D setConnectionProvider(ConnectionProvider connectionProvider) {
151-
if (connectionProvider == null) {
152-
throw new NullPointerException("connectionProvider must be not null");
153-
}
154-
this.connectionProvider = connectionProvider;
155-
setLetterCases();
156-
return myself;
157-
}
158-
15999
/**
160100
* Returns a {@link Connection} from the {@link ConnectionProvider}
161101
*
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
3+
* the License. You may obtain a copy of the License at
4+
*
5+
* http://www.apache.org/licenses/LICENSE-2.0
6+
*
7+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
8+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
9+
* specific language governing permissions and limitations under the License.
10+
*
11+
* Copyright 2015-2024 the original author or authors.
12+
*/
13+
package org.assertj.db.type;
14+
15+
/**
16+
* Entry point for creating database element ( Table, Request, Changes ) required to build assertion.
17+
* Use {@link AssertDbConnectionFactory} to construct new instance of this builder.
18+
* <p>
19+
* Provider fluent builder for create Table, Request and Changes :
20+
* <pre>
21+
* <code class='java'>
22+
* AssertDbConnection connection = ....;
23+
* Table table = connection.table(&quot;movie&quot;).build();
24+
* Request request = connection.request(&quot;select * from actor;&quot;).build();
25+
* Changes changes = connection.changes().build();
26+
* </code>
27+
* </pre>
28+
* <p>
29+
* Some more advanced examples :
30+
* <pre>
31+
* <code class='java'>
32+
* AssertDbConnection connection = ....;
33+
* Table table = connection.table(&quot;movie&quot;).columnToCheck(new String[] { &quot;number&quot;, &quot;title&quot; }).build();
34+
* Request request = connection.request(&quot;select * from actor where id = ?;&quot;).parameters(1).build();
35+
* Changes changes = connection.changes().table(&quot;movie&quot;, t -> t.columnToCheck(new String[] { &quot;number&quot;, &quot;title&quot; })).build();
36+
* </code>
37+
* </pre>
38+
*
39+
* @author Julien Roy
40+
* @since 3.0.0
41+
*/
42+
public class AssertDbConnection {
43+
44+
private final ConnectionProvider connectionProvider;
45+
46+
AssertDbConnection(ConnectionProvider connectionProvider) {
47+
if (connectionProvider == null) {
48+
throw new IllegalArgumentException("connectionProvider can not be null");
49+
}
50+
this.connectionProvider = connectionProvider;
51+
}
52+
53+
/**
54+
* Start building Table element.
55+
*
56+
* @param name Name of the table
57+
* @return Table builder
58+
*/
59+
public Table.Builder table(String name) {
60+
return new Table.Builder(this.connectionProvider, name);
61+
}
62+
63+
/**
64+
* Start building Request element.
65+
*
66+
* @param request SQL request
67+
* @return Request builder
68+
*/
69+
public Request.Builder request(String request) {
70+
return new Request.Builder(this.connectionProvider, request);
71+
}
72+
73+
/**
74+
* Start building Changes element.
75+
*
76+
* @return Changes builder
77+
*/
78+
public Changes.Builder changes() {
79+
return new Changes.Builder(this.connectionProvider);
80+
}
81+
}

src/main/java/org/assertj/db/type/ConnectionProviderFactory.java renamed to src/main/java/org/assertj/db/type/AssertDbConnectionFactory.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,32 @@
1717
import org.assertj.db.type.lettercase.LetterCase;
1818

1919
/**
20-
* Fluent factory to create a connectionProvider from different input ( Jdbc URL or DataSource ).
20+
* Factory to create a {@link AssertDbConnection} from different database connection input ( Jdbc URL or DataSource ).
2121
* Allow to configure behavior of connection provider like letter case or schema metadata retrieval mode.
2222
* <p>
2323
* For create with JDBC URL :
24+
* </p>
2425
* <pre>
2526
* <code class='java'>
26-
* ConnectionProvider connectionProvider = ConnectionProviderFactory.of(&quot;jdbc:h2:mem:test&quot;, &quot;sa&quot;, &quot;&quot;).create();
27-
* Table table = new Table(connectionProvider, &quot;movie&quot;);
27+
* AssertDbConnection connection = AssertDbConnectionFactory.of(&quot;jdbc:h2:mem:test&quot;, &quot;sa&quot;, &quot;&quot;).create();
28+
* Table table = connection.table(&quot;movie&quot;).build();
2829
* </code>
2930
* </pre>
30-
* <p>
3131
* For create with JDBC URL :
3232
* <pre>
3333
* <code class='java'>
3434
* DataSource dataSource = ...;
35-
* ConnectionProvider connectionProvider = ConnectionProviderFactory.of(dataSource).create();
36-
* Table table = new Table(connectionProvider, &quot;song&quot;, new String[] { &quot;number&quot;, &quot;title&quot; }, null);
35+
* AssertDbConnection connection = AssertDbConnectionFactory.of(dataSource).create();
36+
* Table table = connection.table(&quot;song&quot;).columnToCheck(new String[] { &quot;number&quot;, &quot;title&quot; }).build();
3737
* </code>
3838
* </pre>
3939
*
4040
* @author Julien Roy
4141
* @since 3.0.0
4242
*/
43-
public abstract class ConnectionProviderFactory {
43+
public abstract class AssertDbConnectionFactory {
4444

45-
private ConnectionProviderFactory() {
45+
private AssertDbConnectionFactory() {
4646
throw new UnsupportedOperationException();
4747
}
4848

@@ -83,7 +83,7 @@ private DataSourceConnectionProviderFactory(DataSource dataSource) {
8383
* {@inheritDoc}
8484
*/
8585
@Override
86-
public ConnectionProvider create() {
86+
public ConnectionProvider createConnectionProvider() {
8787
return new DataSourceConnectionProvider(dataSource, this.schemaMetaDataMode.getType(), this.tableLetterCase, this.columnLetterCase, this.primaryKeyLetterCase);
8888
}
8989
}
@@ -108,7 +108,7 @@ private JdbcUrlConnectionProviderFactory(String url, String user, String passwor
108108
* {@inheritDoc}
109109
*/
110110
@Override
111-
public ConnectionProvider create() {
111+
public ConnectionProvider createConnectionProvider() {
112112
return new JdbcUrlConnectionProvider(url, user, password, this.schemaMetaDataMode.getType(), this.tableLetterCase, this.columnLetterCase, this.primaryKeyLetterCase);
113113
}
114114
}
@@ -170,6 +170,15 @@ public T schemaMetaDataMode(SchemaMetaDataMode mode) {
170170
*
171171
* @return Connection provider to use for Table, Request or Changes
172172
*/
173-
public abstract ConnectionProvider create();
173+
protected abstract ConnectionProvider createConnectionProvider();
174+
175+
/**
176+
* Build the Connection Provider
177+
*
178+
* @return Connection provider to use for Table, Request or Changes
179+
*/
180+
public AssertDbConnection create() {
181+
return new AssertDbConnection(createConnectionProvider());
182+
}
174183
}
175184
}

0 commit comments

Comments
 (0)