diff --git a/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsCreate.java b/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsCreate.java index a209ed5..75c21af 100644 --- a/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsCreate.java +++ b/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsCreate.java @@ -68,61 +68,29 @@ public GoogleAppsCreate( this.createAttributes = createAttributes; } - public Uid execute() { - final AttributesAccessor accessor = new AttributesAccessor(createAttributes); - - if (ObjectClass.ACCOUNT.equals(objectClass)) { - Uid uid = GoogleApiExecutor.execute(UserHandler.createUser( - configuration.getDirectory().users(), accessor, configuration.getCustomSchemasJSON()), - new RequestResultHandler() { - - @Override - public Uid handleResult(final Directory.Users.Insert request, final User value) { - LOG.ok("New User is created: {0}", value.getId()); - return new Uid(value.getId(), value.getEtag()); - } - }); - - List aliases = accessor.findList(GoogleAppsUtil.ALIASES_ATTR); - if (null != aliases) { - final Directory.Users.Aliases aliasesService = configuration.getDirectory().users().aliases(); - for (Object member : aliases) { - if (member instanceof String) { - String id = GoogleApiExecutor.execute( - UserHandler.createUserAlias(aliasesService, uid.getUidValue(), (String) member), - new RequestResultHandler() { - - @Override - public String handleResult( - final Directory.Users.Aliases.Insert request, final Alias value) { - - return value == null ? null : value.getId(); - } - }); - - if (null == id) { - // TODO make warn about failed update - } - } else if (null != member) { - // Delete user and Error or - RetryableException e = - RetryableException.wrap("Invalid attribute value: " + String.valueOf(member), uid); - e.initCause(new InvalidAttributeValueException("Attribute 'aliases' must be a String list")); - throw e; - } - } + private Uid createUser(final AttributesAccessor accessor) { + Uid uid = GoogleApiExecutor.execute(UserHandler.createUser( + configuration.getDirectory().users(), accessor, configuration.getCustomSchemasJSON()), + new RequestResultHandler() { + + @Override + public Uid handleResult(final Directory.Users.Insert request, final User value) { + LOG.ok("New User is created: {0} with ETag {1}", value.getId(), value.getEtag()); + return new Uid(value.getId(), value.getEtag()); } + }); - Attribute photo = accessor.find(GoogleAppsUtil.PHOTO_ATTR); - if (null != photo) { - Object photoObject = AttributeUtil.getSingleValue(photo); - if (photoObject instanceof byte[]) { - String id = GoogleApiExecutor.execute(UserHandler.createUpdateUserPhoto( - configuration.getDirectory().users().photos(), uid.getUidValue(), (byte[]) photoObject), - new RequestResultHandler() { + List aliases = accessor.findList(GoogleAppsUtil.ALIASES_ATTR); + if (null != aliases) { + final Directory.Users.Aliases aliasesService = configuration.getDirectory().users().aliases(); + for (Object alias : aliases) { + if (alias instanceof String) { + String id = GoogleApiExecutor.execute( + UserHandler.createUserAlias(aliasesService, uid.getUidValue(), (String) alias), + new RequestResultHandler() { @Override - public String handleResult(final Directory.Users.Photos.Update request, final UserPhoto value) { + public String handleResult(final Directory.Users.Aliases.Insert request, final Alias value) { return value == null ? null : value.getId(); } }); @@ -130,135 +98,191 @@ public String handleResult(final Directory.Users.Photos.Update request, final Us if (null == id) { // TODO make warn about failed update } - } else if (null != photoObject) { - // Delete group and Error or - RetryableException e = RetryableException.wrap( - "Invalid attribute value: " + String.valueOf(photoObject), uid); - e.initCause(new InvalidAttributeValueException("Attribute 'photo' must be a single byte[] value")); + } else if (null != alias) { + // Delete user and Error or + RetryableException e = + RetryableException.wrap("Invalid attribute value: " + String.valueOf(alias), uid); + e.initCause(new InvalidAttributeValueException("Attribute 'aliases' must be a String list")); throw e; } } + } - Attribute isAdmin = accessor.find(GoogleAppsUtil.IS_ADMIN_ATTR); - if (null != isAdmin) { - try { - Boolean isAdminValue = AttributeUtil.getBooleanValue(isAdmin); - if (null != isAdminValue && isAdminValue) { - UserMakeAdmin content = new UserMakeAdmin(); - content.setStatus(isAdminValue); - - GoogleApiExecutor.execute( - configuration.getDirectory().users().makeAdmin(uid.getUidValue(), content), - new RequestResultHandler() { - - @Override - public Void handleResult(final Directory.Users.MakeAdmin request, final Void value) { - return null; - } - }); + Attribute photo = accessor.find(GoogleAppsUtil.PHOTO_ATTR); + if (null != photo) { + Object photoObject = AttributeUtil.getSingleValue(photo); + if (photoObject instanceof byte[]) { + String id = GoogleApiExecutor.execute(UserHandler.createUpdateUserPhoto( + configuration.getDirectory().users().photos(), uid.getUidValue(), (byte[]) photoObject), + new RequestResultHandler() { + + @Override + public String handleResult(final Directory.Users.Photos.Update request, final UserPhoto value) { + return value == null ? null : value.getId(); } - } catch (final Exception e) { - // TODO Delete user and throw Exception - throw ConnectorException.wrap(e); + }); + + if (null == id) { + // TODO make warn about failed update } + } else if (null != photoObject) { + // Delete group and Error or + RetryableException e = RetryableException.wrap( + "Invalid attribute value: " + String.valueOf(photoObject), uid); + e.initCause(new InvalidAttributeValueException("Attribute 'photo' must be a single byte[] value")); + throw e; } + } + + Attribute isAdmin = accessor.find(GoogleAppsUtil.IS_ADMIN_ATTR); + if (null != isAdmin) { + try { + Boolean isAdminValue = AttributeUtil.getBooleanValue(isAdmin); + if (null != isAdminValue && isAdminValue) { + UserMakeAdmin content = new UserMakeAdmin(); + content.setStatus(isAdminValue); - Attribute groups = accessor.find(PredefinedAttributes.GROUPS_NAME); - if (null != groups && null != groups.getValue()) { - final Directory.Members service = configuration.getDirectory().members(); - if (!groups.getValue().isEmpty()) { - final List addGroups = new ArrayList<>(); - - for (Object member : groups.getValue()) { - if (member instanceof String) { - String email = accessor.getName().getNameValue(); - addGroups.add(MembersHandler.create(service, (String) member, email, null)); - } else if (null != member) { - // throw error/revert? - throw new InvalidAttributeValueException("Attribute '__GROUPS__' must be a String list"); + GoogleApiExecutor.execute( + configuration.getDirectory().users().makeAdmin(uid.getUidValue(), content), + new RequestResultHandler() { + + @Override + public Void handleResult(final Directory.Users.MakeAdmin request, final Void value) { + return null; } - } + }); + } + } catch (final Exception e) { + // TODO Delete user and throw Exception + throw ConnectorException.wrap(e); + } + } - // Add new Member object - for (Directory.Members.Insert insert : addGroups) { - GoogleApiExecutor.execute(insert, - new RequestResultHandler() { - - @Override - public Object handleResult(final Directory.Members.Insert request, final Member value) { - return null; - } - - @Override - public Object handleDuplicate(final IOException e) { - // Do nothing - return null; - } - }); + Attribute groups = accessor.find(PredefinedAttributes.GROUPS_NAME); + if (null != groups && null != groups.getValue()) { + final Directory.Members service = configuration.getDirectory().members(); + if (!groups.getValue().isEmpty()) { + final List addGroups = new ArrayList<>(); + + for (Object group : groups.getValue()) { + if (group instanceof String) { + String email = accessor.getName().getNameValue(); + addGroups.add(MembersHandler.create(service, (String) group, email, null)); + } else if (null != group) { + // throw error/revert? + throw new InvalidAttributeValueException("Attribute '__GROUPS__' must be a String list"); } } + + // Add new Member object + for (Directory.Members.Insert insert : addGroups) { + GoogleApiExecutor.execute(insert, + new RequestResultHandler() { + + @Override + public Object handleResult(final Directory.Members.Insert request, final Member value) { + return null; + } + + @Override + public Object handleDuplicate(final IOException e) { + // Do nothing + return null; + } + }); + } } + } - return uid; - } else if (ObjectClass.GROUP.equals(objectClass)) { - // @formatter:off - /* AlreadyExistsException - * { - * "code" : 409, - * "errors" : [ { - * "domain" : "global", - * "message" : "Entity already exists.", - * "reason" : "duplicate" - * } ], - * "message" : "Entity already exists." - * } - */ - // @formatter:on - Uid uid = GoogleApiExecutor.execute( - GroupHandler.create(configuration.getDirectory().groups(), accessor), - new RequestResultHandler() { + return uid; + } - @Override - public Uid handleResult(final Directory.Groups.Insert request, - final Group value) { - LOG.ok("New Group is created:{0}", value.getEmail()); - return new Uid(value.getEmail(), value.getEtag()); + private Uid createGroup(final AttributesAccessor accessor) { + Uid uid = GoogleApiExecutor.execute( + GroupHandler.create(configuration.getDirectory().groups(), accessor), + new RequestResultHandler() { + + @Override + public Uid handleResult(final Directory.Groups.Insert request, final Group value) { + LOG.ok("New Group is created:{0}", value.getEmail()); + return new Uid(value.getId(), value.getEtag()); + } + }); + + List aliases = accessor.findList(GoogleAppsUtil.ALIASES_ATTR); + if (null != aliases) { + final Directory.Groups.Aliases aliasesService = configuration.getDirectory().groups().aliases(); + for (Object alias : aliases) { + if (alias instanceof String) { + String id = GoogleApiExecutor.execute( + GroupHandler.createGroupAlias(aliasesService, uid.getUidValue(), (String) alias), + new RequestResultHandler() { + + @Override + public String handleResult(final Directory.Groups.Aliases.Insert request, final Alias value) { + return value == null ? null : value.getId(); + } + }); + + if (null == id) { + // TODO make warn about failed update + } + } else if (null != alias) { + // Delete group and Error or + RetryableException e = + RetryableException.wrap("Invalid attribute value: " + String.valueOf(alias), uid); + e.initCause(new InvalidAttributeValueException("Attribute 'aliases' must be a String list")); + throw e; } - }); - List members = accessor.findList(GoogleAppsUtil.MEMBERS_ATTR); - if (null != members) { - final Directory.Members membersService = configuration.getDirectory().members(); - for (Object member : members) { - if (member instanceof Map) { - String email = (String) ((Map) member).get(GoogleAppsUtil.EMAIL_ATTR); - String role = (String) ((Map) member).get(GoogleAppsUtil.ROLE_ATTR); - - String id = GoogleApiExecutor.execute( - MembersHandler.create(membersService, uid.getUidValue(), email, role), - new RequestResultHandler() { - - @Override - public String handleResult(final Directory.Members.Insert request, final Member value) { - - return value == null ? null : value.getId(); - } - }); - - if (null == id) { - // TODO make warn about failed update + } + } + + List members = accessor.findList(GoogleAppsUtil.MEMBERS_ATTR); + if (null != members) { + final Directory.Members membersService = configuration.getDirectory().members(); + for (Object member : members) { + if (member instanceof Map) { + String email = (String) ((Map) member).get(GoogleAppsUtil.EMAIL_ATTR); + String role = (String) ((Map) member).get(GoogleAppsUtil.ROLE_ATTR); + + String id = GoogleApiExecutor.execute( + MembersHandler.create(membersService, uid.getUidValue(), email, role), + new RequestResultHandler() { + + @Override + public String handleResult(final Directory.Members.Insert request, final Member value) { + return value == null ? null : value.getId(); } - } else if (null != member) { - // Delete group and Error or - RetryableException e = - RetryableException.wrap("Invalid attribute value: " + String.valueOf(member), uid); - e.initCause(new InvalidAttributeValueException("Attribute 'members' must be a Map list")); - throw e; + }); + + if (null == id) { + // TODO make warn about failed update } + } else if (null != member) { + // Delete group and Error or + RetryableException e = + RetryableException.wrap("Invalid attribute value: " + String.valueOf(member), uid); + e.initCause(new InvalidAttributeValueException("Attribute 'members' must be a Map list")); + throw e; } } + } + + return uid; + } + + public Uid execute() { + final AttributesAccessor accessor = new AttributesAccessor(createAttributes); - return uid; - } else if (GoogleAppsUtil.MEMBER.equals(objectClass)) { + if (ObjectClass.ACCOUNT.equals(objectClass)) { + return createUser(accessor); + } + + if (ObjectClass.GROUP.equals(objectClass)) { + return createGroup(accessor); + } + + if (GoogleAppsUtil.MEMBER.equals(objectClass)) { return GoogleApiExecutor.execute( MembersHandler.create(configuration.getDirectory().members(), accessor), new RequestResultHandler() { @@ -269,7 +293,9 @@ public Uid handleResult(final Directory.Members.Insert request, final Member val return MembersHandler.generateUid(request.getGroupKey(), value); } }); - } else if (GoogleAppsUtil.ORG_UNIT.equals(objectClass)) { + } + + if (GoogleAppsUtil.ORG_UNIT.equals(objectClass)) { return GoogleApiExecutor.execute( OrgunitsHandler.create(configuration.getDirectory().orgunits(), accessor), new RequestResultHandler() { @@ -280,7 +306,9 @@ public Uid handleResult(final Directory.Orgunits.Insert request, final OrgUnit v return OrgunitsHandler.generateUid(value); } }); - } else if (GoogleAppsUtil.LICENSE_ASSIGNMENT.equals(objectClass)) { + } + + if (GoogleAppsUtil.LICENSE_ASSIGNMENT.equals(objectClass)) { // @formatter:off /* AlreadyExistsException * { @@ -309,11 +337,11 @@ public Uid handleResult( return LicenseAssignmentsHandler.generateUid(value); } }); - } else { - LOG.warn("Create of type {0} is not supported", configuration.getConnectorMessages() - .format(objectClass.getDisplayNameKey(), objectClass.getObjectClassValue())); - throw new UnsupportedOperationException("Create of type" - + objectClass.getObjectClassValue() + " is not supported"); } + + LOG.warn("Create of type {0} is not supported", configuration.getConnectorMessages() + .format(objectClass.getDisplayNameKey(), objectClass.getObjectClassValue())); + throw new UnsupportedOperationException("Create of type" + + objectClass.getObjectClassValue() + " is not supported"); } } diff --git a/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsUpdate.java b/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsUpdate.java index 5e20d45..40ae78e 100644 --- a/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsUpdate.java +++ b/src/main/java/net/tirasa/connid/bundles/googleapps/GoogleAppsUpdate.java @@ -95,6 +95,7 @@ public Uid handleResult(final Directory.Users.Patch request, final User value) { } }); } + Attribute groups = accessor.find(PredefinedAttributes.GROUPS_NAME); if (null != groups && null != groups.getValue()) { final Directory.Members service = configuration.getDirectory().members(); @@ -181,6 +182,7 @@ public Object handleNotFound(final IOException e) { } } } + // GOOGLEAPPS-9 // license management: if remove license param is true and __ENABLE__ is false perform delete license // license read must be performed with the user primaryEmail, userId is not allowed @@ -249,6 +251,7 @@ public Uid handleResult(final Directory.Groups.Patch request, final Group value) } }); } + Attribute members = accessor.find(GoogleAppsUtil.MEMBERS_ATTR); if (null != members && null != members.getValue()) { final Directory.Members service = configuration.getDirectory().members(); diff --git a/src/main/java/net/tirasa/connid/bundles/googleapps/GroupHandler.java b/src/main/java/net/tirasa/connid/bundles/googleapps/GroupHandler.java index abb8de8..ba3cfa3 100644 --- a/src/main/java/net/tirasa/connid/bundles/googleapps/GroupHandler.java +++ b/src/main/java/net/tirasa/connid/bundles/googleapps/GroupHandler.java @@ -26,6 +26,7 @@ import static net.tirasa.connid.bundles.googleapps.GoogleApiExecutor.execute; import com.google.api.services.directory.Directory; +import com.google.api.services.directory.model.Alias; import com.google.api.services.directory.model.Group; import com.google.api.services.directory.model.Groups; import com.google.common.base.CharMatcher; @@ -334,6 +335,30 @@ public static Directory.Groups.Insert create( } } + public static Directory.Groups.Aliases.Insert createGroupAlias( + final Directory.Groups.Aliases service, final String groupKey, final String alias) { + + Alias content = new Alias(); + content.setAlias(alias); + try { + return service.insert(groupKey, content).setFields(GoogleAppsUtil.ID_ETAG); + } catch (IOException e) { + LOG.warn(e, "Failed to initialize Aliases#Insert"); + throw ConnectorException.wrap(e); + } + } + + public static Directory.Groups.Aliases.Delete deleteGroupAlias( + final Directory.Groups.Aliases service, final String groupKey, final String alias) { + + try { + return service.delete(groupKey, alias); + } catch (IOException e) { + LOG.warn(e, "Failed to initialize Aliases#Delete"); + throw ConnectorException.wrap(e); + } + } + private static void set(final AtomicReference content, final Consumer consumer) { if (content.get() == null) { content.set(new Group()); @@ -444,9 +469,9 @@ public static ConnectorObject fromGroup( builder.setObjectClass(ObjectClass.GROUP); if (null != group.getEtag()) { - builder.setUid(new Uid(group.getEmail(), group.getEtag())); + builder.setUid(new Uid(group.getId(), group.getEtag())); } else { - builder.setUid(group.getEmail()); + builder.setUid(group.getId()); } builder.setName(group.getEmail()); @@ -484,5 +509,4 @@ public static ConnectorObject fromGroup( return builder.build(); } - } diff --git a/src/test/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConnectorUnitTests.java b/src/test/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConnectorUnitTests.java index 8bbc049..86686a9 100644 --- a/src/test/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConnectorUnitTests.java +++ b/src/test/java/net/tirasa/connid/bundles/googleapps/GoogleAppsConnectorUnitTests.java @@ -37,7 +37,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -public class GoogleAppsConnectorUnitTests { +class GoogleAppsConnectorUnitTests { public static class GoogleAppsTestConnector extends GoogleAppsConnector { @@ -59,11 +59,7 @@ private static ConnectorFacade newFacade() { } @BeforeAll - public static void setUp() throws IOException { - - System.setProperty("http.proxyHost", "localhost"); - System.setProperty("http.proxyPort", "3128"); - + static void setUp() throws IOException { CONN_CONF = new GoogleAppsConfiguration(); CONN_CONF.setClientId("aclientid"); @@ -104,12 +100,12 @@ public static void setUp() throws IOException { } @Test - public void validate() { + void validate() { CONNECTOR.validate(); } @Test - public void schema() { + void schema() { Schema schema = CONNECTOR.schema(); boolean accountFound = false; boolean customSingleValuedSchemaFound1 = false;