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());
}