001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    package org.apache.geronimo.kernel.util;
018    
019    import java.io.IOException;
020    import java.io.InputStream;
021    
022    import org.apache.geronimo.kernel.Kernel;
023    import org.apache.geronimo.kernel.KernelFactory;
024    import org.apache.geronimo.kernel.config.ConfigurationUtil;
025    
026    /**
027     *
028     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
029     */
030    public class MainConfigurationBootstrapper {
031    
032        public static void main(String[] args) {
033            int status = main(new MainConfigurationBootstrapper(), args);
034            System.exit(status);
035        }
036    
037        public static int main(MainConfigurationBootstrapper bootstrapper, Object opaque) {
038            Main main = bootstrapper.getMain(MainConfigurationBootstrapper.class.getClassLoader());
039    
040            int exitCode;
041            ClassLoader oldTCCL = Thread.currentThread().getContextClassLoader();
042            try {
043                ClassLoader newTCCL = main.getClass().getClassLoader();
044                Thread.currentThread().setContextClassLoader(newTCCL);
045                exitCode = main.execute(opaque);
046            } finally {
047                Thread.currentThread().setContextClassLoader(oldTCCL);
048            }
049            return exitCode;
050        }
051    
052        protected Kernel kernel;
053    
054        public Main getMain(ClassLoader classLoader) {
055            try {
056                bootKernel();
057                loadBootConfiguration(classLoader);
058                loadPersistentConfigurations();
059                return getMain();
060            } catch (Exception e) {
061                if (null != kernel) {
062                    kernel.shutdown();
063                }
064                e.printStackTrace();
065                System.exit(1);
066                throw new AssertionError();
067            }
068        }
069        
070        public void bootKernel() throws Exception {
071            kernel = KernelFactory.newInstance().createKernel("MainBootstrapper");
072            kernel.boot();
073    
074            Runtime.getRuntime().addShutdownHook(new Thread("MainBootstrapper shutdown thread") {
075                public void run() {
076                    kernel.shutdown();
077                }
078            });
079        }
080        
081        public void loadBootConfiguration(ClassLoader classLoader) throws Exception {
082            InputStream in = classLoader.getResourceAsStream("META-INF/config.ser");
083            try {
084                ConfigurationUtil.loadBootstrapConfiguration(kernel, in, classLoader, true);
085            } finally {
086                if (in != null) {
087                    try {
088                        in.close();
089                    } catch (IOException ignored) {
090                        // ignored
091                    }
092                }
093            }
094        }
095        
096        public void loadPersistentConfigurations() throws Exception {
097        }
098    
099        public Main getMain() throws Exception {
100            return (Main) kernel.getGBean(Main.class);
101        }
102    
103        public Kernel getKernel() {
104            return kernel;
105        }
106        
107    }