PageRenderTime 41ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/jira3-script-plugin/src/main/java/com/google/code/jira/script/listener/ScriptListener.java

http://jira-script-plugin.googlecode.com/
Java | 128 lines | 97 code | 27 blank | 4 comment | 22 complexity | 7689bdcd3dfd0429f97f22413baa72af MD5 | raw file
  1. package com.google.code.jira.script.listener;
  2. import java.io.FileReader;
  3. import java.io.IOException;
  4. import java.io.Reader;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Map;
  8. import javax.script.Invocable;
  9. import javax.script.ScriptEngine;
  10. import javax.script.ScriptEngineFactory;
  11. import javax.script.ScriptEngineManager;
  12. import javax.script.ScriptException;
  13. import org.apache.commons.io.FilenameUtils;
  14. import org.apache.commons.io.IOUtils;
  15. import org.apache.log4j.Category;
  16. import com.atlassian.jira.event.AbstractEvent;
  17. import com.atlassian.jira.event.JiraListener;
  18. public abstract class ScriptListener implements JiraListener {
  19. private static final Category log = Category.getInstance(ScriptListener.class);
  20. private static final String FILE_PARAM = "FILE";
  21. private static final String ENGINE_PARAM = "ENGINE";
  22. private String inputFile;
  23. private String engineName;
  24. private ScriptEngine scriptEngine;
  25. public String[] getAcceptedParams() {
  26. return new String[] { FILE_PARAM, ENGINE_PARAM };
  27. }
  28. public String getDescription() {
  29. return null;
  30. }
  31. public void init(Map params) {
  32. inputFile = (String) params.get(FILE_PARAM);
  33. engineName = (String) params.get(ENGINE_PARAM);
  34. // Validates "inputFile" property
  35. if (inputFile == null || "".equals(inputFile)) {
  36. log.error("Skip running listener because input file is NULL!");
  37. scriptEngine = null;
  38. }
  39. ScriptEngineManager manager = new ScriptEngineManager();
  40. if (engineName == null) {
  41. String extension = FilenameUtils.getExtension(inputFile);
  42. if (extension != null && extension.length() > 1) {
  43. scriptEngine = manager.getEngineByExtension(extension.substring(1));
  44. engineName = (String) scriptEngine.get(ScriptEngine.ENGINE);
  45. }
  46. }
  47. }
  48. public boolean isInternal() {
  49. return false;
  50. }
  51. public boolean isUnique() {
  52. return false;
  53. }
  54. public void run(String eventName, AbstractEvent event) {
  55. log.info("start [script=" + inputFile + "; engine=" + engineName + "]");
  56. // Validates "engineName" property
  57. if (engineName == null || "".equals(engineName)) {
  58. log.error("Engine name can't be NULL!");
  59. return;
  60. }
  61. // Validates "inputFile" property
  62. if (inputFile == null || "".equals(inputFile)) {
  63. log.error("Input file can't be NULL!");
  64. return;
  65. }
  66. // Loads the engine
  67. ScriptEngineManager manager = new ScriptEngineManager();
  68. List factories = manager.getEngineFactories();
  69. if (factories == null || factories.size() == 0) {
  70. log.error("No engines found! Is JSR-233 supported?");
  71. }
  72. ScriptEngine engine = null;
  73. for (Iterator iterator = factories.iterator(); iterator.hasNext();) {
  74. ScriptEngineFactory factory = (ScriptEngineFactory) iterator.next();
  75. if (engineName.equals(factory.getEngineName())) {
  76. engine = factory.getScriptEngine();
  77. break;
  78. }
  79. }
  80. if (engine == null) {
  81. log.error("No script engine found associate with the name " + engineName + ".");
  82. }
  83. Reader reader = null;
  84. try {
  85. reader = new FileReader(inputFile);
  86. engine.eval(reader);
  87. engine.put("log", log);
  88. Invocable invocable = (Invocable) engine;
  89. invocable.invokeFunction(eventName, new Object[] { event });
  90. } catch (ScriptException e) {
  91. log.error("Error evaluating script.", e);
  92. } catch (NoSuchMethodException e) {
  93. log.error("The method " + eventName + " was not found.", e);
  94. } catch (IOException e) {
  95. log.error("Error loading file.", e);
  96. } finally {
  97. IOUtils.closeQuietly(reader);
  98. }
  99. log.info("end [script=" + inputFile + "; engine=" + engineName + "]");
  100. }
  101. }