1 19 package org.java.plugin.boot; 20 21 import java.io.BufferedReader ; 22 import java.io.File ; 23 import java.io.FileInputStream ; 24 import java.io.IOException ; 25 import java.io.InputStreamReader ; 26 import java.net.MalformedURLException ; 27 import java.util.Collection ; 28 import java.util.HashSet ; 29 import java.util.Iterator ; 30 import java.util.LinkedList ; 31 import java.util.List ; 32 import java.util.Set ; 33 34 import org.apache.commons.logging.Log; 35 import org.apache.commons.logging.LogFactory; 36 import org.java.plugin.ObjectFactory; 37 import org.java.plugin.Plugin; 38 import org.java.plugin.PluginManager; 39 import org.java.plugin.PluginManager.PluginLocation; 40 import org.java.plugin.registry.IntegrityCheckReport; 41 import org.java.plugin.registry.ManifestProcessingException; 42 import org.java.plugin.registry.PluginRegistry; 43 import org.java.plugin.registry.PluginRegistry.ManifestInfo; 44 import org.java.plugin.util.ExtendedProperties; 45 import org.java.plugin.util.IoUtil; 46 import org.java.plugin.util.ResourceManager; 47 48 116 public class DefaultApplicationInitializer implements ApplicationInitializer { 117 protected static final String PARAM_APPLICATION_PLUGIN = 118 "org.java.plugin.boot.applicationPlugin"; protected static final String PARAM_INTEGRITY_CHECK_MODE = 120 "org.java.plugin.boot.integrityCheckMode"; protected static final String PARAM_PLUGINS_COLLECTOR = 122 "org.java.plugin.boot.pluginsCollector"; protected static final String PARAM_PLUGINS_WHITE_LIST = 124 "org.java.plugin.boot.pluginsWhiteList"; protected static final String PARAM_PLUGINS_BLACK_LIST = 126 "org.java.plugin.boot.pluginsBlackList"; 128 private Log log; 129 private ExtendedProperties config; 130 private String integrityCheckMode; 131 private PluginsCollector collector; 132 private Set whiteList; 133 private Set blackList; 134 135 147 public void configure(final ExtendedProperties configuration) 148 throws Exception { 149 String log4jConfigKey = "log4j.configuration"; if (System.getProperty(log4jConfigKey) == null) { 152 if (configuration.containsKey(log4jConfigKey)) { 154 System.setProperty(log4jConfigKey, 155 configuration.getProperty(log4jConfigKey)); 156 } else { 157 File log4jConfig = new File ( 158 configuration.getProperty("applicationRoot") + File.separator + "log4j.properties"); if (!log4jConfig.isFile()) { 161 log4jConfig = new File ( 162 configuration.getProperty("applicationRoot") + File.separator + "log4j.xml"); } 165 if (log4jConfig.isFile()) { 166 try { 167 System.setProperty(log4jConfigKey, 168 IoUtil.file2url(log4jConfig).toExternalForm()); 169 } catch (MalformedURLException e) { 170 } 172 } 173 } 174 } 175 log = LogFactory.getLog(getClass()); 176 log.info("logging system initialized"); log.info("application root is " + configuration.getProperty("applicationRoot")); config = configuration; 180 integrityCheckMode = 181 configuration.getProperty(PARAM_INTEGRITY_CHECK_MODE, "full"); collector = getCollectorInstance( 183 configuration.getProperty(PARAM_PLUGINS_COLLECTOR)); 184 collector.configure(configuration); 185 log.debug("plug-ins collector is " + collector); try { 187 whiteList = loadList( 188 configuration.getProperty(PARAM_PLUGINS_WHITE_LIST, null)); 189 } catch (IOException ioe) { 190 log.warn("failed loading white list", ioe); } 192 if (whiteList != null) { 193 log.debug("white list loaded"); } 195 try { 196 blackList = loadList( 197 configuration.getProperty(PARAM_PLUGINS_BLACK_LIST, null)); 198 } catch (IOException ioe) { 199 log.warn("failed loading black list", ioe); } 201 if (blackList != null) { 202 log.debug("black list loaded"); } 204 } 205 206 private Set loadList(final String location) throws IOException { 207 if (location == null) { 208 return null; 209 } 210 Set result = new HashSet (); 211 BufferedReader reader = new BufferedReader (new InputStreamReader ( 212 new FileInputStream (location), "UTF-8")); try { 214 String line; 215 while ((line = reader.readLine()) != null) { 216 line = line.trim(); 217 if (line.length() > 0) { 218 result.add(line); 219 } 220 } 221 } finally { 222 reader.close(); 223 } 224 log.debug("read " + result.size() + " list items from " + location); return result; 227 } 228 229 private PluginsCollector getCollectorInstance( 230 final String className) { 231 if (className != null) { 232 try { 233 return (PluginsCollector) Class.forName(className) 234 .newInstance(); 235 } catch (InstantiationException ie) { 236 log.warn("failed instantiating plug-ins collector " + className, ie); 238 } catch (IllegalAccessException iae) { 239 log.warn("failed instantiating plug-ins collector " + className, iae); 241 } catch (ClassNotFoundException cnfe) { 242 log.warn("failed instantiating plug-ins collector " + className, cnfe); 244 } 245 } 246 return new DefaultPluginsCollector(); 247 } 248 249 268 public Application initApplication(final BootErrorHandler errorHandler, 269 final String [] args) throws Exception { 270 log.debug("collecting plug-in locations"); Collection pluginLocations = collector.collectPluginLocations(); 273 log.debug("collected " + pluginLocations.size() + " plug-in locations, instantiating plug-in manager"); PluginManager pluginManager = 277 ObjectFactory.newInstance(config).createManager(); 278 pluginLocations = filterPluginLocations(pluginManager.getRegistry(), 279 pluginLocations); 280 log.debug(pluginLocations.size() + " plug-in locations remain after " + "applying filters, publishing plug-ins"); pluginManager.publishPlugins( 284 (PluginLocation[]) pluginLocations.toArray( 285 new PluginLocation[pluginLocations.size()])); 286 if (!"off".equalsIgnoreCase(integrityCheckMode)) { log.debug("checking plug-ins set integrity"); IntegrityCheckReport integrityCheckReport = 290 pluginManager.getRegistry().checkIntegrity( 291 "light".equalsIgnoreCase(integrityCheckMode) ? null : pluginManager.getPathResolver()); 293 log.info("integrity check done: errors - " + integrityCheckReport.countErrors() + ", warnings - " + integrityCheckReport.countWarnings()); 296 if (integrityCheckReport.countErrors() != 0) { 297 log.info(integrityCheckReport2str(integrityCheckReport)); 299 if (!errorHandler.handleError(ResourceManager.getMessage( 300 Boot.PACKAGE_NAME, "integrityCheckFailed"), integrityCheckReport)) { 302 return null; 303 } 304 } else if (log.isDebugEnabled() 305 && ((integrityCheckReport.countErrors() > 0) 306 || (integrityCheckReport.countWarnings() > 0))) { 307 log.debug(integrityCheckReport2str(integrityCheckReport)); 308 } 309 } 310 String appPluginId = config.getProperty(PARAM_APPLICATION_PLUGIN); 312 log.info("application plug-in is " + appPluginId); Plugin appPlugin = pluginManager.getPlugin(appPluginId); 315 log.debug("got application plug-in " + appPlugin + ", initializing application"); if (!(appPlugin instanceof ApplicationPlugin)) { 318 log.error("application plug-in class " + appPlugin.getClass().getName() 320 + " doesn't assignable with " + ApplicationPlugin.class.getName()); 322 throw new ClassCastException (appPlugin.getClass().getName()); 323 } 324 return ((ApplicationPlugin) appPlugin).initApplication( 325 config.getSubset(appPluginId + "."), args); } 327 328 protected String integrityCheckReport2str(final IntegrityCheckReport report) { 329 StringBuffer buf = new StringBuffer (); 330 buf.append("integrity check report:\r\n"); buf.append("-------------- REPORT BEGIN -----------------\r\n"); for (Iterator it = report.getItems().iterator(); it.hasNext();) { 333 IntegrityCheckReport.ReportItem item = 334 (IntegrityCheckReport.ReportItem) it.next(); 335 buf.append("\tseverity=").append(item.getSeverity()) .append("; code=").append(item.getCode()) .append("; message=").append(item.getMessage()) .append("; source=").append(item.getSource()) .append("\r\n"); } 341 buf.append("-------------- REPORT END -----------------"); return buf.toString(); 343 } 344 345 352 protected Collection filterPluginLocations(final PluginRegistry registry, 353 final Collection pluginLocations) 354 throws ManifestProcessingException { 355 if ((whiteList == null) && (blackList == null)) { 356 return pluginLocations; 357 } 358 List result = new LinkedList (); 359 for (Iterator ir = pluginLocations.iterator(); ir.hasNext();) { 360 PluginLocation pluginLocation = (PluginLocation) ir.next(); 361 ManifestInfo manifestInfo = registry.readManifestInfo( 362 pluginLocation.getManifestLocation()); 363 if (whiteList != null) { 364 if (isPluginInList(registry, manifestInfo, whiteList)) { 365 result.add(pluginLocation); 366 continue; 367 } 368 } 369 if ((blackList != null) 370 && isPluginInList(registry, manifestInfo, blackList)) { 371 continue; 372 } 373 result.add(pluginLocation); 374 } 375 return result; 376 } 377 378 private boolean isPluginInList(final PluginRegistry registry, 379 final ManifestInfo manifestInfo, final Set list) { 380 if (list.contains(manifestInfo.getId())) { 381 return true; 382 } 383 return list.contains(registry.makeUniqueId(manifestInfo.getId(), 384 manifestInfo.getVersion())); 385 } 386 } 387 | Popular Tags |