package org.nutz.ioc; import java.util.Map; import java.util.Map.Entry; import org.nutz.ioc.meta.IocEventSet; import org.nutz.ioc.meta.IocField; import org.nutz.ioc.meta.IocObject; import org.nutz.ioc.meta.IocValue; import org.nutz.ioc.val.StaticValue; import org.nutz.lang.Lang; import org.nutz.lang.Strings; import org.nutz.lang.meta.Pair; /** * @author zozoh(zozohtnt@gmail.com) * @author wendal(wendal1985@gmail.com) * */ public abstract class Iocs { private static final String OBJFIELDS = "^(type|scope|singleton|fields|args|events|factory)$"; public static boolean isIocObject(Map<String, ?> map) { for (Entry<String, ?> en : map.entrySet()) if (!en.getKey().matches(OBJFIELDS)) return false; return true; } public static Pair<Class<?>> parseName(String name) { String _name = null; Class<?> type = null; int pos = name.indexOf(':'); if (pos < 0) { _name = Strings.trim(name); } else { _name = Strings.trim(name.substring(0, pos)); try { String typeName = Strings.trim(name.substring(pos + 1)); type = Lang.loadClass(typeName); } catch (ClassNotFoundException e) { throw Lang.wrapThrow(e); } } return new Pair<Class<?>>(_name, type); } /** * 查看一下 me 中有没有缺少的属性,没有的话,从 it 补充 */ public static IocObject mergeWith(IocObject me, IocObject it) { // merge type if (me.getType() == null) me.setType(it.getType()); // don't need merge signleon // merge events if (me.getEvents() == null) { me.setEvents(it.getEvents()); } else if (it.getEvents() != null) { IocEventSet eventSet = it.getEvents(); IocEventSet myEventSet = me.getEvents(); if (Strings.isBlank(myEventSet.getCreate())) myEventSet.setCreate(eventSet.getCreate()); if (Strings.isBlank(myEventSet.getDepose())) myEventSet.setDepose(eventSet.getDepose()); if (Strings.isBlank(myEventSet.getFetch())) myEventSet.setFetch(eventSet.getFetch()); } // merge scope if (Strings.isBlank(me.getScope())) { me.setScope(it.getScope()); } // merge arguments if (!me.hasArgs()) me.copyArgys(it.getArgs()); // merge fields for (IocField fld : it.getFields().values()) if (!me.hasField(fld.getName())) me.addField(fld); return me; } public static IocValue convert(String value, boolean dftRefer) { IocValue iocValue = new IocValue(); if (dftRefer && value.startsWith(":")) { iocValue.setType(IocValue.TYPE_NORMAL); iocValue.setValue(value.substring(1)); // } else if (value.startsWith("$")) { // iocValue.setType(IocValue.TYPE_REFER); // iocValue.setValue(value.substring(1)); } else if (value.contains(":")) { String type = value.substring(0, value.indexOf(':')); if (IocValue.types.contains(type)) { iocValue.setType(type); if (value.endsWith(":")) { iocValue.setValue(""); } else iocValue.setValue(value.substring(value.indexOf(':') + 1)); } else { iocValue.setType(IocValue.TYPE_NORMAL); iocValue.setValue(value); } } else { // XXX 兼容性改变, 1.b.52 开始默认就是refer, 如果真的要输入常量 //log.info("auto set as refer:" + value); iocValue.setType(IocValue.TYPE_REFER); iocValue.setValue(value); } return iocValue; } public static Object self(Object obj) { return obj; } public static IocObject wrap(Object obj) { IocObject iobj = new IocObject(); //iobj.setType(obj.getClass()); iobj.setFactory(Iocs.class.getName() + "#self"); IocValue ival = new IocValue(null, new StaticValue(obj)); iobj.addArg(ival); return iobj; } }