This is an automated email from the ASF dual-hosted git repository. jbonofre pushed a commit to branch karaf-4.3.x in repository https://gitbox.apache.org/repos/asf/karaf.git
The following commit(s) were added to refs/heads/karaf-4.3.x by this push: new 7a7949623d [KARAF-7551] Add noAutoRefreshBundles support on KAR service 7a7949623d is described below commit 7a7949623dce6edb235cf5b754f7b81f48055449 Author: Jean-Baptiste Onofré <jbono...@apache.org> AuthorDate: Thu Oct 6 14:51:49 2022 +0200 [KARAF-7551] Add noAutoRefreshBundles support on KAR service (cherry picked from commit d64b000bb377e2691d5a3c34de0ca58de64ed6b4) --- .../main/java/org/apache/karaf/kar/KarService.java | 31 ++++++++++++ .../main/java/org/apache/karaf/kar/KarsMBean.java | 19 ++++++++ .../karaf/kar/command/InstallKarCommand.java | 5 +- .../karaf/kar/command/UninstallKarCommand.java | 10 ++-- .../apache/karaf/kar/internal/KarServiceImpl.java | 56 ++++++++++++++-------- .../apache/karaf/kar/internal/KarsMBeanImpl.java | 17 ++++++- 6 files changed, 109 insertions(+), 29 deletions(-) diff --git a/kar/src/main/java/org/apache/karaf/kar/KarService.java b/kar/src/main/java/org/apache/karaf/kar/KarService.java index 219f9effda..8700cf9a63 100644 --- a/kar/src/main/java/org/apache/karaf/kar/KarService.java +++ b/kar/src/main/java/org/apache/karaf/kar/KarService.java @@ -46,6 +46,16 @@ public interface KarService { * @throws Exception in case of installation failure */ void install(URI karUri, boolean noAutoStartBundles) throws Exception; + + /** + * Install KAR from a given URI + * + * @param karUri URI of the kar to install + * @param noAutoStartBundles true to not start automatically the bundles, false else + * @param noAutoRefreshBundles true to not refresh automatically the bundles, false else + * @throws Exception in case of installation failure + */ + void install(URI karUri, boolean noAutoStartBundles, boolean noAutoRefreshBundles) throws Exception; /** * Install a kar with manually given repository and @@ -69,6 +79,18 @@ public interface KarService { */ void install(URI karUri, File repoDir, File resourceDir, boolean noAutoStartBundles) throws Exception; + /** + * Install a kar with manually given repository and resource directories. + * + * @param karUri Uri of the kar to be installed. + * @param repoDir destination for the repository contents of the kar + * @param resourceDir destination for the resource contents of the kar + * @param noAutoStartBundles true to not start automatically the bundles, false else + * @param noAutoRefreshBundles true to not refresh automatically the bundles, false else + * @throws Exception in case of installation failure + */ + void install(URI karUri, File repoDir, File resourceDir, boolean noAutoStartBundles, boolean noAutoRefreshBundles) throws Exception; + /** * Uninstall the given KAR * @@ -77,6 +99,15 @@ public interface KarService { */ void uninstall(String name) throws Exception; + /** + * Uninstall the given KAR + * + * @param name the name of the KAR + * @param noAutoRefreshBundles true to not automatically refresh bundles, false else. + * @throws Exception in case of failure + */ + void uninstall(String name, boolean noAutoRefreshBundles) throws Exception; + /** * List the KAR stored in the data folder. * diff --git a/kar/src/main/java/org/apache/karaf/kar/KarsMBean.java b/kar/src/main/java/org/apache/karaf/kar/KarsMBean.java index 3a5d31ea0d..3a82598fcf 100644 --- a/kar/src/main/java/org/apache/karaf/kar/KarsMBean.java +++ b/kar/src/main/java/org/apache/karaf/kar/KarsMBean.java @@ -54,6 +54,16 @@ public interface KarsMBean { */ void install(String url, boolean noAutoStartBundles) throws MBeanException; + /** + * Install a KAR file from a given URL. + * + * @param url the KAR URL. + * @param noAutoStartBundles true to not automatically start the bundles, false else. + * @param noAutoRefreshBundles true to not automatically refresh the bundles, false else. + * @throws MBeanException in case of installation failure. + */ + void install(String url, boolean noAutoStartBundles, boolean noAutoRefreshBundles) throws MBeanException; + /** * Uninstall a KAR file. * @@ -62,4 +72,13 @@ public interface KarsMBean { */ void uninstall(String name) throws MBeanException; + /** + * Uninstall a KAR file. + * + * @param name the name of the KAR file. + * @param noAutoRefreshBundles true to not automatically refresh bundles, false else. + * @throws MBeanException in case of uninstall failure. + */ + void uninstall(String name, boolean noAutoRefreshBundles) throws MBeanException; + } diff --git a/kar/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java b/kar/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java index 63acca3810..89a81df134 100644 --- a/kar/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java +++ b/kar/src/main/java/org/apache/karaf/kar/command/InstallKarCommand.java @@ -39,11 +39,14 @@ public class InstallKarCommand implements Action { @Option(name = "--no-start", description = "Do not start the bundles automatically", required = false, multiValued = false) private boolean noAutoStartBundle = false; + @Option(name = "--no-refresh", description = "Do not refresh the bundles automatically", required = false, multiValued = false) + private boolean noAutoRefreshBundle = false; + @Reference private KarService karService; public Object execute() throws Exception { - karService.install(new URI(url), noAutoStartBundle); + karService.install(new URI(url), noAutoStartBundle, noAutoRefreshBundle); return null; } diff --git a/kar/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java b/kar/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java index 506bdb3d47..8dc7dbcb1d 100644 --- a/kar/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java +++ b/kar/src/main/java/org/apache/karaf/kar/command/UninstallKarCommand.java @@ -18,10 +18,7 @@ package org.apache.karaf.kar.command; import org.apache.karaf.kar.KarService; import org.apache.karaf.kar.command.completers.KarCompleter; -import org.apache.karaf.shell.api.action.Action; -import org.apache.karaf.shell.api.action.Argument; -import org.apache.karaf.shell.api.action.Command; -import org.apache.karaf.shell.api.action.Completion; +import org.apache.karaf.shell.api.action.*; import org.apache.karaf.shell.api.action.lifecycle.Reference; import org.apache.karaf.shell.api.action.lifecycle.Service; @@ -33,12 +30,15 @@ public class UninstallKarCommand implements Action { @Completion(KarCompleter.class) private String name; + @Option(name = "--no-refresh", description = "Do not refresh the bundles automatically", required = false, multiValued = false) + private boolean noAutoRefreshBundle = false; + @Reference private KarService karService; @Override public Object execute() throws Exception { - karService.uninstall(name); + karService.uninstall(name, noAutoRefreshBundle); return null; } diff --git a/kar/src/main/java/org/apache/karaf/kar/internal/KarServiceImpl.java b/kar/src/main/java/org/apache/karaf/kar/internal/KarServiceImpl.java index 0f5e544616..16dc3b81d5 100644 --- a/kar/src/main/java/org/apache/karaf/kar/internal/KarServiceImpl.java +++ b/kar/src/main/java/org/apache/karaf/kar/internal/KarServiceImpl.java @@ -89,19 +89,29 @@ public class KarServiceImpl implements KarService { @Override public void install(URI karUri, boolean noAutoStartBundles) throws Exception { + install(karUri, noAutoStartBundles, false); + } + + @Override + public void install(URI karUri, boolean noAutoStartBundles, boolean noAutoRefreshBundles) throws Exception { String karName = new Kar(karUri).getKarName(); LOGGER.debug("Installing KAR {} from {}", karName, karUri); File karDir = new File(storage, karName); - install(karUri, karDir, base, noAutoStartBundles); + install(karUri, karDir, base, noAutoStartBundles, noAutoRefreshBundles); } @Override public void install(URI karUri, File repoDir, File resourceDir) throws Exception { install(karUri, repoDir, resourceDir, false); } - + @Override public void install(URI karUri, File repoDir, File resourceDir, boolean noAutoStartBundles) throws Exception { + install(karUri, repoDir, resourceDir, noAutoStartBundles, false); + } + + @Override + public void install(URI karUri, File repoDir, File resourceDir, boolean noAutoStartBundles, boolean noAutoRefreshBundles) throws Exception { busy.set(true); Kar kar = new Kar(karUri); try { @@ -115,13 +125,13 @@ public class KarServiceImpl implements KarService { List<URI> featureRepos = kar.getFeatureRepos(); Dependency missingDependency = findMissingDependency(featureRepos); if (missingDependency == null) { - installFeatures(featureRepos, noAutoStartBundles); + installFeatures(featureRepos, noAutoStartBundles, noAutoRefreshBundles); } else { LOGGER.warn("Feature dependency {} is not available. Kar deployment postponed to see if it is about to be deployed",missingDependency); unsatisfiedKars.add(kar); if (delayedDeployerThread == null) { - delayedDeployerThread = new DelayedDeployerThread(noAutoStartBundles); + delayedDeployerThread = new DelayedDeployerThread(noAutoStartBundles, noAutoRefreshBundles); delayedDeployerThread.start(); } } @@ -132,7 +142,7 @@ public class KarServiceImpl implements KarService { if(findMissingDependency(delayedKar.getFeatureRepos())==null) { LOGGER.info("Dependencies of kar {} are now satisfied. Installing",delayedKar.getKarName()); iterator.remove(); - installFeatures(delayedKar.getFeatureRepos(), noAutoStartBundles); + installFeatures(delayedKar.getFeatureRepos(), noAutoStartBundles, noAutoRefreshBundles); } } } @@ -231,6 +241,11 @@ public class KarServiceImpl implements KarService { @Override public void uninstall(String karName) throws Exception { + uninstall(karName, false); + } + + @Override + public void uninstall(String karName, boolean noAutoRefreshBundles) throws Exception { File karDir = new File(storage, karName); if (!karDir.exists()) { @@ -238,7 +253,7 @@ public class KarServiceImpl implements KarService { } List<URI> featuresRepositories = readFromFile(new File(karDir, FEATURE_CONFIG_FILE)); - uninstallFeatures(featuresRepositories); + uninstallFeatures(featuresRepositories, noAutoRefreshBundles); for (URI featuresRepository : featuresRepositories) { featuresService.removeRepository(featuresRepository); } @@ -280,7 +295,7 @@ public class KarServiceImpl implements KarService { * * @param featuresRepositories the list of features XML. */ - private void installFeatures(List<URI> featuresRepositories, boolean noAutoStartBundles) throws Exception { + private void installFeatures(List<URI> featuresRepositories, boolean noAutoStartBundles, boolean noAutoRefreshBundles) throws Exception { for (Repository repository : featuresService.listRepositories()) { for (URI karFeatureRepoUri : featuresRepositories) { if (repository.getURI().equals(karFeatureRepoUri)) { @@ -289,8 +304,8 @@ public class KarServiceImpl implements KarService { if (feature.getInstall() == null || Feature.DEFAULT_INSTALL_MODE.equals(feature.getInstall())) { EnumSet<FeaturesService.Option> options = EnumSet.noneOf(FeaturesService.Option.class); try { - LOGGER.debug("noAutoRefreshBundles is {}", isNoAutoRefreshBundles()); - if (isNoAutoRefreshBundles()) { + LOGGER.debug("noAutoRefreshBundles is {} (default {})", noAutoRefreshBundles, this.noAutoRefreshBundles); + if (noAutoRefreshBundles || this.noAutoRefreshBundles) { options.add(FeaturesService.Option.NoAutoRefreshBundles); } LOGGER.debug("noAutoStartBundles is {} (default {})", noAutoStartBundles, this.noAutoStartBundles); @@ -453,15 +468,20 @@ public class KarServiceImpl implements KarService { * * @param featuresRepositories the list of features XML. */ - private void uninstallFeatures(List<URI> featuresRepositories) throws Exception { + private void uninstallFeatures(List<URI> featuresRepositories, boolean noAutoRefreshBundles) throws Exception { for (Repository repository : featuresService.listRepositories()) { for (URI karFeatureRepoUri : featuresRepositories) { if (repository.getURI().equals(karFeatureRepoUri)) { try { for (Feature feature : repository.getFeatures()) { if (feature.getInstall() == null || Feature.DEFAULT_INSTALL_MODE.equals(feature.getInstall())) { + EnumSet<FeaturesService.Option> options = EnumSet.noneOf(FeaturesService.Option.class); try { - featuresService.uninstallFeature(feature.getName(), feature.getVersion()); + LOGGER.debug("noAutoRefreshBundles is {} (default {})", noAutoRefreshBundles, this.noAutoRefreshBundles); + if (noAutoRefreshBundles || this.noAutoRefreshBundles) { + options.add(FeaturesService.Option.NoAutoRefreshBundles); + } + featuresService.uninstallFeature(feature.getName(), feature.getVersion(), options); } catch (Exception e) { LOGGER.warn("Unable to uninstall Kar feature {}", feature.getName() + "/" + feature.getVersion(), e); } @@ -475,18 +495,10 @@ public class KarServiceImpl implements KarService { } } - public boolean isNoAutoRefreshBundles() { - return noAutoRefreshBundles; - } - public void setNoAutoRefreshBundles(boolean noAutoRefreshBundles) { this.noAutoRefreshBundles = noAutoRefreshBundles; } - public boolean isNoAutoStartBundles() { - return noAutoStartBundles; - } - public void setNoAutoStartBundles(boolean noAutoStartBundles) { this.noAutoStartBundles = noAutoStartBundles; } @@ -494,12 +506,14 @@ public class KarServiceImpl implements KarService { private class DelayedDeployerThread extends Thread { private boolean noAutoStartBundles; + private boolean noAutoRefreshBundles; private AtomicBoolean cancel; - public DelayedDeployerThread(boolean noAutoStartBundles) { + public DelayedDeployerThread(boolean noAutoStartBundles, boolean noAutoRefreshBundles) { super("Delayed kar deployment"); cancel = new AtomicBoolean(); this.noAutoStartBundles = noAutoStartBundles; + this.noAutoRefreshBundles = noAutoRefreshBundles; } public void cancel() { @@ -526,7 +540,7 @@ public class KarServiceImpl implements KarService { Kar kar = iterator.next(); iterator.remove(); try { - installFeatures(kar.getFeatureRepos(), noAutoStartBundles); + installFeatures(kar.getFeatureRepos(), noAutoStartBundles, noAutoRefreshBundles); } catch (Exception e) { LOGGER.error("Delayed deployment of kar "+kar.getKarName()+" failed",e); } diff --git a/kar/src/main/java/org/apache/karaf/kar/internal/KarsMBeanImpl.java b/kar/src/main/java/org/apache/karaf/kar/internal/KarsMBeanImpl.java index c926acebe2..2e7d3ee04f 100644 --- a/kar/src/main/java/org/apache/karaf/kar/internal/KarsMBeanImpl.java +++ b/kar/src/main/java/org/apache/karaf/kar/internal/KarsMBeanImpl.java @@ -54,8 +54,12 @@ public class KarsMBeanImpl extends StandardMBean implements KarsMBean { @Override public void install(String url, boolean noAutoStartBundles) throws MBeanException { + install(url, noAutoStartBundles, false); + } + + public void install(String url, boolean noAutoStartBundles, boolean noAutoRefreshBundles) throws MBeanException { try { - karService.install(new URI(url), noAutoStartBundles); + karService.install(new URI(url), noAutoStartBundles, noAutoRefreshBundles); } catch (Exception e) { throw new MBeanException(null, e.toString()); } @@ -64,7 +68,16 @@ public class KarsMBeanImpl extends StandardMBean implements KarsMBean { @Override public void uninstall(String name) throws MBeanException { try { - karService.uninstall(name); + karService.uninstall(name, false); + } catch (Exception e) { + throw new MBeanException(null, e.toString()); + } + } + + @Override + public void uninstall(String name, boolean noAutoRefreshBundles) throws MBeanException { + try { + karService.uninstall(name, noAutoRefreshBundles); } catch (Exception e) { throw new MBeanException(null, e.toString()); }