AnnotationUtils { public static void assignFieldParams(Object bean, Map<String, Param> params) throws TikaConfigException { Class<?> beanClass = bean.getClass(); if (!PARAM_INFO.containsKey(beanClass)) { synchronized (TikaConfig.class){ if (!PARAM_INFO.containsKey(beanClass)) { List<AccessibleObject> aObjs = collectInfo(beanClass, org.apache.tika.config.Field.class); List<ParamField> fields = new ArrayList<>(aObjs.size()); for (AccessibleObject aObj : aObjs) { fields.add(new ParamField(aObj)); } PARAM_INFO.put(beanClass, fields); } } } List<ParamField> fields = PARAM_INFO.get(beanClass); Set<String> validFieldNames = new HashSet<>(); for (ParamField field : fields) { validFieldNames.add(field.getName()); Param<?> param = params.get(field.getName()); if (param != null){ if (field.getType().isAssignableFrom(param.getType())) { try { field.assignValue(bean, param.getValue()); } catch (Exception e) { throw new TikaConfigException(e.getMessage(), e); } } else { String msg = String.format(Locale.ROOT, "Value '%s' of type '%s' cant be" + " assigned to field '%s' of defined type '%s'", param.getValue(), param.getValue().getClass(), field.getName(), field.getType()); throw new TikaConfigException(msg); } } else if (field.isRequired()){ String msg = String.format(Locale.ROOT, "Param %s is required for %s," + " but it is not given in config.", field.getName(), bean.getClass().getName()); throw new TikaConfigException(msg); } else { LOG.debug("Param not supplied, field is not mandatory"); } } }  static void assignFieldParams(Object bean, Map<String, Param> params);  }
@Test public void testMisMatchType() { class MyParser extends Configurable { @Field(required = true) int config; } Map<String, Param> params = new HashMap<>(); try { params.put("config", new Param<>("config", 1)); MyParser bean = new MyParser(); AnnotationUtils.assignFieldParams(bean, params); Assert.assertEquals(bean.config, 1); } catch (TikaConfigException e) { e.printStackTrace(); Assert.fail("Exception Not expected"); } params.clear(); try { params.put("config", new Param<>("config", "a string value")); AnnotationUtils.assignFieldParams(new MyParser(), params); Assert.fail("Exception expected"); } catch (TikaConfigException e) { } }
@Test public void testPrimitiveAndBoxedTypes() { class MyParser extends Configurable { @Field(required = true) int config; @Field(required = true, name = "config") Integer config2; } Map<String, Param> params = new HashMap<>(); try { MyParser bean = new MyParser(); int val = 100; params.put("config", new Param<>("config", val)); AnnotationUtils.assignFieldParams(bean, params); Assert.assertTrue(bean.config == bean.config2); Assert.assertTrue(bean.config == val); } catch (TikaConfigException e) { e.printStackTrace(); Assert.fail("Exception Not expected"); } }
@Test public void testRequiredParam() { class MyParser extends Configurable { @Field(required = true) String config; } Map<String, Param> params = new HashMap<>(); String someval = "someval"; params.put("config", new Param<>("config", someval)); try { MyParser bean = new MyParser(); AnnotationUtils.assignFieldParams(bean, params); Assert.assertEquals(bean.config, someval); } catch (TikaConfigException e) { e.printStackTrace(); Assert.fail("Exception Not expected"); } params.clear(); try { AnnotationUtils.assignFieldParams(new MyParser(), params); Assert.fail("Exception expected"); } catch (TikaConfigException e) { } }
@Test public void testParserInheritance() { class Parent { @Field(required = true) int overridden; @Field(required = true) int parentField; } class Child extends Parent { @Field(required = true) int overridden; @Field(required = true) int childField; } int val = 1; Map<String, Param> params = new HashMap<>(); params.put("overridden", new Param<>("oevrriden", val)); params.put("parentField", new Param<>("parentField", val)); params.put("childField", new Param<>("childField", val)); try { Child child = new Child(); AnnotationUtils.assignFieldParams(child, params); Assert.assertEquals(child.overridden, val); Assert.assertEquals(child.parentField, val); Assert.assertEquals(child.childField, val); } catch (TikaConfigException e) { e.printStackTrace(); Assert.fail("Exception Not expected"); } try { params.remove("parentField"); AnnotationUtils.assignFieldParams(new Child(), params); Assert.fail("Exception expected, parent class field not set"); } catch (TikaConfigException e) { } }
@Test public void testParamValueInheritance() { class Bean { @Field(required = true) CharSequence field; } Bean parser = new Bean(); Map<String, Param> params = new HashMap<>(); try { String val = "someval"; params.put("field", new Param<String>("field", String.class, val)); AnnotationUtils.assignFieldParams(parser, params); Assert.assertEquals(val, parser.field); } catch (Exception e){ e.printStackTrace(); Assert.fail("Exception not expected, string is assignable to CharSequence"); } try { Date val = new Date(); params.put("field", new Param<Date>("field", Date.class, val)); AnnotationUtils.assignFieldParams(parser, params); Assert.fail("Exception expected, Date is not assignable to CharSequence."); } catch (TikaConfigException e){ } }