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.plugin; 021 022 import org.crsh.util.Utils; 023 024 import java.util.ArrayList; 025 import java.util.Collections; 026 import java.util.List; 027 import java.util.logging.Logger; 028 029 public abstract class CRaSHPlugin<P> { 030 031 /** . */ 032 protected final Logger log = Logger.getLogger(getClass().getName()); 033 034 /** . */ 035 public static final int FAILED = -1; 036 037 /** . */ 038 public static final int CONSTRUCTED = 0; 039 040 /** . */ 041 public static final int INITIALIZING = 1; 042 043 /** . */ 044 public static final int INITIALIZED = 2; 045 046 /** . */ 047 PluginContext context; 048 049 /** . */ 050 int status; 051 052 /** . */ 053 private final Class<P> type; 054 055 /** . */ 056 private List<PropertyDescriptor<?>> configurationCapabilities; 057 058 protected CRaSHPlugin() { 059 this.type = (Class<P>)Utils.resolveToClass(getClass(), CRaSHPlugin.class, 0); 060 this.status = CONSTRUCTED; 061 this.context = null; 062 } 063 064 protected final PluginContext getContext() { 065 return context; 066 } 067 068 /** 069 * Returns the current plugin status. 070 * 071 * @return the plugin status 072 */ 073 public int getStatus() { 074 return status; 075 } 076 077 /** 078 * Returns the plugin type. 079 * 080 * @return the plugin type 081 */ 082 public final Class<P> getType() { 083 return type; 084 } 085 086 /** 087 * Returns a list of {@link PropertyDescriptor} this plugin requires for its configuration. 088 * 089 * @return the configuration capabilities 090 */ 091 protected Iterable<PropertyDescriptor<?>> createConfigurationCapabilities() { 092 return Collections.emptyList(); 093 } 094 095 /** 096 * Returns a list of {@link PropertyDescriptor} this plugin requires for its configuration. 097 * 098 * @return the configuration capabilities 099 */ 100 public final Iterable<PropertyDescriptor<?>> getConfigurationCapabilities() { 101 if (configurationCapabilities == null) { 102 List<PropertyDescriptor<?>> configurationCapabilities = Collections.emptyList(); 103 for (PropertyDescriptor<?> pd : createConfigurationCapabilities()) { 104 if (configurationCapabilities.isEmpty()) { 105 configurationCapabilities = new ArrayList<PropertyDescriptor<?>>(); 106 } 107 configurationCapabilities.add(pd); 108 } 109 this.configurationCapabilities = configurationCapabilities.isEmpty() ? configurationCapabilities : Collections.unmodifiableList(configurationCapabilities); 110 } 111 return configurationCapabilities; 112 } 113 114 /** 115 * Returns the implementation. 116 * 117 * @return the implementation 118 */ 119 public abstract P getImplementation(); 120 121 /** 122 * Implement this method to know about init life cycle callback. 123 */ 124 public void init() { 125 } 126 127 /** 128 * Implement this method to know about destroy life cycle callback. 129 */ 130 public void destroy() { 131 } 132 133 @Override 134 public String toString() { 135 return "Plugin[type=" + getClass().getSimpleName() + ",interface=" + type.getSimpleName() + "]"; 136 } 137 }