1 6 package org.jfox.deployment; 7 8 import java.io.File ; 9 import java.io.FileFilter ; 10 import java.util.HashMap ; 11 import java.util.Iterator ; 12 import java.util.Map ; 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 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 moniteDirectory = System.getProperty("JFOXCO_HOME", ".") 44 + File.separator + "deploy"; 45 46 private static String deploymentDir = System 47 .getProperty("JFOXCO_HOME", ".") 48 + File.separator + "temp"; 49 50 private Map deployed = new HashMap (); 52 53 private Map deployedModules = new HashMap (); 55 56 private static FileFilter filter = FileFilters 57 .suffixFileFilter(new String [] { ".jar", ".war", ".ear" }); 58 59 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 [] getDeployedJars() { 79 return (File []) deployed.values().toArray(new File [deployed.size()]); 80 } 81 82 public void run() { 83 File monitorDir = new File (moniteDirectory); 84 while (isStarted()) { 85 if (!pause && monitorDir.exists() && monitorDir.isDirectory()) { 86 87 Map newJars = new HashMap (); 88 File [] jarFiles = monitorDir.listFiles(filter); 90 for (int j = 0; j < jarFiles.length; j++) { 91 File jar = jarFiles[j]; 92 try { 93 newJars.put(jar, new Long (jar.lastModified())); 95 _deploy(jar); 96 } 97 catch (Exception e) { 98 logger.warn(e.getMessage(), e); 99 } 100 } 101 102 for (Iterator it = deployed.keySet().iterator(); it.hasNext();) { 104 File file = (File ) 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 e) { 121 logger.warn(e.getMessage(), e); 123 } 124 } 125 126 } 127 128 134 public void deploy(File jar) throws DeployException { 135 pause = true; 136 try { 137 for (Iterator it = deployed.keySet().iterator(); it.hasNext();) { 138 File deployedJar = (File ) it.next(); 139 if (deployedJar.getName().equalsIgnoreCase(jar.getName())) { 140 String 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 try { 150 Files.copy(jar, new File (moniteDirectory)); 151 } 152 catch(Exception e){ 153 throw new DeployException("copy jar " + jar + " to deploy directory error", e); 154 } 155 File newJar = new File (moniteDirectory,jar.getName()); 156 _deploy(newJar); 157 158 } 159 finally { 160 pause = false; 161 } 162 } 163 164 169 private void _deploy(File jar) throws DeployException { 170 if (isToBeDeploy(jar)) { Deployer deployer = getDeployer(jar); 172 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 { 189 Thread deployMonitor = new Thread (this, this.getClass().getName()); 190 deployMonitor.setPriority(Thread.MIN_PRIORITY); 191 deployMonitor.start(); 192 } 193 194 protected void doStop() throws Exception { 195 196 } 197 198 private boolean isToBeDeploy(File jar) { 199 if (!deployed.containsKey(jar)) { return true; 201 } 202 else { 203 long lastModify = ((Long ) deployed.get(jar)).longValue(); 204 if (jar.lastModified() > lastModify) { return true; 206 } 207 else { 208 return false; 209 } 210 } 211 } 212 213 protected void doInit() throws Exception { 214 215 } 216 217 protected void doDestroy() throws Exception { 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 getDeploymentDir() { 228 return deploymentDir; 229 } 230 231 private Deployer getDeployer(File 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 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 [] args) { 259 260 } 261 } | Popular Tags |