/******************************************************************************** * CruiseControl, a Continuous Integration Toolkit * Copyright (c) 2005 ThoughtWorks, Inc. * 200 E. Randolph, 25th Floor * Chicago, IL 60601 USA * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * + Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * + Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the * names of its contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ********************************************************************************/ package net.sourceforge.cruisecontrol; import net.sourceforge.cruisecontrol.buildloggers.MergeLogger; import net.sourceforge.cruisecontrol.builders.CMakeBuilderOptions; import net.sourceforge.cruisecontrol.publishers.email.EmailMapper; import net.sourceforge.cruisecontrol.publishers.email.EmailMapping; import net.sourceforge.cruisecontrol.config.ConfigurationPlugin; import net.sourceforge.cruisecontrol.config.DashboardConfigurationPlugin; import net.sourceforge.cruisecontrol.config.IncludeProjectsPlugin; import net.sourceforge.cruisecontrol.config.PluginPlugin; import net.sourceforge.cruisecontrol.config.SystemPlugin; import net.sourceforge.cruisecontrol.config.ThreadsPlugin; import net.sourceforge.cruisecontrol.config.DefaultPropertiesPlugin; import java.io.Serializable; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * Type-safe, enumeration of CruiseControl plugin types. */ public final class PluginType implements Serializable { public static final PluginType BOOTSTRAPPER = new PluginType("bootstrapper", "bootstrappers"); public static final PluginType BOOTSTRAPPERS = new PluginType("bootstrappers", "project"); public static final PluginType BUILDER = new PluginType("builder", "schedule"); public static final PluginType CONFIGURATION = new PluginType("configuration", "system"); public static final PluginType CRUISECONTROL = new PluginType("cruisecontrol", ""); public static final PluginType DATE_FORMAT = new PluginType("dateformat", "project"); public static final PluginType INCLUDE_PROJECTS = new PluginType("include.projects", "cruisecontrol"); public static final PluginType DASHBOARD_CONFIGURATION = new PluginType("dashboard", "cruisecontrol"); public static final PluginType LABEL_INCREMENTER = new PluginType("labelincrementer", "project"); public static final PluginType LISTENER = new PluginType("listener", "listeners"); public static final PluginType LISTENERS = new PluginType("listeners", "project"); public static final PluginType LOG = new PluginType("log", "project"); public static final PluginType MAP = new PluginType("map", "email"); public static final PluginType MERGE_LOGGER = new PluginType("logger", "log"); public static final PluginType MANIPULATORS = new PluginType("manipulators", "log"); public static final PluginType MODIFICATION_SET = new PluginType("modificationset", "project"); public static final PluginType PROJECT = new PluginType("project", "cruisecontrol"); public static final PluginType PLUGIN = new PluginType("plugin", "cruisecontrol"); public static final PluginType EMAIL_MAPPER = new PluginType("propertiesmapper", "email"); public static final PluginType PAUSE = new PluginType("pause", "schedule"); public static final PluginType PROPERTIES = new PluginType("property", "cruisecontrol"); public static final PluginType PUBLISHER = new PluginType("publisher", "publishers"); public static final PluginType PUBLISHERS = new PluginType("publishers", "project"); public static final PluginType SCHEDULE = new PluginType("schedule", "project"); public static final PluginType SOURCE_CONTROL = new PluginType("sourcecontrol", "modificationset"); public static final PluginType SYSTEM = new PluginType("system", "cruisecontrol"); public static final PluginType THREADS = new PluginType("threads", "configuration"); public static final PluginType CMAKEOPTIONS = new PluginType("cmakeoptions", "cmake"); private static final Map<Class< ? >, PluginType> PLUGIN_TYPES = new HashMap<Class< ? >, PluginType>() { { put(Bootstrapper.class, BOOTSTRAPPER); put(ProjectConfig.Bootstrappers.class, BOOTSTRAPPERS); put(Builder.class, BUILDER); put(ConfigurationPlugin.class, CONFIGURATION); put(CruiseControlConfig.class, CRUISECONTROL); put(LabelIncrementer.class, LABEL_INCREMENTER); put(IncludeProjectsPlugin.class, INCLUDE_PROJECTS); put(Listener.class, LISTENER); put(ProjectConfig.Listeners.class, LISTENERS); put(Log.class, LOG); put(EmailMapping.class, MAP); put(MergeLogger.class, MERGE_LOGGER); put(Manipulator.class, MANIPULATORS); put(ModificationSet.class, MODIFICATION_SET); put(ProjectConfig.class, PROJECT); put(PluginPlugin.class, PLUGIN); put(EmailMapper.class, EMAIL_MAPPER); put(ProjectConfig.Publishers.class, PUBLISHERS); put(PauseBuilder.class, PAUSE); put(DefaultPropertiesPlugin.class, PROPERTIES); put(Publisher.class, PUBLISHER); put(Schedule.class, SCHEDULE); put(SourceControl.class, SOURCE_CONTROL); put(SystemPlugin.class, SYSTEM); put(ThreadsPlugin.class, THREADS); put(DashboardConfigurationPlugin.class, DASHBOARD_CONFIGURATION); put(CMakeBuilderOptions.class, CMAKEOPTIONS); } }; private final String name; private final String parentElementName; private PluginType(final String type, final String parentElementName) { this.name = type; this.parentElementName = parentElementName; } public static PluginType find(final Class< ? > pluginClass) { if (pluginClass != null) { for (final Map.Entry<Class< ? >, PluginType> element : PLUGIN_TYPES.entrySet()) { if (element.getKey().isAssignableFrom(pluginClass)) { return element.getValue(); } } } throw new IllegalArgumentException(pluginClass + " is not a CruiseControl plugin."); } public static PluginType[] getTypes() { final Set<PluginType> uniqueValues = new HashSet<PluginType>(PLUGIN_TYPES.values()); return uniqueValues.toArray(new PluginType[uniqueValues.size()]); } public static PluginType find(String name) { if (name != null) { for (final Map.Entry<Class< ? >, PluginType> element : PLUGIN_TYPES.entrySet()) { PluginType nextType = element.getValue(); if (nextType.getName().equals(name)) { return nextType; } } } throw new IllegalArgumentException(name + " is not a CruiseControl plugin."); } public String getName() { return this.name; } public String getParentElementName() { return parentElementName; } public String toString() { return getName(); } private Object readResolve() { return PluginType.find(this.name); } }