Skip to content

Commit 4644e17

Browse files
committed
Polish introduction of CredentialsProvider
CredentialsProvider interface is reduced to the bare minimum of methods (getting username and password). Test in connection recovery test suite is fixed, as NIO mode can retrieve username several times for logging. References #350
1 parent ea66f12 commit 4644e17

File tree

7 files changed

+62
-114
lines changed

7 files changed

+62
-114
lines changed

src/main/java/com/rabbitmq/client/ConnectionFactory.java

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
/**
5454
* Convenience "factory" class to facilitate opening a {@link Connection} to an AMQP broker.
5555
*/
56-
5756
public class ConnectionFactory implements Cloneable {
5857

5958
/** Default user name */
@@ -100,34 +99,30 @@ public class ConnectionFactory implements Cloneable {
10099

101100
private static final String FALLBACK_TLS_PROTOCOL = "TLSv1";
102101

103-
private String virtualHost = DEFAULT_VHOST;
104-
private String host = DEFAULT_HOST;
105-
private int port = USE_DEFAULT_PORT;
106-
private int requestedChannelMax = DEFAULT_CHANNEL_MAX;
107-
private int requestedFrameMax = DEFAULT_FRAME_MAX;
108-
private int requestedHeartbeat = DEFAULT_HEARTBEAT;
109-
private int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT;
110-
private int handshakeTimeout = DEFAULT_HANDSHAKE_TIMEOUT;
111-
private int shutdownTimeout = DEFAULT_SHUTDOWN_TIMEOUT;
112-
private Map<String, Object> _clientProperties = AMQConnection.defaultClientProperties();
113-
private SocketFactory factory = SocketFactory.getDefault();
114-
private SaslConfig saslConfig = DefaultSaslConfig.PLAIN;
102+
private String virtualHost = DEFAULT_VHOST;
103+
private String host = DEFAULT_HOST;
104+
private int port = USE_DEFAULT_PORT;
105+
private int requestedChannelMax = DEFAULT_CHANNEL_MAX;
106+
private int requestedFrameMax = DEFAULT_FRAME_MAX;
107+
private int requestedHeartbeat = DEFAULT_HEARTBEAT;
108+
private int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT;
109+
private int handshakeTimeout = DEFAULT_HANDSHAKE_TIMEOUT;
110+
private int shutdownTimeout = DEFAULT_SHUTDOWN_TIMEOUT;
111+
private Map<String, Object> _clientProperties = AMQConnection.defaultClientProperties();
112+
private SocketFactory factory = SocketFactory.getDefault();
113+
private SaslConfig saslConfig = DefaultSaslConfig.PLAIN;
115114
private ExecutorService sharedExecutor;
116-
private ThreadFactory threadFactory = Executors.defaultThreadFactory();
115+
private ThreadFactory threadFactory = Executors.defaultThreadFactory();
117116
// minimises the number of threads rapid closure of many
118117
// connections uses, see rabbitmq/rabbitmq-java-client#86
119118
private ExecutorService shutdownExecutor;
120119
private ScheduledExecutorService heartbeatExecutor;
121-
private SocketConfigurator socketConf = new DefaultSocketConfigurator();
122-
private ExceptionHandler exceptionHandler = new DefaultExceptionHandler();
123-
private CredentialsProvider credentialsProv = new DefaultCredentialsProvider();
124-
{
125-
credentialsProv.setUsername(DEFAULT_USER);
126-
credentialsProv.setPassword(DEFAULT_PASS);
127-
}
120+
private SocketConfigurator socketConf = new DefaultSocketConfigurator();
121+
private ExceptionHandler exceptionHandler = new DefaultExceptionHandler();
122+
private CredentialsProvider credentialsProvider = new DefaultCredentialsProvider(DEFAULT_USER, DEFAULT_PASS);
128123

129-
private boolean automaticRecovery = true;
130-
private boolean topologyRecovery = true;
124+
private boolean automaticRecovery = true;
125+
private boolean topologyRecovery = true;
131126

132127
// long is used to make sure the users can use both ints
133128
// and longs safely. It is unlikely that anybody'd need
@@ -190,41 +185,48 @@ public void setPort(int port) {
190185
* @return the AMQP user name to use when connecting to the broker
191186
*/
192187
public String getUsername() {
193-
return credentialsProv.getUsername();
188+
return credentialsProvider.getUsername();
194189
}
195190

196191
/**
197192
* Set the user name.
198193
* @param username the AMQP user name to use when connecting to the broker
199194
*/
200195
public void setUsername(String username) {
201-
credentialsProv.setUsername(username);
196+
this.credentialsProvider = new DefaultCredentialsProvider(
197+
username,
198+
this.credentialsProvider.getPassword()
199+
);
202200
}
203201

204202
/**
205203
* Retrieve the password.
206204
* @return the password to use when connecting to the broker
207205
*/
208206
public String getPassword() {
209-
return credentialsProv.getPassword();
207+
return credentialsProvider.getPassword();
210208
}
211209

212210
/**
213211
* Set the password.
214212
* @param password the password to use when connecting to the broker
215213
*/
216214
public void setPassword(String password) {
217-
credentialsProv.setPassword(password);
215+
this.credentialsProvider = new DefaultCredentialsProvider(
216+
this.credentialsProvider.getUsername(),
217+
password
218+
);
218219
}
219220

220221
/**
221222
* Set a custom credentials provider.
223+
* Default implementation uses static username and password.
222224
* @param credentialsProvider The custom implementation of CredentialsProvider to use when connecting to the broker.
223225
* @see com.rabbitmq.client.impl.DefaultCredentialsProvider
224-
* @see com.rabbitmq.client.impl.AbstractCredentialsProvider
226+
* @since 4.5.0
225227
*/
226228
public void setCredentialsProvider(CredentialsProvider credentialsProvider) {
227-
this.credentialsProv = credentialsProvider;
229+
this.credentialsProvider = credentialsProvider;
228230
}
229231

230232
/**
@@ -982,7 +984,7 @@ public Connection newConnection(ExecutorService executor, AddressResolver addres
982984
public ConnectionParams params(ExecutorService consumerWorkServiceExecutor) {
983985
ConnectionParams result = new ConnectionParams();
984986

985-
result.setCredentialsProvider(credentialsProv);
987+
result.setCredentialsProvider(credentialsProvider);
986988
result.setConsumerWorkServiceExecutor(consumerWorkServiceExecutor);
987989
result.setVirtualHost(virtualHost);
988990
result.setClientProperties(getClientProperties());
@@ -1081,7 +1083,6 @@ protected AddressResolver createAddressResolver(List<Address> addresses) {
10811083
@Override public ConnectionFactory clone(){
10821084
try {
10831085
ConnectionFactory clone = (ConnectionFactory)super.clone();
1084-
clone.credentialsProv = (CredentialsProvider)clone.credentialsProv.clone();
10851086
return clone;
10861087
} catch (CloneNotSupportedException e) {
10871088
throw new Error(e);

src/main/java/com/rabbitmq/client/impl/AMQConnection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,7 @@ public AMQCommand transformReply(AMQCommand command) {
10211021

10221022
@Override public String toString() {
10231023
final String virtualHost = "/".equals(_virtualHost) ? _virtualHost : "/" + _virtualHost;
1024-
return "amqp://" + credentialsProvider.getUsername() + "@" + getHostAddress() + ":" + getPort() + virtualHost;
1024+
return "amqp://" + this.credentialsProvider.getUsername() + "@" + getHostAddress() + ":" + getPort() + virtualHost;
10251025
}
10261026

10271027
private String getHostAddress() {

src/main/java/com/rabbitmq/client/impl/AbstractCredentialsProvider.java

Lines changed: 0 additions & 48 deletions
This file was deleted.

src/main/java/com/rabbitmq/client/impl/CredentialsProvider.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,13 @@
44
* Provider interface for establishing credentials for connecting to the broker. Especially useful
55
* for situations where credentials might change before a recovery takes place or where it is
66
* convenient to plug in an outside custom implementation.
7-
*
8-
* @see com.rabbitmq.client.impl.AbstractCredentialsProvider
7+
*
8+
* @since 4.5.0
99
*/
10-
public interface CredentialsProvider extends Cloneable {
10+
public interface CredentialsProvider {
1111

1212
String getUsername();
1313

1414
String getPassword();
1515

16-
void setUsername(String username);
17-
18-
void setPassword(String password);
19-
20-
Object clone() throws CloneNotSupportedException;
21-
2216
}

src/main/java/com/rabbitmq/client/impl/DefaultCredentialsProvider.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
/**
44
* Default implementation of a CredentialsProvider which simply holds a static
55
* username and password.
6+
*
7+
* @since 4.5.0
68
*/
7-
public class DefaultCredentialsProvider extends AbstractCredentialsProvider {
9+
public class DefaultCredentialsProvider implements CredentialsProvider {
10+
11+
private final String username;
12+
private final String password;
13+
14+
public DefaultCredentialsProvider(String username, String password) {
15+
this.username = username;
16+
this.password = password;
17+
}
818

9-
protected String username;
10-
protected String password;
11-
1219
@Override
1320
public String getUsername() {
1421
return username;
@@ -19,14 +26,4 @@ public String getPassword() {
1926
return password;
2027
}
2128

22-
@Override
23-
public void setUsername(String username) {
24-
this.username = username;
25-
}
26-
27-
@Override
28-
public void setPassword(String password) {
29-
this.password = password;
30-
}
31-
3229
}

src/test/java/com/rabbitmq/client/test/functional/ConnectionRecovery.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package com.rabbitmq.client.test.functional;
1717

1818
import com.rabbitmq.client.*;
19-
import com.rabbitmq.client.impl.AbstractCredentialsProvider;
19+
import com.rabbitmq.client.impl.CredentialsProvider;
2020
import com.rabbitmq.client.impl.NetworkConnection;
2121
import com.rabbitmq.client.impl.recovery.*;
2222
import com.rabbitmq.client.test.BrokerTestCase;
@@ -37,6 +37,8 @@
3737
import java.util.concurrent.atomic.AtomicLong;
3838
import java.util.concurrent.atomic.AtomicReference;
3939

40+
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
41+
import static org.hamcrest.Matchers.is;
4042
import static org.junit.Assert.*;
4143

4244
@SuppressWarnings("ThrowFromFinallyBlock")
@@ -123,14 +125,15 @@ public class ConnectionRecovery extends BrokerTestCase {
123125
}
124126
}
125127

126-
// See https://github.com/rabbitmq/rabbitmq-java-client/pull/350 . We want to request fresh creds when recovering.
128+
// See https://github.com/rabbitmq/rabbitmq-java-client/pull/350 .
129+
// We want to request fresh creds when recovering.
127130
@Test public void connectionRecoveryRequestsCredentialsAgain() throws Exception {
128131
ConnectionFactory cf = buildConnectionFactoryWithRecoveryEnabled(false);
129132
final String username = cf.getUsername();
130133
final String password = cf.getPassword();
131-
final AtomicLong usernameRequested = new AtomicLong(0);
132-
final AtomicLong passwordRequested = new AtomicLong(0);
133-
cf.setCredentialsProvider(new AbstractCredentialsProvider() {
134+
final AtomicInteger usernameRequested = new AtomicInteger(0);
135+
final AtomicInteger passwordRequested = new AtomicInteger(0);
136+
cf.setCredentialsProvider(new CredentialsProvider() {
134137

135138
@Override
136139
public String getUsername() {
@@ -147,13 +150,14 @@ public String getPassword() {
147150
RecoverableConnection c = (RecoverableConnection) cf.newConnection();
148151
try {
149152
assertTrue(c.isOpen());
150-
assertEquals(1, usernameRequested.get());
151-
assertEquals(1, passwordRequested.get());
152-
153+
assertThat(usernameRequested.get(), is(1));
154+
assertThat(passwordRequested.get(), is(1));
155+
153156
closeAndWaitForRecovery(c);
154157
assertTrue(c.isOpen());
155-
assertEquals(2, usernameRequested.get());
156-
assertEquals(2, passwordRequested.get());
158+
// username is requested in AMQConnection#toString, so it can be accessed at any time
159+
assertThat(usernameRequested.get(), greaterThanOrEqualTo(2));
160+
assertThat(passwordRequested.get(), is(2));
157161
} finally {
158162
c.abort();
159163
}

src/test/java/com/rabbitmq/client/test/functional/SaslMechanisms.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public void connectionCloseAuthFailure(String username, String password) throws
122122
// to be reported by the broker by closing the connection
123123
private Connection connectionWithoutCapabilities(String username, String password)
124124
throws IOException, TimeoutException {
125-
ConnectionFactory customFactory = connectionFactory.clone();
125+
ConnectionFactory customFactory = TestUtils.connectionFactory();
126126
customFactory.setUsername(username);
127127
customFactory.setPassword(password);
128128
Map<String, Object> customProperties = AMQConnection.defaultClientProperties();

0 commit comments

Comments
 (0)