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 2010/10/18 10:07:47 UTC

svn commit: r1023679 - /karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java

Author: gnodet
Date: Mon Oct 18 08:07:47 2010
New Revision: 1023679

URL: http://svn.apache.org/viewvc?rev=1023679&view=rev
Log:
Remove some warnings on the main class

Modified:
    karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.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=1023679&r1=1023678&r2=1023679&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 Oct 18 08:07:47 2010
@@ -33,7 +33,6 @@ import java.security.Security;
 import java.util.*;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import java.lang.reflect.Method;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -178,7 +177,6 @@ public class Main {
     private int lockStartLevel = 1;
     private int lockDelay = 1000;
     private boolean exiting = false;
-    private boolean cmProcessed;
 
     public Main(String[] args) {
         this.args = args;
@@ -212,7 +210,7 @@ public class Main {
         // Copy framework properties from the system properties.
         Main.copySystemProperties(configProps);
 
-        ClassLoader classLoader = updateClassLoader(configProps);
+        ClassLoader classLoader = createClassLoader(configProps);
 
         processSecurityProperties(configProps);
 
@@ -385,15 +383,19 @@ public class Main {
         if (prop != null) {
             String[] providers = prop.split(",");
             for (String provider : providers) {
-                try {
-                    Security.addProvider((Provider) Class.forName(provider).newInstance());
-                } catch (Throwable t) {
-                    System.err.println("Unable to register security provider: " + t);
-                }
+                addProvider(provider);
             }
         }
     }
 
+    private static void addProvider(String provider) {
+        try {
+            Security.addProvider((Provider) Class.forName(provider).newInstance());
+        } catch (Throwable t) {
+            System.err.println("Unable to register security provider: " + t);
+        }
+    }
+
     private void updateInstancePid() {
         try {
             String instanceName = System.getProperty("karaf.name");
@@ -459,6 +461,8 @@ public class Main {
      * <p/>
      * Processes the auto-install and auto-start properties from the
      * specified configuration properties.
+     *
+     * @param context the system bundle context
      */
     private void processAutoProperties(BundleContext context) {
         // Check if we want to convert URLs to maven style
@@ -509,8 +513,8 @@ public class Main {
     private List<Bundle> autoInstall(String propertyPrefix, BundleContext context, StartLevel sl, boolean convertToMavenUrls) {
         Map<Integer, String> autoStart = new TreeMap<Integer, String>();
         List<Bundle> bundles = new ArrayList<Bundle>();
-        for (Iterator i = configProps.keySet().iterator(); i.hasNext();) {
-            String key = (String) i.next();
+        for (Object o : configProps.keySet()) {
+            String key = (String) o;
             // Ignore all keys that are not the auto-start property.
             if (!key.startsWith(propertyPrefix)) {
                 continue;
@@ -522,8 +526,7 @@ public class Main {
             if (!key.equals(propertyPrefix)) {
                 try {
                     startLevel = Integer.parseInt(key.substring(key.lastIndexOf('.') + 1));
-                }
-                catch (NumberFormatException ex) {
+                } catch (NumberFormatException ex) {
                     System.err.println("Invalid property: " + key);
                 }
             }
@@ -532,7 +535,7 @@ public class Main {
         for (Integer startLevel : autoStart.keySet()) {
             StringTokenizer st = new StringTokenizer(autoStart.get(startLevel), "\" ", true);
             if (st.countTokens() > 0) {
-                String location = null;
+                String location;
                 do {
                     location = nextLocation(st);
                     if (location != null) {
@@ -558,7 +561,6 @@ public class Main {
         if (convertToMavenUrls) {
             String[] p = parts[1].split("/");
             if (p.length >= 4 && p[p.length-1].startsWith(p[p.length-3] + "-" + p[p.length-2])) {
-                String groupId = null;
                 String artifactId = p[p.length-3];
                 String version = p[p.length-2];
                 String classifier;
@@ -605,7 +607,7 @@ public class Main {
         if (st.countTokens() > 0) {
             String tokenList = "\" ";
             StringBuffer tokBuf = new StringBuffer(10);
-            String tok = null;
+            String tok;
             boolean inQuote = false;
             boolean tokStarted = false;
             boolean exit = false;
@@ -655,6 +657,8 @@ public class Main {
      * initializing the "<tt>felix.system.properties</tt>" system property to an
      * arbitrary URL.
      * </p>
+     *
+     * @param karafBase the karaf base folder
      */
     protected static void loadSystemProperties(File karafBase) {
         // The system properties file is either specified by a system
@@ -662,10 +666,10 @@ public class Main {
         // Try to load it from one of these places.
 
         // See if the property URL was specified as a property.
-        URL propURL = null;
+        URL propURL;
         try {
             File file = new File(new File(karafBase, "etc"), SYSTEM_PROPERTIES_FILE_NAME);
-            propURL = file.toURL();
+            propURL = file.toURI().toURL();
         }
         catch (MalformedURLException ex) {
             System.err.print("Main: " + ex);
@@ -720,7 +724,7 @@ public class Main {
      * </p>
      *
      * @return A <tt>Properties</tt> instance or <tt>null</tt> if there was an error.
-     * @throws Exception 
+     * @throws Exception if something wrong occurs
      */
     private Properties loadConfigProperties() throws Exception {
         // The config properties file is either specified by a system
@@ -728,11 +732,11 @@ public class Main {
         // installation directory.  Try to load it from one of these
         // places.
 
-        ArrayList<File> bundleDirs = new ArrayList<File>();
+        List<File> bundleDirs = new ArrayList<File>();
 
         // See if the property URL was specified as a property.
-        URL configPropURL = null;
-        URL startupPropURL = null;
+        URL configPropURL;
+        URL startupPropURL;
 
         try {
             File file = new File(new File(karafBase, "etc"), CONFIG_PROPERTIES_FILE_NAME);
@@ -765,7 +769,7 @@ public class Main {
         if (locations != null) {
             StringTokenizer st = new StringTokenizer(locations, "\" ", true);
             if (st.countTokens() > 0) {
-                String location = null;
+                String location;
                 do {
                     location = nextLocation(st);
                     if (location != null) {
@@ -869,7 +873,7 @@ public class Main {
         }
     }
     
-    private ClassLoader updateClassLoader(Properties configProps) throws Exception {
+    private ClassLoader createClassLoader(Properties configProps) throws Exception {
     	String framework = configProps.getProperty(KARAF_FRAMEWORK);
         if (framework == null) {
             throw new IllegalArgumentException("Property " + KARAF_FRAMEWORK + " must be set in the etc/" + CONFIG_PROPERTIES_FILE_NAME + " configuration file");
@@ -894,21 +898,22 @@ public class Main {
             }
         }
 
-        URLClassLoader classLoader = new URLClassLoader(urls.toArray(new URL[urls.size()]), Main.class.getClassLoader());
-        return classLoader;
+        return new URLClassLoader(urls.toArray(new URL[urls.size()]), Main.class.getClassLoader());
     }
 
     /**
      * Process properties to customize default felix behavior
      *
-     * @param startupProps
+     * @param configProps properties loaded from etc/config.properties
+     * @param startupProps properties loaded from etc/startup.properties
+     * @param bundleDirs location to load bundles from (usually system/)
      */
-    private static void processConfigurationProperties(Properties props, Properties startupProps, ArrayList<File> bundleDirs) {
+    private static void processConfigurationProperties(Properties configProps, Properties startupProps, List<File> bundleDirs) {
         if (bundleDirs == null) {
             return;
         }
-        if ("all".equals(props.getProperty(PROPERTY_AUTO_START, "").trim())) {
-            props.remove(PROPERTY_AUTO_START);
+        if ("all".equals(configProps.getProperty(PROPERTY_AUTO_START, "").trim())) {
+            configProps.remove(PROPERTY_AUTO_START);
             ArrayList<File> jars = new ArrayList<File>();
 
             // We should start all the bundles in the system dir.
@@ -920,20 +925,20 @@ public class Main {
 
             for (File jar : jars) {
                 try {
-                    sb.append("\"").append(jar.toURL().toString()).append("\" ");
+                    sb.append("\"").append(jar.toURI().toURL().toString()).append("\" ");
                 } catch (MalformedURLException e) {
                     System.err.print("Ignoring " + jar.toString() + " (" + e + ")");
                 }
             }
 
-            props.setProperty(PROPERTY_AUTO_START, sb.toString());
+            configProps.setProperty(PROPERTY_AUTO_START, sb.toString());
 
-        } else if (STARTUP_PROPERTIES_FILE_NAME.equals(props.getProperty(PROPERTY_AUTO_START, "").trim())) {
-            props.remove(PROPERTY_AUTO_START);
+        } else if (STARTUP_PROPERTIES_FILE_NAME.equals(configProps.getProperty(PROPERTY_AUTO_START, "").trim())) {
+            configProps.remove(PROPERTY_AUTO_START);
             // We should start the bundles in the startup.properties file.
             HashMap<Integer, StringBuffer> levels = new HashMap<Integer, StringBuffer>();
-            for (Iterator iterator = startupProps.keySet().iterator(); iterator.hasNext();) {
-                String name = (String) iterator.next();
+            for (Object o : startupProps.keySet()) {
+                String name = (String) o;
                 File file = findFile(bundleDirs, name);
 
                 if (file != null) {
@@ -950,7 +955,7 @@ public class Main {
                         levels.put(level, sb);
                     }
                     try {
-                        sb.append("\"").append(file.toURL().toString()).append("|").append(name).append("\" ");
+                        sb.append("\"").append(file.toURI().toURL().toString()).append("|").append(name).append("\" ");
                     } catch (MalformedURLException e) {
                         System.err.print("Ignoring " + file.toString() + " (" + e + ")");
                     }
@@ -960,13 +965,13 @@ public class Main {
             }
 
             for (Map.Entry<Integer, StringBuffer> entry : levels.entrySet()) {
-                props.setProperty(PROPERTY_AUTO_START + "." + entry.getKey(), entry.getValue().toString());
+                configProps.setProperty(PROPERTY_AUTO_START + "." + entry.getKey(), entry.getValue().toString());
             }
         }
 
     }
 
-    private static File findFile(ArrayList<File> bundleDirs, String name) {
+    private static File findFile(List<File> bundleDirs, String name) {
         for (File bundleDir : bundleDirs) {
             File file = findFile(bundleDir, name);
             if (file != null) {
@@ -1119,9 +1124,11 @@ public class Main {
         return val;
     }
 
-    /* (non-Javadoc)
-      * @see org.apache.karaf.main.MainService#getArgs()
-      */
+    /**
+     * Retrieve the arguments used when launching Karaf
+     *
+     * @return the arguments of the main karaf process
+     */
     public String[] getArgs() {
         return args;
     }
@@ -1141,33 +1148,7 @@ public class Main {
     public void lock(Properties props) {
         try {
             if (Boolean.parseBoolean(props.getProperty(PROPERTY_USE_LOCK, "true"))) {
-                String clz = props.getProperty(PROPERTY_LOCK_CLASS, PROPERTY_LOCK_CLASS_DEFAULT);
-                lock = (Lock) Class.forName(clz).getConstructor(Properties.class).newInstance(props);
-                boolean lockLogged = false;
-                setStartLevel(lockStartLevel);
-                while (!exiting) {
-                    if (lock.lock()) {
-                        if (lockLogged) {
-                            LOG.info("Lock acquired.");
-                        }
-                        setupShutdown(props);
-                        setStartLevel(defaultStartLevel);
-                        for (;;) {
-                            if (!lock.isAlive()) {
-                                break;
-                            }
-                            Thread.sleep(lockDelay);
-                        }
-                        if (framework.getState() == Bundle.ACTIVE && !exiting) {
-                            LOG.info("Lost the lock, stopping this instance ...");
-                            setStartLevel(lockStartLevel);
-                        }
-                    } else if (!lockLogged) {
-                        LOG.info("Waiting for the lock ...");
-                        lockLogged = true;
-                    }
-                    Thread.sleep(lockDelay);
-                } 
+                doLock(props);
             } else {
                 setStartLevel(defaultStartLevel);
             }
@@ -1176,6 +1157,36 @@ public class Main {
         }
     }
 
+    private void doLock(Properties props) throws Exception {
+        String clz = props.getProperty(PROPERTY_LOCK_CLASS, PROPERTY_LOCK_CLASS_DEFAULT);
+        lock = (Lock) Class.forName(clz).getConstructor(Properties.class).newInstance(props);
+        boolean lockLogged = false;
+        setStartLevel(lockStartLevel);
+        while (!exiting) {
+            if (lock.lock()) {
+                if (lockLogged) {
+                    LOG.info("Lock acquired.");
+                }
+                setupShutdown(props);
+                setStartLevel(defaultStartLevel);
+                for (;;) {
+                    if (!lock.isAlive()) {
+                        break;
+                    }
+                    Thread.sleep(lockDelay);
+                }
+                if (framework.getState() == Bundle.ACTIVE && !exiting) {
+                    LOG.info("Lost the lock, stopping this instance ...");
+                    setStartLevel(lockStartLevel);
+                }
+            } else if (!lockLogged) {
+                LOG.info("Waiting for the lock ...");
+                lockLogged = true;
+            }
+            Thread.sleep(lockDelay);
+        }
+    }
+
     public void unlock() throws Exception {
         if (lock != null) {
             lock.release();
@@ -1194,23 +1205,7 @@ public class Main {
     private ServerSocket shutdownSocket;
 
     protected void setupShutdown(Properties props) {
-        try {
-            String pidFile = props.getProperty(KARAF_SHUTDOWN_PID_FILE);
-            if (pidFile != null) {
-                RuntimeMXBean rtb = ManagementFactory.getRuntimeMXBean();
-                String processName = rtb.getName();
-                Pattern pattern = Pattern.compile("^([0-9]+)@.+$", Pattern.CASE_INSENSITIVE);
-                Matcher matcher = pattern.matcher(processName);
-                if (matcher.matches()) {
-                    int pid = Integer.parseInt(matcher.group(1));
-                    Writer w = new OutputStreamWriter(new FileOutputStream(pidFile));
-                    w.write(Integer.toString(pid));
-                    w.close();
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+        writePid(props);
         try {
             int port = Integer.parseInt(props.getProperty(KARAF_SHUTDOWN_PORT, "0"));
             String host = props.getProperty(KARAF_SHUTDOWN_HOST, "localhost");
@@ -1226,78 +1221,7 @@ public class Main {
                     w.write(Integer.toString(port));
                     w.close();
                 }
-                Thread thread = new Thread() {
-                    public void run() {
-                        try {
-                            while (true) {
-                                // Wait for the next connection
-                                Socket socket = null;
-                                InputStream stream = null;
-                                try {
-                                    socket = shutdownSocket.accept();
-                                    socket.setSoTimeout(10 * 1000);  // Ten seconds
-                                    stream = socket.getInputStream();
-                                } catch (AccessControlException ace) {
-                                    LOG.log(Level.WARNING, "Karaf shutdown socket: security exception: "
-                                                       + ace.getMessage(), ace);
-                                    continue;
-                                } catch (IOException e) {
-                                    LOG.log(Level.SEVERE, "Karaf shutdown socket: accept: ", e);
-                                    System.exit(1);
-                                }
-
-                                // Read a set of characters from the socket
-                                StringBuilder command = new StringBuilder();
-                                int expected = 1024; // Cut off to avoid DoS attack
-                                while (expected < shutdown.length()) {
-                                    if (random == null) {
-                                        random = new Random();
-                                    }
-                                    expected += (random.nextInt() % 1024);
-                                }
-                                while (expected > 0) {
-                                    int ch = -1;
-                                    try {
-                                        ch = stream.read();
-                                    } catch (IOException e) {
-                                        LOG.log(Level.WARNING, "Karaf shutdown socket:  read: ", e);
-                                        ch = -1;
-                                    }
-                                    if (ch < 32) {  // Control character or EOF terminates loop
-                                        break;
-                                    }
-                                    command.append((char) ch);
-                                    expected--;
-                                }
-
-                                // Close the socket now that we are done with it
-                                try {
-                                    socket.close();
-                                } catch (IOException e) {
-                                    // Ignore
-                                }
-
-                                // Match against our command string
-                                boolean match = command.toString().equals(shutdown);
-                                if (match) {
-                                    LOG.log(Level.INFO, "Karaf shutdown socket: received shutdown command. Stopping framework...");
-                                    framework.stop();
-                                    break;
-                                } else {
-                                    LOG.log(Level.WARNING, "Karaf shutdown socket:  Invalid command '" +
-                                                       command.toString() + "' received");
-                                }
-                            }
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        } finally {
-                            try {
-                                shutdownSocket.close();
-                            } catch (IOException e) {
-                            }
-                        }
-                    }
-                };
+                Thread thread = new ShutdownSocketThread(shutdown);
                 thread.setDaemon(true);
                 thread.start();
             }
@@ -1306,4 +1230,104 @@ public class Main {
         }
     }
 
+    private void writePid(Properties props) {
+        try {
+            String pidFile = props.getProperty(KARAF_SHUTDOWN_PID_FILE);
+            if (pidFile != null) {
+                RuntimeMXBean rtb = ManagementFactory.getRuntimeMXBean();
+                String processName = rtb.getName();
+                Pattern pattern = Pattern.compile("^([0-9]+)@.+$", Pattern.CASE_INSENSITIVE);
+                Matcher matcher = pattern.matcher(processName);
+                if (matcher.matches()) {
+                    int pid = Integer.parseInt(matcher.group(1));
+                    Writer w = new OutputStreamWriter(new FileOutputStream(pidFile));
+                    w.write(Integer.toString(pid));
+                    w.close();
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private class ShutdownSocketThread extends Thread {
+
+        private final String shutdown;
+
+        public ShutdownSocketThread(String shutdown) {
+            this.shutdown = shutdown;
+        }
+
+        public void run() {
+            try {
+                while (true) {
+                    // Wait for the next connection
+                    Socket socket = null;
+                    InputStream stream = null;
+                    try {
+                        socket = shutdownSocket.accept();
+                        socket.setSoTimeout(10 * 1000);  // Ten seconds
+                        stream = socket.getInputStream();
+                    } catch (AccessControlException ace) {
+                        LOG.log(Level.WARNING, "Karaf shutdown socket: security exception: "
+                                           + ace.getMessage(), ace);
+                        continue;
+                    } catch (IOException e) {
+                        LOG.log(Level.SEVERE, "Karaf shutdown socket: accept: ", e);
+                        System.exit(1);
+                    }
+
+                    // Read a set of characters from the socket
+                    StringBuilder command = new StringBuilder();
+                    int expected = 1024; // Cut off to avoid DoS attack
+                    while (expected < shutdown.length()) {
+                        if (random == null) {
+                            random = new Random();
+                        }
+                        expected += (random.nextInt() % 1024);
+                    }
+                    while (expected > 0) {
+                        int ch;
+                        try {
+                            ch = stream.read();
+                        } catch (IOException e) {
+                            LOG.log(Level.WARNING, "Karaf shutdown socket:  read: ", e);
+                            ch = -1;
+                        }
+                        if (ch < 32) {  // Control character or EOF terminates loop
+                            break;
+                        }
+                        command.append((char) ch);
+                        expected--;
+                    }
+
+                    // Close the socket now that we are done with it
+                    try {
+                        socket.close();
+                    } catch (IOException e) {
+                        // Ignore
+                    }
+
+                    // Match against our command string
+                    boolean match = command.toString().equals(shutdown);
+                    if (match) {
+                        LOG.log(Level.INFO, "Karaf shutdown socket: received shutdown command. Stopping framework...");
+                        framework.stop();
+                        break;
+                    } else {
+                        LOG.log(Level.WARNING, "Karaf shutdown socket:  Invalid command '" +
+                                           command.toString() + "' received");
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                try {
+                    shutdownSocket.close();
+                } catch (IOException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
 }