Skip to content

Commit f8841e1

Browse files
committed
[bugfix] analyzer conf doesn't accept primitives
1 parent fbefed7 commit f8841e1

File tree

2 files changed

+543
-17
lines changed

2 files changed

+543
-17
lines changed

extensions/indexes/lucene/src/main/java/org/exist/indexing/lucene/AnalyzerConfig.java

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -168,21 +168,23 @@ protected static Analyzer configureAnalyzer(Element config) throws DatabaseConfi
168168
// Classname is defined.
169169

170170
// Probe class
171-
Class<?> clazz = null;
171+
final Class<?> untypedClazz;
172172
try {
173-
clazz = Class.forName(className);
173+
untypedClazz = Class.forName(className);
174174

175175
} catch (ClassNotFoundException e) {
176176
LOG.error(String.format("Lucene index: analyzer class %s not found. (%s)", className, e.getMessage()));
177177
return null;
178178
}
179179

180180
// CHeck if class is an Analyzer
181-
if (!Analyzer.class.isAssignableFrom(clazz)) {
181+
if (!Analyzer.class.isAssignableFrom(untypedClazz)) {
182182
LOG.error(String.format("Lucene index: analyzer class has to be a subclass of %s", Analyzer.class.getName()));
183183
return null;
184184
}
185185

186+
final Class<? extends Analyzer> clazz = (Class<? extends Analyzer>) untypedClazz;
187+
186188
// Get list of parameters
187189
List<KeyTypedValue<?>> cParams;
188190
try {
@@ -216,7 +218,7 @@ protected static Analyzer configureAnalyzer(Element config) throws DatabaseConfi
216218
newAnalyzer = createInstance(clazz, cParamClasses, cParamValues, false);
217219

218220
} else {
219-
// Either no parameters have been provided or more than one parameter
221+
// Either no parameters have been provided, or more than one parameter
220222

221223
// Extend arrays with (default) Version object info, add to front.
222224
Class<?>[] vcParamClasses = addVersionToClasses(cParamClasses);
@@ -252,7 +254,7 @@ protected static Analyzer configureAnalyzer(Element config) throws DatabaseConfi
252254
* @param warnOnError true if an error should be treated as a warning
253255
* @return The lucene analyzer
254256
*/
255-
private static Analyzer createInstance(final Class<?> clazz, final Class<?>[] vcParamClasses,
257+
static <T extends Analyzer> T createInstance(final Class<T> clazz, final Class<?>[] vcParamClasses,
256258
final Object[] vcParamValues, final boolean warnOnError) {
257259

258260
final String className = clazz.getName();
@@ -267,7 +269,7 @@ private static Analyzer createInstance(final Class<?> clazz, final Class<?>[] vc
267269
if (LOG.isDebugEnabled()) {
268270
LOG.debug(String.format("Using analyzer %s", className));
269271
}
270-
return (Analyzer)methodHandle.invokeWithArguments(vcParamValues);
272+
return (T) methodHandle.invokeWithArguments(vcParamValues);
271273
} catch (final NoSuchMethodException e) {
272274
final String message = String.format("Could not find matching analyzer class constructor %s: %s", className, e.getMessage());
273275
if (warnOnError) {
@@ -318,7 +320,7 @@ private static Class<?>[] addVersionToClasses(final Class<?>[] cParamClasses) {
318320
* @return List of triples key-value-valueType
319321
* @throws org.exist.indexing.lucene.AnalyzerConfig.ParameterException
320322
*/
321-
private static List<KeyTypedValue<?>> getAllConstructorParameters(Element config) throws ParameterException {
323+
static List<KeyTypedValue<?>> getAllConstructorParameters(Element config) throws ParameterException {
322324
final List<KeyTypedValue<?>> parameters = new ArrayList<>();
323325
final NodeList params = config.getElementsByTagNameNS(CollectionConfiguration.NAMESPACE, PARAM_ELEMENT_NAME);
324326

@@ -455,29 +457,43 @@ static KeyTypedValue<?> getConstructorParameter(final Element param) throws Para
455457
}
456458

457459
case "java.lang.Integer":
458-
case "int":
459-
460460
if (value == null) {
461461
throw new ParameterException("The 'value' attribute must exist and must contain an integer value.");
462462
}
463-
464463
try {
465464
final Integer n = Integer.parseInt(value);
466465
parameter = new KeyTypedValue<>(name, n, Integer.class);
467-
} catch (NumberFormatException ex) {
466+
} catch (final NumberFormatException ex) {
468467
LOG.error(String.format("Value %s could not be converted to an integer. %s", value, ex.getMessage()));
469468
}
470469
break;
471470

471+
case "int":
472+
if (value == null) {
473+
throw new ParameterException("The 'value' attribute must exist and must contain an int value.");
474+
}
475+
try {
476+
final Integer n = Integer.parseInt(value);
477+
parameter = new KeyTypedValue<>(name, n.intValue(), int.class);
478+
} catch (final NumberFormatException ex) {
479+
LOG.error(String.format("Value %s could not be converted to an int. %s", value, ex.getMessage()));
480+
}
481+
break;
482+
472483
case "java.lang.Boolean":
473-
case "boolean":
484+
if (value == null) {
485+
throw new ParameterException("The 'value' attribute must exist and must contain a Boolean value.");
486+
}
487+
final Boolean b1 = Boolean.parseBoolean(value);
488+
parameter = new KeyTypedValue<>(name, b1, Boolean.class);
489+
break;
474490

491+
case "boolean":
475492
if (value == null) {
476493
throw new ParameterException("The 'value' attribute must exist and must contain a boolean value.");
477494
}
478-
479-
final boolean b = Boolean.parseBoolean(value);
480-
parameter = new KeyTypedValue<>(name, b, boolean.class);
495+
final Boolean b2 = Boolean.parseBoolean(value);
496+
parameter = new KeyTypedValue<>(name, b2.booleanValue(), boolean.class);
481497
break;
482498

483499
default:

0 commit comments

Comments
 (0)