package org.jvnet.hudson.plugins.jira.issueversioning.plugin.hudson.utils; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import hudson.matrix.MatrixConfiguration; import hudson.maven.MavenModule; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Hudson; import hudson.model.ItemGroup; import org.codehaus.plexus.util.StringUtils; import org.jvnet.hudson.plugins.jira.issueversioning.plugin.hudson.JiraProjectKeyJobProperty; /** * Helper class for Hudson Jobs * * @author <a href="mailto:from.hudson@nisgits.net">Stig Kleppe-J;odash&rgensen</a> */ public class ProjectUtils { /** * Get all the Hudson Projects * * @return {@link Set} of {@link AbstractProject} objects */ @SuppressWarnings("unchecked") public static Set<AbstractProject<?, ?>> getAllProjects() { final Set<AbstractProject<?, ?>> supported = new HashSet<AbstractProject<?, ?>>(); final List<AbstractProject> projects = Hudson.getInstance().getAllItems(AbstractProject.class); for (AbstractProject<?, ?> project : projects) { if (isSupportedProjectType(project)) { supported.add(project); } } return supported; } /** * Get all the Hudson Projects * * @return {@link Set} of {@link AbstractProject} objects */ @SuppressWarnings("unchecked") public static Set<AbstractProject<?, ?>> getAllProjectsIncludingModules() { final Set<AbstractProject<?, ?>> supported = new HashSet<AbstractProject<?, ?>>(); final List<AbstractProject> projects = Hudson.getInstance().getAllItems(AbstractProject.class); for (AbstractProject<?, ?> project : projects) { supported.add(project); } return supported; } /** * Get the Hudson Project by Jira Project Key * * @param key the Jira project key * @return the {@link AbstractProject}, may be <code>null</code> if no {@link AbstractProject} can be found */ public static AbstractProject<?, ?> getProjectByJiraProjectKey(final String key) { final Set<AbstractProject<?, ?>> projects = getAllProjectsIncludingModules(); for (AbstractProject<?, ?> project : projects) { if (project.getProperty(JiraProjectKeyJobProperty.class) != null) { final JiraProjectKeyJobProperty jiraProperty = (JiraProjectKeyJobProperty) project.getProperty(JiraProjectKeyJobProperty.class); if (key.equals(jiraProperty.getKey())) { if (isSupportedProjectType(project)) { return project; } else { return (AbstractProject<?, ?>) project.getParent(); } } } } return null; } /** * Get a Hudson project by name * * @param projectName the name of the project * @param parentName the name of the project parent, may be <code>null</code> if the project doesn't have a * parent, required if looking up a subproject like MavenModule * @return the {@link AbstractProject} object */ public static AbstractProject<?, ?> getProjectByName(String projectName, String parentName) { if (StringUtils.isEmpty(parentName)) { return (AbstractProject<?, ?>) Hudson.getInstance().getItem(projectName); } else { final AbstractProject<?, ?> parent = (AbstractProject<?, ?>) Hudson.getInstance().getItem(parentName); return (AbstractProject<?, ?>) ((ItemGroup<?>) parent).getItem(projectName); } } /** * Check if the Jira integration supports the project * * @param <PROJECT> the Type of the project * @param project the {@link AbstractProject} project to check * @return <code>true</code> if supported, <code>false</code> otherwise */ public static <PROJECT extends AbstractProject<?, ?>> boolean isSupportedProjectType(PROJECT project) { return (!(project instanceof MavenModule) && !(project instanceof MatrixConfiguration)); } /** * Get all the builds of a project * * @param <PROJECT> the Type of project * @param project the project to get all the builds for * @return {@link List} of Builds */ @SuppressWarnings("unchecked") public static <PROJECT extends AbstractProject<?, ?>> List<AbstractBuild<?, ?>> getProjectModuleBuilds( PROJECT project) { final List<AbstractBuild<?, ?>> builds = new ArrayList<AbstractBuild<?, ?>>(); if (project instanceof ItemGroup) { final Collection<PROJECT> modules = ((ItemGroup<PROJECT>) project).getItems(); for (PROJECT module : modules) { builds.addAll(module.getBuilds()); } } return builds; } /** * Get all the builds of a {@link List} of projects * * @param <PROJECT> the Type of project * @param projects the {@link List} of projects to get all the builds for * @return {@link List} of Builds */ public static <PROJECT extends AbstractProject<?, ?>> List<AbstractBuild<?, ?>> getProjectModuleBuilds( Collection<PROJECT> projects) { final List<AbstractBuild<?, ?>> builds = new ArrayList<AbstractBuild<?, ?>>(); for (PROJECT project : projects) { builds.addAll(getProjectModuleBuilds(project)); } return builds; } /** * Get the {@link JiraProjectKeyJobProperty} of a given Hudson Project * * @param <PROJECT> the Project type * @param project the Hudson project * @return the {@link JiraProjectKeyJobProperty} property of the project if any is configured, may be * <code>null</code> */ public static <PROJECT extends AbstractProject<?, ?>> JiraProjectKeyJobProperty getJiraProjectKeyPropertyOfProject( PROJECT project) { if (project.getProperty(JiraProjectKeyJobProperty.class) != null) { return (JiraProjectKeyJobProperty) project.getProperty(JiraProjectKeyJobProperty.class); } return null; } }