001 /* 002 * Copyright (C) 2010 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.plugin; 021 022 import org.crsh.vfs.Resource; 023 import org.slf4j.Logger; 024 import org.slf4j.LoggerFactory; 025 026 import java.io.ByteArrayInputStream; 027 import java.io.IOException; 028 import java.util.Properties; 029 030 /** 031 * Controls the life cycle of a plugin manager. 032 * 033 * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> 034 * @version $Revision$ 035 */ 036 public abstract class PluginLifeCycle { 037 038 /** . */ 039 protected final Logger log = LoggerFactory.getLogger(getClass()); 040 041 /** . */ 042 private PluginContext context; 043 044 /** . */ 045 private Properties config; 046 047 public Properties getConfig() { 048 return config; 049 } 050 051 public void setConfig(Properties config) { 052 this.config = config; 053 } 054 055 public PluginContext getContext() { 056 return context; 057 } 058 059 protected final void start(PluginContext context) throws IllegalStateException { 060 if (this.context != null) { 061 throw new IllegalStateException("Already started"); 062 } 063 064 // Get properties from system properties 065 Properties config = new Properties(); 066 067 // Load properties from configuration file 068 Resource res = context.loadResource("crash.properties", ResourceKind.CONFIG); 069 if (res != null) { 070 try { 071 config.load(new ByteArrayInputStream(res.getContent())); 072 log.debug("Loaded properties from " + config); 073 } catch (IOException e) { 074 log.warn("Could not configure from crash.properties", e); 075 } 076 } else { 077 log.debug("Could not find crash.properties file"); 078 } 079 080 // Override default properties from external config 081 if (this.config != null) { 082 config.putAll(this.config); 083 } 084 085 // Override default properties from command line 086 for (PropertyDescriptor<?> desc : PropertyDescriptor.ALL.values()) { 087 configureProperty(context, config, desc); 088 } 089 090 // Override default properties from plugin defined properties. 091 for (final CRaSHPlugin<?> plugin : context.manager.getPlugins()) 092 { 093 for (PropertyDescriptor<?> descriptor : plugin.getConfigurationCapabilities()) { 094 configureProperty(context, config, descriptor); 095 } 096 } 097 098 // 099 context.start(); 100 101 // 102 this.context = context; 103 } 104 105 public final void stop() throws IllegalStateException { 106 if (context == null) { 107 throw new IllegalStateException("Not started"); 108 } 109 PluginContext context = this.context; 110 this.context = null; 111 context.stop(); 112 } 113 114 private void configureProperty(PluginContext context, Properties props, PropertyDescriptor<?> desc) { 115 String key = "crash." + desc.name; 116 String value = props.getProperty(key); 117 if (value != null) { 118 try { 119 log.info("Configuring property " + desc.name + "=" + value + " from properties"); 120 context.setProperty(desc, value); 121 } 122 catch (IllegalArgumentException e) { 123 log.error("Could not configure property", e); 124 } 125 } 126 } 127 }