protected ValueDefinition resolvedString(Class<?> type, String string) { return new ValueDefinition(string, false, type); }
@Override public Object get() { Map definedMap = (Map)vd.getDefinedValue(); Map createdMap = null; if(null == vd.getDefinedType()){ createdMap = new LinkedHashMap(definedMap.size()); }else{ Class<?> clzz = vd.getDefinedType(); if(clzz.isInterface() || Modifier.isAbstract(clzz.getModifiers())){ boolean isAssignableFrom = clzz.isAssignableFrom(vd.getDefinedValue().getClass()); if(!isAssignableFrom){ throw new BeanDefinitionException("Error create instance of collection type '" + vd.getDefinedType() + "' bean " + bd + " cause "+clzz+" is interface or abstract class and the value type " + vd.getDefinedValue().getClass().getName() + " is not the subclass of "+clzz); }else{ clzz = vd.getDefinedValue().getClass(); createdMap.put(doConvertValue(key, vd.getDefinedKeyType()), doConvertValue(val, vd.getDefinedElementType()));
protected Object doResolveArray(final BeanDefinitionBase bd,final ValueDefinition vd){ Supplier<Object> func = new Supplier<Object>() { @Override public Object get() { Object definedArray = vd.getDefinedValue(); Object createdArray = null; int arrayLength = Array.getLength(definedArray); createdArray = Array.newInstance(definedArray.getClass().getComponentType(), arrayLength); for(int i=0;i<arrayLength;i++){ Object element = Array.get(definedArray, i); Object value = element instanceof ValueDefinition ? doResolveValue(bd, (ValueDefinition)element, null) : element; Array.set(createdArray, i, doConvertValue(value, vd.getDefinedElementType())); } return createdArray; } }; vd.resolved(func); return func.get(); }
@Override public Object get() { Object definedArray = vd.getDefinedValue(); Object createdArray = null; int arrayLength = Array.getLength(definedArray); createdArray = Array.newInstance(definedArray.getClass().getComponentType(), arrayLength); for(int i=0;i<arrayLength;i++){ Object element = Array.get(definedArray, i); Object value = element instanceof ValueDefinition ? doResolveValue(bd, (ValueDefinition)element, null) : element; Array.set(createdArray, i, doConvertValue(value, vd.getDefinedElementType())); } return createdArray; } };
@SuppressWarnings("unchecked") protected Collection<Object> createCollection(BeanDefinitionBase bd, ValueDefinition vd,Collection<Object> col){ try { Class<?> definedType = vd.getDefinedType(); if(definedType != null){ if(definedType.isInterface() || Modifier.isAbstract(definedType.getModifiers())){ boolean isAssignableFrom = definedType.isAssignableFrom(vd.getDefinedValue().getClass()); if(!isAssignableFrom){ throw new BeanDefinitionException("Error create instance of collection type '" + vd.getDefinedType() + "' bean " + bd + " cause "+definedType+" is interface or abstract class and the value type " + vd.getDefinedValue().getClass().getName() + " is not the subclass of "+definedType); }else{ definedType = vd.getDefinedValue().getClass(); } } return (Collection<Object>)Reflection.newInstance(definedType); } } catch (ReflectException e) { throw new BeanDefinitionException("Error create instance of collection type '" + vd.getDefinedType() + "' bean " + bd, e); } if(col instanceof List){ return new ArrayList<Object>(); }else if(col instanceof Set){ return new ArrayList<Object>(); }else{ throw new BeanDefinitionException("Invalid collection type '" + col.getClass().getName() + "', only 'list' and 'set' are supported, please check the bean " + bd); } }
@SuppressWarnings({ "rawtypes", "unused" }) protected Object doResolveValue(BeanDefinitionBase bd,ValueDefinition vd, String defaultValue){ if(vd.isResolved()){ Object value = vd.getResolvedValue(); Object definedValue = vd.getDefinedValue(); vd.resolved(null); }else{ definedValue = placeholderResolver.resolveString(defaultValue); vd.resolved(doConvertValue(definedValue, vd.getDefinedType())); return vd.getResolvedValue(); vd.resolved(beanReferenceValue); return beanReferenceValue.get(); }else if(definedValue instanceof BeanDefinitionBase){ Supplier<Object> beanValue = createBeanValue(bd,(BeanDefinitionBase)definedValue); vd.resolved(beanValue); return beanValue.get(); }else if(definedValue instanceof Collection){ vd.resolved(doConvertValue(resolvedValue, vd.getDefinedType())); return resolvedValue;
continue; Class<?> valType = vd.getDefinedElementType(); if (valType == null && vd.getDefinedValue() != null) { valType = vd.getDefinedValue().getClass(); BeanReference beanRef = (BeanReference) vd.getDefinedValue(); if (beanRef.getTargetBeanDefinition() != null) { Class<?> refCls = beanRef.getTargetBeanDefinition().getSource().getClass(); BeanDefinitionBase bd = (BeanDefinitionBase) vd.getDefinedValue(); Class<?> definedType = bd.getBeanClass(); if (definedType == null) { if (null == ad.getValueDefinition().getDefinedType()) { ad.getValueDefinition().setDefinedType(type);
protected BeanDefinitionBase readMapBean(BeanContainer container, XmlReader reader, LoaderContext context) { BeanDefinitionBase bean = new BeanDefinitionBase(reader.getSource()); readValuedBeanAttributes(container, reader, context, bean); bean.setBeanClass(classAttribute(reader, MAP_CLASS_ATTRIBUTE, false)); bean.setValueDefinition(readMap(container, reader, context)); bean.getValueDefinition().setDefinedType(bean.getBeanClass()); if (null == bean.getBeanClass()) { bean.setBeanClass(LinkedHashMap.class); } return bean; }
protected Object doCreateBean( ValueDefinition vd){ Object definedValue = vd.getDefinedValue(); if(null == definedValue){ throw new IllegalStateException("The defined value must not be null"); } if(definedValue instanceof BeanReference){ return doGetBeanReferenceInstance((BeanReference)definedValue); }else if(definedValue instanceof BeanDefinitionBase){ return doGetBean((BeanDefinitionBase)definedValue); } throw new IllegalStateException("The value definition must be bean reference or bean definition"); }
protected Object[] doResolveArgs(final BeanDefinitionBase bd,final List<ArgumentDefinition> argDefs){ List<Object> args = new ArrayList<>(); for(ArgumentDefinition ad : argDefs){ if(null != ad.getValueDefinition().getDefinedType()){ args.add(Converts.convert(doResolveValue(bd, ad.getValueDefinition(),ad.getDefaultValue()),ad.getValueDefinition().getDefinedType())); }else{ args.add(doResolveValue(bd, ad.getValueDefinition(),ad.getDefaultValue())); } } return args.toArray(new Object[args.size()]); }
@Override public Collection get() { Collection definedCol = (Collection)vd.getDefinedValue(); Collection createdCol = createCollection(bd, vd,definedCol); for(Object element : definedCol){ Object value = element instanceof ValueDefinition ? doResolveValue(bd, (ValueDefinition)element, null) : element; createdCol.add(doConvertValue(value, vd.getDefinedElementType())); } return createdCol; } };
protected BeanDefinitionBase readSetBean(BeanContainer container, XmlReader reader, LoaderContext context) { BeanDefinitionBase bean = new BeanDefinitionBase(reader.getSource()); readValuedBeanAttributes(container, reader, context, bean); bean.setBeanClass(classAttribute(reader, SET_CLASS_ATTRIBUTE, false)); bean.setValueDefinition(readSet(container, reader, context)); bean.getValueDefinition().setDefinedType(bean.getBeanClass()); if (null == bean.getBeanClass()) { bean.setBeanClass(LinkedHashSet.class); } return bean; }
if(null != bld){ for(ValueDefinition vd : bld.getValues()){ Object v = vd.getDefinedValue(); if(v instanceof BeanDefinition && !((BeanDefinition)v).isSingleton()) { cache = false;
protected ValueDefinition resolvedString(String string) { return new ValueDefinition(string); }
protected BeanDefinitionBase readListBean(BeanContainer container, XmlReader reader, LoaderContext context) { BeanDefinitionBase bean = new BeanDefinitionBase(reader.getSource()); readValuedBeanAttributes(container, reader, context, bean); bean.setBeanClass(classAttribute(reader, LIST_CLASS_ATTRIBUTE, false)); bean.setValueDefinition(readList(container, reader, context)); bean.getValueDefinition().setDefinedType(bean.getBeanClass()); if (null == bean.getBeanClass()) { bean.setBeanClass(ArrayList.class); } return bean; }
@SuppressWarnings({ "unchecked", "rawtypes" }) protected Object doResolveCollection(final BeanDefinitionBase bd,final ValueDefinition vd){ Supplier<Collection> func = new Supplier<Collection>() { @Override public Collection get() { Collection definedCol = (Collection)vd.getDefinedValue(); Collection createdCol = createCollection(bd, vd,definedCol); for(Object element : definedCol){ Object value = element instanceof ValueDefinition ? doResolveValue(bd, (ValueDefinition)element, null) : element; createdCol.add(doConvertValue(value, vd.getDefinedElementType())); } return createdCol; } }; vd.resolved(func); return func.get(); }
protected ValueDefinition resolvedValue(Object value) { return new ValueDefinition(value); }
protected ValueDefinition beanReference(LoaderContext context, String ref) { return new ValueDefinition(new BeanReference(ref)); }
protected ValueDefinition beanReference(LoaderContext context, Class<?> type, String name) { return new ValueDefinition(new BeanReference(type, name)); }