/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.jmx.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.mx.util.ObjectNameFactory; import org.jboss.test.JBossTestCase; import org.jboss.test.JBossTestSetup; import org.jboss.util.file.Files; import org.jboss.util.file.JarUtils; import org.jboss.util.stream.Streams; /** * Base test for url deployment scanner * * @author adrian@jboss.org * @author dimitris@jboss.org * @version $Revision: 92490 $ */ public abstract class AbstractURLDeploymentScannerTest extends JBossTestCase { protected static ObjectName scanner = ObjectNameFactory.create("jboss.test:type=DeploymentScanner,flavor=URL"); private static URL scanDir; public AbstractURLDeploymentScannerTest(String name) { super(name); } public static Test getTestSuite(Class clazz) throws Exception { TestSuite suite = new TestSuite(); suite.addTest(new TestSuite(clazz)); JBossTestSetup setup = new JBossTestSetup(suite) { protected void setUp() throws Exception { super.setUp(); MBeanServerConnection server = getServer(); scanDir = getScanURL(); getLog().debug("Scan Directory=" + scanDir); server.invoke(scanner, "addURL", new Object[] { scanDir }, new String[] { URL.class.getName() }); } }; return getDeploySetup(setup, "jbosstest-urlscanner-service.xml"); } public void startScanner() throws Exception { getServer().invoke(scanner, "start", null, null); } public void stopScanner() throws Exception { getServer().invoke(scanner, "stop", null, null); } /** * The deployment URL of a filename, inside the scan directory */ public URL getTargetURL(String fileName) throws Exception { return new URL(scanDir, fileName); } /** * Delegate to Scanner */ public void suspendDeployment(URL url) throws Exception { getServer().invoke( scanner, "suspendDeployment", new Object[] { url }, new String[] { URL.class.getName() }); } /** * Delegate to Scanner */ public void resumeDeployment(URL url, boolean markUpToDate) throws Exception { getServer().invoke( scanner, "resumeDeployment", new Object[] { url, new Boolean(markUpToDate) }, new String[] { URL.class.getName(), boolean.class.getName() }); } public void hotDeploy(String fileName) throws Exception { hotDeploy(fileName, 2000); } public void hotDeploy(String fileName, long wait) throws Exception { URL url = getDeployURL(fileName); URL destURL = getTargetURL(fileName); copy(url, new File(destURL.getFile())); // TODO something better than a sleep if (wait > 0) Thread.sleep(wait); } public void hotUndeploy(String fileName) throws Exception { hotUndeploy(fileName, 2000); } public void hotUndeploy(String fileName, long wait) throws Exception { URL destURL = new URL(scanDir, fileName); delete(new File(destURL.getFile())); // TODO something better than a sleep if (wait > 0) Thread.sleep(wait); } protected void copy(URL src, File dest) throws IOException { log.debug("Copying " + src + " -> " + dest); // Validate that the dest parent directory structure exists File dir = dest.getParentFile(); if (!dir.exists()) { boolean created = dir.mkdirs(); if( created == false ) throw new IOException("mkdirs failed for: "+dir.getAbsolutePath()); } // Remove any existing dest content if( dest.exists() == true ) { boolean deleted = Files.delete(dest); if( deleted == false ) throw new IOException("delete of previous content failed for: "+dest.getAbsolutePath()); } if (src.getProtocol().equals("file")) { File srcFile = new File(src.getFile()); if (srcFile.isDirectory()) { log.debug("Making zip copy of: " + srcFile); // make a jar archive of the directory OutputStream out = new BufferedOutputStream(new FileOutputStream(dest)); JarUtils.jar(out, srcFile.listFiles()); out.close(); return; } } InputStream in = new BufferedInputStream(src.openStream()); OutputStream out = new BufferedOutputStream(new FileOutputStream(dest)); Streams.copy(in, out); out.flush(); out.close(); in.close(); } protected void delete(File dest) throws IOException { log.debug("Deleting " + dest); // Remove any existing dest content if( dest.exists() == true ) { boolean deleted = Files.delete(dest); int tries = 0; int wait=100; while (!deleted && tries++ < 10) { try { Thread.sleep(wait<<=1); } catch(Exception e) { } deleted = Files.delete(dest); } if (!deleted) throw new IOException("delete of previous content failed for: "+dest.getAbsolutePath()); } } private static URL getScanURL() throws Exception { String deployDir = System.getProperty("jbosstest.deploy.dir"); if (deployDir == null) deployDir = "../lib"; File file = new File(deployDir); File scanDir = new File(file, "urlscannertest"); URL url = scanDir.toURL(); return url; } }