001    /*
002     * Copyright (C) 2012 eXo Platform SAS.
003     *
004     * This is free software; you can redistribute it and/or modify it
005     * under the terms of the GNU Lesser General Public License as
006     * published by the Free Software Foundation; either version 2.1 of
007     * the License, or (at your option) any later version.
008     *
009     * This software is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012     * Lesser General Public License for more details.
013     *
014     * You should have received a copy of the GNU Lesser General Public
015     * License along with this software; if not, write to the Free
016     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018     */
019    
020    package org.crsh.spring;
021    
022    import org.crsh.plugin.PluginContext;
023    import org.crsh.plugin.PluginDiscovery;
024    import org.crsh.plugin.PluginLifeCycle;
025    import org.crsh.plugin.ServiceLoaderDiscovery;
026    import org.crsh.vfs.FS;
027    import org.crsh.vfs.Path;
028    import org.springframework.beans.BeansException;
029    import org.springframework.beans.factory.BeanClassLoaderAware;
030    import org.springframework.beans.factory.BeanFactory;
031    import org.springframework.beans.factory.BeanFactoryAware;
032    import org.springframework.beans.factory.DisposableBean;
033    import org.springframework.beans.factory.InitializingBean;
034    import org.springframework.beans.factory.ListableBeanFactory;
035    
036    import java.io.IOException;
037    import java.net.URISyntaxException;
038    import java.util.Collections;
039    import java.util.HashMap;
040    import java.util.Map;
041    
042    public class SpringBootstrap extends PluginLifeCycle implements
043        BeanClassLoaderAware,
044        BeanFactoryAware,
045        InitializingBean,
046        DisposableBean {
047    
048      /** . */
049      private ClassLoader loader;
050    
051      /** . */
052      private BeanFactory factory;
053    
054      public SpringBootstrap() {
055      }
056    
057      public void setBeanClassLoader(ClassLoader loader) {
058        this.loader = loader;
059      }
060    
061      public void setBeanFactory(BeanFactory factory) throws BeansException {
062        this.factory = factory;
063      }
064    
065      public void afterPropertiesSet() throws Exception {
066    
067        // List beans
068        Map<String,Object> attributes = new HashMap<String, Object>();
069        attributes.put("factory", factory);
070        if (factory instanceof ListableBeanFactory) {
071          ListableBeanFactory listable = (ListableBeanFactory)factory;
072          attributes.put("beans", new SpringMap(listable));
073        }
074    
075        //
076        PluginDiscovery discovery = new SpringPluginDiscovery(loader, factory);
077    
078        //
079        FS cmdFS = createCommandFS();
080    
081        //
082        FS confFS = createConfFS();
083    
084        //
085        PluginContext context = new PluginContext(
086            discovery,
087            Collections.unmodifiableMap(attributes),
088            cmdFS,
089            confFS,
090            loader);
091    
092        //
093        context.refresh();
094    
095        //
096        start(context);
097      }
098    
099      protected FS createCommandFS() throws IOException, URISyntaxException {
100        FS cmdFS = new FS();
101        cmdFS.mount(loader, Path.get("/crash/commands/"));
102        return cmdFS;
103      }
104    
105      protected FS createConfFS() throws IOException, URISyntaxException {
106        FS confFS = new FS();
107        confFS.mount(loader, Path.get("/crash/"));
108        return confFS;
109      }
110    
111      public void destroy() throws Exception {
112        stop();
113      }
114    }