Skip to content

Commit 5dfcb2b

Browse files
committed
add tests for newInstance methods on JavaxJsonAdaptation
1 parent e33b332 commit 5dfcb2b

File tree

2 files changed

+58
-10
lines changed

2 files changed

+58
-10
lines changed

core/src/main/java/org/everit/json/schema/javax/json/JavaxJsonAdaptation.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
*/
2525
public abstract class JavaxJsonAdaptation implements JsonAdaptation<JsonValue> {
2626

27-
private static final String JSR_374_ADAPTATION = "Jsr374Adaptation";
28-
private static final String JSR_353_ADAPTATION = "Jsr353Adaptation";
27+
static final String JSR_374_ADAPTATION = "Jsr374Adaptation";
28+
static final String JSR_353_ADAPTATION = "Jsr353Adaptation";
2929

3030
@Override
3131
public Class<?> arrayType() {
@@ -67,17 +67,12 @@ public static JavaxJsonAdaptation newInstance() {
6767
* provided by OSGi.
6868
*
6969
* @param classLoader the class loader to use to find the JSON-P API and
70-
* implementation classes
70+
* implementation classes
7171
* @return adaptation instance for JSON-P data types
7272
* @throws RuntimeException if the adaptation class cannot be instantiated
7373
*/
7474
public static JavaxJsonAdaptation newInstance(ClassLoader classLoader) {
75-
try {
76-
Json.class.getMethod("createValue", String.class);
77-
return newInstance(classLoader, JSR_374_ADAPTATION);
78-
} catch (NoSuchMethodException ex) {
79-
return newInstance(classLoader, JSR_353_ADAPTATION);
80-
}
75+
return newInstance(classLoader, determineProvider("createValue", String.class));
8176
}
8277

8378
/**
@@ -88,7 +83,7 @@ public static JavaxJsonAdaptation newInstance(ClassLoader classLoader) {
8883
* @return adaptation instance
8984
* @throws RuntimeException an instance of the specified type cannot be instantiated
9085
*/
91-
private static JavaxJsonAdaptation newInstance(ClassLoader classLoader,
86+
static JavaxJsonAdaptation newInstance(ClassLoader classLoader,
9287
String providerName) {
9388
try {
9489
return (JavaxJsonAdaptation) classLoader.loadClass(
@@ -99,6 +94,22 @@ private static JavaxJsonAdaptation newInstance(ClassLoader classLoader,
9994
}
10095
}
10196

97+
/**
98+
* Determine the name of the adaptation provider class based on the availability
99+
* of a particular sentinel method in the {@link Json} class.
100+
* @param sentinelMethodName name of the method whose presence is to be checked
101+
* @param argTypes argument types for the sentinel method
102+
* @return adaptation provider name
103+
*/
104+
static String determineProvider(String sentinelMethodName, Class<?>... argTypes) {
105+
try {
106+
Json.class.getMethod(sentinelMethodName, argTypes);
107+
return JSR_374_ADAPTATION;
108+
} catch (NoSuchMethodException ex) {
109+
return JSR_353_ADAPTATION;
110+
}
111+
}
112+
102113
/**
103114
* Constructs the fully-qualified class name for a given named provider class.
104115
* <p>

core/src/test/java/org/everit/json/schema/javax/json/JavaxJsonValidationTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public void testAdaptJsonScalars(JavaxJsonAdaptation adaptation) {
7878
assertNull(adaptation.adapt(JsonValue.NULL));
7979
assertEquals(true, adaptation.adapt(JsonValue.TRUE));
8080
assertEquals(false, adaptation.adapt(JsonValue.FALSE));
81+
assertEquals("value", adaptation.adapt(Json.createValue("value")));
8182
assertEquals(BigInteger.ONE, adaptation.adapt(Json.createValue(1)));
8283
assertEquals(BigInteger.ONE, adaptation.adapt(Json.createValue(1L)));
8384
assertEquals(BigInteger.ONE, adaptation.adapt(Json.createValue(BigInteger.ONE)));
@@ -112,6 +113,7 @@ public void testInvertIntrinsics(JavaxJsonAdaptation adaptation) {
112113
assertEquals(Json.createValue("value"), adaptation.invert("value"));
113114
assertEquals(Json.createValue(1), adaptation.invert(1));
114115
assertEquals(Json.createValue(1L), adaptation.invert(1L));
116+
assertEquals(Json.createValue(1.0), adaptation.invert(1.0));
115117
assertEquals(Json.createValue(BigInteger.ONE), adaptation.invert(BigInteger.ONE));
116118
assertEquals(Json.createValue(BigDecimal.ONE), adaptation.invert(BigDecimal.ONE));
117119
}
@@ -130,4 +132,39 @@ public void testInvertArrayAdapter(JavaxJsonAdaptation adaptation) {
130132
assertSame(array, adaptation.invert(new JavaxJsonArrayAdapter(array)));
131133
}
132134

135+
@Test
136+
public void testNewInstanceDefaultClassLoader() {
137+
final ClassLoader tccl = Thread.currentThread().getContextClassLoader();
138+
Thread.currentThread().setContextClassLoader(null);
139+
assertTrue(JavaxJsonAdaptation.newInstance() instanceof Jsr374Adaptation);
140+
Thread.currentThread().setContextClassLoader(tccl);
141+
}
142+
143+
@Test
144+
public void testNewInstanceThreadContextClassLoader() {
145+
final ClassLoader tccl = Thread.currentThread().getContextClassLoader();
146+
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
147+
assertTrue(JavaxJsonAdaptation.newInstance() instanceof Jsr374Adaptation);
148+
Thread.currentThread().setContextClassLoader(tccl);
149+
}
150+
151+
@Test
152+
public void testNewInstanceWithClassLoader() {
153+
assertTrue(JavaxJsonAdaptation.newInstance(getClass().getClassLoader())
154+
instanceof Jsr374Adaptation);
155+
}
156+
157+
@Test
158+
public void testDetermineProvider() {
159+
assertEquals(JavaxJsonAdaptation.JSR_374_ADAPTATION,
160+
JavaxJsonAdaptation.determineProvider("createValue", String.class));
161+
assertEquals(JavaxJsonAdaptation.JSR_353_ADAPTATION,
162+
JavaxJsonAdaptation.determineProvider(".noSuchMethod"));
163+
}
164+
165+
@Test(expected = RuntimeException.class)
166+
public void testInstanceWhenCannotInstantiate() {
167+
JavaxJsonAdaptation.newInstance(getClass().getClassLoader(), ".noSuchProviderName");
168+
}
169+
133170
}

0 commit comments

Comments
 (0)