/* * Copyright (C) 2013 tarent AG * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.osiam.resources.converter; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.osiam.resources.scim.Extension; import org.osiam.resources.scim.GroupRef; import org.osiam.resources.scim.User; import org.osiam.storage.entities.AddressEntity; import org.osiam.storage.entities.EmailEntity; import org.osiam.storage.entities.EntitlementEntity; import org.osiam.storage.entities.ExtensionFieldValueEntity; import org.osiam.storage.entities.GroupEntity; import org.osiam.storage.entities.ImEntity; import org.osiam.storage.entities.PhoneNumberEntity; import org.osiam.storage.entities.PhotoEntity; import org.osiam.storage.entities.RoleEntity; import org.osiam.storage.entities.UserEntity; import org.osiam.storage.entities.X509CertificateEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserConverter implements Converter<User, UserEntity> { @Autowired private X509CertificateConverter x509CertificateConverter; @Autowired private RoleConverter roleConverter; @Autowired private PhotoConverter photoConverter; @Autowired private PhoneNumberConverter phoneNumberConverter; @Autowired private ImConverter imConverter; @Autowired private EntitlementConverter entitlementConverter; @Autowired private EmailConverter emailConverter; @Autowired private AddressConverter addressConverter; @Autowired private NameConverter nameConverter; @Autowired private ExtensionConverter extensionConverter; @Autowired private MetaConverter metaConverter; @Override public UserEntity fromScim(User user) { if (user == null) { return null; } UserEntity userEntity = new UserEntity(); if (user.getPassword() != null && !user.getPassword().isEmpty()) { userEntity.setPassword(user.getPassword()); } if(user.isActive() != null) { userEntity.setActive(user.isActive()); } userEntity.setDisplayName(user.getDisplayName()); userEntity.setNickName(user.getNickName()); userEntity.setExternalId(user.getExternalId() == null ? null : user.getExternalId().isEmpty() ? null : user .getExternalId()); // Due to uniqueness in databases userEntity.setPreferredLanguage(user.getPreferredLanguage()); userEntity.setLocale(user.getLocale()); userEntity.setProfileUrl(user.getProfileUrl()); userEntity.setTimezone(user.getTimezone()); userEntity.setTitle(user.getTitle()); userEntity.setUserName(user.getUserName()); userEntity.setUserType(user.getUserType()); userEntity.setName(nameConverter.fromScim(user.getName())); Set<AddressEntity> addresses = convertMultiValueFromScim(addressConverter, new HashSet<>(user.getAddresses())); for (AddressEntity addressEntity : addresses) { userEntity.addAddress(addressEntity); } Set<EmailEntity> emails = convertMultiValueFromScim(emailConverter, new HashSet<>(user.getEmails())); for (EmailEntity emailEntity : emails) { userEntity.addEmail(emailEntity); } Set<EntitlementEntity> entitlements = convertMultiValueFromScim(entitlementConverter, new HashSet<>(user.getEntitlements())); for (EntitlementEntity entitlementEntity : entitlements) { userEntity.addEntitlement(entitlementEntity); } Set<ImEntity> ims = convertMultiValueFromScim(imConverter, new HashSet<>(user.getIms())); for (ImEntity imEntity : ims) { userEntity.addIm(imEntity); } Set<PhoneNumberEntity> phoneNumbers = convertMultiValueFromScim(phoneNumberConverter, new HashSet<>(user.getPhoneNumbers())); for (PhoneNumberEntity phoneNumberEntity : phoneNumbers) { userEntity.addPhoneNumber(phoneNumberEntity); } Set<PhotoEntity> photos = convertMultiValueFromScim(photoConverter, new HashSet<>(user.getPhotos())); for (PhotoEntity photoEntity : photos) { userEntity.addPhoto(photoEntity); } Set<RoleEntity> roles = convertMultiValueFromScim(roleConverter, new HashSet<>(user.getRoles())); for (RoleEntity roleEntity : roles) { userEntity.addRole(roleEntity); } Set<X509CertificateEntity> x509Certificates = convertMultiValueFromScim(x509CertificateConverter, new HashSet<>(user.getX509Certificates())); for (X509CertificateEntity x509CertificateEntity : x509Certificates) { userEntity.addX509Certificate(x509CertificateEntity); } Set<ExtensionFieldValueEntity> fieldValues = extensionConverter.fromScim(new HashSet<>(user.getExtensions() .values())); for (ExtensionFieldValueEntity fieldValue : fieldValues) { userEntity.addOrUpdateExtensionValue(fieldValue); } return userEntity; } @Override public User toScim(UserEntity entity) { if (entity == null) { return null; } User.Builder userBuilder = new User.Builder(entity.getUserName()) .setActive(entity.getActive()) .setDisplayName(entity.getDisplayName()) .setLocale(entity.getLocale()) .setName(entity.getName() != null ? nameConverter.toScim(entity.getName()) : null) .setNickName(entity.getNickName()) .setPassword(entity.getPassword()) .setPreferredLanguage(entity.getPreferredLanguage()) .setProfileUrl(entity.getProfileUrl()) .setTimezone(entity.getTimezone()).setTitle(entity.getTitle()) .setUserType(entity.getUserType()) .setExternalId(entity.getExternalId()).setId(entity.getId().toString()) .setMeta(metaConverter.toScim(entity.getMeta())) .addAddresses(convertMultiValueToScim(addressConverter, entity.getAddresses())) .addEmails(convertMultiValueToScim(emailConverter, entity.getEmails())) .addEntitlements(convertMultiValueToScim(entitlementConverter, entity.getEntitlements())) .setGroups(entityGroupsToScim(entity.getGroups())) .addIms(convertMultiValueToScim(imConverter, entity.getIms())) .addPhoneNumbers(convertMultiValueToScim(phoneNumberConverter, entity.getPhoneNumbers())) .addPhotos(convertMultiValueToScim(photoConverter, entity.getPhotos())) .addRoles(convertMultiValueToScim(roleConverter, entity.getRoles())) .addX509Certificates(convertMultiValueToScim(x509CertificateConverter, entity.getX509Certificates())); addExtensions(userBuilder, entity.getExtensionFieldValues()); return userBuilder.build(); } private void addExtensions(User.Builder userBuilder, Set<ExtensionFieldValueEntity> extensionFieldValues) { Set<Extension> extensions = extensionConverter.toScim(extensionFieldValues); for (Extension extension : extensions) { userBuilder.addExtension(extension); } } private <S, E> Set<E> convertMultiValueFromScim(Converter<S, E> converter, Set<S> multiValues) { Set<E> entities = new HashSet<>(); for (S multiValue : multiValues) { E entity = converter.fromScim(multiValue); entities.add(entity); } return entities; } private <S, E> List<S> convertMultiValueToScim(Converter<S, E> converter, Set<E> entities) { List<S> multiValues = new ArrayList<>(); for (E entity : entities) { S multiValue = converter.toScim(entity); multiValues.add(multiValue); } return multiValues; } private List<GroupRef> entityGroupsToScim(Set<GroupEntity> groupEntities) { List<GroupRef> groupsForMapping = new ArrayList<>(); if (groupEntities != null) { for (GroupEntity groupEntity : groupEntities) { GroupRef groupRef = new GroupRef.Builder() .setDisplay(groupEntity.getDisplayName()).setValue(groupEntity.getId().toString()).build(); groupsForMapping.add(groupRef); } } return groupsForMapping; } }