Package org.nutz.ioc.loader.combo

Source Code of org.nutz.ioc.loader.combo.ComboIocLoader

package org.nutz.ioc.loader.combo;

import java.util.ArrayList;
import java.util.List;

import org.nutz.ioc.IocLoader;
import org.nutz.ioc.IocLoading;
import org.nutz.ioc.ObjectLoadException;
import org.nutz.ioc.meta.IocObject;
import org.nutz.lang.Lang;
import org.nutz.lang.Mirror;

/**
* 融化多种IocLoader
*
* @author wendal(wendal1985@gmail.com)
*
*/
public class ComboIocLoader implements IocLoader {

  private List<IocLoader> iocLoaders = new ArrayList<IocLoader>();

  /**
   * 这个构造方法需要一组特殊的参数
   * <p/>
   * 第一种,以*开头,后面接类名, 如 <code>*org.nutz.ioc.loader.json.JsonLoader</code>
   * <p/>
   * 第二种,为具体的参数
   * <p/>
   * 处理规律, 当遇到第一种参数(*),则认为接下来的一个或多个参数为这一个IocLoader的参数,直至遇到另外一个*开头的参数
   * <p/>
   * <p/>
   * 例子:
   * <p/>
   * <code>{"*org.nutz.ioc.loader.json.JsonLoader","dao.js","service.js","*org.nutz.ioc.loader.xml.XmlIocLoader","config.xml"}</code>
   * <p/>
   * 这样的参数, 会生成一个以{"dao.js","service.js"}作为参数的JsonLoader,一个以{"dao.xml"}
   * 作为参数的XmlIocLoader
   *
   * @throws ClassNotFoundException
   *             如果*开头的参数所指代的类不存在
   */
  public ComboIocLoader(String... args) throws ClassNotFoundException {
    ArrayList<String> argsList = null;
    String currentClassName = null;
    for (String str : args) {
      if (str.length() > 0 && str.charAt(0) == '*') {
        if (argsList != null)
          createIocLoader(currentClassName, argsList);
        currentClassName = str.substring(1);
        argsList = new ArrayList<String>();
      } else
        argsList.add(str);
    }
    if (currentClassName != null)
      createIocLoader(currentClassName, argsList);
  }

  private void createIocLoader(String className, List<String> args) throws ClassNotFoundException {
    iocLoaders.add((IocLoader) Mirror  .me(Lang.loadClass(className))
                      .born(args.toArray(new Object[args.size()])));
  }

  public ComboIocLoader(IocLoader... loaders) {
    for (IocLoader iocLoader : loaders)
      if (iocLoader != null)
        iocLoaders.add(iocLoader);
  }

  public String[] getName() {
    ArrayList<String> list = new ArrayList<String>();
    for (IocLoader iocLoader : iocLoaders) {
      for (String name : iocLoader.getName())
        list.add(name);
    }
    return list.toArray(new String[list.size()]);
  }

  public boolean has(String name) {
    for (IocLoader iocLoader : iocLoaders)
      if (iocLoader.has(name))
        return true;
    return false;
  }

  public IocObject load(IocLoading loading, String name) throws ObjectLoadException {
    for (IocLoader iocLoader : iocLoaders)
      if (iocLoader.has(name))
        return iocLoader.load(loading, name);
    throw new ObjectLoadException("Object '" + name + "' without define!");
  }

}
TOP

Related Classes of org.nutz.ioc.loader.combo.ComboIocLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.