1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 package org.seasar.groovy;
48
49 import groovy.lang.GroovyShell;
50
51 import org.codehaus.groovy.control.CompilationFailedException;
52
53 import org.seasar.framework.container.S2Container;
54 import org.seasar.framework.container.factory.S2ContainerBuilder;
55 import org.seasar.framework.util.ResourceUtil;
56
57 import java.io.IOException;
58 import java.io.InputStream;
59
60
61 /***
62 * Groovyスクリプトを読みこんでS2Containerを作成するファクトリークラス。
63 * 読みこまれるGroovyスクリプトは、スクリプト内でS2Containerを作成し、 returnする必要がある。
64 *
65 * @author takai
66 */
67 public class S2ContainerGroovyFactory
68 implements S2ContainerBuilder
69 {
70 protected S2ContainerGroovyFactory() {
71 }
72
73 /***
74 * GroovyスクリプトからS2Containerを作成する。
75 *
76 * @param path 読みこむGroovyスクリプトのパス
77 *
78 * @return Groovyスクリプトによって作成されたS2Container
79 *
80 * @throws SeasarBuilderException Groovyスクリプトにエラーがあった場合に発生する
81 */
82 public static S2Container create(String path)
83 throws SeasarBuilderException
84 {
85 return new S2ContainerGroovyFactory().build(path);
86 }
87
88 /***
89 * @see org.seasar.framework.container.factory.S2ContainerBuilder#build(java.lang.String)
90 */
91 public S2Container build(String path)
92 throws SeasarBuilderException
93 {
94 S2Container container = null;
95
96 try {
97 InputStream stream = ResourceUtil.getResourceAsStream(path);
98 GroovyShell shell = new GroovyShell();
99 container = (S2Container) shell.evaluate(stream, path);
100
101 if (container == null) {
102 throw new SeasarBuilderException("The return value is null or not returning.");
103 }
104
105 if (!(container instanceof S2Container)) {
106 throw new SeasarBuilderException("The return value is not instance of S2Container");
107 }
108 } catch (CompilationFailedException e) {
109 throw new SeasarBuilderException(e);
110 } catch (IOException e) {
111 throw new SeasarBuilderException(e);
112 } catch (RuntimeException e) {
113 throw new SeasarBuilderException(e);
114 } catch (NoClassDefFoundError e) {
115 throw new SeasarBuilderException(e);
116 }
117
118 return container;
119 }
120
121 /***
122 * @see org.seasar.framework.container.factory.S2ContainerBuilder#build(java.lang.String,
123 * java.lang.ClassLoader)
124 */
125 public S2Container build(String path, ClassLoader classLoader)
126 throws SeasarBuilderException
127 {
128 S2Container container = null;
129 ClassLoader old = Thread.currentThread().getContextClassLoader();
130
131 try {
132 if (classLoader != null) {
133 Thread.currentThread().setContextClassLoader(classLoader);
134 }
135
136 container = build(path);
137 } finally {
138 Thread.currentThread().setContextClassLoader(old);
139 }
140
141 return container;
142 }
143
144
145
146
147
148
149 public S2Container include(S2Container parent, String path) {
150 S2Container container = build(path);
151 parent.include(container);
152
153 return parent;
154 }
155 }