Author: jbonofre Date: Wed Jun 13 11:28:42 2012 New Revision: 1349762 URL: http://svn.apache.org/viewvc?rev=1349762&view=rev Log: [KARAF-1392] Uninstall a kar now remove the features, bundles, repositories
Modified: karaf/branches/karaf-2.2.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java Modified: karaf/branches/karaf-2.2.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java URL: http://svn.apache.org/viewvc/karaf/branches/karaf-2.2.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java?rev=1349762&r1=1349761&r2=1349762&view=diff ============================================================================== --- karaf/branches/karaf-2.2.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java (original) +++ karaf/branches/karaf-2.2.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java Wed Jun 13 11:28:42 2012 @@ -81,7 +81,6 @@ public class KarArtifactInstaller implem public void install(File file) throws Exception { // Check to see if this file has already been extracted. For example, on restart of Karaf, // we don't necessarily want to re-extract all the Karaf Archives! - // if (alreadyExtracted(file)) { logger.info("Ignoring '{}'; timestamp indicates it's already been deployed.", file); return; @@ -89,7 +88,10 @@ public class KarArtifactInstaller implem logger.info("Installing KAR file {}", file); - ZipFile zipFile = new ZipFile(file); + File karFile = new File(localRepoPath, file.getName()); + copy(file.toURI(), karFile); + + ZipFile zipFile = new ZipFile(karFile); List<URI> featuresRepositoriesInKar = new ArrayList<URI>(); @@ -119,6 +121,37 @@ public class KarArtifactInstaller implem updateTimestamp(file); } + + /** + * Create a destination file using a source URL. + * + * @param url the source URL. + * @param file the destination file + * @throws Exception in case of copy failure + */ + private void copy(URI url, File file) throws Exception { + InputStream is = null; + FileOutputStream fos = null; + try { + is = url.toURL().openStream(); + fos = new FileOutputStream(file); + byte[] buffer = new byte[8192]; + int count = is.read(buffer); + while (count >= 0) { + fos.write(buffer, 0, count); + count = is.read(buffer); + } + } finally { + if (is != null) { + is.close(); + } + if (fos != null) { + fos.flush(); + fos.close(); + } + } + } + private void installFeatures(List<URI> featuresRepositories) { for (Repository repository : featuresService.listRepositories()) { for (URI karFeatureRepoUri : featuresRepositories) { @@ -139,6 +172,26 @@ public class KarArtifactInstaller implem } } + private void uninstallFeatures(List<URI> featuresRepositories) { + for (Repository repository : featuresService.listRepositories()) { + for (URI karFeatureRepoUri : featuresRepositories) { + if (repository.getURI().equals(karFeatureRepoUri)) { + try { + for (Feature feature : repository.getFeatures()) { + try { + featuresService.uninstallFeature(feature.getName(), feature.getVersion()); + } catch (Exception e) { + logger.warn("Unable to uninstall Kar feature {}", feature.getName() + "/" + feature.getVersion(), e); + } + } + } catch (Exception e) { + logger.warn("Can't get features for KAR {}", karFeatureRepoUri, e); + } + } + } + } + } + private File extract(ZipFile zipFile, ZipEntry entry, String repoEntryName, String base) throws IOException { File extract; if (entry.isDirectory()) { @@ -183,16 +236,55 @@ public class KarArtifactInstaller implem } public void uninstall(File file) throws Exception { + logger.debug("Looking for KAR entries to purge the local repository"); + File karFile = new File(localRepoPath, file.getName()); + List<URI> featuresRepositories = new ArrayList<URI>(); + ZipFile zipFile = new ZipFile(karFile); + Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + String repoEntryName = getRepoEntryName(entry); + if (repoEntryName != null) { + File toDelete = new File(localRepoPath + File.separator + repoEntryName); + if (isFeaturesRepository(toDelete)) { + featuresRepositories.add(toDelete.toURI()); + } else { + if (toDelete.isFile() && toDelete.exists()) { + toDelete.delete(); + } + } + } + if (entry.getName().startsWith("resource")) { + String resourceEntryName = entry.getName().substring("resource/".length()); + File toDelete = new File(base + File.separator + resourceEntryName); + if (toDelete.isFile() && toDelete.exists()) { + toDelete.delete(); + } + } + } + zipFile.close(); + + uninstallFeatures(featuresRepositories); + for (URI featuresRepository : featuresRepositories) { + featuresService.removeRepository(featuresRepository); + File toDelete = new File(featuresRepository); + if (toDelete.exists() && toDelete.isFile()) { + toDelete.delete(); + } + } + + karFile.delete(); + File timestamp = getArchiveTimestampFile(file); if (timestamp.exists()) { logger.debug("Removing the timestamp file"); timestamp.delete(); } - logger.warn("Karaf archive '{}' has been removed; however, its feature URLs have not been deregistered, and its bundles are still available in '{}'.", file, localRepoPath); } public void update(File file) throws Exception { logger.warn("Karaf archive '{}' has been updated; redeploying.", file); + uninstall(file); install(file); }