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 }