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 2020/10/05 13:12:40 UTC
[karaf] branch master updated: Clean logic is now in Main instead
of scripts
This is an automated email from the ASF dual-hosted git repository.
jbonofre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/karaf.git
The following commit(s) were added to refs/heads/master by this push:
new aa87030 Clean logic is now in Main instead of scripts
new ad49da1 Merge pull request #1214 from jbonofre/CLEAN_IN_MAIN
aa87030 is described below
commit aa870306c5bca0f1dd84bf20199fa00d63443c0c
Author: jbonofre <jb...@apache.org>
AuthorDate: Mon Oct 5 07:26:30 2020 +0200
Clean logic is now in Main instead of scripts
---
.../main/filtered-resources/resources/bin/karaf | 4 -
.../filtered-resources/resources/bin/karaf.bat | 6 --
main/src/main/java/org/apache/karaf/main/Main.java | 34 +++++++-
.../test/java/org/apache/karaf/main/MainTest.java | 92 ++++++++++++++++++++++
4 files changed, 122 insertions(+), 14 deletions(-)
diff --git a/assemblies/features/base/src/main/filtered-resources/resources/bin/karaf b/assemblies/features/base/src/main/filtered-resources/resources/bin/karaf
index 9b3b791..7d4d148 100644
--- a/assemblies/features/base/src/main/filtered-resources/resources/bin/karaf
+++ b/assemblies/features/base/src/main/filtered-resources/resources/bin/karaf
@@ -202,10 +202,6 @@ run() {
nodebug=false
while [ "${1}" != "" ]; do
case "${1}" in
- 'clean')
- rm -rf "${KARAF_DATA:?}"
- shift
- ;;
'debug')
debug=true
shift
diff --git a/assemblies/features/base/src/main/filtered-resources/resources/bin/karaf.bat b/assemblies/features/base/src/main/filtered-resources/resources/bin/karaf.bat
index 77b51fd..5fdda71 100644
--- a/assemblies/features/base/src/main/filtered-resources/resources/bin/karaf.bat
+++ b/assemblies/features/base/src/main/filtered-resources/resources/bin/karaf.bat
@@ -338,7 +338,6 @@ if "%KARAF_PROFILER%" == "" goto :RUN
if "%1" == "run" goto :EXECUTE_RUN
if "%1" == "daemon" goto :EXECUTE_DAEMON
if "%1" == "client" goto :EXECUTE_CLIENT
- if "%1" == "clean" goto :EXECUTE_CLEAN
if "%1" == "debug" goto :EXECUTE_DEBUG
if "%1" == "debugs" goto :EXECUTE_DEBUGS
goto :EXECUTE
@@ -386,11 +385,6 @@ if "%KARAF_PROFILER%" == "" goto :RUN
shift
goto :RUN_LOOP
-:EXECUTE_CLEAN
- pushd "%KARAF_DATA%" && (rmdir /S /Q "%KARAF_DATA%" 2>nul & popd)
- shift
- goto :RUN_LOOP
-
:EXECUTE_DEBUG
if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS%
set JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%
diff --git a/main/src/main/java/org/apache/karaf/main/Main.java b/main/src/main/java/org/apache/karaf/main/Main.java
index d9ee3c8..25b6166 100644
--- a/main/src/main/java/org/apache/karaf/main/Main.java
+++ b/main/src/main/java/org/apache/karaf/main/Main.java
@@ -18,10 +18,7 @@
*/
package org.apache.karaf.main;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -30,9 +27,15 @@ import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
import java.security.Provider;
import java.security.Security;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
import java.util.concurrent.TimeUnit;
@@ -232,6 +235,29 @@ public class Main {
}
public void launch() throws Exception {
+ if (Arrays.asList(args).contains("clean")) {
+ // clean instance
+ final Path dataDir = new File(System.getProperty(ConfigProperties.PROP_KARAF_DATA)).toPath();
+ if (Files.exists(dataDir)) {
+ try {
+ Files.walkFileTree(dataDir, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attributes) throws IOException {
+ Files.delete(file);
+ return super.visitFile(file, attributes);
+ }
+ @Override
+ public FileVisitResult postVisitDirectory(final Path dir, final IOException exception) throws IOException {
+ Files.delete(dir);
+ return super.postVisitDirectory(dir, exception);
+ }
+ });
+ } catch (final IOException ioException) {
+ LOG.log(Level.WARNING, "Can't delete " + dataDir + " (" + ioException.getMessage() + ")", ioException);
+ }
+ Files.createDirectories(dataDir.resolve("tmp"));
+ }
+ }
if (config == null) {
config = new ConfigProperties();
}
diff --git a/main/src/test/java/org/apache/karaf/main/MainTest.java b/main/src/test/java/org/apache/karaf/main/MainTest.java
new file mode 100644
index 0000000..e8b76d5
--- /dev/null
+++ b/main/src/test/java/org/apache/karaf/main/MainTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.main;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collection;
+
+import static java.util.Arrays.asList;
+import static org.apache.karaf.main.ConfigProperties.PROP_KARAF_BASE;
+import static org.apache.karaf.main.ConfigProperties.PROP_KARAF_HOME;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class MainTest {
+ @Rule
+ public final TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ /**
+ * Ensures "clean" arg is supported by karaf main.
+ *
+ * Impl note: since it is the first part of the main we just call launch but skip the execution thanks to ConfigProperties hack.
+ */
+ @Test
+ public void ensureDataCanBeDelete() throws Exception {
+ final Path data = temporaryFolder.getRoot().toPath().resolve("data");
+ final Path child = data.resolve("child1").resolve("child2");
+ Files.createDirectories(child);
+ final Path foo = child.resolve("foo.txt");
+ Files.write(foo, new byte[0]);
+
+ // here foo exists
+ assertTrue(Files.exists(foo));
+
+ final Main main = new Main(new String[]{"clean"});
+ assertTrue(Files.exists(foo));
+
+ final Path base = new File(getClass().getClassLoader().getResource("foo").getPath()).toPath().getParent().resolve("test-karaf-home");
+ final Collection<String> props = asList(PROP_KARAF_HOME, PROP_KARAF_BASE);
+ System.setProperty("org.osgi.framework.startlevel.beginning", "0");
+ System.setProperty("karaf.framework", "test");
+ System.setProperty("karaf.framework.test", "test");
+ System.setProperty("karaf.data", data.toString());
+ props.forEach(k -> System.setProperty(k, base.normalize().toAbsolutePath().toString()));
+ main.setConfig(new ConfigProperties() { // just to test clean phase, not the rest
+ @Override
+ public void performInit() throws Exception {
+ throw new EagerExit();
+ }
+ });
+ try {
+ main.launch();
+ fail();
+ } catch (final EagerExit ee) {
+ // expected
+ } finally {
+ props.forEach(System::clearProperty);
+ System.clearProperty("org.osgi.framework.startlevel.beginning");
+ System.clearProperty("karaf.data");
+ System.clearProperty("karaf.framework");
+ System.clearProperty("karaf.framework.test");
+ }
+ assertFalse(Files.exists(foo));
+ assertFalse(Files.exists(child));
+ assertTrue(Files.exists(data.resolve("tmp")));
+ }
+
+ public static class EagerExit extends Exception {}
+
+}
\ No newline at end of file