package org.rhq.plugins.apache; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.pluginapi.plugin.PluginContext; import org.rhq.core.pluginapi.plugin.PluginLifecycleListener; public class ApachePluginLifecycleListener implements PluginLifecycleListener { private static final Log log = LogFactory.getLog(ApachePluginLifecycleListener.class); private static final String LENS_NAME = "httpd.aug"; protected String dataPath; public void initialize(PluginContext context) throws Exception { try { File tempDirectory = context.getDataDirectory(); if (!tempDirectory.exists()) { if (!tempDirectory.mkdir()) { log.error("Failed to create a temporary folder for augeas lens."); } } //we need to have the path to temp directory because we need to delete these files in the end //and shutdown has not param PluginContext dataPath = tempDirectory.getAbsolutePath(); copyTheLens(dataPath); } catch (Exception e) { log.error("Copy of augeas lens to temporary folder failed.", e); } } public void shutdown() { File tempDirectory = new File(dataPath); File[] files = tempDirectory.listFiles(); for (File file : files) { if (file.getName().matches(".*.aug")) { if (!file.delete()) { log.error("Failed to delete augeas lens: " + file.getAbsolutePath()); } } } } public void copyFile(InputStream in, File destination) throws Exception { if (!destination.canWrite()) { throw new Exception("Creating of temporary file for lens failed. Destination file " + destination.getAbsolutePath() + " is not accessible."); } OutputStream out = new FileOutputStream(destination); try { byte[] buf = new byte[1024]; int length; while ((length = in.read(buf)) > 0) { out.write(buf, 0, length); } } finally { out.close(); } } public void copyTheLens(String tempDirectory) throws Exception { URL url = this.getClass().getClassLoader().getResource(LENS_NAME); String tempFile = url.getFile(); File file = new File(tempFile); String modName = Character.toLowerCase(file.getName().charAt(0)) + file.getName().substring(1); File destinationFile = new File(tempDirectory, modName); if (!destinationFile.exists()) { if (destinationFile.createNewFile()) { InputStream input = this.getClass().getClassLoader().getResourceAsStream(LENS_NAME); try { copyFile(input, destinationFile); } finally { input.close(); } } } } }