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 extends Item> 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));
}