KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jfox > deployment > J2EEDeployMonitor


1 /* JFox, the OpenSource J2EE Application Server
2  *
3  * Distributable under GNU LGPL license by gun.org
4  * more details please visit http://www.huihoo.org/jfox
5  */

6 package org.jfox.deployment;
7
8 import java.io.File JavaDoc;
9 import java.io.FileFilter JavaDoc;
10 import java.util.HashMap JavaDoc;
11 import java.util.Iterator JavaDoc;
12 import java.util.Map JavaDoc;
13
14 import org.jfox.deployment.application.EARDeployer;
15 import org.jfox.deployment.application.EARModule;
16 import org.jfox.deployment.ejb.EJBDeployer;
17 import org.jfox.deployment.ejb.EJBModule;
18 import org.jfox.deployment.web.WebDeployer;
19 import org.jfox.deployment.web.WebModule;
20 import org.jfox.ioc.ComponentContext;
21 import org.jfox.ioc.common.AbstractService;
22 import org.jfox.ioc.deploy.DeployException;
23 import org.jfox.ioc.deployment.Deployable;
24 import org.jfox.ioc.deployment.Deployer;
25 import org.jfox.ioc.ext.ActiveComponent;
26 import org.jfox.ioc.util.FileFilters;
27 import org.jfox.ioc.util.Files;
28
29 /**
30  * @author <a HREF="mailto:young_yy@hotmail.com">Young Yang</a>
31  */

