package org.osiam.resources.provisioning; import org.osiam.resources.exception.NoSuchElementException; import org.osiam.resources.exception.OsiamBackendFailureException; import org.osiam.resources.provisioning.model.ExtensionDefinition; import org.osiam.resources.scim.Extension; import org.osiam.resources.scim.Extension.Field; import org.osiam.resources.scim.ExtensionFieldType; import org.osiam.storage.dao.ExtensionDao; import org.osiam.storage.entities.ExtensionEntity; import org.osiam.storage.entities.ExtensionFieldEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.BigInteger; import java.net.URI; import java.net.URISyntaxException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map.Entry; @Service @Transactional public class SCIMExtensionProvisioning { private static final Logger LOGGER = LoggerFactory.getLogger(SCIMExtensionProvisioning.class); private ExtensionDao dao; @Autowired public SCIMExtensionProvisioning(ExtensionDao dao) { this.dao = dao; } /** * Get all persisted extension definitions. * * @return A list of all {@link ExtensionDefinition} that are persisted. */ public List<ExtensionDefinition> getAllExtensionDefinitions() { List<Extension> extensions = fromEntity(dao.getAllExtensions()); final List<ExtensionDefinition> extensionDefinitions = new ArrayList<>(); for (Extension extension : extensions) { final ExtensionDefinition extensionDefinition = new ExtensionDefinition(extension.getUrn()); for (Entry<String, Field> fieldEntry : extension.getFields().entrySet()) { final String field = fieldEntry.getKey(); final ExtensionFieldType<?> type = fieldEntry.getValue().getType(); extensionDefinition.addPair(field, type); } extensionDefinitions.add(extensionDefinition); } return extensionDefinitions; } private List<Extension> fromEntity(List<ExtensionEntity> entities) { List<Extension> result = new ArrayList<>(); for (ExtensionEntity entity : entities) { Extension.Builder builder = new Extension.Builder(entity.getUrn()); setField(entity, builder); result.add(builder.build()); } return result; } private void setField(ExtensionEntity entity, Extension.Builder builder) { for (ExtensionFieldEntity fieldEntity : entity.getFields()) { switch (fieldEntity.getType().getName()) { case "STRING": builder.setField(fieldEntity.getName(), "null"); break; case "INTEGER": builder.setField(fieldEntity.getName(), BigInteger.ZERO); break; case "DECIMAL": builder.setField(fieldEntity.getName(), BigDecimal.ZERO); break; case "BOOLEAN": builder.setField(fieldEntity.getName(), false); break; case "DATE_TIME": builder.setField(fieldEntity.getName(), new Date(0L)); break; case "BINARY": builder.setField(fieldEntity.getName(), ByteBuffer.wrap(new byte[]{})); break; case "REFERENCE": try { builder.setField(fieldEntity.getName(), new URI("http://www.osiam.org")); } catch (URISyntaxException e) { LOGGER.warn("Unable to contruct URI for http://www.osiam.org This should never happen!", e); throw new OsiamBackendFailureException(); } break; default: throw new NoSuchElementException("Type '" + fieldEntity.getType().getName() + "' does not exist"); } } } }