You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2022/10/07 08:38:31 UTC

[karaf] branch karaf-4.3.x updated: [KARAF-7551] Add noAutoRefreshBundles support on KAR service

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é <jb...@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());
         }