View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.transport.quartz.jobs;
8   
9   import org.mule.api.MuleContext;
10  import org.mule.api.MuleMessage;
11  import org.mule.api.context.MuleContextAware;
12  import org.mule.config.i18n.CoreMessages;
13  import org.mule.transport.quartz.config.AbstractJobConfig;
14  import org.mule.transport.quartz.config.JobConfig;
15  import org.mule.util.ClassUtils;
16  
17  import java.lang.reflect.InvocationTargetException;
18  
19  import org.quartz.Job;
20  import org.quartz.StatefulJob;
21  
22  /**
23   * This configuration simply holds a reference to a user defined job to execute.
24   */
25  public class CustomJobFromMessageConfig extends AbstractJobConfig
26  {
27      private String expression;
28      private String evaluator;
29      private String customEvaluator;
30  
31      public Job getJob(MuleMessage message) throws ClassNotFoundException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException
32      {
33          setupEvaluator();
34  
35          Object result = getMuleContext().getExpressionManager().evaluate(expression, evaluator, message, true);
36          Class<? extends Job> clazz;
37          if (result instanceof Job)
38          {
39              return (Job) result;
40          }
41          else if (result instanceof JobConfig)
42          {
43              clazz = ((JobConfig)result).getJobClass();
44          }
45          else
46          {
47              throw new IllegalStateException(CoreMessages.propertyIsNotSupportedType(evaluator + ":" + expression,
48                      new Class[]{Job.class, JobConfig.class}, result.getClass()).getMessage());
49          }
50  
51          return ClassUtils.instanciateClass(clazz);
52      }
53  
54      public JobConfig getJobConfig(MuleMessage message) throws ClassNotFoundException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException
55      {
56          setupEvaluator();
57  
58          final MuleContext muleContext = getMuleContext();
59          Object result = muleContext.getExpressionManager().evaluate(expression, evaluator, message, true);
60          if (result instanceof Job)
61          {
62              CustomJobConfig customJob = new CustomJobConfig();
63              customJob.setJob((Job) result);
64              customJob.setMuleContext(muleContext);
65              return customJob;
66          }
67          else if (result instanceof JobConfig)
68          {
69              if (result instanceof MuleContextAware)
70              {
71                  ((MuleContextAware) result).setMuleContext(muleContext);
72              }
73              return (JobConfig) result;
74          }
75          else
76          {
77              throw new IllegalStateException(CoreMessages.propertyIsNotSupportedType(evaluator + ":" + expression,
78                      new Class[]{Job.class, JobConfig.class, Class.class, String.class}, result.getClass()).getMessage());
79          }
80      }
81  
82      protected void setupEvaluator()
83      {
84          if (evaluator.equals("custom"))
85          {
86              evaluator = customEvaluator;
87          }
88      }
89  
90      public String getCustomEvaluator()
91      {
92          return customEvaluator;
93      }
94  
95      public void setCustomEvaluator(String customEvaluator)
96      {
97          this.customEvaluator = customEvaluator;
98      }
99  
100     public String getEvaluator()
101     {
102         return evaluator;
103     }
104 
105     public void setEvaluator(String evaluator)
106     {
107         this.evaluator = evaluator;
108     }
109 
110     public String getExpression()
111     {
112         return expression;
113     }
114 
115     public void setExpression(String expression)
116     {
117         this.expression = expression;
118     }
119 
120     @Override
121     protected Class<? extends StatefulJob> getStatefulJobClass()
122     {
123         return StatefulCustomJob.class;
124     }
125 
126     @Override
127     protected Class<? extends Job> getStatelessJobClass()
128     {
129         return CustomJob.class;
130     }
131 }