/* * FindBugs - Find Bugs in Java programs * Copyright (C) 2003-2008 University of Maryland * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package edu.umd.cs.findbugs.cloud; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import edu.umd.cs.findbugs.BugCollection; import edu.umd.cs.findbugs.DetectorFactoryCollection; import edu.umd.cs.findbugs.IGuiCallback; import edu.umd.cs.findbugs.Plugin; import edu.umd.cs.findbugs.SystemProperties; /** * @author pwilliam */ public class CloudFactory { private static final String FINDBUGS_NAMELOOKUP_CLASSNAME = "findbugs.namelookup.classname"; private static final String FINDBUGS_NAMELOOKUP_REQUIRED = "findbugs.namelookup.required"; public static final String FAIL_ON_CLOUD_ERROR_PROP = "findbugs.failOnCloudError"; public static final boolean FAIL_ON_CLOUD_ERROR = SystemProperties.getBoolean(FAIL_ON_CLOUD_ERROR_PROP, false); public static boolean DEBUG = SystemProperties.getBoolean("findbugs.cloud.debug", false); public static String DEFAULT_CLOUD = SystemProperties.getProperty("findbugs.cloud.default"); private static final Logger LOGGER = Logger.getLogger(CloudFactory.class.getName()); public static Cloud createCloudWithoutInitializing(BugCollection bc) { CloudPlugin plugin = getCloudPlugin(bc); if (plugin == null) { LOGGER.log(Level.FINE, "default cloud " + DEFAULT_CLOUD + " not registered"); return getPlainCloud(bc); } LOGGER.log(Level.FINE, "Using cloud plugin " + plugin.getId()); try { Class<? extends Cloud> cloudClass = plugin.getCloudClass(); Properties properties = bc.getProject().getCloudProperties(); Constructor<? extends Cloud> constructor = cloudClass.getConstructor(CloudPlugin.class, BugCollection.class, Properties.class); Cloud cloud = constructor.newInstance(plugin, bc, properties); if (DEBUG) bc.getProject().getGuiCallback().showMessageDialog("constructed " + cloud.getClass().getName()); LOGGER.log(Level.FINE, "constructed cloud plugin " + plugin.getId()); return cloud; } catch (InvocationTargetException e) { return handleInitializationException(bc, plugin, e.getCause()); } catch (Exception e) { return handleInitializationException(bc, plugin, e); } } /** * @param bc * @return */ public static CloudPlugin getCloudPlugin(BugCollection bc) { CloudPlugin plugin = null; String cloudId = bc.getProject().getCloudId(); if (cloudId != null) { plugin = DetectorFactoryCollection.instance().getRegisteredClouds().get(cloudId); if (plugin == null && FAIL_ON_CLOUD_ERROR) throw new IllegalArgumentException("Cannot find registered cloud for " + cloudId); } // is the desired plugin disabled for this project (and/or globally)? if so, skip it. if (plugin != null) { Plugin fbplugin = Plugin.getByPluginId(plugin.getFindbugsPluginId()); //noinspection PointlessBooleanExpression if (fbplugin != null && bc.getProject().getPluginStatus(fbplugin) == false) { plugin = null; // use default cloud below } } if (plugin == null) { if (DEFAULT_CLOUD != null) LOGGER.log(Level.FINE, "Trying default cloud " + DEFAULT_CLOUD); cloudId = DEFAULT_CLOUD; plugin = DetectorFactoryCollection.instance().getRegisteredClouds().get(cloudId); } return plugin; } public static Cloud handleInitializationException(BugCollection bc, CloudPlugin plugin, Throwable e) { if (DEBUG) { bc.getProject().getGuiCallback().showMessageDialog("failed " + e.getMessage() + e.getClass().getName()); } LOGGER.log(Level.WARNING, "Could not load cloud plugin " + plugin, e); if (SystemProperties.getBoolean("findbugs.failIfUnableToConnectToCloud")) System.exit(1); return getPlainCloud(bc); } public static void initializeCloud(BugCollection bc, Cloud cloud) throws IOException { IGuiCallback callback = bc.getProject().getGuiCallback(); if (!cloud.availableForInitialization()) return; if (DEBUG) callback.showMessageDialog("attempting to initialize " + cloud.getClass().getName()); if (!cloud.initialize()) throw new IOException("Unable to connect to " + cloud.getCloudName()); if (DEBUG) callback.showMessageDialog("initialized " + cloud.getClass().getName()); } public static Cloud getPlainCloud(BugCollection bc) { DoNothingCloud cloud = new DoNothingCloud(bc); if (cloud.initialize()) return cloud; throw new IllegalStateException("Unable to initialize DoNothingCloud"); } }