Skip to content

Commit e7fcc3c

Browse files
committed
[feature] Make grammar cache configurable from conf.xml
1 parent 1994fb2 commit e7fcc3c

File tree

9 files changed

+102
-38
lines changed

9 files changed

+102
-38
lines changed

exist-core/src/main/java/org/exist/util/Configuration.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ public Configuration(@Nullable String configFilename, Optional<Path> existHomeDi
372372
configureElement(doc, XQUERY_CONFIGURATION_ELEMENT_NAME, this::configureXQuery);
373373
// Validation
374374
configureElement(doc, XMLReaderObjectFactory.CONFIGURATION_ELEMENT_NAME, element -> configureValidation(existHomePath, element));
375+
// Grammar cache
376+
configureElement(doc, GrammarPool.GRAMMAR_POOL, element -> configureGrammarCache(existHomePath, element));
375377
// RPC server
376378
configureElement(doc, "rpc-server", this::configureRpcServer);
377379
} catch (final SAXException | IOException | ParserConfigurationException e) {
@@ -1192,13 +1194,17 @@ private void configureIndexer(final Document doc, final Element indexer) throws
11921194
setProperty(IndexManager.PROPERTY_INDEXER_MODULES, modConfig);
11931195
}
11941196

1197+
private void configureGrammarCache(final Optional<Path> dbHome, final Element validation) {
1198+
configureProperty(validation, GrammarPool.ATTRIBUTE_MAXIMUM_SIZE, GrammarPool.PROPERTY_MAXIMUM_SIZE, Configuration::asInteger, null);
1199+
configureProperty(validation, GrammarPool.ATTRIBUTE_EXPIRE_AFTER_ACCESS, GrammarPool.PROPERTY_EXPIRE_AFTER_ACCESS, Configuration::asInteger, null);
1200+
1201+
setProperty(GrammarPool.GRAMMAR_POOL, new GrammarPool(getInteger(GrammarPool.PROPERTY_MAXIMUM_SIZE), getInteger(GrammarPool.PROPERTY_EXPIRE_AFTER_ACCESS)));
1202+
}
1203+
11951204
private void configureValidation(final Optional<Path> dbHome, final Element validation) {
11961205
// Determine validation mode
11971206
configureProperty(validation, XMLReaderObjectFactory.VALIDATION_MODE_ATTRIBUTE, PROPERTY_VALIDATION_MODE);
11981207

1199-
// cache
1200-
setProperty(XMLReaderObjectFactory.GRAMMAR_POOL, new GrammarPool());
1201-
12021208
// Configure the Entity Resolver
12031209
final NodeList entityResolver = validation.getElementsByTagName(XMLReaderObjectFactory.CONFIGURATION_ENTITY_RESOLVER_ELEMENT_NAME);
12041210
if (entityResolver.getLength() == 0) {

exist-core/src/main/java/org/exist/util/XMLReaderObjectFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ public class XMLReaderObjectFactory extends BasePooledObjectFactory<XMLReader> i
6060
public static final String PROPERTY_VALIDATION_MODE = "validation.mode";
6161
public static final String CATALOG_RESOLVER = "validation.resolver";
6262
public static final String CATALOG_URIS = "validation.catalog_uris";
63-
public static final String GRAMMAR_POOL = "validation.grammar_pool";
6463

6564
// Xerces feature and property names
6665
public static final String APACHE_FEATURES_VALIDATION_SCHEMA
@@ -83,7 +82,7 @@ public class XMLReaderObjectFactory extends BasePooledObjectFactory<XMLReader> i
8382

8483
@Override
8584
public void configure(final Configuration configuration) {
86-
this.grammarPool = (GrammarPool) configuration.getProperty(XMLReaderObjectFactory.GRAMMAR_POOL);
85+
this.grammarPool = (GrammarPool) configuration.getProperty(GrammarPool.GRAMMAR_POOL);
8786
this.resolver = (Resolver) configuration.getProperty(CATALOG_RESOLVER);
8887
final String option = (String) configuration.getProperty(PROPERTY_VALIDATION_MODE);
8988
this.validation = VALIDATION_SETTING.fromOption(option);

exist-core/src/main/java/org/exist/validation/GrammarPool.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@
3838
*/
3939
public class GrammarPool implements XMLGrammarPool {
4040

41+
public static final String GRAMMAR_POOL = "grammar-pool";
42+
43+
public static final String ATTRIBUTE_MAXIMUM_SIZE = "maximum-size";
44+
public static final String PROPERTY_MAXIMUM_SIZE = "grammar-cache.maximum-size";
45+
46+
public static final String ATTRIBUTE_EXPIRE_AFTER_ACCESS = "expire-after-access";
47+
public static final String PROPERTY_EXPIRE_AFTER_ACCESS = "grammar-cache.expire-after-access";
48+
4149
private final Cache<GrammarKey, Grammar> grammarCache;
4250
private boolean isLocked = false;
4351

@@ -52,13 +60,21 @@ public GrammarPool() {
5260
* Constructor.
5361
*
5462
* @param maxSize Maximum nr of cached elements.
55-
* @param minutes Maximum expiration time in minutes after last access.
63+
* @param seconds Maximum expiration time in seconds after last access.
5664
*/
57-
public GrammarPool(final long maxSize, final long minutes) {
58-
grammarCache = Caffeine.newBuilder()
59-
.maximumSize(maxSize)
60-
.expireAfterAccess(minutes, TimeUnit.MINUTES)
61-
.build();
65+
public GrammarPool(final long maxSize, final long seconds) {
66+
67+
Caffeine<Object, Object> cafeineBuilder = Caffeine.newBuilder();
68+
69+
if(maxSize>0){
70+
cafeineBuilder = cafeineBuilder.maximumSize(maxSize);
71+
}
72+
73+
if(seconds>0){
74+
cafeineBuilder.expireAfterAccess(seconds, TimeUnit.SECONDS);
75+
}
76+
77+
grammarCache = cafeineBuilder.build();
6278
}
6379

6480
@Override

exist-core/src/main/java/org/exist/validation/Validator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public Validator(final BrokerPool brokerPool, final Subject subject) {
9090
final Configuration config = brokerPool.getConfiguration();
9191

9292
// setup grammar brokerPool
93-
this.grammarPool = (GrammarPool) config.getProperty(XMLReaderObjectFactory.GRAMMAR_POOL);
93+
this.grammarPool = (GrammarPool) config.getProperty(GrammarPool.GRAMMAR_POOL);
9494

9595
// setup system wide catalog resolver
9696
this.systemCatalogResolver = (Resolver) config.getProperty(XMLReaderObjectFactory.CATALOG_RESOLVER);

exist-core/src/main/java/org/exist/xquery/functions/validation/GrammarTooling.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public Sequence eval(Sequence[] args, Sequence contextSequence)
139139
throws XPathException {
140140

141141
final GrammarPool grammarpool
142-
= (GrammarPool) config.getProperty(XMLReaderObjectFactory.GRAMMAR_POOL);
142+
= (GrammarPool) config.getProperty(GrammarPool.GRAMMAR_POOL);
143143

144144
if (isCalledAs("clear-grammar-cache")){
145145

exist-core/src/main/java/org/exist/xquery/functions/validation/Jaxp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ public Sequence eval(final Sequence[] args, final Sequence contextSequence) thro
283283
if (useCache) {
284284
LOG.debug("Grammar caching enabled.");
285285
final Configuration config = brokerPool.getConfiguration();
286-
final GrammarPool grammarPool = (GrammarPool) config.getProperty(XMLReaderObjectFactory.GRAMMAR_POOL);
286+
final GrammarPool grammarPool = (GrammarPool) config.getProperty(GrammarPool.GRAMMAR_POOL);
287287
xmlReader.setProperty(XMLReaderObjectFactory.APACHE_PROPERTIES_INTERNAL_GRAMMARPOOL, grammarPool);
288288
}
289289

0 commit comments

Comments
 (0)