You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2014/03/06 09:47:14 UTC
[1/2] git commit: [KARAF-2811] Upgrade to felix utils 1.6.0
Repository: karaf
Updated Branches:
refs/heads/master 7c8b5a720 -> c4313f627
[KARAF-2811] Upgrade to felix utils 1.6.0
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/c4313f62
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/c4313f62
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/c4313f62
Branch: refs/heads/master
Commit: c4313f627ba00274a2d745a9f29550161ff9d17f
Parents: 89bbd1d
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Thu Mar 6 09:46:20 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Thu Mar 6 09:46:57 2014 +0100
----------------------------------------------------------------------
config/command/pom.xml | 3 +
instance/core/pom.xml | 1 -
.../core/internal/InstanceServiceImpl.java | 20 +-
.../org/apache/karaf/main/ConfigProperties.java | 2 +-
.../org/apache/karaf/main/InstanceHelper.java | 3 +-
.../main/java/org/apache/karaf/main/Main.java | 3 +-
.../org/apache/karaf/main/PropertiesLoader.java | 4 +-
.../apache/karaf/main/lock/DefaultJDBCLock.java | 2 +-
.../apache/karaf/main/lock/DerbyJDBCLock.java | 2 +-
.../apache/karaf/main/lock/GenericJDBCLock.java | 3 +-
.../org/apache/karaf/main/lock/LockFactory.java | 2 +-
.../apache/karaf/main/lock/MySQLJDBCLock.java | 2 +-
.../apache/karaf/main/lock/OracleJDBCLock.java | 2 +-
.../karaf/main/lock/PostgreSQLJDBCLock.java | 2 +-
.../karaf/main/lock/SQLServerJDBCLock.java | 2 +-
.../apache/karaf/main/lock/SimpleFileLock.java | 2 +-
.../karaf/main/util/BootstrapLogManager.java | 4 +-
.../java/org/apache/karaf/main/MockLock.java | 2 +-
.../main/lock/BaseJDBCLockIntegrationTest.java | 2 +-
.../karaf/main/lock/BaseJDBCLockTest.java | 2 +-
.../lock/DefaultJDBCLockIntegrationTest.java | 3 +-
.../karaf/main/lock/DefaultJDBCLockTest.java | 3 +-
.../main/lock/DerbyJDBCLockIntegrationTest.java | 4 +-
.../karaf/main/lock/DerbyJDBCLockTest.java | 3 +-
.../main/lock/MySQLJDBCLockIntegrationTest.java | 3 +-
.../karaf/main/lock/MySQLJDBCLockTest.java | 3 +-
.../lock/OracleJDBCLockIntegrationTest.java | 3 +-
.../karaf/main/lock/OracleJDBCLockTest.java | 3 +-
.../lock/PostgreSQLJDBCLockIntegrationTest.java | 2 +-
.../karaf/main/lock/PostgreSQLJDBCLockTest.java | 2 +-
.../main/util/BootstrapLogManagerTest.java | 2 +-
pom.xml | 2 +-
shell/core/pom.xml | 2 +-
.../impl/console/commands/help/HelpCommand.java | 2 +-
.../apache/karaf/util/locks/FileLockUtils.java | 2 +-
.../util/properties/InterpolationHelper.java | 325 ------
.../karaf/util/properties/Properties.java | 1102 ------------------
wrapper/core/pom.xml | 1 -
38 files changed, 48 insertions(+), 1484 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/config/command/pom.xml
----------------------------------------------------------------------
diff --git a/config/command/pom.xml b/config/command/pom.xml
index 35f7e1e..c661200 100644
--- a/config/command/pom.xml
+++ b/config/command/pom.xml
@@ -93,6 +93,9 @@
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
+ <Private-Package>
+ org.apache.felix.utils.properties
+ </Private-Package>
<Karaf-Commands>*</Karaf-Commands>
</instructions>
</configuration>
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/instance/core/pom.xml
----------------------------------------------------------------------
diff --git a/instance/core/pom.xml b/instance/core/pom.xml
index be13f18..742b1e0 100644
--- a/instance/core/pom.xml
+++ b/instance/core/pom.xml
@@ -153,7 +153,6 @@
org.apache.karaf.jpm.impl,
org.apache.karaf.instance.core.internal,
org.apache.felix.utils.properties;-split-package:=merge-first,
- org.apache.karaf.util.properties,
org.apache.karaf.util.locks
</Private-Package>
</instructions>
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/instance/core/src/main/java/org/apache/karaf/instance/core/internal/InstanceServiceImpl.java
----------------------------------------------------------------------
diff --git a/instance/core/src/main/java/org/apache/karaf/instance/core/internal/InstanceServiceImpl.java b/instance/core/src/main/java/org/apache/karaf/instance/core/internal/InstanceServiceImpl.java
index ae03fd9..e3758d5 100644
--- a/instance/core/src/main/java/org/apache/karaf/instance/core/internal/InstanceServiceImpl.java
+++ b/instance/core/src/main/java/org/apache/karaf/instance/core/internal/InstanceServiceImpl.java
@@ -117,7 +117,7 @@ public class InstanceServiceImpl implements InstanceService {
this.stopTimeout = stopTimeout;
}
- private State loadData(org.apache.karaf.util.properties.Properties storage) {
+ private State loadData(org.apache.felix.utils.properties.Properties storage) {
State state = new State();
int count = getInt(storage, "count", 0);
state.defaultSshPortStart = getInt(storage, "ssh.port", state.defaultSshPortStart);
@@ -149,7 +149,7 @@ public class InstanceServiceImpl implements InstanceService {
return state;
}
- private void saveData(State state, org.apache.karaf.util.properties.Properties storage) {
+ private void saveData(State state, org.apache.felix.utils.properties.Properties storage) {
storage.put("ssh.port", Integer.toString(state.defaultSshPortStart));
storage.put("rmi.registry.port", Integer.toString(state.defaultRmiRegistryPortStart));
storage.put("rmi.server.port", Integer.toString(state.defaultRmiServerPortStart));
@@ -173,7 +173,7 @@ public class InstanceServiceImpl implements InstanceService {
}
}
- private boolean getBool(org.apache.karaf.util.properties.Properties storage, String name, boolean def) {
+ private boolean getBool(org.apache.felix.utils.properties.Properties storage, String name, boolean def) {
Object value = storage.get(name);
if (value != null) {
return Boolean.parseBoolean(value.toString());
@@ -182,7 +182,7 @@ public class InstanceServiceImpl implements InstanceService {
}
}
- private int getInt(org.apache.karaf.util.properties.Properties storage, String name, int def) {
+ private int getInt(org.apache.felix.utils.properties.Properties storage, String name, int def) {
Object value = storage.get(name);
if (value != null) {
return Integer.parseInt(value.toString());
@@ -191,7 +191,7 @@ public class InstanceServiceImpl implements InstanceService {
}
}
- private String getString(org.apache.karaf.util.properties.Properties storage, String name, String def) {
+ private String getString(org.apache.felix.utils.properties.Properties storage, String name, String def) {
Object value = storage.get(name);
return value != null ? value.toString() : def;
}
@@ -216,7 +216,7 @@ public class InstanceServiceImpl implements InstanceService {
}
try {
return FileLockUtils.execute(storageFile, new FileLockUtils.CallableWithProperties<T>() {
- public T call(org.apache.karaf.util.properties.Properties properties) throws IOException {
+ public T call(org.apache.felix.utils.properties.Properties properties) throws IOException {
State state = loadData(properties);
T t = callback.call(state);
saveData(state, properties);
@@ -362,14 +362,14 @@ public class InstanceServiceImpl implements InstanceService {
void addFeaturesFromSettings(File featuresCfg, final InstanceSettings settings) throws IOException {
FileLockUtils.execute(featuresCfg, new FileLockUtils.RunnableWithProperties() {
- public void run(org.apache.karaf.util.properties.Properties properties) throws IOException {
+ public void run(org.apache.felix.utils.properties.Properties properties) throws IOException {
appendToPropList(properties, "featuresBoot", settings.getFeatures());
appendToPropList(properties, "featuresRepositories", settings.getFeatureURLs());
}
});
}
- private void appendToPropList(org.apache.karaf.util.properties.Properties p, String key, List<String> elements) {
+ private void appendToPropList(org.apache.felix.utils.properties.Properties p, String key, List<String> elements) {
if (elements == null) {
return;
}
@@ -715,7 +715,7 @@ public class InstanceServiceImpl implements InstanceService {
File f = new File(instance.loc, path);
try {
return FileLockUtils.execute(f, new FileLockUtils.CallableWithProperties<Integer>() {
- public Integer call(org.apache.karaf.util.properties.Properties properties) throws IOException {
+ public Integer call(org.apache.felix.utils.properties.Properties properties) throws IOException {
return Integer.parseInt(properties.get(key).toString());
}
});
@@ -737,7 +737,7 @@ public class InstanceServiceImpl implements InstanceService {
}
File f = new File(instance.loc, path);
FileLockUtils.execute(f, new FileLockUtils.RunnableWithProperties() {
- public void run(org.apache.karaf.util.properties.Properties properties) throws IOException {
+ public void run(org.apache.felix.utils.properties.Properties properties) throws IOException {
properties.put(key, Integer.toString(port));
}
});
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/ConfigProperties.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/ConfigProperties.java b/main/src/main/java/org/apache/karaf/main/ConfigProperties.java
index 25f19b6..d30c9c1 100644
--- a/main/src/main/java/org/apache/karaf/main/ConfigProperties.java
+++ b/main/src/main/java/org/apache/karaf/main/ConfigProperties.java
@@ -22,7 +22,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.net.URI;
import java.net.URISyntaxException;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import org.apache.karaf.main.lock.SimpleFileLock;
import org.apache.karaf.main.util.Utils;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/InstanceHelper.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/InstanceHelper.java b/main/src/main/java/org/apache/karaf/main/InstanceHelper.java
index 01f08c5..02b0a54 100644
--- a/main/src/main/java/org/apache/karaf/main/InstanceHelper.java
+++ b/main/src/main/java/org/apache/karaf/main/InstanceHelper.java
@@ -30,6 +30,7 @@ import java.net.ServerSocket;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.felix.utils.properties.Properties;
import org.apache.karaf.util.locks.FileLockUtils;
import org.osgi.framework.launch.Framework;
@@ -60,7 +61,7 @@ public class InstanceHelper {
}
}
FileLockUtils.execute(propertiesFile, new FileLockUtils.RunnableWithProperties() {
- public void run(org.apache.karaf.util.properties.Properties props) throws IOException {
+ public void run(Properties props) throws IOException {
if (props.isEmpty()) {
if (isRoot) {
props.setProperty("count", "1");
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/Main.java
----------------------------------------------------------------------
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 bc3e3d4..2ebd2ff 100644
--- a/main/src/main/java/org/apache/karaf/main/Main.java
+++ b/main/src/main/java/org/apache/karaf/main/Main.java
@@ -29,9 +29,8 @@ import java.net.URLClassLoader;
import java.security.Provider;
import java.security.Security;
import java.util.ArrayList;
-import java.util.Enumeration;
import java.util.List;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/PropertiesLoader.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/PropertiesLoader.java b/main/src/main/java/org/apache/karaf/main/PropertiesLoader.java
index 750241e..7fe2057 100644
--- a/main/src/main/java/org/apache/karaf/main/PropertiesLoader.java
+++ b/main/src/main/java/org/apache/karaf/main/PropertiesLoader.java
@@ -26,12 +26,12 @@ import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import java.util.StringTokenizer;
import org.apache.karaf.main.util.Utils;
-import static org.apache.karaf.util.properties.InterpolationHelper.substVars;
+import static org.apache.felix.utils.properties.InterpolationHelper.substVars;
public class PropertiesLoader {
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java b/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java
index 1b624a6..aeb0a6a 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/DefaultJDBCLock.java
@@ -24,7 +24,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java b/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java
index 9b7027d..fce3d33 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/DerbyJDBCLock.java
@@ -19,7 +19,7 @@
package org.apache.karaf.main.lock;
import java.sql.Connection;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
/**
* Represents an exclusive lock on a database,
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/GenericJDBCLock.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/GenericJDBCLock.java b/main/src/main/java/org/apache/karaf/main/lock/GenericJDBCLock.java
index a31bd3c..286c0d4 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/GenericJDBCLock.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/GenericJDBCLock.java
@@ -24,12 +24,11 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.karaf.main.ConfigProperties;
-import org.apache.karaf.main.Main;
import org.apache.karaf.main.util.BootstrapLogManager;
/**
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java b/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java
index 6b11f9d..039c067 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/LockFactory.java
@@ -18,7 +18,7 @@
*/
package org.apache.karaf.main.lock;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
public class LockFactory {
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java b/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java
index 6000b85..2e98b0c 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/MySQLJDBCLock.java
@@ -19,7 +19,7 @@
package org.apache.karaf.main.lock;
import java.sql.Connection;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
/**
* Represents an exclusive lock on a database,
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java b/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java
index b2a41c2..bdfdf07 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/OracleJDBCLock.java
@@ -20,7 +20,7 @@ package org.apache.karaf.main.lock;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
/**
* Represents an exclusive lock on a database,
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/PostgreSQLJDBCLock.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/PostgreSQLJDBCLock.java b/main/src/main/java/org/apache/karaf/main/lock/PostgreSQLJDBCLock.java
index c73e568..407a431 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/PostgreSQLJDBCLock.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/PostgreSQLJDBCLock.java
@@ -18,7 +18,7 @@
*/
package org.apache.karaf.main.lock;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
/**
* Represents an exclusive lock on a database,
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/SQLServerJDBCLock.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/SQLServerJDBCLock.java b/main/src/main/java/org/apache/karaf/main/lock/SQLServerJDBCLock.java
index d14f9c0..cd2a4d9 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/SQLServerJDBCLock.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/SQLServerJDBCLock.java
@@ -18,7 +18,7 @@
*/
package org.apache.karaf.main.lock;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
/**
* Represents an exclusive lock on a database,
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java b/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java
index 3cb43ab..7004f7f 100644
--- a/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java
+++ b/main/src/main/java/org/apache/karaf/main/lock/SimpleFileLock.java
@@ -22,7 +22,7 @@ import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import java.util.logging.Logger;
import org.apache.karaf.main.util.BootstrapLogManager;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java
----------------------------------------------------------------------
diff --git a/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java b/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java
index e46b50f..5e093d5 100644
--- a/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java
+++ b/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java
@@ -24,8 +24,8 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import org.apache.karaf.util.properties.Properties;
-import org.apache.karaf.util.properties.InterpolationHelper;
+import org.apache.felix.utils.properties.Properties;
+import org.apache.felix.utils.properties.InterpolationHelper;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/MockLock.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/MockLock.java b/main/src/test/java/org/apache/karaf/main/MockLock.java
index 176d8bb..e2ac2b2 100644
--- a/main/src/test/java/org/apache/karaf/main/MockLock.java
+++ b/main/src/test/java/org/apache/karaf/main/MockLock.java
@@ -1,6 +1,6 @@
package org.apache.karaf.main;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import java.util.logging.Logger;
import org.apache.karaf.main.lock.Lock;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java b/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java
index dc29b70..aac0210 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockIntegrationTest.java
@@ -23,7 +23,7 @@ import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import java.util.logging.Logger;
import org.apache.karaf.main.util.BootstrapLogManager;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java b/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java
index 0fd32f3..ea8b7c5 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/BaseJDBCLockTest.java
@@ -28,7 +28,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import org.apache.karaf.main.util.BootstrapLogManager;
import org.easymock.EasyMock;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java b/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java
index 91c5bc8..d262fef 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockIntegrationTest.java
@@ -20,9 +20,8 @@ package org.apache.karaf.main.lock;
import static org.junit.Assert.assertTrue;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.main.lock.DefaultJDBCLock;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java b/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java
index 5705033..9a3451b 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/DefaultJDBCLockTest.java
@@ -21,9 +21,8 @@ package org.apache.karaf.main.lock;
import static org.junit.Assert.assertEquals;
import java.sql.Connection;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.main.lock.DefaultJDBCLock;
import org.junit.Before;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java b/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java
index 6cbedb9..ba9365d 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockIntegrationTest.java
@@ -20,10 +20,8 @@ package org.apache.karaf.main.lock;
import static org.junit.Assert.assertTrue;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.main.lock.DefaultJDBCLock;
-import org.apache.karaf.main.lock.DerbyJDBCLock;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java b/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java
index 26cae64..b2bee85 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/DerbyJDBCLockTest.java
@@ -21,9 +21,8 @@ package org.apache.karaf.main.lock;
import static org.junit.Assert.assertEquals;
import java.sql.Connection;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.main.lock.DerbyJDBCLock;
import org.junit.Before;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java b/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java
index e22ef09..91ca1fe 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockIntegrationTest.java
@@ -22,9 +22,8 @@ package org.apache.karaf.main.lock;
import static org.junit.Assert.assertFalse;
import java.sql.Connection;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.main.lock.MySQLJDBCLock;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java b/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java
index 842f4e1..c49d71d 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/MySQLJDBCLockTest.java
@@ -21,9 +21,8 @@ package org.apache.karaf.main.lock;
import static org.junit.Assert.assertEquals;
import java.sql.Connection;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.main.lock.MySQLJDBCLock;
import org.junit.Before;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java b/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java
index 80f105c..9c3f170 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockIntegrationTest.java
@@ -22,9 +22,8 @@ package org.apache.karaf.main.lock;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.main.lock.OracleJDBCLock;
import org.junit.Before;
import org.junit.Ignore;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java b/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java
index 20a8198..30b2400 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/OracleJDBCLockTest.java
@@ -26,9 +26,8 @@ import static org.junit.Assert.*;
import java.sql.Connection;
import java.sql.SQLException;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.main.lock.OracleJDBCLock;
import org.junit.Before;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockIntegrationTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockIntegrationTest.java b/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockIntegrationTest.java
index 76a9dbc..9006630 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockIntegrationTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockIntegrationTest.java
@@ -22,7 +22,7 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import static org.junit.Assert.assertTrue;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java b/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java
index 818aafe..6d4121f 100644
--- a/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java
+++ b/main/src/test/java/org/apache/karaf/main/lock/PostgreSQLJDBCLockTest.java
@@ -23,7 +23,7 @@ import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.assertEquals;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/main/src/test/java/org/apache/karaf/main/util/BootstrapLogManagerTest.java
----------------------------------------------------------------------
diff --git a/main/src/test/java/org/apache/karaf/main/util/BootstrapLogManagerTest.java b/main/src/test/java/org/apache/karaf/main/util/BootstrapLogManagerTest.java
index 7eb468a..af5bf91 100644
--- a/main/src/test/java/org/apache/karaf/main/util/BootstrapLogManagerTest.java
+++ b/main/src/test/java/org/apache/karaf/main/util/BootstrapLogManagerTest.java
@@ -19,7 +19,7 @@
package org.apache.karaf.main.util;
import java.io.File;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
import java.util.logging.Handler;
import junit.framework.Assert;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ae3cabb..ae4da3a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -160,7 +160,7 @@
<felix.framework.security.version>2.2.0</felix.framework.security.version>
<felix.gogo.version>0.10.0</felix.gogo.version>
<felix.plugin.version>2.4.0</felix.plugin.version>
- <felix.utils.version>1.4.2</felix.utils.version>
+ <felix.utils.version>1.6.0</felix.utils.version>
<felix.webconsole.version>4.2.0</felix.webconsole.version>
<felix.webconsole.api.version>3.1.2</felix.webconsole.api.version>
<felix.metatype.version>1.0.10</felix.metatype.version>
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/shell/core/pom.xml
----------------------------------------------------------------------
diff --git a/shell/core/pom.xml b/shell/core/pom.xml
index c41b0b2..c14cc6e 100644
--- a/shell/core/pom.xml
+++ b/shell/core/pom.xml
@@ -154,7 +154,7 @@
<Private-Package>
org.apache.karaf.service.guard.tools,
org.apache.karaf.shell.impl.*,
- org.apache.karaf.util.properties,
+ org.apache.felix.utils.properties,
org.apache.felix.utils.extender,
org.apache.felix.utils.manifest,
org.apache.felix.gogo.api,
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/shell/core/src/main/java/org/apache/karaf/shell/impl/console/commands/help/HelpCommand.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/commands/help/HelpCommand.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/commands/help/HelpCommand.java
index 086b83b..4afa149 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/commands/help/HelpCommand.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/commands/help/HelpCommand.java
@@ -25,7 +25,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.karaf.util.properties.InterpolationHelper;
+import org.apache.felix.utils.properties.InterpolationHelper;
import org.apache.karaf.shell.api.console.Command;
import org.apache.karaf.shell.api.console.CommandLine;
import org.apache.karaf.shell.api.console.Completer;
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/util/src/main/java/org/apache/karaf/util/locks/FileLockUtils.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/locks/FileLockUtils.java b/util/src/main/java/org/apache/karaf/util/locks/FileLockUtils.java
index b3d1c32..b64639b 100644
--- a/util/src/main/java/org/apache/karaf/util/locks/FileLockUtils.java
+++ b/util/src/main/java/org/apache/karaf/util/locks/FileLockUtils.java
@@ -24,7 +24,7 @@ import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;
-import org.apache.karaf.util.properties.Properties;
+import org.apache.felix.utils.properties.Properties;
public final class FileLockUtils {
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/util/src/main/java/org/apache/karaf/util/properties/InterpolationHelper.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/properties/InterpolationHelper.java b/util/src/main/java/org/apache/karaf/util/properties/InterpolationHelper.java
deleted file mode 100644
index b59dda5..0000000
--- a/util/src/main/java/org/apache/karaf/util/properties/InterpolationHelper.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * 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.util.properties;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.osgi.framework.BundleContext;
-
-/**
- * <p>
- * Enhancement of the standard <code>Properties</code>
- * managing the maintain of comments, etc.
- * </p>
- *
- * @author gnodet, jbonofre
- */
-public class InterpolationHelper {
-
- private InterpolationHelper() {
- }
-
- private static final char ESCAPE_CHAR = '\\';
- private static final String DELIM_START = "${";
- private static final String DELIM_STOP = "}";
-
-
- /**
- * Callback for substitution
- */
- public interface SubstitutionCallback {
-
- public String getValue(String key);
-
- }
-
- /**
- * Perform substitution on a property set
- *
- * @param properties the property set to perform substitution on
- */
- public static void performSubstitution(Map<String,String> properties)
- {
- performSubstitution(properties, (BundleContext) null);
- }
-
- /**
- * Perform substitution on a property set
- *
- * @param properties the property set to perform substitution on
- */
- public static void performSubstitution(Map<String,String> properties, BundleContext context)
- {
- performSubstitution(properties, new BundleContextSubstitutionCallback(context));
- }
-
- /**
- * Perform substitution on a property set
- *
- * @param properties the property set to perform substitution on
- */
- public static void performSubstitution(Map<String,String> properties, SubstitutionCallback callback)
- {
- Map<String, String> org = new HashMap<String, String>(properties);
- for (String name : properties.keySet())
- {
- String value = properties.get(name);
- properties.put(name, substVars(value, name, null, org, callback));
- }
- }
-
- /**
- * <p>
- * This method performs property variable substitution on the
- * specified value. If the specified value contains the syntax
- * <tt>${<prop-name>}</tt>, where <tt><prop-name></tt>
- * refers to either a configuration property or a system property,
- * then the corresponding property value is substituted for the variable
- * placeholder. Multiple variable placeholders may exist in the
- * specified value as well as nested variable placeholders, which
- * are substituted from inner most to outer most. Configuration
- * properties override system properties.
- * </p>
- *
- * @param val The string on which to perform property substitution.
- * @param currentKey The key of the property being evaluated used to
- * detect cycles.
- * @param cycleMap Map of variable references used to detect nested cycles.
- * @param configProps Set of configuration properties.
- * @return The value of the specified string after system property substitution.
- * @throws IllegalArgumentException If there was a syntax error in the
- * property placeholder syntax or a recursive variable reference.
- **/
- public static String substVars(String val,
- String currentKey,
- Map<String,String> cycleMap,
- Map<String,String> configProps)
- throws IllegalArgumentException
- {
- return substVars(val, currentKey, cycleMap, configProps, (SubstitutionCallback) null);
- }
-
- /**
- * <p>
- * This method performs property variable substitution on the
- * specified value. If the specified value contains the syntax
- * <tt>${<prop-name>}</tt>, where <tt><prop-name></tt>
- * refers to either a configuration property or a system property,
- * then the corresponding property value is substituted for the variable
- * placeholder. Multiple variable placeholders may exist in the
- * specified value as well as nested variable placeholders, which
- * are substituted from inner most to outer most. Configuration
- * properties override system properties.
- * </p>
- *
- * @param val The string on which to perform property substitution.
- * @param currentKey The key of the property being evaluated used to
- * detect cycles.
- * @param cycleMap Map of variable references used to detect nested cycles.
- * @param configProps Set of configuration properties.
- * @param context the bundle context to retrieve properties from
- * @return The value of the specified string after system property substitution.
- * @throws IllegalArgumentException If there was a syntax error in the
- * property placeholder syntax or a recursive variable reference.
- **/
- public static String substVars(String val,
- String currentKey,
- Map<String,String> cycleMap,
- Map<String,String> configProps,
- BundleContext context)
- throws IllegalArgumentException
- {
- return substVars(val, currentKey, cycleMap, configProps, new BundleContextSubstitutionCallback(context));
- }
-
- /**
- * <p>
- * This method performs property variable substitution on the
- * specified value. If the specified value contains the syntax
- * <tt>${<prop-name>}</tt>, where <tt><prop-name></tt>
- * refers to either a configuration property or a system property,
- * then the corresponding property value is substituted for the variable
- * placeholder. Multiple variable placeholders may exist in the
- * specified value as well as nested variable placeholders, which
- * are substituted from inner most to outer most. Configuration
- * properties override system properties.
- * </p>
- *
- * @param val The string on which to perform property substitution.
- * @param currentKey The key of the property being evaluated used to
- * detect cycles.
- * @param cycleMap Map of variable references used to detect nested cycles.
- * @param configProps Set of configuration properties.
- * @param callback the callback to obtain substitution values
- * @return The value of the specified string after system property substitution.
- * @throws IllegalArgumentException If there was a syntax error in the
- * property placeholder syntax or a recursive variable reference.
- **/
- public static String substVars(String val,
- String currentKey,
- Map<String,String> cycleMap,
- Map<String,String> configProps,
- SubstitutionCallback callback)
- throws IllegalArgumentException
- {
- return unescape(doSubstVars(val, currentKey, cycleMap, configProps, callback));
- }
-
- private static String doSubstVars(String val,
- String currentKey,
- Map<String,String> cycleMap,
- Map<String,String> configProps,
- SubstitutionCallback callback)
- throws IllegalArgumentException
- {
- if (cycleMap == null)
- {
- cycleMap = new HashMap<String,String>();
- }
-
- // Put the current key in the cycle map.
- cycleMap.put(currentKey, currentKey);
-
- // Assume we have a value that is something like:
- // "leading ${foo.${bar}} middle ${baz} trailing"
-
- // Find the first ending '}' variable delimiter, which
- // will correspond to the first deepest nested variable
- // placeholder.
- int stopDelim = val.indexOf(DELIM_STOP);
- while (stopDelim > 0 && val.charAt(stopDelim - 1) == ESCAPE_CHAR)
- {
- stopDelim = val.indexOf(DELIM_STOP, stopDelim + 1);
- }
-
- // Find the matching starting "${" variable delimiter
- // by looping until we find a start delimiter that is
- // greater than the stop delimiter we have found.
- int startDelim = val.indexOf(DELIM_START);
- while (stopDelim >= 0)
- {
- int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
- if ((idx < 0) || (idx > stopDelim))
- {
- break;
- }
- else if (idx < stopDelim)
- {
- startDelim = idx;
- }
- }
-
- // If we do not have a start or stop delimiter, then just
- // return the existing value.
- if ((startDelim < 0) || (stopDelim < 0))
- {
- return val;
- }
-
- // At this point, we have found a variable placeholder so
- // we must perform a variable substitution on it.
- // Using the start and stop delimiter indices, extract
- // the first, deepest nested variable placeholder.
- String variable = val.substring(startDelim + DELIM_START.length(), stopDelim);
-
- // Verify that this is not a recursive variable reference.
- if (cycleMap.get(variable) != null)
- {
- throw new IllegalArgumentException("recursive variable reference: " + variable);
- }
-
- // Get the value of the deepest nested variable placeholder.
- // Try to configuration properties first.
- String substValue = (String) ((configProps != null) ? configProps.get(variable) : null);
- if (substValue == null)
- {
- if (variable.length() <= 0)
- {
- substValue = "";
- }
- else
- {
- if (callback != null)
- {
- substValue = callback.getValue(variable);
- }
- if (substValue == null)
- {
- substValue = System.getProperty(variable, "");
- }
- }
- }
-
- // Remove the found variable from the cycle map, since
- // it may appear more than once in the value and we don't
- // want such situations to appear as a recursive reference.
- cycleMap.remove(variable);
-
- // Append the leading characters, the substituted value of
- // the variable, and the trailing characters to get the new
- // value.
- val = val.substring(0, startDelim) + substValue + val.substring(stopDelim + DELIM_STOP.length(), val.length());
-
- // Now perform substitution again, since there could still
- // be substitutions to make.
- val = doSubstVars(val, currentKey, cycleMap, configProps, callback);
-
- // Return the value.
- return val;
- }
-
- private static String unescape(String val)
- {
- int escape = val.indexOf(ESCAPE_CHAR);
- while (escape >= 0 && escape < val.length() - 1)
- {
- char c = val.charAt(escape + 1);
- if (c == '{' || c == '}' || c == ESCAPE_CHAR)
- {
- val = val.substring(0, escape) + val.substring(escape + 1);
- }
- escape = val.indexOf(ESCAPE_CHAR, escape + 1);
- }
- return val;
- }
-
- static class BundleContextSubstitutionCallback implements SubstitutionCallback
- {
- private final BundleContext context;
-
- public BundleContextSubstitutionCallback(BundleContext context)
- {
- this.context = context;
- }
-
- public String getValue(String key)
- {
- String value = null;
- if (context != null)
- {
- value = context.getProperty(key);
- }
- if (value == null)
- {
- value = System.getProperty(key, "");
- }
- return value;
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/util/src/main/java/org/apache/karaf/util/properties/Properties.java
----------------------------------------------------------------------
diff --git a/util/src/main/java/org/apache/karaf/util/properties/Properties.java b/util/src/main/java/org/apache/karaf/util/properties/Properties.java
deleted file mode 100644
index dffc3f2..0000000
--- a/util/src/main/java/org/apache/karaf/util/properties/Properties.java
+++ /dev/null
@@ -1,1102 +0,0 @@
-/*
- * 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.util.properties;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FilterWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.AbstractMap;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import org.osgi.framework.BundleContext;
-
-/**
- * <p>
- * Enhancement of the standard <code>Properties</code>
- * managing the maintain of comments, etc.
- * </p>
- *
- * @author gnodet, jbonofre
- */
-public class Properties extends AbstractMap<String, String> {
-
- /** Constant for the supported comment characters.*/
- private static final String COMMENT_CHARS = "#!";
-
- /** The list of possible key/value separators */
- private static final char[] SEPARATORS = new char[] {'=', ':'};
-
- /** The white space characters used as key/value separators. */
- private static final char[] WHITE_SPACE = new char[] {' ', '\t', '\f'};
-
- /**
- * The default encoding (ISO-8859-1 as specified by
- * http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html)
- */
- private static final String DEFAULT_ENCODING = "ISO-8859-1";
-
- /** Constant for the platform specific line separator.*/
- private static final String LINE_SEPARATOR = AccessController.doPrivileged(new PrivilegedAction<String>() {
- public String run() {
- return System.getProperty("line.separator");
- }
- });
-
- /** Constant for the radix of hex numbers.*/
- private static final int HEX_RADIX = 16;
-
- /** Constant for the length of a unicode literal.*/
- private static final int UNICODE_LEN = 4;
-
- private final Map<String,String> storage = new LinkedHashMap<String,String>();
- private final Map<String,Layout> layout = new LinkedHashMap<String,Layout>();
- private List<String> header;
- private List<String> footer;
- private File location;
- private InterpolationHelper.SubstitutionCallback callback;
- private boolean substitute = true;
-
- public Properties() {
- }
-
- public Properties(File location) throws IOException {
- this(location, (InterpolationHelper.SubstitutionCallback) null);
- }
-
- public Properties(File location, BundleContext context) throws IOException {
- this(location, new InterpolationHelper.BundleContextSubstitutionCallback(context));
- }
-
- public Properties(File location, InterpolationHelper.SubstitutionCallback callback) throws IOException {
- this.location = location;
- this.callback = callback;
- if(location.exists())
- load(location);
- }
-
- public Properties(boolean substitute) throws IOException {
- this.substitute = substitute;
- }
-
- public Properties(File location, boolean substitute) throws IOException {
- this.location = location;
- this.substitute = substitute;
- }
-
- public void load(File location) throws IOException {
- InputStream is = new FileInputStream(location);
- try {
- load(is);
- } finally {
- is.close();
- }
- }
-
- public void load(URL location) throws IOException {
- InputStream is = location.openStream();
- try {
- load(is);
- } finally {
- is.close();
- }
- }
-
- public void load(InputStream is) throws IOException {
- load(new InputStreamReader(is, DEFAULT_ENCODING));
- }
-
- public void load(Reader reader) throws IOException {
- loadLayout(reader);
- }
-
- public void save() throws IOException {
- save(this.location);
- }
-
- public void save(File location) throws IOException {
- OutputStream os = new FileOutputStream(location);
- try {
- save(os);
- } finally {
- os.close();
- }
- }
-
- public void save(OutputStream os) throws IOException {
- save(new OutputStreamWriter(os, DEFAULT_ENCODING));
- }
-
- public void save(Writer writer) throws IOException {
- saveLayout(writer);
- }
-
- /**
- * Store a properties into a output stream, preserving comments, special character, etc.
- * This method is mainly to be compatible with the java.util.Properties class.
- *
- * @param os an output stream.
- * @param comment this parameter is ignored as this Properties
- * @throws java.io.IOException
- */
- public void store(OutputStream os, String comment) throws IOException {
- this.save(os);
- }
-
- /**
- * Searches for the property with the specified key in this property list.
- *
- * @param key the property key.
- * @return the value in this property list with the specified key value.
- */
- public String getProperty(String key) {
- return this.get(key);
- }
-
- /**
- * Searches for the property with the specified key in this property list. If the key is not found in this property
- * list, the default property list, and its defaults, recursively, are then checked. The method returns the default
- * value argument if the property is not found.
- *
- * @param key the property key.
- * @param defaultValue a default value.
- * @return
- */
- public String getProperty(String key, String defaultValue) {
- if (this.get(key) != null)
- return this.get(key);
- return defaultValue;
- }
-
- @Override
- public Set<Entry<String, String>> entrySet() {
- return storage.entrySet();
- }
-
- /**
- * Returns an enumeration of all the keys in this property list, including distinct keys in the default property
- * list if a key of the same name has not already been found from the main properties list.
- *
- * @return an enumeration of all the keys in this property list, including the keys in the default property list.
- */
- public Enumeration<?> propertyNames() {
- return Collections.enumeration(storage.keySet());
- }
-
- /**
- * Calls the map method put. Provided for parallelism with the getProperty method.
- * Enforces use of strings for property keys and values. The value returned is the result of the map call to put.
- *
- * @param key the key to be placed into this property list.
- * @param value the value corresponding to the key.
- * @return the previous value of the specified key in this property list, or null if it did not have one.
- */
- public Object setProperty(String key, String value) {
- return this.put(key, value);
- }
-
- @Override
- public String put(String key, String value) {
- String old = storage.put(key, value);
- if (old == null || !old.equals(value)) {
- Layout l = layout.get(key);
- if (l != null) {
- l.clearValue();
- }
- }
- return old;
- }
-
- public String put(String key, List<String> commentLines, List<String> valueLines) {
- commentLines = new ArrayList<String>(commentLines);
- valueLines = new ArrayList<String>(valueLines);
- String escapedKey = escapeKey(key);
- int lastLine = valueLines.size() - 1;
- if (valueLines.isEmpty()) {
- valueLines.add(escapedKey + "=");
- } else if (!valueLines.get(0).trim().startsWith(escapedKey)) {
- valueLines.set(0, escapedKey + " = " + escapeJava(valueLines.get(0)) + (0 < lastLine? "\\": ""));
- }
- for (int i = 1; i < valueLines.size(); i++) {
- valueLines.set(i, escapeJava(valueLines.get(i)) + (i < lastLine? "\\": ""));
- }
- StringBuilder value = new StringBuilder();
- for (String line: valueLines) {
- value.append(line);
- }
- this.layout.put(key, new Layout(commentLines, valueLines));
- return storage.put(key, unescapeJava(value.toString()));
- }
-
- public String put(String key, List<String> commentLines, String value) {
- commentLines = new ArrayList<String>(commentLines);
- this.layout.put(key, new Layout(commentLines, null));
- return storage.put(key, value);
- }
-
- public String put(String key, String comment, String value) {
- return put(key, Collections.singletonList(comment), value);
- }
-
- public List<String> getRaw(String key) {
- if (layout.containsKey(key)) {
- if (layout.get(key).getValueLines() != null) {
- return new ArrayList<String>(layout.get(key).getValueLines());
- }
- }
- List<String> result = new ArrayList<String>();
- if (storage.containsKey(key)) {
- result.add(storage.get(key));
- }
- return result;
- }
-
- @Override
- public String remove(Object key) {
- Layout l = layout.get(key);
- if (l != null) {
- l.clearValue();
- }
- return storage.remove(key);
- }
-
- @Override
- public void clear() {
- for (Layout l : layout.values()) {
- l.clearValue();
- }
- storage.clear();
- }
-
- /**
- * Return the comment header.
- *
- * @return the comment header
- */
- public List<String> getHeader()
- {
- return header;
- }
-
- /**
- * Set the comment header.
- *
- * @param header the header to use
- */
- public void setHeader(List<String> header)
- {
- this.header = header;
- }
-
- /**
- * Return the comment footer.
- *
- * @return the comment footer
- */
- public List<String> getFooter()
- {
- return footer;
- }
-
- /**
- * Set the comment footer.
- *
- * @param footer the footer to use
- */
- public void setFooter(List<String> footer)
- {
- this.footer = footer;
- }
-
- /**
- * Reads a properties file and stores its internal structure. The found
- * properties will be added to the associated configuration object.
- *
- * @param in the reader to the properties file
- * @throws java.io.IOException if an error occurs
- */
- protected void loadLayout(Reader in) throws IOException
- {
- PropertiesReader reader = new PropertiesReader(in);
- while (reader.nextProperty())
- {
- storage.put(reader.getPropertyName(), reader.getPropertyValue());
- int idx = checkHeaderComment(reader.getCommentLines());
- layout.put(reader.getPropertyName(),
- new Layout(idx < reader.getCommentLines().size() ?
- new ArrayList<String>(reader.getCommentLines().subList(idx, reader.getCommentLines().size())) :
- null,
- new ArrayList<String>(reader.getValueLines())));
- }
- footer = new ArrayList<String>(reader.getCommentLines());
- if (substitute)
- {
- substitute();
- }
- }
-
- public void substitute()
- {
- substitute(callback);
- }
-
- public void substitute(InterpolationHelper.SubstitutionCallback callback)
- {
- if(callback != null)
- {
- InterpolationHelper.performSubstitution(storage, callback);
- }
- else {
- InterpolationHelper.performSubstitution(storage);
- }
-
- }
-
- /**
- * Writes the properties file to the given writer, preserving as much of its
- * structure as possible.
- *
- * @param out the writer
- * @throws java.io.IOException if an error occurs
- */
- protected void saveLayout(Writer out) throws IOException
- {
- PropertiesWriter writer = new PropertiesWriter(out);
- if (header != null)
- {
- for (String s : header)
- {
- writer.writeln(s);
- }
- }
-
- for (String key : storage.keySet())
- {
- Layout l = layout.get(key);
- if (l != null && l.getCommentLines() != null)
- {
- for (String s : l.getCommentLines())
- {
- writer.writeln(s);
- }
- }
- if (l != null && l.getValueLines() != null)
- {
- for (String s : l.getValueLines())
- {
- writer.writeln(s);
- }
- }
- else
- {
- writer.writeProperty(key, storage.get(key));
- }
- }
- if (footer != null)
- {
- for (String s : footer)
- {
- writer.writeln(s);
- }
- }
- writer.flush();
- }
-
- /**
- * Checks if parts of the passed in comment can be used as header comment.
- * This method checks whether a header comment can be defined (i.e. whether
- * this is the first comment in the loaded file). If this is the case, it is
- * searched for the lates blank line. This line will mark the end of the
- * header comment. The return value is the index of the first line in the
- * passed in list, which does not belong to the header comment.
- *
- * @param commentLines the comment lines
- * @return the index of the next line after the header comment
- */
- private int checkHeaderComment(List<String> commentLines)
- {
- if (getHeader() == null && layout.isEmpty())
- {
- // This is the first comment. Search for blank lines.
- int index = commentLines.size() - 1;
- while (index >= 0 && commentLines.get(index).length() > 0)
- {
- index--;
- }
- setHeader(new ArrayList<String>(commentLines.subList(0, index + 1)));
- return index + 1;
- }
- else
- {
- return 0;
- }
- }
-
- /**
- * Tests whether a line is a comment, i.e. whether it starts with a comment
- * character.
- *
- * @param line the line
- * @return a flag if this is a comment line
- */
- static boolean isCommentLine(String line) {
- String s = line.trim();
- // blank lines are also treated as comment lines
- return s.length() < 1 || COMMENT_CHARS.indexOf(s.charAt(0)) >= 0;
- }
-
- /**
- * <p>Unescapes any Java literals found in the <code>String</code> to a
- * <code>Writer</code>.</p> This is a slightly modified version of the
- * StringEscapeUtils.unescapeJava() function in commons-lang that doesn't
- * drop escaped separators (i.e '\,').
- *
- * @param str the <code>String</code> to unescape, may be null
- * @return the processed string
- * @throws IllegalArgumentException if the Writer is <code>null</code>
- */
- protected static String unescapeJava(String str) {
- if (str == null) {
- return null;
- }
- int sz = str.length();
- StringBuffer out = new StringBuffer(sz);
- StringBuffer unicode = new StringBuffer(UNICODE_LEN);
- boolean hadSlash = false;
- boolean inUnicode = false;
- for (int i = 0; i < sz; i++) {
- char ch = str.charAt(i);
- if (inUnicode) {
- // if in unicode, then we're reading unicode
- // values in somehow
- unicode.append(ch);
- if (unicode.length() == UNICODE_LEN) {
- // unicode now contains the four hex digits
- // which represents our unicode character
- try {
- int value = Integer.parseInt(unicode.toString(), HEX_RADIX);
- out.append((char) value);
- unicode.setLength(0);
- inUnicode = false;
- hadSlash = false;
- } catch (NumberFormatException nfe) {
- throw new IllegalArgumentException("Unable to parse unicode value: " + unicode, nfe);
- }
- }
- continue;
- }
-
- if (hadSlash) {
- // handle an escaped value
- hadSlash = false;
- switch (ch) {
- case '\\' :
- out.append('\\');
- break;
- case '\'' :
- out.append('\'');
- break;
- case '\"' :
- out.append('"');
- break;
- case 'r' :
- out.append('\r');
- break;
- case 'f' :
- out.append('\f');
- break;
- case 't' :
- out.append('\t');
- break;
- case 'n' :
- out.append('\n');
- break;
- case 'b' :
- out.append('\b');
- break;
- case 'u' :
- // uh-oh, we're in unicode country....
- inUnicode = true;
- break;
- default :
- out.append(ch);
- break;
- }
- continue;
- } else if (ch == '\\') {
- hadSlash = true;
- continue;
- }
- out.append(ch);
- }
-
- if (hadSlash) {
- // then we're in the weird case of a \ at the end of the
- // string, let's output it anyway.
- out.append('\\');
- }
-
- return out.toString();
- }
-
- /**
- * <p>Escapes the characters in a <code>String</code> using Java String rules.</p>
- *
- * <p>Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.) </p>
- *
- * <p>So a tab becomes the characters <code>'\\'</code> and
- * <code>'t'</code>.</p>
- *
- * <p>The only difference between Java strings and JavaScript strings
- * is that in JavaScript, a single quote must be escaped.</p>
- *
- * <p>Example:
- * <pre>
- * input string: He didn't say, "Stop!"
- * output string: He didn't say, \"Stop!\"
- * </pre>
- * </p>
- *
- * @param str String to escape values in, may be null
- * @return String with escaped values, <code>null</code> if null string input
- */
- protected static String escapeJava(String str) {
- if (str == null) {
- return null;
- }
- int sz = str.length();
- StringBuffer out = new StringBuffer(sz * 2);
- for (int i = 0; i < sz; i++) {
- char ch = str.charAt(i);
- // handle unicode
- if (ch > 0xfff) {
- out.append("\\u").append(hex(ch));
- } else if (ch > 0xff) {
- out.append("\\u0").append(hex(ch));
- } else if (ch > 0x7f) {
- out.append("\\u00").append(hex(ch));
- } else if (ch < 32) {
- switch (ch) {
- case '\b' :
- out.append('\\');
- out.append('b');
- break;
- case '\n' :
- out.append('\\');
- out.append('n');
- break;
- case '\t' :
- out.append('\\');
- out.append('t');
- break;
- case '\f' :
- out.append('\\');
- out.append('f');
- break;
- case '\r' :
- out.append('\\');
- out.append('r');
- break;
- default :
- if (ch > 0xf) {
- out.append("\\u00").append(hex(ch));
- } else {
- out.append("\\u000").append(hex(ch));
- }
- break;
- }
- } else {
- switch (ch) {
- case '"' :
- out.append('\\');
- out.append('"');
- break;
- case '\\' :
- out.append('\\');
- out.append('\\');
- break;
- default :
- out.append(ch);
- break;
- }
- }
- }
- return out.toString();
- }
-
- /**
- * <p>Returns an upper case hexadecimal <code>String</code> for the given
- * character.</p>
- *
- * @param ch The character to convert.
- * @return An upper case hexadecimal <code>String</code>
- */
- protected static String hex(char ch) {
- return Integer.toHexString(ch).toUpperCase(Locale.ENGLISH);
- }
-
- /**
- * <p>Checks if the value is in the given array.</p>
- *
- * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
- *
- * @param array the array to search through
- * @param valueToFind the value to find
- * @return <code>true</code> if the array contains the object
- */
- public static boolean contains(char[] array, char valueToFind) {
- if (array == null) {
- return false;
- }
- for (int i = 0; i < array.length; i++) {
- if (valueToFind == array[i]) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Escape the separators in the key.
- *
- * @param key the key
- * @return the escaped key
- */
- private static String escapeKey(String key)
- {
- StringBuffer newkey = new StringBuffer();
-
- for (int i = 0; i < key.length(); i++)
- {
- char c = key.charAt(i);
-
- if (contains(SEPARATORS, c) || contains(WHITE_SPACE, c))
- {
- // escape the separator
- newkey.append('\\');
- newkey.append(c);
- }
- else
- {
- newkey.append(c);
- }
- }
-
- return newkey.toString();
- }
-
- /**
- * This class is used to read properties lines. These lines do
- * not terminate with new-line chars but rather when there is no
- * backslash sign a the end of the line. This is used to
- * concatenate multiple lines for readability.
- */
- public static class PropertiesReader extends LineNumberReader
- {
- /** Stores the comment lines for the currently processed property.*/
- private final List<String> commentLines;
-
- /** Stores the value lines for the currently processed property.*/
- private final List<String> valueLines;
-
- /** Stores the name of the last read property.*/
- private String propertyName;
-
- /** Stores the value of the last read property.*/
- private String propertyValue;
-
- /**
- * Creates a new instance of <code>PropertiesReader</code> and sets
- * the underlaying reader and the list delimiter.
- *
- * @param reader the reader
- */
- public PropertiesReader(Reader reader)
- {
- super(reader);
- commentLines = new ArrayList<String>();
- valueLines = new ArrayList<String>();
- }
-
- /**
- * Reads a property line. Returns null if Stream is
- * at EOF. Concatenates lines ending with "\".
- * Skips lines beginning with "#" or "!" and empty lines.
- * The return value is a property definition (<code><name></code>
- * = <code><value></code>)
- *
- * @return A string containing a property value or null
- *
- * @throws java.io.IOException in case of an I/O error
- */
- public String readProperty() throws IOException
- {
- commentLines.clear();
- valueLines.clear();
- StringBuffer buffer = new StringBuffer();
-
- while (true)
- {
- String line = readLine();
- if (line == null)
- {
- // EOF
- return null;
- }
-
- if (isCommentLine(line))
- {
- commentLines.add(line);
- continue;
- }
-
- valueLines.add(line);
- while (line.length() > 0 && contains(WHITE_SPACE, line.charAt(0)))
- {
- line = line.substring(1, line.length());
- }
-
- if (checkCombineLines(line))
- {
- line = line.substring(0, line.length() - 1);
- buffer.append(line);
- }
- else
- {
- buffer.append(line);
- break;
- }
- }
- return buffer.toString();
- }
-
- /**
- * Parses the next property from the input stream and stores the found
- * name and value in internal fields. These fields can be obtained using
- * the provided getter methods. The return value indicates whether EOF
- * was reached (<b>false</b>) or whether further properties are
- * available (<b>true</b>).
- *
- * @return a flag if further properties are available
- * @throws java.io.IOException if an error occurs
- */
- public boolean nextProperty() throws IOException
- {
- String line = readProperty();
-
- if (line == null)
- {
- return false; // EOF
- }
-
- // parse the line
- String[] property = parseProperty(line);
- propertyName = unescapeJava(property[0]);
- propertyValue = unescapeJava(property[1]);
- return true;
- }
-
- /**
- * Returns the comment lines that have been read for the last property.
- *
- * @return the comment lines for the last property returned by
- * <code>readProperty()</code>
- */
- public List<String> getCommentLines()
- {
- return commentLines;
- }
-
- /**
- * Returns the value lines that have been read for the last property.
- *
- * @return the raw value lines for the last property returned by
- * <code>readProperty()</code>
- */
- public List<String> getValueLines()
- {
- return valueLines;
- }
-
- /**
- * Returns the name of the last read property. This method can be called
- * after <code>{@link #nextProperty()}</code> was invoked and its
- * return value was <b>true</b>.
- *
- * @return the name of the last read property
- */
- public String getPropertyName()
- {
- return propertyName;
- }
-
- /**
- * Returns the value of the last read property. This method can be
- * called after <code>{@link #nextProperty()}</code> was invoked and
- * its return value was <b>true</b>.
- *
- * @return the value of the last read property
- */
- public String getPropertyValue()
- {
- return propertyValue;
- }
-
- /**
- * Checks if the passed in line should be combined with the following.
- * This is true, if the line ends with an odd number of backslashes.
- *
- * @param line the line
- * @return a flag if the lines should be combined
- */
- private static boolean checkCombineLines(String line)
- {
- int bsCount = 0;
- for (int idx = line.length() - 1; idx >= 0 && line.charAt(idx) == '\\'; idx--)
- {
- bsCount++;
- }
-
- return bsCount % 2 != 0;
- }
-
- /**
- * Parse a property line and return the key and the value in an array.
- *
- * @param line the line to parse
- * @return an array with the property's key and value
- */
- private static String[] parseProperty(String line)
- {
- // sorry for this spaghetti code, please replace it as soon as
- // possible with a regexp when the Java 1.3 requirement is dropped
-
- String[] result = new String[2];
- StringBuffer key = new StringBuffer();
- StringBuffer value = new StringBuffer();
-
- // state of the automaton:
- // 0: key parsing
- // 1: antislash found while parsing the key
- // 2: separator crossing
- // 3: white spaces
- // 4: value parsing
- int state = 0;
-
- for (int pos = 0; pos < line.length(); pos++)
- {
- char c = line.charAt(pos);
-
- switch (state)
- {
- case 0:
- if (c == '\\')
- {
- state = 1;
- }
- else if (contains(WHITE_SPACE, c))
- {
- // switch to the separator crossing state
- state = 2;
- }
- else if (contains(SEPARATORS, c))
- {
- // switch to the value parsing state
- state = 3;
- }
- else
- {
- key.append(c);
- }
-
- break;
-
- case 1:
- if (contains(SEPARATORS, c) || contains(WHITE_SPACE, c))
- {
- // this is an escaped separator or white space
- key.append(c);
- }
- else
- {
- // another escaped character, the '\' is preserved
- key.append('\\');
- key.append(c);
- }
-
- // return to the key parsing state
- state = 0;
-
- break;
-
- case 2:
- if (contains(WHITE_SPACE, c))
- {
- // do nothing, eat all white spaces
- state = 2;
- }
- else if (contains(SEPARATORS, c))
- {
- // switch to the value parsing state
- state = 3;
- }
- else
- {
- // any other character indicates we encoutered the beginning of the value
- value.append(c);
-
- // switch to the value parsing state
- state = 4;
- }
-
- break;
-
- case 3:
- if (contains(WHITE_SPACE, c))
- {
- // do nothing, eat all white spaces
- state = 3;
- }
- else
- {
- // any other character indicates we encoutered the beginning of the value
- value.append(c);
-
- // switch to the value parsing state
- state = 4;
- }
-
- break;
-
- case 4:
- value.append(c);
- break;
- }
- }
-
- result[0] = key.toString();
- result[1] = value.toString();
-
- return result;
- }
- } // class PropertiesReader
-
- /**
- * This class is used to write properties lines.
- */
- public static class PropertiesWriter extends FilterWriter
- {
- /**
- * Constructor.
- *
- * @param writer a Writer object providing the underlying stream
- */
- public PropertiesWriter(Writer writer)
- {
- super(writer);
- }
-
- /**
- * Writes the given property and its value.
- *
- * @param key the property key
- * @param value the property value
- * @throws java.io.IOException if an error occurs
- */
- public void writeProperty(String key, String value) throws IOException
- {
- write(escapeKey(key));
- write(" = ");
- write(escapeJava(value));
- writeln(null);
- }
-
- /**
- * Helper method for writing a line with the platform specific line
- * ending.
- *
- * @param s the content of the line (may be <b>null</b>)
- * @throws java.io.IOException if an error occurs
- */
- public void writeln(String s) throws IOException
- {
- if (s != null)
- {
- write(s);
- }
- write(LINE_SEPARATOR);
- }
-
- } // class PropertiesWriter
-
- /**
- * TODO
- */
- protected static class Layout {
-
- private List<String> commentLines;
- private List<String> valueLines;
-
- public Layout() {
- }
-
- public Layout(List<String> commentLines, List<String> valueLines) {
- this.commentLines = commentLines;
- this.valueLines = valueLines;
- }
-
- public List<String> getCommentLines() {
- return commentLines;
- }
-
- public void setCommentLines(List<String> commentLines) {
- this.commentLines = commentLines;
- }
-
- public List<String> getValueLines() {
- return valueLines;
- }
-
- public void setValueLines(List<String> valueLines) {
- this.valueLines = valueLines;
- }
-
- public void clearValue() {
- this.valueLines = null;
- }
-
- } // class Layout
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/karaf/blob/c4313f62/wrapper/core/pom.xml
----------------------------------------------------------------------
diff --git a/wrapper/core/pom.xml b/wrapper/core/pom.xml
index f6f51d1..961525c 100644
--- a/wrapper/core/pom.xml
+++ b/wrapper/core/pom.xml
@@ -110,7 +110,6 @@
</Private-Package>
<Import-Package>
!org.apache.felix.utils.properties,
- !org.apache.karaf.util.properties,
!org.apache.karaf.util.locks,
!org.apache.karaf.info,
*
[2/2] git commit: [KARAF-2789] Upgrade to SSHD 0.10.1
Posted by gn...@apache.org.
[KARAF-2789] Upgrade to SSHD 0.10.1
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/89bbd1d8
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/89bbd1d8
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/89bbd1d8
Branch: refs/heads/master
Commit: 89bbd1d8c0363a09c4c5109712b480685457eaa5
Parents: 7c8b5a7
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Thu Mar 6 09:03:10 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Thu Mar 6 09:46:57 2014 +0100
----------------------------------------------------------------------
.../main/java/org/apache/karaf/client/Main.java | 59 +++++++++---------
pom.xml | 2 +-
.../karaf/shell/ssh/KarafAgentFactory.java | 11 ++--
.../karaf/shell/ssh/KarafJaasAuthenticator.java | 3 -
.../karaf/shell/ssh/KnownHostsManager.java | 2 +-
.../org/apache/karaf/shell/ssh/SshAction.java | 63 +++++++-------------
.../shell/ssh/UserAuthFactoriesFactory.java | 2 +-
7 files changed, 61 insertions(+), 81 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/89bbd1d8/client/src/main/java/org/apache/karaf/client/Main.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/karaf/client/Main.java b/client/src/main/java/org/apache/karaf/client/Main.java
index 81e0cf1..a2df5c5 100644
--- a/client/src/main/java/org/apache/karaf/client/Main.java
+++ b/client/src/main/java/org/apache/karaf/client/Main.java
@@ -34,8 +34,8 @@ import org.apache.sshd.SshClient;
import org.apache.sshd.agent.SshAgent;
import org.apache.sshd.agent.local.AgentImpl;
import org.apache.sshd.agent.local.LocalAgentFactory;
+import org.apache.sshd.client.UserInteraction;
import org.apache.sshd.client.channel.ChannelShell;
-import org.apache.sshd.client.future.AuthFuture;
import org.apache.sshd.client.future.ConnectFuture;
import org.apache.sshd.common.RuntimeSshException;
import org.fusesource.jansi.AnsiConsole;
@@ -75,40 +75,41 @@ public class Main {
SshClient client = null;
Terminal terminal = null;
try {
+ final Console console = System.console();
client = SshClient.setUpDefaultClient();
setupAgent(config.getUser(), client);
- client.start();
- ClientSession session = connectWithRetries(client, config);
- Console console = System.console();
- if (console != null) {
- console.printf("Logging in as %s\n", config.getUser());
- }
- if (!session.authAgent(config.getUser()).await().isSuccess()) {
- AuthFuture authFuture;
- boolean useDefault = config.getPassword() != null;
- do {
- String password;
- if (useDefault) {
- password = config.getPassword();
- useDefault = false;
- } else {
- if (console != null) {
- char[] readPassword = console.readPassword("Password: ");
- if (readPassword != null) {
- password = new String(readPassword);
- } else {
- return;
+ client.setUserInteraction(new UserInteraction() {
+ public void welcome(String banner) {
+ System.out.println(banner);
+ }
+
+ public String[] interactive(String destination, String name, String instruction, String[] prompt, boolean[] echo) {
+ String[] answers = new String[prompt.length];
+ try {
+ for (int i = 0; i < prompt.length; i++) {
+ if (console != null) {
+ if (echo[i]) {
+ answers[i] = console.readLine(prompt[i] + " ");
+ } else {
+ answers[i] = new String(console.readPassword(prompt[i] + " "));
+ }
}
- } else {
- throw new Exception("Unable to prompt password: could not get system console");
}
+ } catch (IOError e) {
}
- authFuture = session.authPassword(config.getUser(), password);
- } while (authFuture.await().isFailure());
- if (!authFuture.isSuccess()) {
- throw new Exception("Authentication failure");
+ return answers;
}
+ });
+ client.start();
+ if (console != null) {
+ console.printf("Logging in as %s\n", config.getUser());
}
+ ClientSession session = connectWithRetries(client, config);
+ if (config.getPassword() != null) {
+ session.addPasswordIdentity(config.getPassword());
+ }
+ session.auth().verify();
+
ClientChannel channel;
if (config.getCommand().length() > 0) {
channel = session.createChannel("exec", config.getCommand() + "\n");
@@ -168,7 +169,7 @@ public class Main {
ClientSession session = null;
int retries = 0;
do {
- ConnectFuture future = client.connect(config.getHost(), config.getPort());
+ ConnectFuture future = client.connect(config.getUser(), config.getHost(), config.getPort());
future.await();
try {
session = future.getSession();
http://git-wip-us.apache.org/repos/asf/karaf/blob/89bbd1d8/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 938537e..ae3cabb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -241,7 +241,7 @@
<spring32.version>3.2.4.RELEASE</spring32.version>
<spring.security31.version>3.1.4.RELEASE</spring.security31.version>
- <sshd.version>0.9.0</sshd.version>
+ <sshd.version>0.10.1</sshd.version>
<struts.bundle.version>1.3.10_1</struts.bundle.version>
<xbean.version>3.16</xbean.version>
<xerces.version>2.11.0</xerces.version>
http://git-wip-us.apache.org/repos/asf/karaf/blob/89bbd1d8/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
index da4d43a..f54b9bf 100644
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
+++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
@@ -34,8 +34,10 @@ import org.apache.sshd.agent.local.AgentImpl;
import org.apache.sshd.agent.local.AgentServerProxy;
import org.apache.sshd.agent.local.ChannelAgentForwarding;
import org.apache.sshd.common.Channel;
+import org.apache.sshd.common.FactoryManager;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.Session;
+import org.apache.sshd.common.session.ConnectionService;
import org.apache.sshd.server.session.ServerSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,8 +53,8 @@ public class KarafAgentFactory implements SshAgentFactory {
return new ChannelAgentForwarding.Factory();
}
- public SshAgent createClient(Session session) throws IOException {
- String proxyId = session.getFactoryManager().getProperties().get(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
+ public SshAgent createClient(FactoryManager manager) throws IOException {
+ String proxyId = manager.getProperties().get(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
if (proxyId == null) {
throw new IllegalStateException("No " + SshAgent.SSH_AUTHSOCKET_ENV_NAME + " environment variable set");
}
@@ -67,11 +69,12 @@ public class KarafAgentFactory implements SshAgentFactory {
throw new IllegalStateException("No ssh agent found");
}
- public SshAgentServer createServer(Session session) throws IOException {
+ public SshAgentServer createServer(ConnectionService service) throws IOException {
+ Session session = service.getSession();
if (!(session instanceof ServerSession)) {
throw new IllegalStateException("The session used to create an agent server proxy must be a server session");
}
- final AgentServerProxy proxy = new AgentServerProxy((ServerSession) session);
+ final AgentServerProxy proxy = new AgentServerProxy(service);
proxies.put(proxy.getId(), proxy);
return new SshAgentServer() {
public String getId() {
http://git-wip-us.apache.org/repos/asf/karaf/blob/89bbd1d8/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasAuthenticator.java
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasAuthenticator.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasAuthenticator.java
index 6df591a..632cb98 100644
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasAuthenticator.java
+++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasAuthenticator.java
@@ -19,7 +19,6 @@
package org.apache.karaf.shell.ssh;
import java.io.IOException;
-import java.security.Principal;
import java.security.PublicKey;
import javax.security.auth.Subject;
@@ -28,10 +27,8 @@ import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.login.FailedLoginException;
import javax.security.auth.login.LoginContext;
-import org.apache.karaf.jaas.boot.principal.RolePrincipal;
import org.apache.karaf.jaas.modules.publickey.PublickeyCallback;
import org.apache.sshd.common.Session;
import org.apache.sshd.server.PasswordAuthenticator;
http://git-wip-us.apache.org/repos/asf/karaf/blob/89bbd1d8/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KnownHostsManager.java
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KnownHostsManager.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KnownHostsManager.java
index 31434a1..0c9389d 100644
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KnownHostsManager.java
+++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KnownHostsManager.java
@@ -33,7 +33,7 @@ import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
-import org.apache.mina.util.Base64;
+import org.apache.sshd.common.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
http://git-wip-us.apache.org/repos/asf/karaf/blob/89bbd1d8/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java
index 0f2ae21..64bd6f3 100644
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java
+++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java
@@ -34,8 +34,8 @@ import org.apache.sshd.ClientChannel;
import org.apache.sshd.ClientSession;
import org.apache.sshd.SshClient;
import org.apache.sshd.agent.SshAgent;
+import org.apache.sshd.client.UserInteraction;
import org.apache.sshd.client.channel.ChannelShell;
-import org.apache.sshd.client.future.ConnectFuture;
import org.apache.sshd.common.util.NoCloseInputStream;
import org.apache.sshd.common.util.NoCloseOutputStream;
import org.slf4j.Logger;
@@ -120,54 +120,33 @@ public class SshAction implements Action {
agentSocket = this.session.get(SshAgent.SSH_AUTHSOCKET_ENV_NAME).toString();
client.getProperties().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME,agentSocket);
}
+ client.setUserInteraction(new UserInteraction() {
+ public void welcome(String banner) {
+ System.out.println(banner);
+ }
+ public String[] interactive(String destination, String name, String instruction, String[] prompt, boolean[] echo) {
+ String[] answers = new String[prompt.length];
+ try {
+ for (int i = 0; i < prompt.length; i++) {
+ answers[i] = session.readLine(prompt[i] + " ", echo[i] ? null : '*');
+ }
+ } catch (IOException e) {
+ }
+ return answers;
+ }
+ });
try {
- ConnectFuture future = client.connect(hostname, port);
- future.await();
- ClientSession sshSession = future.getSession();
+ ClientSession sshSession = client.connect(username, hostname, port).await().getSession();
Object oldIgnoreInterrupts = this.session.get(Session.IGNORE_INTERRUPTS);
try {
- boolean authed = false;
- if (agentSocket != null) {
- try {
- sshSession.authAgent(username);
- } catch (IllegalStateException ise) {
- System.err.println(keyChangedMessage);
- return null;
- }
- int ret = sshSession.waitFor(ClientSession.WAIT_AUTH | ClientSession.CLOSED | ClientSession.AUTHED, 0);
- if ((ret & ClientSession.AUTHED) == 0) {
- System.err.println("Agent authentication failed, falling back to password authentication.");
- } else {
- authed = true;
- }
- }
- if (!authed) {
- if (password == null) {
- log.debug("Prompting user for password");
- password = session.readLine("Password: ", '*');
- } else {
- log.debug("Password provided using command line option");
- }
- try {
- sshSession.authPassword(username, password);
- } catch (IllegalStateException ise) {
- System.err.println(keyChangedMessage);
- return null;
- }
- int ret = sshSession.waitFor(ClientSession.WAIT_AUTH | ClientSession.CLOSED | ClientSession.AUTHED, 0);
- if ((ret & ClientSession.AUTHED) == 0) {
- System.err.println("Password authentication failed");
- } else {
- authed = true;
- }
- }
- if (!authed) {
- return null;
+ if (password != null) {
+ sshSession.addPasswordIdentity(password);
}
+ sshSession.auth().verify();
System.out.println("Connected");
this.session.put( Session.IGNORE_INTERRUPTS, Boolean.TRUE );
@@ -199,7 +178,7 @@ public class SshAction implements Action {
}
channel.setOut(new NoCloseOutputStream(System.out));
channel.setErr(new NoCloseOutputStream(System.err));
- channel.open();
+ channel.open().verify();
channel.waitFor(ClientChannel.CLOSED, 0);
} finally {
session.put( Session.IGNORE_INTERRUPTS, oldIgnoreInterrupts );
http://git-wip-us.apache.org/repos/asf/karaf/blob/89bbd1d8/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java
----------------------------------------------------------------------
diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java
index 94d71a3..a7bd297 100644
--- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java
+++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java
@@ -53,7 +53,7 @@ public class UserAuthFactoriesFactory {
private Set<String> methodSet;
private List<NamedFactory<UserAuth>> factories;
- public void setAuthMethods(String methods) {
+ public void setAuthMethods(String methods) {
this.methodSet = new HashSet<String>();
this.factories = new ArrayList<NamedFactory<UserAuth>>();
String[] ams = methods.split(",");