001    /*
002     * Copyright 2010 the original author or authors.
003     * 
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package com.hs.mail.container.simple;
017    
018    import java.io.File;
019    
020    import org.apache.commons.beanutils.ConstructorUtils;
021    import org.apache.commons.beanutils.MethodUtils;
022    import org.apache.log4j.Logger;
023    
024    /**
025     * Simple spring component container
026     * 
027     * @author Won Chul Doh
028     * @since Jan 11, 2010
029     */
030    public class SimpleSpringContainer {
031    
032            private static Logger logger = Logger.getLogger(SimpleSpringContainer.class);
033            
034            private static final String IMPL_CLASS_NAME = "org.springframework.context.support.FileSystemXmlApplicationContext";
035            
036            protected String[] configLocations;
037            
038            protected Object applicationContext;
039    
040            public SimpleSpringContainer(String[] configLocations) {
041                    super();
042                    this.configLocations = configLocations;
043            }
044    
045            public Object createFileSystemXmlApplicationContext(String[] configLocations)
046                            throws Exception {
047                    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
048                    Class klass = classLoader.loadClass(IMPL_CLASS_NAME);
049    
050                    Object[] args = new Object[] { configLocations, new Boolean(false) };
051                    Object applicationContext = ConstructorUtils.invokeConstructor(klass, args);
052                    MethodUtils.invokeMethod(applicationContext, "refresh", null);
053    
054                    return applicationContext;
055            }
056    
057            public void start() throws Exception {
058                    this.applicationContext = createFileSystemXmlApplicationContext(this.configLocations);
059                    SpringContainerShutdownHook hook = new SpringContainerShutdownHook(this);
060                    Runtime.getRuntime().addShutdownHook(hook);
061            }
062    
063        public void forceShutdown() {
064                    try {
065                            MethodUtils.invokeMethod(this.applicationContext, "stop", null);
066                            MethodUtils.invokeMethod(this.applicationContext, "close", null);
067                    } catch (Exception e) {
068                    }
069            }
070    
071        /**
072             * @param args
073             */
074            public static void main(String[] args) {
075                    String configLocation = (args.length > 0) ? args[0].trim()
076                                    : "conf/applicationContext.xml";
077    
078                    try {
079                            String[] configLocations = new String[1];
080                            configLocations[0] = new File(configLocation).getCanonicalPath();
081                            System.setProperty("app.home", new File(configLocations[0]).getParentFile().getParent());
082                            SimpleSpringContainer container = new SimpleSpringContainer(
083                                            configLocations);
084                            container.start();
085                    } catch (Exception e) {
086                            String errMsg = (e.getMessage() != null) ? e.getMessage() : e.getCause().getMessage();
087                            System.err.println(errMsg);
088                            logger.fatal(errMsg, e);
089                    }
090            }
091    }
092    
093    final class SpringContainerShutdownHook extends Thread {
094            private SimpleSpringContainer container;
095    
096            protected SpringContainerShutdownHook(SimpleSpringContainer container) {
097                    this.container = container;
098            }
099    
100            public void run() {
101                    this.container.forceShutdown();
102            }
103    }