32
33 public class J2EEDeployMonitor extends AbstractService implements
34         ActiveComponent {
35     private long sleepTime = 1000L;
36
37     private EARDeployer earDeployer;
38
39     private EJBDeployer ejbDeployer;
40
41     private WebDeployer webDeployer;
42
43     private String JavaDoc moniteDirectory = System.getProperty("JFOXCO_HOME", ".")
44             + File.separator + "deploy";
45
46     private static String JavaDoc deploymentDir = System
47             .getProperty("JFOXCO_HOME", ".")
48             + File.separator + "temp";
49
50     // file => last modify
51
private Map JavaDoc deployed = new HashMap JavaDoc();
52
53     // file => modules
54
private Map JavaDoc deployedModules = new HashMap JavaDoc();
55
56     private static FileFilter JavaDoc filter = FileFilters
57             .suffixFileFilter(new String JavaDoc[] { ".jar", ".war", ".ear" });
58
59     /**
60      * 在通过外部调用发布时,暂停自动发布监视
61      */

62     private boolean pause = false;
63
64     public J2EEDeployMonitor(EARDeployer earDeployer) {
65         this.earDeployer = earDeployer;
66         this.ejbDeployer = earDeployer.getEjbDeployer();
67         this.webDeployer = earDeployer.getWebDeployer();
68     }
69
70     public void setSleepTime(long time) {
71         this.sleepTime = time;
72     }
73
74     public long getSleepTime() {
75         return sleepTime;
76     }
77
78     public File JavaDoc[] getDeployedJars() {
79         return (File JavaDoc[]) deployed.values().toArray(new File JavaDoc[deployed.size()]);
80     }
81
82     public void run() {
83         File JavaDoc monitorDir = new File JavaDoc(moniteDirectory);
84         while (isStarted()) {
85             if (!pause && monitorDir.exists() && monitorDir.isDirectory()) {
86
87                 Map JavaDoc newJars = new HashMap JavaDoc();
88                 // 取得目录下所有的 .jar 文件
89
File JavaDoc[] jarFiles = monitorDir.listFiles(filter);
90                 for (int j = 0; j < jarFiles.length; j++) {
91                     File JavaDoc jar = jarFiles[j];
92                     try {
93                         // TODO: 把这里单独作为一个 deploy(File jar) 方法,并可以给外部调用
94
newJars.put(jar, new Long JavaDoc(jar.lastModified()));
95                         _deploy(jar);
96                     }
97                     catch (Exception JavaDoc e) {
98                         logger.warn(e.getMessage(), e);
99                     }
100                 }
101
102                 // jars 里面剩下的是已经删除的jar, undeploy 它们
103
for (Iterator JavaDoc it = deployed.keySet().iterator(); it.hasNext();) {
104                     File JavaDoc file = (File JavaDoc) it.next();
105                     Deployable module = (Deployable) deployedModules.get(file);
106                     Deployer deployer = getDeployer(file);
107                     try {
108                         deployer.undeploy(module);
109                         deployedModules.remove(file);
110                     }
111                     catch (DeployException e) {
112                         logger.warn("undeploy module " + module + " error", e);
113                     }
114                 }
115                 deployed = newJars;
116             }
117             try {
118                 Thread.sleep(sleepTime);
119             }
120             catch (InterruptedException JavaDoc e) {
121                 // e.printStackTrace();
122
logger.warn(e.getMessage(), e);
123             }
124         }
125
126     }
127
128     /**
129      * 外部调用该方法来发布 JAR WAR EAR
130      * 该文件所处的目录应该不在 deploy 目录下,发布时会自动将该文件拷贝志 deploy 目录下
131      * @param jar
132      * @throws DeployException
133      */

134     public void deploy(File JavaDoc jar) throws DeployException {
135         pause = true;
136         try {
137             for (Iterator JavaDoc it = deployed.keySet().iterator(); it.hasNext();) {
138                 File JavaDoc deployedJar = (File JavaDoc) it.next();
139                 if (deployedJar.getName().equalsIgnoreCase(jar.getName())) {
140                     String JavaDoc msg = "File "
141                             + jar.getName()
142                             + " has been deployed, please undeploy it first or rename the file and redeploy.";
143                     logger.warn(msg);
144                     throw new DeployException(msg);
145                 }
146             }
147             
148             //将要发布的文件拷贝到 deploy 目录下
149
try {
150                 Files.copy(jar, new File JavaDoc(moniteDirectory));
151             }
152             catch(Exception JavaDoc e){
153                 throw new DeployException("copy jar " + jar + " to deploy directory error", e);
154             }
155             File JavaDoc newJar = new File JavaDoc(moniteDirectory,jar.getName());
156             _deploy(newJar);
157
158         }
159         finally {
160             pause = false;
161         }
162     }
163
164     /**
165      * 用于自动检测的到的jar文件的发布,不需要判断该jar包是否已经发布
166      *
167      * @param jar
168      */

169     private void _deploy(File JavaDoc jar) throws DeployException {
170         if (isToBeDeploy(jar)) { // 要发布
171
Deployer deployer = getDeployer(jar);
172             // 说明该模块已经发布,是更新,应该先 undeploy
173
if (deployed.containsKey(jar)) {
174                 Deployable module = (Deployable) deployedModules.get(jar);
175                 deployer.undeploy(module);
176             }
177
178             logger.info("deploy module " + jar.getName() + " ...");
179             Deployable module = buildModule(jar);
180             deployer.deploy(module);
181             deployedModules.put(jar, module);
182             logger.info("deploy module " + jar.getName() + " over.");
183         }
184         deployed.remove(jar);
185
186     }
187
188     protected void doStart() throws Exception JavaDoc {
189         Thread JavaDoc deployMonitor = new Thread JavaDoc(this, this.getClass().getName());
190         deployMonitor.setPriority(Thread.MIN_PRIORITY);
191         deployMonitor.start();
192     }
193
194     protected void doStop() throws Exception JavaDoc {
195
196     }
197
198     private boolean isToBeDeploy(File JavaDoc jar) {
199         if (!deployed.containsKey(jar)) { // 新增的 jar
200
return true;
201         }
202         else {
203             long lastModify = ((Long JavaDoc) deployed.get(jar)).longValue();
204             if (jar.lastModified() > lastModify) { // 修改的 jar
205
return true;
206             }
207             else {
208                 return false;
209             }
210         }
211     }
212
213     protected void doInit() throws Exception JavaDoc {
214
215     }
216
217     protected void doDestroy() throws Exception JavaDoc {
218
219     }
220
221     public void setComponentContext(ComponentContext ctx) {
222         super.setComponentContext(ctx);
223         moniteDirectory = ctx.getModuleDir() + File.separator + "apps";
224         deploymentDir = ctx.getModuleDir() + File.separator + "temp";
225     }
226
227     public static String JavaDoc getDeploymentDir() {
228         return deploymentDir;
229     }
230
231     private Deployer getDeployer(File JavaDoc jar) {
232         if (jar.getName().endsWith(".ear")) {
233             return earDeployer;
234         }
235         else if (jar.getName().endsWith(".war")) {
236             return webDeployer;
237         }
238         else if (jar.getName().endsWith(".jar")) {
239             return ejbDeployer;
240         }
241         return null;
242     }
243
244     private Deployable buildModule(File JavaDoc jar) throws DeployException {
245         if (jar.getName().endsWith(".ear")) {
246             return new EARModule(jar);
247         }
248         else if (jar.getName().endsWith(".war")) {
249             return new WebModule(jar);
250         }
251         else if (jar.getName().endsWith(".jar")) {
252             return new EJBModule(jar);
253         }
254         return null;
255
256     }
257
258     public static void main(String JavaDoc[] args) {
259
260     }
261 }
Popular Tags