| package com.matrix.core.tools.rr; | 
|   | 
| import com.matrix.core.pojo.AjaxResult; | 
| import com.matrix.core.tools.WebUtil; | 
| import groovy.lang.GroovyClassLoader; | 
| import org.slf4j.Logger; | 
| import org.slf4j.LoggerFactory; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.beans.factory.annotation.Qualifier; | 
| import org.springframework.core.annotation.AnnotationUtils; | 
|   | 
| import javax.annotation.Resource; | 
| import java.lang.reflect.Field; | 
| import java.lang.reflect.Modifier; | 
|   | 
| /** | 
|  * glue factory, product class/object by name | 
|  * @author xuxueli 2016-1-2 20:02:27 | 
|  */ | 
| public class GlueFactory { | 
|     private static Logger logger = LoggerFactory.getLogger(GlueFactory.class); | 
|      | 
|     /** | 
|      * groovy class loader | 
|      */ | 
|     private GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); | 
|   | 
|     // ----------------------------- spring support ----------------------------- | 
|     private static GlueFactory glueFactory = new GlueFactory(); | 
|     public static GlueFactory getInstance(){ | 
|         return glueFactory; | 
|     } | 
|   | 
|     /** | 
|      * inject action of spring | 
|      * @param instance | 
|      */ | 
|     private void injectService(Object instance){ | 
|         if (instance==null) { | 
|             return; | 
|         } | 
|          | 
|         Field[] fields = instance.getClass().getDeclaredFields(); | 
|         for (Field field : fields) { | 
|             if (Modifier.isStatic(field.getModifiers())) { | 
|                 continue; | 
|             } | 
|              | 
|             Object fieldBean = null; | 
|             // with bean-id, bean could be found by both @Resource and @Autowired, or bean could only be found by @Autowired | 
|             if (AnnotationUtils.getAnnotation(field, Resource.class) != null) { | 
|                 try { | 
|                     Resource resource = AnnotationUtils.getAnnotation(field, Resource.class); | 
|                     if (resource.name()!=null && resource.name().length()>0){ | 
|                         fieldBean = WebUtil.getApplicationContext().getBean(resource.name()); | 
|                     } else { | 
|                         fieldBean = WebUtil.getApplicationContext().getBean(field.getName()); | 
|                     } | 
|                 } catch (Exception e) { | 
|                 } | 
|                 if (fieldBean==null ) { | 
|                     fieldBean = WebUtil.getApplicationContext().getBean(field.getType()); | 
|                 } | 
|             } else if (AnnotationUtils.getAnnotation(field, Autowired.class) != null) { | 
|                 Qualifier qualifier = AnnotationUtils.getAnnotation(field, Qualifier.class); | 
|                 if (qualifier!=null && qualifier.value()!=null && qualifier.value().length()>0) { | 
|                     fieldBean = WebUtil.getApplicationContext().getBean(qualifier.value()); | 
|                 } else { | 
|                     fieldBean = WebUtil.getApplicationContext().getBean(field.getType()); | 
|                 } | 
|             } | 
|              | 
|             if (fieldBean!=null) { | 
|                 field.setAccessible(true); | 
|                 try { | 
|                     field.set(instance, fieldBean); | 
|                 } catch (IllegalArgumentException e) { | 
|                     logger.error(e.getMessage(), e); | 
|                 } catch (IllegalAccessException e) { | 
|                     logger.error(e.getMessage(), e); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|      | 
|     // ----------------------------- load instance ----------------------------- | 
|     // load new instance, prototype | 
|     public AjaxResult loadNewInstance(String codeSource) throws Exception{ | 
|         if (codeSource!=null && codeSource.trim().length()>0) { | 
|             Class<?> clazz = groovyClassLoader.parseClass(codeSource); | 
|             if (clazz != null) { | 
|                 Object instance = clazz.newInstance(); | 
|                 if (instance!=null) { | 
|                     if (instance instanceof GroovyRunable) { | 
|                         this.injectService(instance); | 
|                         return ((GroovyRunable) instance).run(); | 
|                     } else { | 
|                         throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, " | 
|                                 + "cannot convert from instance["+ instance.getClass() +"] to IJobHandler"); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|         throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null"); | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 根据字符串获取几个java实例 | 
|      * @param codeSource | 
|      * @return | 
|      * @throws Exception | 
|      */ | 
|     public Object loadInstance(String codeSource) throws Exception{ | 
|         if (codeSource!=null && codeSource.trim().length()>0) { | 
|             Class<?> clazz = groovyClassLoader.parseClass(codeSource); | 
|             if (clazz != null) { | 
|                 Object instance = clazz.newInstance(); | 
|                 if (instance!=null) { | 
|                     this.injectService(instance); | 
|                     return  instance; | 
|                 } | 
|             } | 
|         } | 
|         throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null"); | 
|     } | 
|   | 
|   | 
|   | 
| } |