diff --git a/src/main/java/com/github/fge/jsonschema/cfg/ValidationConfiguration.java b/src/main/java/com/github/fge/jsonschema/cfg/ValidationConfiguration.java index b67fdc840..54a1b9360 100644 --- a/src/main/java/com/github/fge/jsonschema/cfg/ValidationConfiguration.java +++ b/src/main/java/com/github/fge/jsonschema/cfg/ValidationConfiguration.java @@ -70,6 +70,11 @@ public final class ValidationConfiguration * Whether to use {@code format} in the resulting factory */ final boolean useFormat; + + /** + * Cache size for processing validations + */ + final int cacheSize; /** * The set of syntax messages @@ -113,6 +118,7 @@ public static ValidationConfiguration byDefault() libraries = ImmutableMap.copyOf(builder.libraries); defaultLibrary = builder.defaultLibrary; useFormat = builder.useFormat; + cacheSize = builder.cacheSize; syntaxMessages = builder.syntaxMessages; validationMessages = builder.validationMessages; } @@ -146,6 +152,11 @@ public boolean getUseFormat() { return useFormat; } + + public int getCacheSize() + { + return cacheSize; + } public MessageBundle getSyntaxMessages() { diff --git a/src/main/java/com/github/fge/jsonschema/cfg/ValidationConfigurationBuilder.java b/src/main/java/com/github/fge/jsonschema/cfg/ValidationConfigurationBuilder.java index 61cdec21c..949a18b3b 100644 --- a/src/main/java/com/github/fge/jsonschema/cfg/ValidationConfigurationBuilder.java +++ b/src/main/java/com/github/fge/jsonschema/cfg/ValidationConfigurationBuilder.java @@ -80,6 +80,11 @@ public final class ValidationConfigurationBuilder * Whether to use {@code format} ({@code true} by default) */ boolean useFormat = true; + + /** + * Cache maximum size of 512 records by default + */ + int cacheSize = 512; /** * The set of syntax messages @@ -119,6 +124,7 @@ public final class ValidationConfigurationBuilder libraries = Maps.newHashMap(cfg.libraries); defaultLibrary = cfg.defaultLibrary; useFormat = cfg.useFormat; + cacheSize = cfg.cacheSize; syntaxMessages = cfg.syntaxMessages; validationMessages = cfg.validationMessages; } @@ -217,6 +223,14 @@ public ValidationConfigurationBuilder setValidationMessages( return this; } + public ValidationConfigurationBuilder setCacheSize( + final int cacheSize) + { + BUNDLE.checkArgument(cacheSize >= -1, "invalidCacheSize"); + this.cacheSize = cacheSize; + return this; + } + /** * Return a frozen version of this configuration * diff --git a/src/main/java/com/github/fge/jsonschema/main/JsonSchemaFactory.java b/src/main/java/com/github/fge/jsonschema/main/JsonSchemaFactory.java index bfaca5fe0..c9adbcc23 100644 --- a/src/main/java/com/github/fge/jsonschema/main/JsonSchemaFactory.java +++ b/src/main/java/com/github/fge/jsonschema/main/JsonSchemaFactory.java @@ -275,6 +275,6 @@ private Processor buildProcessor() final Processor processor = map.getProcessor(); return new CachingProcessor(processor, - SchemaContextEquivalence.getInstance()); + SchemaContextEquivalence.getInstance(), validationCfg.getCacheSize()); } } diff --git a/src/main/java/com/github/fge/jsonschema/processors/validation/ValidationChain.java b/src/main/java/com/github/fge/jsonschema/processors/validation/ValidationChain.java index bc4e4ad9e..061574aec 100644 --- a/src/main/java/com/github/fge/jsonschema/processors/validation/ValidationChain.java +++ b/src/main/java/com/github/fge/jsonschema/processors/validation/ValidationChain.java @@ -71,7 +71,7 @@ public ValidationChain(final RefResolver refResolver, = ProcessorChain.startWith(refResolver).chainWith(syntaxProcessor); resolver = new CachingProcessor, ValueHolder>( - chain1.getProcessor(), SchemaHolderEquivalence.INSTANCE + chain1.getProcessor(), SchemaHolderEquivalence.INSTANCE, cfg.getCacheSize() ); final SchemaDigester digester = new SchemaDigester(library); @@ -86,7 +86,7 @@ public ValidationChain(final RefResolver refResolver, } builder = new CachingProcessor( - chain2.getProcessor(), SchemaContextEquivalence.getInstance() + chain2.getProcessor(), SchemaContextEquivalence.getInstance(), cfg.getCacheSize() ); } diff --git a/src/main/resources/com/github/fge/jsonschema/validator/configuration.properties b/src/main/resources/com/github/fge/jsonschema/validator/configuration.properties index ae76069c4..55996e6ff 100644 --- a/src/main/resources/com/github/fge/jsonschema/validator/configuration.properties +++ b/src/main/resources/com/github/fge/jsonschema/validator/configuration.properties @@ -37,3 +37,4 @@ nullFormat = format attribute name cannot be null nullAttribute = attempt to register null implementation of format attribute "%s" nullKeyword = attempt to add null keyword to library nullType = null type argument to digester constructor +invalidCacheSize = cache size must be greater than -1. -1 value sets a cache with unlimited records, zero-value disables the cache diff --git a/src/test/java/com/github/fge/jsonschema/cfg/ValidationConfigurationTest.java b/src/test/java/com/github/fge/jsonschema/cfg/ValidationConfigurationTest.java index 79684b6ce..c508bca9f 100644 --- a/src/test/java/com/github/fge/jsonschema/cfg/ValidationConfigurationTest.java +++ b/src/test/java/com/github/fge/jsonschema/cfg/ValidationConfigurationTest.java @@ -103,6 +103,18 @@ public void cannotPutNullValidationMessageBundle() } } + @Test + public void cannotPutInvalidCacheSize() + { + try { + cfg.setCacheSize(-2); + fail("No exception thrown!!"); + } catch (IllegalArgumentException e) { + assertEquals(e.getMessage(), + BUNDLE.getMessage("invalidCacheSize")); + } + } + @Test public void defaultLibraryIsDraftV4() {