Author: cschneider
Date: Mon Mar 26 16:12:39 2012
New Revision: 1305423

URL: http://svn.apache.org/viewvc?rev=1305423&view=rev
Log:
KARAF-713 Extracting variable substitution and FrameworkFactory

Added:
    karaf/trunk/main/src/main/java/org/apache/karaf/main/util/SubstHelper.java
Modified:
    karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
    karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java
    
karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java

Modified: karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java?rev=1305423&r1=1305422&r2=1305423&view=diff
==============================================================================
--- karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java (original)
+++ karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java Mon Mar 26 
16:12:39 2012
@@ -57,6 +57,7 @@ import org.apache.karaf.main.lock.Simple
 import org.apache.karaf.main.util.BootstrapLogManager;
 import org.apache.karaf.main.util.ServerInfoImpl;
 import org.apache.karaf.main.util.StringMap;
+import org.apache.karaf.main.util.SubstHelper;
 import org.apache.karaf.main.util.Utils;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleActivator;
@@ -274,16 +275,9 @@ public class Main {
         lockDelay = 
Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_DELAY, 
Integer.toString(lockDelay)));
         configProps.setProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL, 
Integer.toString(lockStartLevel));
         shutdownTimeout = 
Integer.parseInt(configProps.getProperty(KARAF_SHUTDOWN_TIMEOUT, 
Integer.toString(shutdownTimeout)));
-        // Start up the OSGI framework
 
-        String factoryClass = configProps.getProperty(KARAF_FRAMEWORK_FACTORY);
-        if (factoryClass == null) {
-            InputStream is = 
classLoader.getResourceAsStream("META-INF/services/" + 
FrameworkFactory.class.getName());
-            BufferedReader br = new BufferedReader(new InputStreamReader(is, 
"UTF-8"));
-            factoryClass = br.readLine();
-            br.close();
-        }
-        FrameworkFactory factory = (FrameworkFactory) 
classLoader.loadClass(factoryClass).newInstance();
+        // Start up the OSGI framework
+        FrameworkFactory factory = loadFrameworkFactory(classLoader);
         framework = factory.newFramework(new StringMap(configProps, false));
         framework.init();
         // Process properties
@@ -304,6 +298,18 @@ public class Main {
         }.start();
     }
 
+    private FrameworkFactory loadFrameworkFactory(ClassLoader classLoader) 
throws Exception {
+        String factoryClass = configProps.getProperty(KARAF_FRAMEWORK_FACTORY);
+        if (factoryClass == null) {
+            InputStream is = 
classLoader.getResourceAsStream("META-INF/services/" + 
FrameworkFactory.class.getName());
+            BufferedReader br = new BufferedReader(new InputStreamReader(is, 
"UTF-8"));
+            factoryClass = br.readLine();
+            br.close();
+        }
+        FrameworkFactory factory = (FrameworkFactory) 
classLoader.loadClass(factoryClass).newInstance();
+        return factory;
+    }
+
     private void startKarafActivators(ClassLoader classLoader) throws 
IOException {
         Enumeration<URL> urls = 
classLoader.getResources("META-INF/MANIFEST.MF");
         while (urls != null && urls.hasMoreElements()) {
@@ -811,7 +817,7 @@ public class Main {
         for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
             String name = (String) e.nextElement();
             String value = System.getProperty(name, props.getProperty(name));
-            System.setProperty(name, substVars(value, name, null, props));
+            System.setProperty(name, SubstHelper.substVars(value, name, null, 
props));
         }
     }
 
@@ -857,7 +863,7 @@ public class Main {
         for (Enumeration e = configProps.propertyNames(); 
e.hasMoreElements();) {
             String name = (String) e.nextElement();
             configProps.setProperty(name,
-                    substVars(configProps.getProperty(name), name, null, 
configProps));
+                    SubstHelper.substVars(configProps.getProperty(name), name, 
null, configProps));
         }
 
         return configProps;
@@ -1197,121 +1203,6 @@ public class Main {
         }
     }
 
-    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<String, String> 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<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);
-
-        // 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;
-    }
-
     /**
      * Retrieve the arguments used when launching Karaf
      *

Modified: karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java?rev=1305423&r1=1305422&r2=1305423&view=diff
==============================================================================
--- karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java (original)
+++ karaf/trunk/main/src/main/java/org/apache/karaf/main/Stop.java Mon Mar 26 
16:12:39 2012
@@ -27,6 +27,7 @@ import java.net.URL;
 import java.util.Enumeration;
 import java.util.Properties;
 
+import org.apache.karaf.main.util.SubstHelper;
 import org.apache.karaf.main.util.Utils;
 
 /**
@@ -55,7 +56,7 @@ public class Stop {
         for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
             String name = (String) e.nextElement();
             props.setProperty(name,
-                    Main.substVars(props.getProperty(name), name, null, 
props));
+                    SubstHelper.substVars(props.getProperty(name), name, null, 
props));
         }
 
         int port = 
Integer.parseInt(props.getProperty(Main.KARAF_SHUTDOWN_PORT, "0"));

Modified: 
karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java?rev=1305423&r1=1305422&r2=1305423&view=diff
==============================================================================
--- 
karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java
 (original)
+++ 
karaf/trunk/main/src/main/java/org/apache/karaf/main/util/BootstrapLogManager.java
 Mon Mar 26 16:12:39 2012
@@ -28,7 +28,6 @@ import java.util.logging.Handler;
 import java.util.logging.LogRecord;
 import java.util.logging.StreamHandler;
 
-import org.apache.karaf.main.Main;
 
 /**
  * Convenience class for configuring java.util.logging to append to
@@ -70,7 +69,7 @@ public class BootstrapLogManager {
                     }
                 }
             }
-            filename = 
Main.substVars(props.getProperty("log4j.appender.out.file"), 
"log4j.appender.out.file", null, null);
+            filename = 
SubstHelper.substVars(props.getProperty("log4j.appender.out.file"), 
"log4j.appender.out.file", null, null);
             log = new File(filename);
         }
 

Added: 
karaf/trunk/main/src/main/java/org/apache/karaf/main/util/SubstHelper.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/util/SubstHelper.java?rev=1305423&view=auto
==============================================================================
--- karaf/trunk/main/src/main/java/org/apache/karaf/main/util/SubstHelper.java 
(added)
+++ karaf/trunk/main/src/main/java/org/apache/karaf/main/util/SubstHelper.java 
Mon Mar 26 16:12:39 2012
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.main.util;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+public class SubstHelper {
+    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<String, String> 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<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);
+    
+        // 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;
+    }
+
+}


Reply via email to