public PropertyArray2JavaBeanConverter(ClassProvider<Object> beanClassProvider, String[] attributePaths, ReferenceResolver referenceResolver) { super(Object[].class, Object.class); this.beanClassProvider = Assert.notNull(beanClassProvider, "beanClassProvider"); this.attributePaths = Assert.notNull(attributePaths, "attributePaths"); this.referenceResolver = Assert.notNull(referenceResolver, "referenceResolver"); createMutators(attributePaths); }
private Object haveTargetObject(Object bean, String featurePath) { if (featurePath == null) { return bean; } else if (featurePath.contains(".")) { String[] pathParts = StringUtil.splitOnFirstSeparator(featurePath, '.'); Object child = haveTargetObject(bean, pathParts[0]); return haveTargetObject(child, pathParts[1]); } Object value = FeatureAccessor.getValue(bean, featurePath, false); if (value != null) return value; else return AnyMutator.setFeatureDefault(bean, featurePath); }
@SuppressWarnings("unchecked") public XLSJavaBeanIterator(String uri, String sheetName, boolean formatted, String nullMarker, String emptyMarker, ClassProvider<Object> beanClassProvider) throws IOException, InvalidFormatException { super(null, null); this.uri = uri; this.formatted = formatted; Converter<String, ?> scriptConverter = new ScriptConverterForStrings(new DefaultContext()); XLSLineIterator iterator = new XLSLineIterator(uri, sheetName, true, formatted, scriptConverter); iterator.setNullMarker(nullMarker); iterator.setEmptyMarker(emptyMarker); String[] headers = parseHeaders(uri, sheetName, iterator); this.source = iterator; this.converter = (Converter<Object[], E>) new PropertyArray2JavaBeanConverter(beanClassProvider, headers, new RefResolver()); }
@Override public Object convert(Object[] propertyArray) throws ConversionException { if (propertyArray == null) return null; Class<?> beanClass = beanClassProvider.classFor(propertyArray); Object bean = BeanUtil.newInstance(beanClass); int elementsToUse = Math.min(propertyArray.length, attributePaths.length); for (int i = 0; i < elementsToUse; i++) { String attributePath = attributePaths[i]; String[] pathParts = StringUtil.splitOnLastSeparator(attributePath, '.'); Object target = haveTargetObject(bean, pathParts[0]); mutators[i].setValue(bean, referenceResolver.resolveReferences(propertyArray[i], target, pathParts[1])); } return bean; }