Skip to content

Commit

Permalink
Refactor group methods for easier access from other components
Browse files Browse the repository at this point in the history
  • Loading branch information
fhanik committed Jun 22, 2017
1 parent d23a25c commit c513689
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 67 deletions.
Expand Up @@ -280,4 +280,12 @@ public static String convertISO8859_1_to_UTF_8(String s) {
}
}

public static String toJsonString(String s) {
if (s == null) {
return null;
}
String result = JsonUtils.writeValueAsString(s);
return result.substring(1, result.length()-1);
}

}
@@ -1,5 +1,5 @@
/*******************************************************************************
* Cloud Foundry
* Cloud Foundry
* Copyright (c) [2009-2016] Pivotal Software, Inc. All Rights Reserved.
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
Expand All @@ -16,4 +16,9 @@
import org.cloudfoundry.identity.uaa.resources.ResourceManager;

public interface ScimGroupProvisioning extends ResourceManager<ScimGroup>, Queryable<ScimGroup> {
String GROUP_BY_NAME_FILTER = "displayName eq \"%s\"";

ScimGroup createOrGet(ScimGroup group, String zoneId);

ScimGroup getByName(String displayName, String zoneId);
}
Expand Up @@ -22,12 +22,14 @@
import org.cloudfoundry.identity.uaa.scim.ScimUser;
import org.cloudfoundry.identity.uaa.scim.ScimUserProvisioning;
import org.cloudfoundry.identity.uaa.scim.exception.MemberAlreadyExistsException;
import org.cloudfoundry.identity.uaa.scim.exception.ScimResourceAlreadyExistsException;
import org.cloudfoundry.identity.uaa.scim.exception.ScimResourceNotFoundException;
import org.cloudfoundry.identity.uaa.util.MapCollector;
import org.cloudfoundry.identity.uaa.zone.IdentityZone;
import org.cloudfoundry.identity.uaa.zone.IdentityZoneHolder;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.ResourcePropertySource;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.util.StringUtils;

import java.io.IOException;
Expand Down Expand Up @@ -60,8 +62,6 @@ public class ScimGroupBootstrap implements InitializingBean {

private static final String USER_BY_NAME_FILTER = "username eq \"%s\"";

private static final String GROUP_BY_NAME_FILTER = "displayName eq \"%s\"";

private final Log logger = LogFactory.getLog(getClass());
private PropertySource messageSource;
private String messagePropertyNameTemplate = "scope.%s";
Expand Down Expand Up @@ -252,25 +252,19 @@ private ScimUser getUser(String name) {
}

ScimGroup getGroup(String name) {
List<ScimGroup> g = scimGroupProvisioning.query(String.format(GROUP_BY_NAME_FILTER, name), IdentityZoneHolder.get().getId());
if (g != null && !g.isEmpty()) {
ScimGroup gr = g.get(0);
try {
ScimGroup gr = scimGroupProvisioning.getByName(name, IdentityZoneHolder.get().getId());
gr.setMembers(membershipManager.getMembers(gr.getId(), false, IdentityZoneHolder.get().getId()));
return gr;
} catch (ScimResourceNotFoundException | IncorrectResultSizeDataAccessException e) {
logger.debug("could not find group with name");
return null;
}
logger.debug("could not find group with name");
return null;
}

private ScimGroup getOrCreateGroup(String name) {
logger.debug("adding group: " + name);
ScimGroup g = new ScimGroup(null,name,IdentityZoneHolder.get().getId());
try {
g = scimGroupProvisioning.create(g, IdentityZoneHolder.get().getId());
} catch (ScimResourceAlreadyExistsException ex) {
logger.debug("group " + g + " already exists, retrieving...");
g = getGroup(name);
}
return g;
String uaaZoneId = IdentityZone.getUaa().getId();
return scimGroupProvisioning.createOrGet(new ScimGroup(null, name, uaaZoneId), uaaZoneId);
}
}
Expand Up @@ -27,6 +27,7 @@
import org.cloudfoundry.identity.uaa.scim.exception.ScimResourceAlreadyExistsException;
import org.cloudfoundry.identity.uaa.scim.exception.ScimResourceConstraintFailedException;
import org.cloudfoundry.identity.uaa.scim.exception.ScimResourceNotFoundException;
import org.cloudfoundry.identity.uaa.util.UaaStringUtils;
import org.cloudfoundry.identity.uaa.zone.IdentityZone;
import org.cloudfoundry.identity.uaa.zone.event.IdentityZoneModifiedEvent;
import org.springframework.dao.DuplicateKeyException;
Expand All @@ -36,7 +37,6 @@
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
Expand All @@ -47,6 +47,7 @@
import java.util.UUID;

import static org.cloudfoundry.identity.uaa.zone.ZoneManagementScopes.getSystemScopes;
import static org.springframework.util.StringUtils.hasText;

public class JdbcScimGroupProvisioning extends AbstractQueryable<ScimGroup>
implements ScimGroupProvisioning, SystemDeletable {
Expand Down Expand Up @@ -161,6 +162,27 @@ private void createAndIgnoreDuplicate(final String name, final String zoneId) {
}
}

@Override
public ScimGroup createOrGet(ScimGroup group, String zoneId) {
createAndIgnoreDuplicate(group.getDisplayName(), zoneId);
return getByName(group.getDisplayName(), zoneId);
}

@Override
public ScimGroup getByName(String displayName, String zoneId) {
if (!hasText(displayName)) {
throw new IncorrectResultSizeDataAccessException("group name must contain text", 1, 0);
}
String jsonName = UaaStringUtils.toJsonString(displayName);
String filter = String.format(GROUP_BY_NAME_FILTER, jsonName);
List<ScimGroup> groups = query(filter, zoneId);
if (groups.size()==1) {
return groups.get(0);
} else {
throw new IncorrectResultSizeDataAccessException("Invalid result size found for:"+displayName, 1, groups.size());
}
}

@Override
public void onApplicationEvent(AbstractUaaEvent event) {
if (event!=null && event instanceof IdentityZoneModifiedEvent) {
Expand Down Expand Up @@ -300,7 +322,7 @@ public int deleteByUser(String userId, String zoneId) {
}

protected void validateGroup(ScimGroup group) throws ScimResourceConstraintFailedException {
if (!StringUtils.hasText(group.getZoneId())) {
if (!hasText(group.getZoneId())) {
throw new ScimResourceConstraintFailedException("zoneId is a required field");
}
}
Expand Down

0 comments on commit c513689

Please sign in to comment.