From 7966b74eaf7a1706276b93382f83e134f867bc11 Mon Sep 17 00:00:00 2001 From: taleb Date: Tue, 3 Jul 2018 13:19:47 +0100 Subject: [PATCH] add schema catalog resolver and producer --- CHANGELOG.md | 2 + .../schema/catalog/CatalogObjectFactory.java | 13 ++++ .../schema/catalog/SchemaCatalogResolver.java | 27 ++++++++ .../src/main/resources/META-INF/beans.xml | 6 -- .../catalog/CatalogObjectFactoryTest.java | 16 +++++ .../catalog/SchemaCatalogResolverTest.java | 47 ++++++++++++++ .../schema/service}/CatalogProducer.java | 5 +- .../SchemaCatalogResolverProducer.java | 22 +++++++ .../schema/service}/CatalogProducerTest.java | 5 +- .../service/SchemaCatalogResolverIT.java | 61 +++++++++++++++++++ .../SchemaCatalogResolverProducerTest.java | 44 +++++++++++++ .../schema/service/SchemaServiceIT.java | 2 - .../schema/context/invalid_reference.json | 21 +++++++ 13 files changed, 261 insertions(+), 10 deletions(-) create mode 100644 catalog-core/src/main/java/uk/gov/justice/schema/catalog/SchemaCatalogResolver.java delete mode 100644 catalog-core/src/main/resources/META-INF/beans.xml create mode 100644 catalog-core/src/test/java/uk/gov/justice/schema/catalog/SchemaCatalogResolverTest.java rename {catalog-core/src/main/java/uk/gov/justice/schema/catalog => schema-service/src/main/java/uk/gov/justice/schema/service}/CatalogProducer.java (73%) create mode 100644 schema-service/src/main/java/uk/gov/justice/schema/service/SchemaCatalogResolverProducer.java rename {catalog-core/src/test/java/uk/gov/justice/schema/catalog => schema-service/src/test/java/uk/gov/justice/schema/service}/CatalogProducerTest.java (87%) create mode 100644 schema-service/src/test/java/uk/gov/justice/schema/service/SchemaCatalogResolverIT.java create mode 100644 schema-service/src/test/java/uk/gov/justice/schema/service/SchemaCatalogResolverProducerTest.java create mode 100644 schema-service/src/test/resources/json/schema/context/invalid_reference.json diff --git a/CHANGELOG.md b/CHANGELOG.md index bd4a47c..1ff2e70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ on [Keep a CHANGELOG](http://keepachangelog.com/). This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +### Changed +- Added schema catalog resolver to enable loading schemas from JSON objects ## [1.2.4] - 2018-07-03 diff --git a/catalog-core/src/main/java/uk/gov/justice/schema/catalog/CatalogObjectFactory.java b/catalog-core/src/main/java/uk/gov/justice/schema/catalog/CatalogObjectFactory.java index 7cb9d48..73d0e36 100644 --- a/catalog-core/src/main/java/uk/gov/justice/schema/catalog/CatalogObjectFactory.java +++ b/catalog-core/src/main/java/uk/gov/justice/schema/catalog/CatalogObjectFactory.java @@ -76,6 +76,19 @@ public SchemaResolver schemaResolver() { return new SchemaResolver(urlConverter(), uriResolver()); } + /** + * @return a new instance of {@link SchemaCatalogResolver} + */ + public SchemaCatalogResolver schemaCatalogResolver() { + + return new SchemaCatalogResolver( + rawCatalog(), + schemaClientFactory(), + jsonToSchemaConverter()); + } + + + /** * @return a new instance of {@link CatalogToSchemaResolver} */ diff --git a/catalog-core/src/main/java/uk/gov/justice/schema/catalog/SchemaCatalogResolver.java b/catalog-core/src/main/java/uk/gov/justice/schema/catalog/SchemaCatalogResolver.java new file mode 100644 index 0000000..73652e0 --- /dev/null +++ b/catalog-core/src/main/java/uk/gov/justice/schema/catalog/SchemaCatalogResolver.java @@ -0,0 +1,27 @@ +package uk.gov.justice.schema.catalog; + +import uk.gov.justice.schema.catalog.client.SchemaClientFactory; + +import org.everit.json.schema.Schema; +import org.json.JSONObject; + +public class SchemaCatalogResolver { + + private final RawCatalog rawCatalog; + private final SchemaClientFactory schemaClientFactory; + private final JsonToSchemaConverter jsonStringToSchemaConverter; + + public SchemaCatalogResolver(final RawCatalog rawCatalog, + final SchemaClientFactory schemaClientFactory, + final JsonToSchemaConverter jsonStringToSchemaConverter) { + this.rawCatalog = rawCatalog; + this.schemaClientFactory = schemaClientFactory; + this.jsonStringToSchemaConverter = jsonStringToSchemaConverter; + } + + public Schema loadSchema(final JSONObject jsonSchema) { + return jsonStringToSchemaConverter.convert( + jsonSchema, + schemaClientFactory.create(rawCatalog)); + } +} diff --git a/catalog-core/src/main/resources/META-INF/beans.xml b/catalog-core/src/main/resources/META-INF/beans.xml deleted file mode 100644 index 9cee431..0000000 --- a/catalog-core/src/main/resources/META-INF/beans.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/catalog-core/src/test/java/uk/gov/justice/schema/catalog/CatalogObjectFactoryTest.java b/catalog-core/src/test/java/uk/gov/justice/schema/catalog/CatalogObjectFactoryTest.java index cb0605e..aa8044f 100644 --- a/catalog-core/src/test/java/uk/gov/justice/schema/catalog/CatalogObjectFactoryTest.java +++ b/catalog-core/src/test/java/uk/gov/justice/schema/catalog/CatalogObjectFactoryTest.java @@ -93,6 +93,22 @@ public void shouldCreateASchemaResolver() throws Exception { assertThat(uriResolver, is(notNullValue())); } + @Test + public void shouldCreateASchemaCatalogResolver() throws Exception { + + final SchemaCatalogResolver schemaCatalogResolver = catalogObjectFactory.schemaCatalogResolver(); + assertThat(schemaCatalogResolver, is(notNullValue())); + + final RawCatalog rawCatalog = getPrivateField("rawCatalog", schemaCatalogResolver, RawCatalog.class); + assertThat(rawCatalog, is(notNullValue())); + + final SchemaClientFactory schemaClientFactory = getPrivateField("schemaClientFactory", schemaCatalogResolver, SchemaClientFactory.class); + assertThat(schemaClientFactory, is(notNullValue())); + + final JsonToSchemaConverter jsonToSchemaConverter = getPrivateField("jsonStringToSchemaConverter", schemaCatalogResolver, JsonToSchemaConverter.class); + assertThat(jsonToSchemaConverter, is(notNullValue())); + } + @Test public void shouldCreateCatalogToSchemaResolver() throws Exception { diff --git a/catalog-core/src/test/java/uk/gov/justice/schema/catalog/SchemaCatalogResolverTest.java b/catalog-core/src/test/java/uk/gov/justice/schema/catalog/SchemaCatalogResolverTest.java new file mode 100644 index 0000000..6e366a4 --- /dev/null +++ b/catalog-core/src/test/java/uk/gov/justice/schema/catalog/SchemaCatalogResolverTest.java @@ -0,0 +1,47 @@ +package uk.gov.justice.schema.catalog; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import uk.gov.justice.schema.catalog.client.SchemaClientFactory; + +import org.everit.json.schema.Schema; +import org.everit.json.schema.loader.SchemaClient; +import org.json.JSONObject; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class SchemaCatalogResolverTest { + + @Mock + private RawCatalog rawCatalog; + + @Mock + private SchemaClientFactory schemaClientFactory; + + @Mock + private JsonToSchemaConverter jsonStringToSchemaConverter; + + @InjectMocks + private SchemaCatalogResolver schemaCatalogResolver; + + @Test + public void shouldResolveSchema() { + final Schema schema = mock(Schema.class); + final JSONObject jsonSchema = mock(JSONObject.class); + final SchemaClient schemaClient = mock(SchemaClient.class); + + when(schemaClientFactory.create(rawCatalog)).thenReturn(schemaClient); + when(jsonStringToSchemaConverter.convert(jsonSchema, schemaClient)).thenReturn(schema); + + final Schema resultSchema = schemaCatalogResolver.loadSchema(jsonSchema); + + assertThat(resultSchema, is(schema)); + } +} \ No newline at end of file diff --git a/catalog-core/src/main/java/uk/gov/justice/schema/catalog/CatalogProducer.java b/schema-service/src/main/java/uk/gov/justice/schema/service/CatalogProducer.java similarity index 73% rename from catalog-core/src/main/java/uk/gov/justice/schema/catalog/CatalogProducer.java rename to schema-service/src/main/java/uk/gov/justice/schema/service/CatalogProducer.java index 6181b15..7a21746 100644 --- a/catalog-core/src/main/java/uk/gov/justice/schema/catalog/CatalogProducer.java +++ b/schema-service/src/main/java/uk/gov/justice/schema/service/CatalogProducer.java @@ -1,4 +1,7 @@ -package uk.gov.justice.schema.catalog; +package uk.gov.justice.schema.service; + +import uk.gov.justice.schema.catalog.Catalog; +import uk.gov.justice.schema.catalog.CatalogObjectFactory; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; diff --git a/schema-service/src/main/java/uk/gov/justice/schema/service/SchemaCatalogResolverProducer.java b/schema-service/src/main/java/uk/gov/justice/schema/service/SchemaCatalogResolverProducer.java new file mode 100644 index 0000000..8a40c2a --- /dev/null +++ b/schema-service/src/main/java/uk/gov/justice/schema/service/SchemaCatalogResolverProducer.java @@ -0,0 +1,22 @@ +package uk.gov.justice.schema.service; + +import uk.gov.justice.schema.catalog.CatalogObjectFactory; +import uk.gov.justice.schema.catalog.SchemaCatalogResolver; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Produces; + +/** + * A Producer for the {@link SchemaCatalogResolver} should you be running in a CDI container + */ +@ApplicationScoped +public class SchemaCatalogResolverProducer { + + /** + * @return a new instance of {@link SchemaCatalogResolver} + */ + @Produces + public SchemaCatalogResolver schemaCatalogResolver() { + return new CatalogObjectFactory().schemaCatalogResolver(); + } +} diff --git a/catalog-core/src/test/java/uk/gov/justice/schema/catalog/CatalogProducerTest.java b/schema-service/src/test/java/uk/gov/justice/schema/service/CatalogProducerTest.java similarity index 87% rename from catalog-core/src/test/java/uk/gov/justice/schema/catalog/CatalogProducerTest.java rename to schema-service/src/test/java/uk/gov/justice/schema/service/CatalogProducerTest.java index a1e0180..e41200c 100644 --- a/catalog-core/src/test/java/uk/gov/justice/schema/catalog/CatalogProducerTest.java +++ b/schema-service/src/test/java/uk/gov/justice/schema/service/CatalogProducerTest.java @@ -1,9 +1,12 @@ -package uk.gov.justice.schema.catalog; +package uk.gov.justice.schema.service; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; +import uk.gov.justice.schema.catalog.Catalog; +import uk.gov.justice.schema.catalog.JsonToSchemaConverter; +import uk.gov.justice.schema.catalog.RawCatalog; import uk.gov.justice.schema.catalog.client.SchemaClientFactory; import java.lang.reflect.Field; diff --git a/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaCatalogResolverIT.java b/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaCatalogResolverIT.java new file mode 100644 index 0000000..72ef75d --- /dev/null +++ b/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaCatalogResolverIT.java @@ -0,0 +1,61 @@ +package uk.gov.justice.schema.service; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertTrue; + +import uk.gov.justice.schema.catalog.SchemaCatalogResolver; + +import java.io.InputStream; + +import javax.inject.Inject; + +import org.apache.openejb.jee.Application; +import org.apache.openejb.jee.WebApp; +import org.apache.openejb.junit.ApplicationComposer; +import org.apache.openejb.testing.Classes; +import org.apache.openejb.testing.Module; +import org.everit.json.schema.Schema; +import org.everit.json.schema.SchemaException; +import org.json.JSONObject; +import org.json.JSONTokener; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(ApplicationComposer.class) +public class SchemaCatalogResolverIT { + + @Inject + private SchemaCatalogResolver schemaCatalogResolver; + + @Module + @Classes(cdi = true, value = { + SchemaCatalogResolverProducer.class + }) + public WebApp war() { + return new WebApp() + .contextRoot("schema-catalog-resolver-test") + .addServlet("SchemaCatalogResolverIT", Application.class.getName()); + } + + @Test + public void shouldReturnResolvedSchema() throws Exception { + try (final InputStream schemaFileStream = this.getClass().getResourceAsStream("/json/schema/context/person.json")) { + final JSONObject schemaJsonObject = new JSONObject(new JSONTokener(schemaFileStream)); + + final Schema schema = schemaCatalogResolver.loadSchema(schemaJsonObject); + + assertThat(schema.getId(), is("http://justice.gov.uk/context/person.json")); + assertTrue(schema.definesProperty("correspondence_address")); + } + } + + @Test(expected = SchemaException.class) + public void shouldReturnInvalidSchema() throws Exception { + try (final InputStream schemaFileStream = this.getClass().getResourceAsStream("/json/schema/context/invalid_reference.json")) { + final JSONObject schemaJsonObject = new JSONObject(new JSONTokener(schemaFileStream)); + + schemaCatalogResolver.loadSchema(schemaJsonObject); + } + } +} diff --git a/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaCatalogResolverProducerTest.java b/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaCatalogResolverProducerTest.java new file mode 100644 index 0000000..d59be2c --- /dev/null +++ b/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaCatalogResolverProducerTest.java @@ -0,0 +1,44 @@ +package uk.gov.justice.schema.service; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +import uk.gov.justice.schema.catalog.JsonToSchemaConverter; +import uk.gov.justice.schema.catalog.RawCatalog; +import uk.gov.justice.schema.catalog.SchemaCatalogResolver; +import uk.gov.justice.schema.catalog.client.SchemaClientFactory; + +import java.lang.reflect.Field; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class SchemaCatalogResolverProducerTest { + + @InjectMocks + private SchemaCatalogResolverProducer schemaCatalogResolverProducer; + + @Test + public void shouldCreateTheCatalog() throws Exception { + + final SchemaCatalogResolver schemaCatalogResolver = schemaCatalogResolverProducer.schemaCatalogResolver(); + + assertThat(schemaCatalogResolver, is(notNullValue())); + + assertThat(getPrivateField(schemaCatalogResolver, "rawCatalog", RawCatalog.class), is(notNullValue())); + assertThat(getPrivateField(schemaCatalogResolver, "schemaClientFactory", SchemaClientFactory.class), is(notNullValue())); + assertThat(getPrivateField(schemaCatalogResolver, "jsonStringToSchemaConverter", JsonToSchemaConverter.class), is(notNullValue())); + } + + @SuppressWarnings("unchecked") + private T getPrivateField(final SchemaCatalogResolver schemaCatalogResolver, final String fieldName, @SuppressWarnings("unused") final Class clazz) throws Exception { + + final Field field = schemaCatalogResolver.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + return (T) field.get(schemaCatalogResolver); + } +} diff --git a/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaServiceIT.java b/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaServiceIT.java index e101436..5fab3e7 100644 --- a/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaServiceIT.java +++ b/schema-service/src/test/java/uk/gov/justice/schema/service/SchemaServiceIT.java @@ -3,8 +3,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import uk.gov.justice.schema.catalog.CatalogProducer; - import java.util.Optional; import javax.inject.Inject; diff --git a/schema-service/src/test/resources/json/schema/context/invalid_reference.json b/schema-service/src/test/resources/json/schema/context/invalid_reference.json new file mode 100644 index 0000000..a58e4bb --- /dev/null +++ b/schema-service/src/test/resources/json/schema/context/invalid_reference.json @@ -0,0 +1,21 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "http://justice.gov.uk/context/person.json", + "type": "object", + "properties": { + "nino": { + "type": "string" + }, + "name": { + "type": "string" + }, + "correspondence_address": + {"$ref" : "http://justice.gov.uk/standards/complex_address.json#/definitions/invalid_address"} + + }, + "required": [ + "nino", + "name", + "correspondence_address" + ] +} \ No newline at end of file