summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main')
-rw-r--r--branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java135
-rw-r--r--branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/FrameworkLauncher.java130
2 files changed, 199 insertions, 66 deletions
diff --git a/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java b/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
index 345a06880e..fd4d0ee5bf 100644
--- a/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
+++ b/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java
@@ -186,71 +186,7 @@ public class EquinoxHost {
try {
if (injectedBundleContext == null) {
- String version = getSystemProperty("java.specification.version");
-
- /**
- * [rfeng] I have to remove javax.transaction.* packages from the system bundle
- * See: http://www.mail-archive.com/dev@geronimo.apache.org/msg70761.html
- */
- String profile = "J2SE-1.5.profile";
- if (version.startsWith("1.6")) {
- profile = "JavaSE-1.6.profile";
- }
- Properties props = new Properties();
- InputStream is = getClass().getResourceAsStream(profile);
- if (is != null) {
- props.load(is);
- is.close();
- }
-
- props.putAll(getSystemProperties());
-
- // Configure Eclipse properties
-
- // Use the boot classloader as the parent classloader
- put(props, PROP_OSGI_CONTEXT_CLASS_LOADER_PARENT, "app");
-
- // Set startup properties
- put(props, PROP_OSGI_CLEAN, "true");
-
- // Set location properties
- // FIXME Use proper locations
- String tmpDir = getSystemProperty("java.io.tmpdir");
- File root = new File(tmpDir);
- // Add user name as the prefix. For multiple users on the same Lunix,
- // there will be permission issue if one user creates the .tuscany folder
- // first under /tmp with no write permission for others.
- String userName = getSystemProperty(PROP_USER_NAME);
- if (userName != null) {
- root = new File(root, userName);
- }
- root = new File(root, ".tuscany/equinox/" + UUID.randomUUID().toString());
- if (logger.isLoggable(Level.FINE)) {
- logger.fine("Equinox location: " + root);
- }
-
- put(props, PROP_INSTANCE_AREA_DEFAULT, new File(root, "workspace").toURI().toString());
- put(props, PROP_INSTALL_AREA, new File(root, "install").toURI().toString());
- put(props, PROP_CONFIG_AREA_DEFAULT, new File(root, "config").toURI().toString());
- put(props, PROP_USER_AREA_DEFAULT, new File(root, "user").toURI().toString());
-
- // Test if the configuration/config.ini or osgi.bundles has been set
- // If yes, try to avoid discovery of bundles
- if (bundleLocations == null) {
- if (props.getProperty("osgi.bundles") != null) {
- bundleLocations = Collections.emptySet();
- } else {
- String config = props.getProperty(PROP_CONFIG_AREA);
- File ini = new File(config, "config.ini");
- if (ini.isFile()) {
- Properties iniProps = new Properties();
- iniProps.load(new FileInputStream(ini));
- if (iniProps.getProperty("osgi.bundles") != null) {
- bundleLocations = Collections.emptySet();
- }
- }
- }
- }
+ Properties props = configureProperties();
startFramework(props);
} else {
@@ -396,6 +332,75 @@ public class EquinoxHost {
}
}
+ protected Properties configureProperties() throws IOException, FileNotFoundException {
+ String version = getSystemProperty("java.specification.version");
+
+ /**
+ * [rfeng] I have to remove javax.transaction.* packages from the system bundle
+ * See: http://www.mail-archive.com/dev@geronimo.apache.org/msg70761.html
+ */
+ String profile = "J2SE-1.5.profile";
+ if (version.startsWith("1.6")) {
+ profile = "JavaSE-1.6.profile";
+ }
+ Properties props = new Properties();
+ InputStream is = getClass().getResourceAsStream(profile);
+ if (is != null) {
+ props.load(is);
+ is.close();
+ }
+
+ props.putAll(getSystemProperties());
+
+ // Configure Eclipse properties
+
+ // Use the boot classloader as the parent classloader
+ put(props, PROP_OSGI_CONTEXT_CLASS_LOADER_PARENT, "app");
+
+ // Set startup properties
+ put(props, PROP_OSGI_CLEAN, "true");
+
+ // Set location properties
+ // FIXME Use proper locations
+ String tmpDir = getSystemProperty("java.io.tmpdir");
+ File root = new File(tmpDir);
+ // Add user name as the prefix. For multiple users on the same Lunix,
+ // there will be permission issue if one user creates the .tuscany folder
+ // first under /tmp with no write permission for others.
+ String userName = getSystemProperty(PROP_USER_NAME);
+ if (userName != null) {
+ root = new File(root, userName);
+ }
+ root = new File(root, ".tuscany/equinox/" + UUID.randomUUID().toString());
+ if (logger.isLoggable(Level.FINE)) {
+ logger.fine("Equinox location: " + root);
+ }
+
+ put(props, PROP_INSTANCE_AREA_DEFAULT, new File(root, "workspace").toURI().toString());
+ put(props, PROP_INSTALL_AREA, new File(root, "install").toURI().toString());
+ put(props, PROP_CONFIG_AREA_DEFAULT, new File(root, "config").toURI().toString());
+ put(props, PROP_USER_AREA_DEFAULT, new File(root, "user").toURI().toString());
+
+ // Test if the configuration/config.ini or osgi.bundles has been set
+ // If yes, try to avoid discovery of bundles
+ if (bundleLocations == null) {
+ if (props.getProperty("osgi.bundles") != null) {
+ bundleLocations = Collections.emptySet();
+ } else {
+ String config = props.getProperty(PROP_CONFIG_AREA);
+ File ini = new File(config, "config.ini");
+ if (ini.isFile()) {
+ Properties iniProps = new Properties();
+ iniProps.load(new FileInputStream(ini));
+ if (iniProps.getProperty("osgi.bundles") != null) {
+ bundleLocations = Collections.emptySet();
+ }
+ }
+ }
+ }
+ return props;
+ }
+
private boolean isServiceProvider(Bundle bundle, Set<String> serviceProviders) {
if (bundle != null) {
String export = (String)bundle.getHeaders().get(Constants.EXPORT_PACKAGE);
diff --git a/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/FrameworkLauncher.java b/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/FrameworkLauncher.java
index 5714df2a5d..414f3aae63 100644
--- a/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/FrameworkLauncher.java
+++ b/branches/sca-java-2.0-M4/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/FrameworkLauncher.java
@@ -23,8 +23,10 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
+import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -101,7 +103,28 @@ public class FrameworkLauncher implements BundleActivator {
if (factory == null) {
return null;
}
- return factory.newFramework(properties);
+ String propertyFile = null;
+ String factoryName = factory.getClass().getName();
+ if (factoryName.startsWith("org.eclipse.osgi.")) {
+ propertyFile = "equinox.properties";
+ } else if (factoryName.startsWith("org.apache.felix.")) {
+ propertyFile = "felix.properties";
+ }
+ Map propMap = new HashMap();
+ if (propertyFile != null) {
+ InputStream is = getClass().getResourceAsStream(propertyFile);
+ if (is != null) {
+ Properties props = new Properties();
+ try {
+ props.load(is);
+ } catch (IOException e) {
+ logger.log(Level.WARNING, e.getMessage(), e);
+ }
+ propMap.putAll(props);
+ }
+ }
+ propMap.putAll(properties);
+ return factory.newFramework(propMap);
}
public boolean isEquinox() {
@@ -123,4 +146,109 @@ public class FrameworkLauncher implements BundleActivator {
public void stop(BundleContext context) throws Exception {
EquinoxHost.injectedBundleContext = null;
}
+
+ private static final String DELIM_START = "${";
+ private static final String DELIM_STOP = "}";
+
+ /**
+ * <p>
+ * This method performs property variable substitution on the
+ * specified value. If the specified value contains the syntax
+ * <tt>${&lt;prop-name&gt;}</tt>, where <tt>&lt;prop-name&gt;</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 cycleMap, Properties configProps)
+ throws IllegalArgumentException {
+ // If there is currently no cycle map, then create
+ // one for detecting cycles for this invocation.
+ if (cycleMap == null) {
+ cycleMap = new HashMap();
+ }
+
+ // 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);
+
+ // 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 found a stop delimiter without a start,
+ // so throw an exception.
+ else if (((startDelim < 0) || (startDelim > stopDelim)) && (stopDelim >= 0)) {
+ throw new IllegalArgumentException("stop delimiter with no start delimiter: " + 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 = (configProps != null) ? configProps.getProperty(variable, null) : null;
+ if (substValue == null) {
+ // Ignore unknown property values.
+ 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 = substVars(val, currentKey, cycleMap, configProps);
+
+ // Return the value.
+ return val;
+ }
+
}