/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.plugin.externalds.generate.factory.init.bean;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;
import com.ewcms.plugin.BaseRuntimeException;
import com.ewcms.plugin.BaseRuntimeExceptionWrapper;
/**
* <ul>根据的数据源映射对象,查找相对应的数据源工厂
* <p>通过在org.jict.alqc.datasource.init.AlqcDataSourceFactory类中定义的serviceDefinitionMap变量进行查找;
* 而此类(AlqcDataSourceFactory)为服务器启动时自动加载.
* </ul>
* @author 吴智俊
*/
@Service
public class BeanForInterfaceFactory implements BeanForInterfaceFactoryable, ApplicationContextAware {
private static final Logger logger = LoggerFactory.getLogger(BeanForInterfaceFactory.class);
private ApplicationContext ctx;
@Override
public void setApplicationContext(ApplicationContext ctx) {
this.ctx = ctx;
}
@SuppressWarnings("rawtypes")
private final Comparator itfComparator = new Comparator() {
@SuppressWarnings("unchecked")
@Override
public int compare(Object o1, Object o2) {
Class itf1 = (Class) o1;
Class itf2 = (Class) o2;
if (itf1.equals(itf2)) {
return 0;
} else if (itf2.isAssignableFrom(itf1)) {
return -1;
} else if (itf1.isAssignableFrom(itf2)) {
return 1;
} else {
return itf1.getName().compareTo(itf2.getName());
}
}
};
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public String getBeanName(Map interfaceToBeanMappings, Class itfClass) {
if (interfaceToBeanMappings == null) {
return null;
}
try {
SortedSet interfaces = new TreeSet(itfComparator);
for (Iterator it = interfaceToBeanMappings.keySet().iterator(); it.hasNext();) {
String itfName = (String) it.next();
Class itf = Class.forName(itfName, true, Thread.currentThread().getContextClassLoader());
if (itf.isAssignableFrom(itfClass)) {
interfaces.add(itf);
}
}
if (!interfaces.isEmpty()) {
Class itf = (Class) interfaces.iterator().next();
return (String) interfaceToBeanMappings.get(itf.getName());
}
return null;
} catch (ClassNotFoundException e) {
logger.error("ClassNotFoundException",e);
throw new BaseRuntimeExceptionWrapper(e);
}
}
@SuppressWarnings("rawtypes")
@Override
public Object getBean(Map classToBeanMappings, Class _class) {
String beanName = getBeanName(classToBeanMappings, _class);
if (beanName == null) {
logger.error("名称未找到接口");
throw new BaseRuntimeException("名称未找到接口", new Object[]{_class.getName()});
}
Object bean = ctx.getBean(beanName);
if (bean == null) {
logger.error("Bean没有名字");
throw new BaseRuntimeException("Bean没有名字", new Object[]{beanName});
}
return bean;
}
}