Skip to content

Commit b3855bb

Browse files
authored
Merge pull request #117 from exasol/enhancement/116-Explicit_init_of_AdapterFactory
#116: Initializing adapter registry on first use.
2 parents 36a6dee + f8fbad6 commit b3855bb

File tree

6 files changed

+35
-30
lines changed

6 files changed

+35
-30
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>com.exasol</groupId>
66
<artifactId>virtual-schema-common-java</artifactId>
7-
<version>7.5.0</version>
7+
<version>7.5.1</version>
88
<name>Common module of Exasol Virtual Schemas Adapters</name>
99
<description>This is one of the modules of Virtual Schemas Adapters. The libraries provided by this project are the foundation of the adapter development, i.e. adapters must be implemented on top of them.</description>
1010
<url>https://github.com/exasol/virtual-schema-common-java</url>

src/main/java/com/exasol/adapter/AdapterFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface AdapterFactory {
1515

1616
/**
1717
* Create a new instance of the Virtual Schema Adapter
18-
*
18+
*
1919
* @return new instance
2020
*/
2121
public VirtualSchemaAdapter createAdapter();

src/main/java/com/exasol/adapter/AdapterRegistry.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,24 @@
99
*/
1010
public final class AdapterRegistry {
1111
private static final Logger LOGGER = Logger.getLogger(AdapterRegistry.class.getName());
12-
private static final AdapterRegistry instance = new AdapterRegistry();
12+
private static AdapterRegistry instance;
1313
private final Map<String, AdapterFactory> registeredFactories = new HashMap<>();
1414

1515
/**
1616
* Get the singleton instance of the {@link AdapterRegistry}
1717
*
1818
* @return singleton instance
1919
*/
20-
public static AdapterRegistry getInstance() {
20+
public static final synchronized AdapterRegistry getInstance() {
21+
if (instance == null) {
22+
LOGGER.finer(() -> "Instanciating Virtual Schema Adapter registry and loading adapter factories.");
23+
instance = new AdapterRegistry();
24+
instance.loadAdapterFactories();
25+
}
2126
return instance;
2227
}
2328

24-
/**
25-
* Load adapter factories via the {@link ServiceLoader}
26-
*/
27-
public void loadAdapterFactories() {
29+
private void loadAdapterFactories() {
2830
final ServiceLoader<AdapterFactory> serviceLoader = ServiceLoader.load(AdapterFactory.class);
2931
final Iterator<AdapterFactory> factories = serviceLoader.iterator();
3032
while (factories.hasNext()) {
@@ -98,18 +100,22 @@ public void clear() {
98100
* @return description
99101
*/
100102
public String describe() {
101-
final StringBuilder builder = new StringBuilder("Currently registered Virtual Schema Adapter factories: ");
102-
boolean first = true;
103-
for (final String name : this.registeredFactories.keySet()) {
104-
if (first) {
105-
first = false;
106-
} else {
107-
builder.append(", ");
103+
if (this.registeredFactories.isEmpty()) {
104+
return "No Virtual Schema Adapter factories are currently reqistered.";
105+
} else {
106+
final StringBuilder builder = new StringBuilder("Currently registered Virtual Schema Adapter factories: ");
107+
boolean first = true;
108+
for (final String name : this.registeredFactories.keySet()) {
109+
if (first) {
110+
first = false;
111+
} else {
112+
builder.append(", ");
113+
}
114+
builder.append("\"");
115+
builder.append(name);
116+
builder.append("\"");
108117
}
109-
builder.append("\"");
110-
builder.append(name);
111-
builder.append("\"");
118+
return builder.toString();
112119
}
113-
return builder.toString();
114120
}
115121
}

src/main/java/com/exasol/adapter/RequestDispatcher.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ public static synchronized RequestDispatcher getInstance() {
2828
return INSTANCE;
2929
}
3030

31-
private RequestDispatcher() {
32-
AdapterRegistry.getInstance().loadAdapterFactories();
33-
}
34-
3531
/**
3632
* Main entry point for all Virtual Schema Adapter requests issued by the Exasol database.
3733
*
@@ -61,6 +57,11 @@ private String executeAdapterCall(final ExaMetadata metadata, final String rawRe
6157
}
6258
}
6359

60+
private VirtualSchemaAdapter findResponsibleAdapter(final AdapterRequest request) {
61+
final String name = request.getAdapterName();
62+
return AdapterRegistry.getInstance().getAdapterForName(name);
63+
}
64+
6465
private String processRequest(final AdapterRequest request, final VirtualSchemaAdapter adapter,
6566
final ExaMetadata metadata) throws AdapterException {
6667
final AdapterRequestType type = request.getType();
@@ -104,11 +105,6 @@ private void logRawRequest(final String rawRequest) {
104105
LOGGER.finer(() -> "Raw JSON request:\n" + rawRequest);
105106
}
106107

107-
private VirtualSchemaAdapter findResponsibleAdapter(final AdapterRequest request) {
108-
final String name = request.getAdapterName();
109-
return AdapterRegistry.getInstance().getAdapterForName(name);
110-
}
111-
112108
private String dispatchCreateVirtualSchemaRequestToAdapter(final AdapterRequest request,
113109
final VirtualSchemaAdapter adapter, final ExaMetadata metadata) throws AdapterException {
114110
final CreateVirtualSchemaResponse response = adapter.createVirtualSchema(metadata,

src/test/java/com/exasol/adapter/AdapterRegistryTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ void testDoesNotContainAdapterFactoryWithName() {
4444

4545
@Test
4646
void testLoadFactories() {
47-
this.registry.loadAdapterFactories();
4847
assertThat(this.registry.hasAdapterWithName("DUMMY"), equalTo(false));
4948
}
5049

@@ -66,4 +65,9 @@ void testDescribe() {
6665
assertThat(this.registry.describe(),
6766
equalTo("Currently registered Virtual Schema Adapter factories: \"One\", \"Two\""));
6867
}
68+
69+
@Test
70+
void testDescribeWithNoFactories() {
71+
assertThat(this.registry.describe(), equalTo("No Virtual Schema Adapter factories are currently reqistered."));
72+
}
6973
}

src/test/java/com/exasol/adapter/DummyAdapterFactory.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.util.Set;
55

66
public class DummyAdapterFactory implements AdapterFactory {
7-
87
@Override
98
public Set<String> getSupportedAdapterNames() {
109
final Set<String> names = new HashSet<>();

0 commit comments

Comments
 (0)