diff --git a/blueocean-events/src/main/java/io/jenkins/blueocean/events/BlueMessageEnricher.java b/blueocean-events/src/main/java/io/jenkins/blueocean/events/BlueMessageEnricher.java index a20b716a..e36aed05 100644 --- a/blueocean-events/src/main/java/io/jenkins/blueocean/events/BlueMessageEnricher.java +++ b/blueocean-events/src/main/java/io/jenkins/blueocean/events/BlueMessageEnricher.java @@ -56,7 +56,7 @@ public class BlueMessageEnricher extends MessageEnricher { public void enrich(@Nonnull Message message) { // TODO: Replace once https://issues.jenkins-ci.org/browse/JENKINS-36286 is done - message.set(EventProps.Jenkins.jenkins_org, OrganizationImpl.INSTANCE.getName()); + message.set(EventProps.Jenkins.jenkins_org, OrganizationImpl.DEFAULT_ORGANIZATION.getName()); String channelName = message.getChannelName(); if (channelName.equals(Events.JobChannel.NAME)) { @@ -80,7 +80,7 @@ public class BlueMessageEnricher extends MessageEnricher { // TODO: Replace once https://issues.jenkins-ci.org/browse/JENKINS-36286 is done private static @Nonnull Link getLink(@Nonnull ParameterizedJobMixIn.ParameterizedJob job) { - Link orgLink = new Link("/rest/organizations/" + OrganizationImpl.INSTANCE.getName()); + Link orgLink = new Link("/rest/organizations/" + OrganizationImpl.DEFAULT_ORGANIZATION.getName()); if (job instanceof WorkflowJob) { ItemGroup parent = job.getParent(); diff --git a/blueocean-rest-impl/pom.xml b/blueocean-rest-impl/pom.xml index a9f243e3..1ba04078 100644 --- a/blueocean-rest-impl/pom.xml +++ b/blueocean-rest-impl/pom.xml @@ -122,7 +122,11 @@ token-macro 1.12.1 - + + org.jenkins-ci.plugins + jenkins-organizations + 1.0-SNAPSHOT + diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/AbstractRunImpl.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/AbstractRunImpl.java index ba7cc626..c3ffbbb1 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/AbstractRunImpl.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/AbstractRunImpl.java @@ -58,7 +58,7 @@ public class AbstractRunImpl extends BlueRun { @Override public String getOrganization() { - return OrganizationImpl.INSTANCE.getName(); + return OrganizationImpl.DEFAULT_ORGANIZATION.getName(); } @Override @@ -247,7 +247,7 @@ public class AbstractRunImpl extends BlueRun { @Override public Link getLink() { if(parent == null){ - return OrganizationImpl.INSTANCE.getLink().rel(String.format("pipelines/%s/runs/%s", run.getParent().getName(), getId())); + return OrganizationImpl.DEFAULT_ORGANIZATION.getLink().rel(String.format("pipelines/%s/runs/%s", run.getParent().getName(), getId())); } return parent.rel("runs/"+getId()); } diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/BluePipelineFactory.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/BluePipelineFactory.java index c7f03740..cbf53a80 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/BluePipelineFactory.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/BluePipelineFactory.java @@ -56,7 +56,7 @@ public abstract class BluePipelineFactory implements ExtensionPoint { Item nextStep = findNextStep(Jenkins.getInstance(), item); for (BluePipelineFactory f : all()) { - Resource r = f.resolve(nextStep, OrganizationImpl.INSTANCE.getPipelines(), item); + Resource r = f.resolve(nextStep, OrganizationImpl.DEFAULT_ORGANIZATION.getPipelines(), item); if (r!=null) return r; } return null; diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/MultiBranchPipelineImpl.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/MultiBranchPipelineImpl.java index 6bd1cc37..95bc59ff 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/MultiBranchPipelineImpl.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/MultiBranchPipelineImpl.java @@ -43,12 +43,12 @@ public class MultiBranchPipelineImpl extends BlueMultiBranchPipeline { private final Link self; public MultiBranchPipelineImpl(MultiBranchProject mbp) { this.mbp = mbp; - this.self = OrganizationImpl.INSTANCE.getLink().rel("pipelines").rel(PipelineImpl.getRecursivePathFromFullName(this)); + this.self = OrganizationImpl.DEFAULT_ORGANIZATION.getLink().rel("pipelines").rel(PipelineImpl.getRecursivePathFromFullName(this)); } @Override public String getOrganization() { - return OrganizationImpl.INSTANCE.getName(); + return OrganizationImpl.DEFAULT_ORGANIZATION.getName(); } diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/OrganizationContainerImpl.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/OrganizationContainerImpl.java index 46c52574..cb622171 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/OrganizationContainerImpl.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/OrganizationContainerImpl.java @@ -1,15 +1,19 @@ package io.jenkins.blueocean.service.embedded.rest; +import com.google.common.collect.Lists; import hudson.Extension; +import hudson.model.Item; import io.jenkins.blueocean.commons.ServiceException; import io.jenkins.blueocean.rest.ApiHead; import io.jenkins.blueocean.rest.hal.Link; import io.jenkins.blueocean.rest.model.BlueOrganization; import io.jenkins.blueocean.rest.model.BlueOrganizationContainer; import jenkins.model.Jenkins; +import org.jenkinsci.plugins.jenkinsorganizations.JenkinsOrganizationFolder; import java.util.Collections; import java.util.Iterator; +import java.util.List; /** * {@link BlueOrganizationContainer} for the embedded use @@ -22,20 +26,29 @@ public class OrganizationContainerImpl extends BlueOrganizationContainer { @Override public BlueOrganization get(String name) { - validateOrganization(name); - return OrganizationImpl.INSTANCE; + if(OrganizationImpl.DEFAULT_ORGANIZATION.getName().equals(name)){ + return OrganizationImpl.DEFAULT_ORGANIZATION; + } else { + Item item = Jenkins.getInstance().getItem(name); + if(item instanceof JenkinsOrganizationFolder) { + return new OrganizationImpl((JenkinsOrganizationFolder) item); + } else { + return null; + } + } } @Override public Iterator iterator() { - return Collections.singleton(OrganizationImpl.INSTANCE).iterator(); - } - - protected void validateOrganization(String organization){ - if (!organization.equals(Jenkins.getActiveInstance().getDisplayName().toLowerCase())) { - throw new ServiceException.UnprocessableEntityException(String.format("Organization %s not found", - organization)); + List orgs = Jenkins.getInstance().getAllItems(JenkinsOrganizationFolder.class); + List ret = Lists.newArrayList(); + for (JenkinsOrganizationFolder org : orgs) { + ret.add(new OrganizationImpl(org)); } + + ret.add(new OrganizationImpl()); + + return ret.iterator(); } @Override diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/OrganizationImpl.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/OrganizationImpl.java index b7ea7303..bac7aaf2 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/OrganizationImpl.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/OrganizationImpl.java @@ -10,6 +10,7 @@ import io.jenkins.blueocean.rest.model.BluePipelineContainer; import io.jenkins.blueocean.rest.model.BlueUser; import io.jenkins.blueocean.rest.model.BlueUserContainer; import jenkins.model.Jenkins; +import org.jenkinsci.plugins.jenkinsorganizations.JenkinsOrganizationFolder; import org.kohsuke.stapler.WebMethod; import org.kohsuke.stapler.verb.DELETE; import org.kohsuke.stapler.verb.PUT; @@ -24,20 +25,28 @@ import java.io.IOException; */ public class OrganizationImpl extends BlueOrganization { private final UserContainerImpl users = new UserContainerImpl(this); - + final JenkinsOrganizationFolder organizationFolder; /** * In embedded mode, there's only one organization */ - public static final OrganizationImpl INSTANCE = new OrganizationImpl(); + public static final OrganizationImpl DEFAULT_ORGANIZATION = new OrganizationImpl(); + public OrganizationImpl(JenkinsOrganizationFolder organizationFolder) { + this.organizationFolder = organizationFolder; + } private OrganizationImpl() { + this(null); } /** * In embedded mode, there's only one organization */ public String getName() { - return Jenkins.getInstance().getDisplayName().toLowerCase(); + if(organizationFolder == null) { + return Jenkins.getInstance().getDisplayName().toLowerCase(); + } else { + return organizationFolder.getDisplayName(); + } } @Override @@ -77,7 +86,7 @@ public class OrganizationImpl extends BlueOrganization { if(user == null){ throw new ServiceException.NotFoundException("No authenticated user found"); } - return new UserImpl(user,new UserContainerImpl(OrganizationImpl.INSTANCE)); + return new UserImpl(user,new UserContainerImpl(OrganizationImpl.DEFAULT_ORGANIZATION)); } @Override diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineContainerImpl.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineContainerImpl.java index 311e6ed8..d7efc36d 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineContainerImpl.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineContainerImpl.java @@ -21,21 +21,23 @@ import java.util.List; public class PipelineContainerImpl extends BluePipelineContainer { private final @Nonnull ItemGroup itemGroup; private final Link self; + final OrganizationImpl organization; - public PipelineContainerImpl() { - this(Jenkins.getInstance(),null); + public PipelineContainerImpl(OrganizationImpl organization) { + this(Jenkins.getInstance(), organization, null); } - public PipelineContainerImpl(ItemGroup itemGroup) { - this(itemGroup,null); + public PipelineContainerImpl(ItemGroup itemGroup, OrganizationImpl organization) { + this(itemGroup, organization, null); } - public PipelineContainerImpl(ItemGroup itemGroup, Reachable parent) { + public PipelineContainerImpl(ItemGroup itemGroup, OrganizationImpl organization, Reachable parent) { this.itemGroup = itemGroup; + this.organization = organization; if(parent!=null){ this.self = parent.getLink().rel("pipelines"); }else{ - this.self = OrganizationImpl.INSTANCE.getLink().rel("pipelines"); + this.self = organization.getLink().rel("pipelines"); } } @Override diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineFolderImpl.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineFolderImpl.java index fcd498f4..6745e7d1 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineFolderImpl.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineFolderImpl.java @@ -36,7 +36,7 @@ public class PipelineFolderImpl extends BluePipelineFolder { @Override public String getOrganization() { - return OrganizationImpl.INSTANCE.getName(); + return OrganizationImpl.DEFAULT_ORGANIZATION.getName(); } @Override @@ -99,7 +99,7 @@ public class PipelineFolderImpl extends BluePipelineFolder { @Override public Link getLink() { - return OrganizationImpl.INSTANCE.getLink().rel("pipelines").rel(getRecursivePathFromFullName(this)); + return OrganizationImpl.DEFAULT_ORGANIZATION.getLink().rel("pipelines").rel(getRecursivePathFromFullName(this)); } @Extension(ordinal = 0) diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineImpl.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineImpl.java index 6daa8b6e..dae1da37 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineImpl.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineImpl.java @@ -40,7 +40,7 @@ public class PipelineImpl extends BluePipeline { @Override public String getOrganization() { - return OrganizationImpl.INSTANCE.getName(); + return OrganizationImpl.DEFAULT_ORGANIZATION.getName(); } @Override @@ -120,7 +120,7 @@ public class PipelineImpl extends BluePipeline { @Override public Link getLink() { - return OrganizationImpl.INSTANCE.getLink().rel("pipelines").rel(getRecursivePathFromFullName(this)); + return OrganizationImpl.DEFAULT_ORGANIZATION.getLink().rel("pipelines").rel(getRecursivePathFromFullName(this)); } protected static String getRecursivePathFromFullName(BluePipeline pipeline){ diff --git a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineSearch.java b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineSearch.java index 41773330..3d8d6d89 100644 --- a/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineSearch.java +++ b/blueocean-rest-impl/src/main/java/io/jenkins/blueocean/service/embedded/rest/PipelineSearch.java @@ -48,7 +48,7 @@ public class PipelineSearch extends OmniSearch{ String s = q.param(EXCLUDED_FROM_FLATTENING_PARAM); String org = q.param(ORGANIZATION_PARAM); - if(org!=null && !OrganizationImpl.INSTANCE.getName().equals(org)){ + if(org!=null && !OrganizationImpl.DEFAULT_ORGANIZATION.getName().equals(org)){ throw new ServiceException.BadRequestExpception( String.format("Organization %s not found. Query parameter %s value: %s is invalid. ", org,ORGANIZATION_PARAM,org)); }