Skip to content

Commit 872ed40

Browse files
committed
CodecRegistry extends CodecProvider
This enables an existing CodecRegistry to be wrapped by another CodecRegistry and used as a CodecProvider. We take advantage of this for the OverridableUuidRepresentationCodecRegistry, allowing us to remove an ugly cast. JAVA-3506
1 parent 9c3d626 commit 872ed40

File tree

6 files changed

+28
-38
lines changed

6 files changed

+28
-38
lines changed

bson/src/main/org/bson/codecs/configuration/CodecRegistries.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.bson.codecs.Codec;
2020
import org.bson.internal.ProvidersCodecRegistry;
2121

22-
import java.util.ArrayList;
2322
import java.util.List;
2423

2524
import static java.util.Arrays.asList;
@@ -124,28 +123,7 @@ public static CodecRegistry fromRegistries(final CodecRegistry... registries) {
124123
* @return a {@code CodecRegistry} that combines the list of {@code CodecRegistry} instances into a single one
125124
*/
126125
public static CodecRegistry fromRegistries(final List<? extends CodecRegistry> registries) {
127-
List<CodecProvider> providers = new ArrayList<CodecProvider>();
128-
for (CodecRegistry registry : registries) {
129-
providers.add(providerFromRegistry(registry));
130-
}
131-
return new ProvidersCodecRegistry(providers);
132-
}
133-
134-
private static CodecProvider providerFromRegistry(final CodecRegistry innerRegistry) {
135-
if (innerRegistry instanceof CodecProvider) {
136-
return (CodecProvider) innerRegistry;
137-
} else {
138-
return new CodecProvider() {
139-
@Override
140-
public <T> Codec<T> get(final Class<T> clazz, final CodecRegistry outerRregistry) {
141-
try {
142-
return innerRegistry.get(clazz);
143-
} catch (CodecConfigurationException e) {
144-
return null;
145-
}
146-
}
147-
};
148-
}
126+
return new ProvidersCodecRegistry(registries);
149127
}
150128

151129
private CodecRegistries() {

bson/src/main/org/bson/codecs/configuration/CodecRegistry.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@
2626
* {@code Object.equals}. It is not necessary to do so, and the simplest course of action is to rely on Object's implementation, but the
2727
* implementer may wish to implement a "value comparison" in place of the default "reference comparison."</p>
2828
*
29+
* <p>As of the 4.0 release, this class extends the {@code CodecProvider} interface. This capability was introduced to enable nesting
30+
* registries inside another registry.</p>
2931
* @since 3.0
3032
*/
31-
public interface CodecRegistry {
33+
public interface CodecRegistry extends CodecProvider {
3234
/**
3335
* Gets a {@code Codec} for the given Class.
3436
*

bson/src/main/org/bson/internal/ChildCodecRegistry.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ public <U> Codec<U> get(final Class<U> clazz) {
5353
}
5454
}
5555

56+
@Override
57+
public <U> Codec<U> get(final Class<U> clazz, final CodecRegistry registry) {
58+
return this.registry.get(clazz, registry);
59+
}
60+
5661
@SuppressWarnings("rawtypes")
5762
private <U> Boolean hasCycles(final Class<U> theClass) {
5863
ChildCodecRegistry current = this;

bson/src/main/org/bson/internal/CodecRegistryHelper.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,16 @@
1717
package org.bson.internal;
1818

1919
import org.bson.UuidRepresentation;
20-
import org.bson.codecs.configuration.CodecConfigurationException;
21-
import org.bson.codecs.configuration.CodecProvider;
2220
import org.bson.codecs.configuration.CodecRegistry;
2321

2422
public final class CodecRegistryHelper {
2523

2624
public static CodecRegistry createRegistry(final CodecRegistry codecRegistry, final UuidRepresentation uuidRepresentation) {
27-
CodecRegistry retVal = codecRegistry;
28-
if (uuidRepresentation != UuidRepresentation.UNSPECIFIED) {
29-
if (codecRegistry instanceof CodecProvider) {
30-
retVal = new OverridableUuidRepresentationCodecRegistry((CodecProvider) codecRegistry, uuidRepresentation);
31-
} else {
32-
throw new CodecConfigurationException("Changing the default UuidRepresentation requires a CodecRegistry that also "
33-
+ "implements the CodecProvider interface");
34-
}
25+
if (uuidRepresentation == UuidRepresentation.UNSPECIFIED) {
26+
return codecRegistry;
27+
} else {
28+
return new OverridableUuidRepresentationCodecRegistry(codecRegistry, uuidRepresentation);
3529
}
36-
return retVal;
3730
}
3831

3932
private CodecRegistryHelper() {

bson/src/main/org/bson/internal/OverridableUuidRepresentationCodecRegistry.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.bson.codecs.Codec;
2121
import org.bson.codecs.OverridableUuidRepresentationCodec;
2222
import org.bson.codecs.configuration.CodecProvider;
23+
import org.bson.codecs.configuration.CodecRegistry;
2324

2425
import static org.bson.assertions.Assertions.notNull;
2526

@@ -47,8 +48,19 @@ public <T> Codec<T> get(final Class<T> clazz) {
4748
return get(new ChildCodecRegistry<T>(this, clazz));
4849
}
4950

51+
52+
@Override
53+
@SuppressWarnings({"unchecked"})
54+
public <T> Codec<T> get(final Class<T> clazz, final CodecRegistry registry) {
55+
Codec<T> codec = wrapped.get(clazz, registry);
56+
if (codec instanceof OverridableUuidRepresentationCodec) {
57+
return ((OverridableUuidRepresentationCodec<T>) codec).withUuidRepresentation(uuidRepresentation);
58+
}
59+
return codec;
60+
}
61+
5062
@Override
51-
@SuppressWarnings({"unchecked", "rawtypes"})
63+
@SuppressWarnings({"unchecked"})
5264
public <T> Codec<T> get(final ChildCodecRegistry<T> context) {
5365
if (!codecCache.containsKey(context.getCodecClass())) {
5466
Codec<T> codec = wrapped.get(context.getCodecClass(), context);

bson/src/main/org/bson/internal/ProvidersCodecRegistry.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
import static org.bson.assertions.Assertions.isTrueArgument;
2727

28-
public final class ProvidersCodecRegistry implements CodecRegistry, CodecProvider, CycleDetectingCodecRegistry {
28+
public final class ProvidersCodecRegistry implements CodecRegistry, CycleDetectingCodecRegistry {
2929
private final List<CodecProvider> codecProviders;
3030
private final CodecCache codecCache = new CodecCache();
3131

@@ -50,7 +50,7 @@ public <T> Codec<T> get(final Class<T> clazz, final CodecRegistry registry) {
5050
return null;
5151
}
5252

53-
@SuppressWarnings({ "unchecked", "rawtypes" })
53+
@SuppressWarnings({"rawtypes" })
5454
public <T> Codec<T> get(final ChildCodecRegistry<T> context) {
5555
if (!codecCache.containsKey(context.getCodecClass())) {
5656
for (CodecProvider provider : codecProviders) {

0 commit comments

Comments
 (0)