http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java index ae6d8a8..eec346e 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java @@ -18,18 +18,30 @@ */ package org.apache.syncope.core.provisioning.java.data; +import java.util.Map; +import org.apache.commons.lang3.StringUtils; import org.apache.syncope.core.provisioning.api.data.NotificationDataBinder; import org.apache.syncope.common.lib.to.NotificationTO; import org.apache.syncope.core.persistence.api.entity.EntityFactory; import org.apache.syncope.core.persistence.api.entity.Notification; import org.apache.syncope.core.misc.spring.BeanUtils; +import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; +import org.apache.syncope.core.persistence.api.entity.AnyAbout; +import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class NotificationDataBinderImpl implements NotificationDataBinder { - private static final String[] IGNORE_PROPERTIES = { "key", "about", "recipients" }; + private static final Logger LOG = LoggerFactory.getLogger(NotificationDataBinder.class); + + private static final String[] IGNORE_PROPERTIES = { "key", "abouts", "recipients" }; + + @Autowired + private AnyTypeDAO anyTypeDAO; @Autowired private EntityFactory entityFactory; @@ -41,8 +53,10 @@ public class NotificationDataBinderImpl implements NotificationDataBinder { BeanUtils.copyProperties(notification, result, IGNORE_PROPERTIES); result.setKey(notification.getKey()); - result.setUserAbout(notification.getUserAbout()); - result.setGroupAbout(notification.getGroupAbout()); + for (AnyAbout about : notification.getAbouts()) { + result.getAbouts().put(about.getAnyType().getKey(), about.get()); + } + result.setRecipients(notification.getRecipients()); return result; @@ -59,8 +73,22 @@ public class NotificationDataBinderImpl implements NotificationDataBinder { public void update(final Notification notification, final NotificationTO notificationTO) { BeanUtils.copyProperties(notificationTO, notification, IGNORE_PROPERTIES); - notification.setUserAbout(notificationTO.getUserAbout()); - notification.setGroupAbout(notificationTO.getGroupAbout()); + notification.getAbouts().clear(); + for (Map.Entry<String, String> entry : notificationTO.getAbouts().entrySet()) { + if (StringUtils.isNotBlank(entry.getValue())) { + AnyType anyType = anyTypeDAO.find(entry.getKey()); + if (anyType == null) { + LOG.warn("Invalid AnyType {} specified, ignoring...", entry.getKey()); + } else { + AnyAbout about = entityFactory.newEntity(AnyAbout.class); + about.setAnyType(anyType); + about.setNotification(notification); + + notification.add(about); + } + } + } + notification.setRecipients(notificationTO.getRecipients()); } }
http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java index 3fe382c..b29f9fa 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java @@ -32,7 +32,7 @@ import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; import org.apache.syncope.core.persistence.api.dao.RealmDAO; import org.apache.syncope.core.persistence.api.entity.AccountPolicy; import org.apache.syncope.core.persistence.api.entity.EntityFactory; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.PasswordPolicy; import org.apache.syncope.core.persistence.api.entity.Policy; import org.apache.syncope.core.persistence.api.entity.Realm; http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java index cf1339e..fae0f9f 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java @@ -27,6 +27,7 @@ import org.apache.syncope.common.lib.SyncopeClientCompositeException; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.MappingItemTO; import org.apache.syncope.common.lib.to.MappingTO; +import org.apache.syncope.common.lib.to.ProvisionTO; import org.apache.syncope.common.lib.to.ResourceTO; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.lib.types.IntMappingType; @@ -36,34 +37,34 @@ import org.apache.syncope.core.persistence.api.dao.PolicyDAO; import org.apache.syncope.core.persistence.api.entity.AccountPolicy; import org.apache.syncope.core.persistence.api.entity.ConnInstance; import org.apache.syncope.core.persistence.api.entity.EntityFactory; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; -import org.apache.syncope.core.persistence.api.entity.Mapping; -import org.apache.syncope.core.persistence.api.entity.MappingItem; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.resource.Mapping; +import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.PasswordPolicy; import org.apache.syncope.core.persistence.api.entity.SyncPolicy; -import org.apache.syncope.core.persistence.api.entity.group.GMapping; -import org.apache.syncope.core.persistence.api.entity.group.GMappingItem; -import org.apache.syncope.core.persistence.api.entity.user.UMapping; -import org.apache.syncope.core.persistence.api.entity.user.UMappingItem; import org.apache.syncope.core.provisioning.api.ConnectorRegistry; import org.apache.syncope.core.misc.jexl.JexlUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.syncope.core.misc.spring.BeanUtils; +import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; +import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.resource.Provision; +import org.identityconnectors.framework.common.objects.ObjectClass; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class ResourceDataBinderImpl implements ResourceDataBinder { - /** - * Logger. - */ private static final Logger LOG = LoggerFactory.getLogger(ResourceDataBinder.class); private static final String[] MAPPINGITEM_IGNORE_PROPERTIES = { "key", "mapping" }; @Autowired + private AnyTypeDAO anyTypeDAO; + + @Autowired private ConnectorRegistry connRegistry; @Autowired @@ -107,21 +108,34 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { resource.setPropagationMode(resourceTO.getPropagationMode()); - if (resourceTO.getUmapping() == null || resourceTO.getUmapping().getItems().isEmpty()) { - resource.setUmapping(null); - } else { - UMapping mapping = entityFactory.newEntity(UMapping.class); - mapping.setResource(resource); - resource.setUmapping(mapping); - populateMapping(resourceTO.getUmapping(), mapping, entityFactory.newEntity(UMappingItem.class)); - } - if (resourceTO.getGmapping() == null || resourceTO.getGmapping().getItems().isEmpty()) { - resource.setGmapping(null); - } else { - GMapping mapping = entityFactory.newEntity(GMapping.class); - mapping.setResource(resource); - resource.setGmapping(mapping); - populateMapping(resourceTO.getGmapping(), mapping, entityFactory.newEntity(GMappingItem.class)); + for (ProvisionTO provisionTO : resourceTO.getProvisions()) { + AnyType anyType = anyTypeDAO.find(provisionTO.getAnyType()); + if (anyType == null) { + LOG.warn("Invalid type specified {}, ignoring...", provisionTO.getAnyType()); + } + + Provision provision = resource.getProvision(anyType); + if (provision == null) { + provision = entityFactory.newEntity(Provision.class); + provision.setResource(resource); + resource.add(provision); + provision.setAnyType(anyType); + } + + provision.setObjectClass(new ObjectClass(provisionTO.getObjectClass())); + + if (provisionTO.getSyncToken() == null) { + provision.setSyncToken(null); + } + + if (provisionTO.getMapping() == null) { + provision.setMapping(null); + } else { + Mapping mapping = entityFactory.newEntity(Mapping.class); + mapping.setProvision(provision); + provision.setMapping(mapping); + populateMapping(provisionTO.getMapping(), mapping, entityFactory.newEntity(MappingItem.class)); + } } resource.setCreateTraceLevel(resourceTO.getCreateTraceLevel()); @@ -140,13 +154,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { resource.setConnInstanceConfiguration(new HashSet<>(resourceTO.getConnConfProperties())); - if (resourceTO.getUsyncToken() == null) { - resource.setUsyncToken(null); - } - if (resourceTO.getRsyncToken() == null) { - resource.setRsyncToken(null); - } - resource.getPropagationActionsClassNames().clear(); resource.getPropagationActionsClassNames().addAll(resourceTO.getPropagationActionsClassNames()); @@ -155,16 +162,14 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { @SuppressWarnings({ "unchecked", "rawtypes" }) private void populateMapping(final MappingTO mappingTO, final Mapping mapping, final MappingItem prototype) { - mapping.setAccountLink(mappingTO.getAccountLink()); + mapping.setConnObjectLink(mappingTO.getConnObjectLink()); for (MappingItem item : getMappingItems(mappingTO.getItems(), prototype)) { item.setMapping(mapping); - if (item.isAccountid()) { - mapping.setAccountIdItem(item); - } else if (item.isPassword()) { - ((UMapping) mapping).setPasswordItem((UMappingItem) item); + if (item.isConnObjectKey()) { + mapping.setConnObjectKeyItem(item); } else { - mapping.addItem(item); + mapping.add(item); } } } @@ -233,8 +238,8 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { return connRegistry.getOverriddenConnInstance(connInstanceClone, resourceTO.getConnConfProperties()); } - private void populateMappingTO(final Mapping<?> mapping, final MappingTO mappingTO) { - mappingTO.setAccountLink(mapping.getAccountLink()); + private void populateMappingTO(final Mapping mapping, final MappingTO mappingTO) { + mappingTO.setConnObjectLink(mapping.getConnObjectLink()); for (MappingItem item : mapping.getItems()) { MappingItemTO itemTO = new MappingItemTO(); @@ -242,11 +247,9 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { BeanUtils.copyProperties(item, itemTO, MAPPINGITEM_IGNORE_PROPERTIES); if (itemTO.isAccountid()) { - mappingTO.setAccountIdItem(itemTO); - } else if (itemTO.isPassword()) { - mappingTO.setPasswordItem(itemTO); + mappingTO.setConnObjectKeyItem(itemTO); } else { - mappingTO.addItem(itemTO); + mappingTO.add(itemTO); } } } @@ -274,16 +277,19 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { resourceTO.setConnectorId(connector == null ? null : connector.getKey()); resourceTO.setConnectorDisplayName(connector == null ? null : connector.getDisplayName()); - // set the mappings - if (resource.getUmapping() != null) { - MappingTO mappingTO = new MappingTO(); - resourceTO.setUmapping(mappingTO); - populateMappingTO(resource.getUmapping(), mappingTO); - } - if (resource.getGmapping() != null) { - MappingTO mappingTO = new MappingTO(); - resourceTO.setGmapping(mappingTO); - populateMappingTO(resource.getGmapping(), mappingTO); + // set the provision information + for (Provision provision : resource.getProvisions()) { + ProvisionTO provisionTO = new ProvisionTO(); + provisionTO.setKey(provision.getKey()); + provisionTO.setAnyType(provision.getAnyType().getKey()); + provisionTO.setObjectClass(provision.getObjectClass().getObjectClassValue()); + provisionTO.setSyncToken(provision.getSerializedSyncToken()); + + if (provision.getMapping() != null) { + MappingTO mappingTO = new MappingTO(); + provisionTO.setMapping(mappingTO); + populateMappingTO(provision.getMapping(), mappingTO); + } } resourceTO.setEnforceMandatoryCondition(resource.isEnforceMandatoryCondition()); @@ -312,9 +318,6 @@ public class ResourceDataBinderImpl implements ResourceDataBinder { resourceTO.getConnConfProperties().addAll(resource.getConnInstanceConfiguration()); - resourceTO.setUsyncToken(resource.getSerializedUSyncToken()); - resourceTO.setRsyncToken(resource.getSerializedRSyncToken()); - resourceTO.getPropagationActionsClassNames().addAll(resource.getPropagationActionsClassNames()); return resourceTO; http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java index 2f4fd2d..b286043 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java @@ -26,10 +26,10 @@ import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.core.misc.search.SearchCondConverter; import org.apache.syncope.core.persistence.api.dao.RealmDAO; import org.apache.syncope.core.persistence.api.dao.search.SearchCond; -import org.apache.syncope.core.persistence.api.entity.DynRoleMembership; import org.apache.syncope.core.persistence.api.entity.EntityFactory; import org.apache.syncope.core.persistence.api.entity.Realm; import org.apache.syncope.core.persistence.api.entity.Role; +import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership; import org.apache.syncope.core.provisioning.api.data.RoleDataBinder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -101,7 +101,7 @@ public class RoleDataBinderImpl implements RoleDataBinder { } else if (role.getDynMembership() != null && roleTO.getDynMembershipCond() != null && !role.getDynMembership().getFIQLCond().equals(roleTO.getDynMembershipCond())) { - role.getDynMembership().getUsers().clear(); + role.getDynMembership().getMembers().clear(); setDynMembership(role, roleTO.getDynMembershipCond()); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java index 0a34e61..e44198b 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java @@ -19,22 +19,22 @@ package org.apache.syncope.core.provisioning.java.data; import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder; -import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.lib.SyncopeClientCompositeException; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.to.DerSchemaTO; import org.apache.syncope.common.lib.to.PlainSchemaTO; import org.apache.syncope.common.lib.to.VirSchemaTO; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; -import org.apache.syncope.core.persistence.api.entity.AttributableUtils; import org.apache.syncope.core.persistence.api.entity.DerSchema; -import org.apache.syncope.core.persistence.api.entity.PlainAttr; import org.apache.syncope.core.persistence.api.entity.PlainSchema; import org.apache.syncope.core.persistence.api.entity.VirSchema; import org.apache.syncope.core.misc.spring.BeanUtils; import org.apache.syncope.core.misc.jexl.JexlUtils; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; +import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -44,6 +44,9 @@ public class SchemaDataBinderImpl implements SchemaDataBinder { @Autowired private PlainSchemaDAO schemaDAO; + @Autowired + private AnyUtilsFactory anyUtilsFactory; + // --------------- PLAIN ----------------- private <T extends PlainSchema> void fill(final T schema, final PlainSchemaTO schemaTO) { if (!JexlUtils.isExpressionValid(schemaTO.getMandatoryCondition())) { @@ -61,13 +64,16 @@ public class SchemaDataBinderImpl implements SchemaDataBinder { } @Override - public <T extends PlainSchema> void update(final PlainSchemaTO schemaTO, final T schema, - final AttributableUtils attributableUtil) { - + public <T extends PlainSchema> void update(final PlainSchemaTO schemaTO, final T schema) { SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); - List<PlainAttr> attrs = schemaDAO.findAttrs(schema, attributableUtil.plainAttrClass()); - if (!attrs.isEmpty()) { + boolean hasAttrs = false; + for (AnyTypeKind anyTypeKind : AnyTypeKind.values()) { + AnyUtils anyUtils = anyUtilsFactory.getInstance(anyTypeKind); + hasAttrs &= schemaDAO.findAttrs(schema, anyUtils.plainAttrClass()).isEmpty(); + } + + if (hasAttrs) { if (schema.getType() != schemaTO.getType()) { SyncopeClientException e = SyncopeClientException.build(ClientExceptionType.InvalidPlainSchema); e.getElements().add("Cannot change type since " + schema.getKey() + " has attributes"); @@ -90,9 +96,7 @@ public class SchemaDataBinderImpl implements SchemaDataBinder { } @Override - public <T extends PlainSchema> PlainSchemaTO getPlainSchemaTO( - final T schema, final AttributableUtils attributableUtil) { - + public <T extends PlainSchema> PlainSchemaTO getPlainSchemaTO(final T schema) { PlainSchemaTO schemaTO = new PlainSchemaTO(); BeanUtils.copyProperties(schema, schemaTO); http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java index 9fe733e..c25b3ed 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java @@ -18,14 +18,14 @@ */ package org.apache.syncope.core.provisioning.java.data; +import java.util.Map; import org.apache.syncope.core.provisioning.api.data.TaskDataBinder; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.lib.SyncopeClientException; -import org.apache.syncope.common.lib.to.AbstractAttributableTO; import org.apache.syncope.common.lib.to.AbstractProvisioningTaskTO; import org.apache.syncope.common.lib.to.AbstractTaskTO; +import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.AttrTO; -import org.apache.syncope.common.lib.to.MembershipTO; import org.apache.syncope.common.lib.to.PropagationTaskTO; import org.apache.syncope.common.lib.to.PushTaskTO; import org.apache.syncope.common.lib.to.GroupTO; @@ -40,7 +40,6 @@ import org.apache.syncope.common.lib.types.UnmatchingRule; import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; import org.apache.syncope.core.persistence.api.dao.NotFoundException; import org.apache.syncope.core.persistence.api.dao.TaskExecDAO; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; import org.apache.syncope.core.persistence.api.entity.task.NotificationTask; import org.apache.syncope.core.persistence.api.entity.task.PropagationTask; import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask; @@ -53,7 +52,13 @@ import org.apache.syncope.core.persistence.api.entity.task.TaskUtils; import org.apache.syncope.core.provisioning.api.job.JobNamer; import org.apache.syncope.core.misc.spring.BeanUtils; import org.apache.syncope.core.misc.jexl.JexlUtils; +import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; import org.apache.syncope.core.persistence.api.dao.RealmDAO; +import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.EntityFactory; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.task.AnyFilter; +import org.apache.syncope.core.persistence.api.entity.task.AnyTemplate; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; @@ -87,16 +92,22 @@ public class TaskDataBinderImpl implements TaskDataBinder { private TaskExecDAO taskExecDAO; @Autowired + private AnyTypeDAO anyTypeDAO; + + @Autowired + private EntityFactory entityFactory; + + @Autowired private SchedulerFactoryBean scheduler; - private void checkJexl(final AbstractAttributableTO attributableTO, final SyncopeClientException sce) { - for (AttrTO attrTO : attributableTO.getPlainAttrs()) { + private void checkJexl(final AnyTO anyTO, final SyncopeClientException sce) { + for (AttrTO attrTO : anyTO.getPlainAttrs()) { if (!attrTO.getValues().isEmpty() && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))) { sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0)); } } - for (AttrTO attrTO : attributableTO.getVirAttrs()) { + for (AttrTO attrTO : anyTO.getVirAttrs()) { if (!attrTO.getValues().isEmpty() && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))) { sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0)); } @@ -105,11 +116,17 @@ public class TaskDataBinderImpl implements TaskDataBinder { private void fill(final ProvisioningTask task, final AbstractProvisioningTaskTO taskTO) { if (task instanceof PushTask && taskTO instanceof PushTaskTO) { - final PushTask pushTask = (PushTask) task; - final PushTaskTO pushTaskTO = (PushTaskTO) taskTO; + PushTask pushTask = (PushTask) task; + PushTaskTO pushTaskTO = (PushTaskTO) taskTO; + + for (Map.Entry<String, String> entry : pushTaskTO.getFilters().entrySet()) { + AnyFilter filter = entityFactory.newEntity(AnyFilter.class); + filter.setAnyType(anyTypeDAO.find(entry.getKey())); + filter.set(entry.getValue()); - pushTask.setUserFilter(pushTaskTO.getUserFilter()); - pushTask.setGroupFilter(pushTaskTO.getGroupFilter()); + filter.setPushTask(pushTask); + pushTask.add(filter); + } pushTask.setMatchingRule(pushTaskTO.getMatchingRule() == null ? MatchingRule.LINK : pushTaskTO.getMatchingRule()); @@ -131,42 +148,46 @@ public class TaskDataBinderImpl implements TaskDataBinder { SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSyncTask); // 1. validate JEXL expressions in user and group templates - if (syncTaskTO.getUserTemplate() != null) { - UserTO template = syncTaskTO.getUserTemplate(); - - if (StringUtils.isNotBlank(template.getUsername()) - && !JexlUtils.isExpressionValid(template.getUsername())) { - - sce.getElements().add("Invalid JEXL: " + template.getUsername()); - } - if (StringUtils.isNotBlank(template.getPassword()) - && !JexlUtils.isExpressionValid(template.getPassword())) { - - sce.getElements().add("Invalid JEXL: " + template.getPassword()); - } - - checkJexl(template, sce); - - for (MembershipTO memb : template.getMemberships()) { - checkJexl(memb, sce); + for (Map.Entry<String, AnyTO> entry : syncTaskTO.getTemplates().entrySet()) { + checkJexl(entry.getValue(), sce); + + if (entry.getValue() instanceof UserTO) { + UserTO template = (UserTO) entry.getValue(); + if (StringUtils.isNotBlank(template.getUsername()) + && !JexlUtils.isExpressionValid(template.getUsername())) { + + sce.getElements().add("Invalid JEXL: " + template.getUsername()); + } + if (StringUtils.isNotBlank(template.getPassword()) + && !JexlUtils.isExpressionValid(template.getPassword())) { + + sce.getElements().add("Invalid JEXL: " + template.getPassword()); + } + } else if (entry.getValue() instanceof GroupTO) { + GroupTO template = (GroupTO) entry.getValue(); + if (StringUtils.isNotBlank(template.getName()) + && !JexlUtils.isExpressionValid(template.getName())) { + + sce.getElements().add("Invalid JEXL: " + template.getName()); + } } } - if (syncTaskTO.getGroupTemplate() != null) { - GroupTO template = syncTaskTO.getGroupTemplate(); - - if (StringUtils.isNotBlank(template.getName()) && !JexlUtils.isExpressionValid(template.getName())) { - sce.getElements().add("Invalid JEXL: " + template.getName()); - } - - checkJexl(template, sce); - } if (!sce.isEmpty()) { throw sce; } // 2. all JEXL expressions are valid: accept user and group templates - syncTask.setUserTemplate(syncTaskTO.getUserTemplate()); - syncTask.setGroupTemplate(syncTaskTO.getGroupTemplate()); + for (Map.Entry<String, AnyTO> entry : syncTaskTO.getTemplates().entrySet()) { + AnyType type = anyTypeDAO.find(entry.getKey()); + if (type != null) { + AnyTemplate anyTemplate = entityFactory.newEntity(AnyTemplate.class); + anyTemplate.setAnyType(type); + anyTemplate.set(entry.getValue()); + anyTemplate.setSyncTask(syncTask); + + syncTask.add(anyTemplate); + } + } syncTask.setFullReconciliation(syncTaskTO.isFullReconciliation()); } @@ -176,12 +197,16 @@ public class TaskDataBinderImpl implements TaskDataBinder { task.setPerformUpdate(taskTO.isPerformUpdate()); task.setPerformDelete(taskTO.isPerformDelete()); task.setSyncStatus(taskTO.isSyncStatus()); - task.getActionsClassNames().clear(); - task.getActionsClassNames().addAll(taskTO.getActionsClassNames()); + task.getActionsClassNames() + .clear(); + task.getActionsClassNames() + .addAll(taskTO.getActionsClassNames()); } @Override - public SchedTask createSchedTask(final SchedTaskTO taskTO, final TaskUtils taskUtils) { + public SchedTask createSchedTask(final SchedTaskTO taskTO, + final TaskUtils taskUtils + ) { final Class<? extends AbstractTaskTO> taskTOClass = taskUtils.taskTOClass(); if (taskTOClass == null || !taskTOClass.equals(taskTO.getClass())) { @@ -212,7 +237,10 @@ public class TaskDataBinderImpl implements TaskDataBinder { } @Override - public void updateSchedTask(final SchedTask task, final SchedTaskTO taskTO, final TaskUtils taskUtils) { + public void updateSchedTask(final SchedTask task, + final SchedTaskTO taskTO, + final TaskUtils taskUtils + ) { Class<? extends Task> taskClass = taskUtils.taskClass(); Class<? extends AbstractTaskTO> taskTOClass = taskUtils.taskTOClass(); @@ -240,7 +268,8 @@ public class TaskDataBinderImpl implements TaskDataBinder { } @Override - public TaskExecTO getTaskExecTO(final TaskExec execution) { + public TaskExecTO getTaskExecTO(final TaskExec execution + ) { TaskExecTO executionTO = new TaskExecTO(); BeanUtils.copyProperties(execution, executionTO, IGNORE_TASK_EXECUTION_PROPERTIES); http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java index 317fce2..e7ec3cd 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java @@ -19,7 +19,6 @@ package org.apache.syncope.core.provisioning.java.data; import java.util.Collection; -import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Map; @@ -31,24 +30,15 @@ import org.apache.commons.collections4.Transformer; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.common.lib.SyncopeClientCompositeException; import org.apache.syncope.common.lib.SyncopeClientException; -import org.apache.syncope.common.lib.mod.MembershipMod; import org.apache.syncope.common.lib.mod.UserMod; import org.apache.syncope.common.lib.to.MembershipTO; import org.apache.syncope.common.lib.to.UserTO; -import org.apache.syncope.common.lib.types.AttributableType; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.CipherAlgorithm; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.lib.types.ResourceOperation; import org.apache.syncope.core.persistence.api.dao.ConfDAO; import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO; -import org.apache.syncope.core.persistence.api.entity.DerAttr; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; -import org.apache.syncope.core.persistence.api.entity.PlainAttr; -import org.apache.syncope.core.persistence.api.entity.VirAttr; -import org.apache.syncope.core.persistence.api.entity.membership.MDerAttr; -import org.apache.syncope.core.persistence.api.entity.membership.MPlainAttr; -import org.apache.syncope.core.persistence.api.entity.membership.MVirAttr; -import org.apache.syncope.core.persistence.api.entity.membership.Membership; import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion; import org.apache.syncope.core.persistence.api.entity.user.User; @@ -60,13 +50,14 @@ import org.apache.syncope.core.misc.spring.BeanUtils; import org.apache.syncope.core.misc.ConnObjectUtils; import org.apache.syncope.core.persistence.api.dao.RoleDAO; import org.apache.syncope.core.persistence.api.entity.Role; +import org.apache.syncope.core.persistence.api.entity.user.UMembership; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @Component @Transactional(rollbackFor = { Throwable.class }) -public class UserDataBinderImpl extends AbstractAttributableDataBinder implements UserDataBinder { +public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDataBinder { private static final String[] IGNORE_USER_PROPERTIES = { "realm", "roles", "memberships", "plainAttrs", "derAttrs", "virAttrs", "resources", @@ -118,7 +109,7 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement @Transactional(readOnly = true) @Override public boolean verifyPassword(final String username, final String password) { - return verifyPassword(userDAO.authFetch(username), password); + return verifyPassword(userDAO.authFind(username), password); } @Transactional(readOnly = true) @@ -153,40 +144,35 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement if (role == null) { LOG.warn("Ignoring unknown role with id {}", roleKey); } else { - user.addRole(role); + user.add(role); } } // memberships - Group group; for (MembershipTO membershipTO : userTO.getMemberships()) { - group = groupDAO.find(membershipTO.getGroupKey()); + Group group = groupDAO.find(membershipTO.getRightKey()); if (group == null) { if (LOG.isDebugEnabled()) { LOG.debug("Ignoring invalid group " + membershipTO.getGroupName()); } } else { - Membership membership = null; + UMembership membership = null; if (user.getKey() != null) { - membership = user.getMembership(group.getKey()) == null - ? membershipDAO.find(user, group) - : user.getMembership(group.getKey()); + membership = user.getMembership(group.getKey()); } if (membership == null) { - membership = entityFactory.newEntity(Membership.class); - membership.setGroup(group); - membership.setUser(user); + membership = entityFactory.newEntity(UMembership.class); + membership.setRightEnd(group); + membership.setLeftEnd(user); - user.addMembership(membership); + user.add(membership); } - - fill(membership, membershipTO, attrUtilsFactory.getInstance(AttributableType.MEMBERSHIP), scce); } } // realm, attributes, derived attributes, virtual attributes and resources - fill(user, userTO, attrUtilsFactory.getInstance(AttributableType.USER), scce); + fill(user, userTO, anyUtilsFactory.getInstance(AnyTypeKind.USER), scce); // set password if (StringUtils.isBlank(userTO.getPassword()) || !storePassword) { @@ -228,7 +214,7 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement Collection<String> currentResources = userDAO.findAllResourceNames(user); // fetch account ids before update - Map<String, String> oldAccountIds = getAccountIds(user, AttributableType.USER); + Map<String, String> oldConnObjectKeys = getConnObjectKeys(user); // realm setRealm(user, userMod); @@ -272,7 +258,7 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement if (role == null) { LOG.warn("Ignoring unknown role with id {}", roleKey); } else { - user.removeRole(role); + user.remove(role); } } }); @@ -284,100 +270,57 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement if (role == null) { LOG.warn("Ignoring unknown role with id {}", roleKey); } else { - user.addRole(role); + user.add(role); } } }); // attributes, derived attributes, virtual attributes and resources - propByRes.merge(fill(user, userMod, attrUtilsFactory.getInstance(AttributableType.USER), scce)); + propByRes.merge(fill(user, userMod, anyUtilsFactory.getInstance(AnyTypeKind.USER), scce)); // store the group ids of membership required to be added - Set<Long> membershipToBeAddedGroupKeys = CollectionUtils.collect(userMod.getMembershipsToAdd(), - new Transformer<MembershipMod, Long>() { - - @Override - public Long transform(final MembershipMod membToBeAdded) { - return membToBeAdded.getGroup(); - } - }, new HashSet<Long>()); + Set<Long> membershipToBeAddedGroupKeys = new HashSet<>(userMod.getMembershipsToAdd()); final Set<String> toBeDeprovisioned = new HashSet<>(); final Set<String> toBeProvisioned = new HashSet<>(); // memberships to be removed - for (Long membKey : userMod.getMembershipsToRemove()) { - LOG.debug("Membership to be removed: {}", membKey); + for (Long groupKey : userMod.getMembershipsToRemove()) { + LOG.debug("Membership to be removed for group {}", groupKey); - Membership membership = membershipDAO.find(membKey); + UMembership membership = user.getMembership(groupKey); if (membership == null) { - LOG.warn("Invalid membership id specified to be removed: {}", membKey); + LOG.warn("Invalid group key specified for membership to be removed: {}", groupKey); } else { - if (!membershipToBeAddedGroupKeys.contains(membership.getGroup().getKey())) { - toBeDeprovisioned.addAll(membership.getGroup().getResourceNames()); + if (!membershipToBeAddedGroupKeys.contains(membership.getRightEnd().getKey())) { + toBeDeprovisioned.addAll(membership.getRightEnd().getResourceNames()); } - // In order to make the removeMembership() below to work, - // we need to be sure to take exactly the same membership - // of the user object currently in memory (which has potentially - // some modifications compared to the one stored in the DB - membership = user.getMembership(membership.getGroup().getKey()); - if (membershipToBeAddedGroupKeys.contains(membership.getGroup().getKey())) { - Set<Long> attrKeys = new HashSet<>(membership.getPlainAttrs().size()); - for (PlainAttr plainAttr : membership.getPlainAttrs()) { - attrKeys.add(plainAttr.getKey()); - } - for (Long attrKey : attrKeys) { - plainAttrDAO.delete(attrKey, MPlainAttr.class); - } - attrKeys.clear(); - - // remove derived attributes - for (DerAttr derAttr : membership.getDerAttrs()) { - attrKeys.add(derAttr.getKey()); - } - for (Long derAttrId : attrKeys) { - derAttrDAO.delete(derAttrId, MDerAttr.class); - } - attrKeys.clear(); - - // remove virtual attributes - for (VirAttr virAttr : membership.getVirAttrs()) { - attrKeys.add(virAttr.getKey()); - } - for (Long virAttrId : attrKeys) { - virAttrDAO.delete(virAttrId, MVirAttr.class); - } - attrKeys.clear(); + if (!membershipToBeAddedGroupKeys.contains(membership.getRightEnd().getKey())) { } else { - user.removeMembership(membership); - - membershipDAO.delete(membKey); + user.remove(membership); } } } // memberships to be added - for (MembershipMod membershipMod : userMod.getMembershipsToAdd()) { - LOG.debug("Membership to be added: group({})", membershipMod.getGroup()); + for (Long groupKey : userMod.getMembershipsToAdd()) { + LOG.debug("Membership to be added for group {}", groupKey); - Group group = groupDAO.find(membershipMod.getGroup()); + Group group = groupDAO.find(groupKey); if (group == null) { - LOG.debug("Ignoring invalid group {}", membershipMod.getGroup()); + LOG.debug("Ignoring invalid group {}", groupKey); } else { - Membership membership = user.getMembership(group.getKey()); + UMembership membership = user.getMembership(group.getKey()); if (membership == null) { - membership = entityFactory.newEntity(Membership.class); - membership.setGroup(group); - membership.setUser(user); + membership = entityFactory.newEntity(UMembership.class); + membership.setRightEnd(group); + membership.setLeftEnd(user); - user.addMembership(membership); + user.add(membership); toBeProvisioned.addAll(group.getResourceNames()); } - - propByRes.merge(fill(membership, membershipMod, - attrUtilsFactory.getInstance(AttributableType.MEMBERSHIP), scce)); } } @@ -394,8 +337,8 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement } // check if some account id was changed by the update above - Map<String, String> newAccountIds = getAccountIds(user, AttributableType.USER); - for (Map.Entry<String, String> entry : oldAccountIds.entrySet()) { + Map<String, String> newAccountIds = getConnObjectKeys(user); + for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) { if (newAccountIds.containsKey(entry.getKey()) && !entry.getValue().equals(newAccountIds.get(entry.getKey()))) { @@ -418,29 +361,16 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement userTO.setSecurityQuestion(user.getSecurityQuestion().getKey()); } - connObjectUtils.retrieveVirAttrValues(user, attrUtilsFactory.getInstance(AttributableType.USER)); + connObjectUtils.retrieveVirAttrValues(user); fillTO(userTO, user.getRealm().getFullPath(), user.getPlainAttrs(), user.getDerAttrs(), user.getVirAttrs(), userDAO.findAllResources(user)); - for (Membership membership : user.getMemberships()) { + for (UMembership membership : user.getMemberships()) { MembershipTO membershipTO = new MembershipTO(); - // set sys info - membershipTO.setCreator(membership.getCreator()); - membershipTO.setCreationDate(membership.getCreationDate()); - membershipTO.setLastModifier(membership.getLastModifier()); - membershipTO.setLastChangeDate(membership.getLastChangeDate()); - membershipTO.setKey(membership.getKey()); - membershipTO.setGroupKey(membership.getGroup().getKey()); - membershipTO.setGroupName(membership.getGroup().getName()); - - // SYNCOPE-458 retrieve also membership virtual attributes - connObjectUtils.retrieveVirAttrValues( - membership, attrUtilsFactory.getInstance(AttributableType.MEMBERSHIP)); - fillTO(membershipTO, null, - membership.getPlainAttrs(), membership.getDerAttrs(), membership.getVirAttrs(), - Collections.<ExternalResource>emptyList()); + membershipTO.setRightKey(membership.getRightEnd().getKey()); + membershipTO.setGroupName(membership.getRightEnd().getName()); userTO.getMemberships().add(membershipTO); } @@ -467,13 +397,13 @@ public class UserDataBinderImpl extends AbstractAttributableDataBinder implement @Transactional(readOnly = true) @Override public UserTO getUserTO(final String username) { - return getUserTO(userDAO.authFetch(username)); + return getUserTO(userDAO.authFind(username)); } @Transactional(readOnly = true) @Override public UserTO getUserTO(final Long key) { - return getUserTO(userDAO.authFetch(key)); + return getUserTO(userDAO.authFind(key)); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java index 7153529..776b8db 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java @@ -30,26 +30,21 @@ import java.util.Set; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.to.GroupTO; import org.apache.syncope.common.lib.to.UserTO; -import org.apache.syncope.common.lib.types.AttributableType; import org.apache.syncope.common.lib.types.AuditElements; import org.apache.syncope.common.lib.types.AuditElements.Result; import org.apache.syncope.common.lib.types.AuditLoggerName; import org.apache.syncope.common.lib.types.IntMappingType; -import org.apache.syncope.common.lib.types.SubjectType; -import org.apache.syncope.common.lib.CollectionUtils2; +import org.apache.syncope.common.lib.to.AnyObjectTO; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.core.persistence.api.dao.ConfDAO; import org.apache.syncope.core.persistence.api.dao.NotificationDAO; import org.apache.syncope.core.persistence.api.dao.GroupDAO; -import org.apache.syncope.core.persistence.api.dao.SubjectSearchDAO; import org.apache.syncope.core.persistence.api.dao.TaskDAO; import org.apache.syncope.core.persistence.api.dao.UserDAO; import org.apache.syncope.core.persistence.api.dao.search.OrderByClause; -import org.apache.syncope.core.persistence.api.entity.Attributable; -import org.apache.syncope.core.persistence.api.entity.AttributableUtilsFactory; import org.apache.syncope.core.persistence.api.entity.EntityFactory; import org.apache.syncope.core.persistence.api.entity.Notification; import org.apache.syncope.core.persistence.api.entity.PlainAttr; -import org.apache.syncope.core.persistence.api.entity.Subject; import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.task.NotificationTask; import org.apache.syncope.core.persistence.api.entity.task.TaskExec; @@ -61,6 +56,12 @@ import org.apache.syncope.core.provisioning.api.data.GroupDataBinder; import org.apache.syncope.core.provisioning.api.data.UserDataBinder; import org.apache.syncope.core.misc.ConnObjectUtils; import org.apache.syncope.core.misc.search.SearchCondConverter; +import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; +import org.apache.syncope.core.persistence.api.dao.AnySearchDAO; +import org.apache.syncope.core.persistence.api.entity.Any; +import org.apache.syncope.core.persistence.api.entity.AnyAbout; +import org.apache.syncope.core.persistence.api.entity.AnyType; +import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.context.Context; @@ -100,6 +101,12 @@ public class NotificationManagerImpl implements NotificationManager { private ConfDAO confDAO; /** + * AnyObject DAO. + */ + @Autowired + private AnyObjectDAO anyObjectDAO; + + /** * User DAO. */ @Autowired @@ -112,10 +119,10 @@ public class NotificationManagerImpl implements NotificationManager { private GroupDAO groupDAO; /** - * User Search DAO. + * Search DAO. */ @Autowired - private SubjectSearchDAO searchDAO; + private AnySearchDAO searchDAO; /** * Task DAO. @@ -148,7 +155,7 @@ public class NotificationManagerImpl implements NotificationManager { private EntityFactory entityFactory; @Autowired - private AttributableUtilsFactory attrUtilsFactory; + private AnyUtilsFactory anyUtilsFactory; @Transactional(readOnly = true) @Override @@ -160,19 +167,17 @@ public class NotificationManagerImpl implements NotificationManager { * Create a notification task. * * @param notification notification to take as model - * @param attributable the user this task is about + * @param any the any object this task is about * @param model Velocity model * @return notification task, fully populated */ private NotificationTask getNotificationTask( final Notification notification, - final Attributable<?, ?, ?> attributable, + final Any<?, ?, ?> any, final Map<String, Object> model) { - if (attributable != null) { - connObjectUtils.retrieveVirAttrValues(attributable, - attrUtilsFactory.getInstance( - attributable instanceof User ? AttributableType.USER : AttributableType.GROUP)); + if (any != null) { + connObjectUtils.retrieveVirAttrValues(any); } final List<User> recipients = new ArrayList<>(); @@ -180,17 +185,17 @@ public class NotificationManagerImpl implements NotificationManager { if (notification.getRecipients() != null) { recipients.addAll(searchDAO.<User>search(SyncopeConstants.FULL_ADMIN_REALMS, SearchCondConverter.convert(notification.getRecipients()), - Collections.<OrderByClause>emptyList(), SubjectType.USER)); + Collections.<OrderByClause>emptyList(), AnyTypeKind.USER)); } - if (notification.isSelfAsRecipient() && attributable instanceof User) { - recipients.add((User) attributable); + if (notification.isSelfAsRecipient() && any instanceof User) { + recipients.add((User) any); } final Set<String> recipientEmails = new HashSet<>(); final List<UserTO> recipientTOs = new ArrayList<>(recipients.size()); for (User recipient : recipients) { - connObjectUtils.retrieveVirAttrValues(recipient, attrUtilsFactory.getInstance(AttributableType.USER)); + connObjectUtils.retrieveVirAttrValues(recipient); String email = getRecipientEmail(notification.getRecipientAttrType(), notification.getRecipientAttrName(), recipient); @@ -266,42 +271,42 @@ public class NotificationManagerImpl implements NotificationManager { final Object output, final Object... input) { - SubjectType subjectType = null; - Subject<?, ?, ?> subject = null; + Any<?, ?, ?> any = null; if (before instanceof UserTO) { - subjectType = SubjectType.USER; - subject = userDAO.find(((UserTO) before).getKey()); + any = userDAO.find(((UserTO) before).getKey()); } else if (output instanceof UserTO) { - subjectType = SubjectType.USER; - subject = userDAO.find(((UserTO) output).getKey()); + any = userDAO.find(((UserTO) output).getKey()); + } else if (before instanceof AnyObjectTO) { + any = anyObjectDAO.find(((AnyObjectTO) before).getKey()); + } else if (output instanceof AnyObjectTO) { + any = anyObjectDAO.find(((AnyObjectTO) output).getKey()); } else if (before instanceof GroupTO) { - subjectType = SubjectType.GROUP; - subject = groupDAO.find(((GroupTO) before).getKey()); + any = groupDAO.find(((GroupTO) before).getKey()); } else if (output instanceof GroupTO) { - subjectType = SubjectType.GROUP; - subject = groupDAO.find(((GroupTO) output).getKey()); + any = groupDAO.find(((GroupTO) output).getKey()); } - LOG.debug("Search notification for [{}]{}", subjectType, subject); + AnyType anyType = any == null ? null : any.getType(); + LOG.debug("Search notification for [{}]{}", anyType, any); for (Notification notification : notificationDAO.findAll()) { - LOG.debug("Notification available user about {}", notification.getUserAbout()); - LOG.debug("Notification available group about {}", notification.getGroupAbout()); + if (LOG.isDebugEnabled()) { + for (AnyAbout about : notification.getAbouts()) { + LOG.debug("Notification about {} defined: {}", about.getAnyType(), about.get()); + } + } if (notification.isActive()) { String currentEvent = AuditLoggerName.buildEvent(type, category, subcategory, event, condition); if (!notification.getEvents().contains(currentEvent)) { - LOG.debug("No events found about {}", subject); - } else if (subjectType == null || subject == null - || (subjectType == SubjectType.USER && (notification.getUserAbout() == null - || searchDAO.matches(subject, - SearchCondConverter.convert(notification.getUserAbout()), subjectType))) - || subjectType == SubjectType.GROUP && (notification.getGroupAbout() == null - || searchDAO.matches(subject, - SearchCondConverter.convert(notification.getGroupAbout()), subjectType))) { + LOG.debug("No events found about {}", any); + } else if (anyType == null || any == null + || notification.getAbout(anyType) == null + || searchDAO.matches(any, + SearchCondConverter.convert(notification.getAbout(anyType).get()), anyType.getKind())) { - LOG.debug("Creating notification task for event {} about {}", currentEvent, subject); + LOG.debug("Creating notification task for event {} about {}", currentEvent, any); final Map<String, Object> model = new HashMap<>(); model.put("type", type); @@ -313,18 +318,16 @@ public class NotificationManagerImpl implements NotificationManager { model.put("output", output); model.put("input", input); - if (subject instanceof User) { - model.put("user", userDataBinder.getUserTO((User) subject)); - } else if (subject instanceof Group) { - model.put("group", groupDataBinder.getGroupTO((Group) subject)); + if (any instanceof User) { + model.put("user", userDataBinder.getUserTO((User) any)); + } else if (any instanceof Group) { + model.put("group", groupDataBinder.getGroupTO((Group) any)); } - taskDAO.save(getNotificationTask(notification, subject, model)); + taskDAO.save(getNotificationTask(notification, any, model)); } } else { - LOG.debug("Notification {}, userAbout {}, groupAbout {} is deactivated, " - + "notification task will not be created", notification.getKey(), - notification.getUserAbout(), notification.getGroupAbout()); + LOG.debug("Notification {} is not active, task will not be created", notification.getKey()); } } } @@ -342,7 +345,7 @@ public class NotificationManagerImpl implements NotificationManager { case UserPlainSchema: UPlainAttr attr = user.getPlainAttr(recipientAttrName); if (attr != null) { - email = CollectionUtils2.getFirstOrNull(attr.getValuesAsStrings()); + email = attr.getValuesAsStrings().isEmpty() ? null : attr.getValuesAsStrings().get(0); } break; @@ -356,7 +359,7 @@ public class NotificationManagerImpl implements NotificationManager { case UserVirtualSchema: UVirAttr virAttr = user.getVirAttr(recipientAttrName); if (virAttr != null) { - email = CollectionUtils2.getFirstOrNull(virAttr.getValues()); + email = virAttr.getValues().isEmpty() ? null : virAttr.getValues().get(0); } break; @@ -402,7 +405,7 @@ public class NotificationManagerImpl implements NotificationManager { protected Map<String, String> findAllSyncopeConfs() { Map<String, String> syncopeConfMap = new HashMap<>(); - for (PlainAttr attr : confDAO.get().getPlainAttrs()) { + for (PlainAttr<?> attr : confDAO.get().getPlainAttrs()) { syncopeConfMap.put(attr.getSchema().getKey(), attr.getValuesAsStrings().get(0)); } return syncopeConfMap; http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java index 6408987..5c89dbb 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java @@ -35,10 +35,7 @@ import org.apache.syncope.common.lib.types.TraceLevel; import org.apache.syncope.core.persistence.api.dao.GroupDAO; import org.apache.syncope.core.persistence.api.dao.TaskDAO; import org.apache.syncope.core.persistence.api.dao.UserDAO; -import org.apache.syncope.core.persistence.api.entity.AttributableUtilsFactory; import org.apache.syncope.core.persistence.api.entity.EntityFactory; -import org.apache.syncope.core.persistence.api.entity.ExternalResource; -import org.apache.syncope.core.persistence.api.entity.Subject; import org.apache.syncope.core.persistence.api.entity.task.PropagationTask; import org.apache.syncope.core.persistence.api.entity.task.TaskExec; import org.apache.syncope.core.provisioning.api.Connector; @@ -51,7 +48,12 @@ import org.apache.syncope.core.misc.AuditManager; import org.apache.syncope.core.misc.spring.ApplicationContextProvider; import org.apache.syncope.core.misc.ConnObjectUtils; import org.apache.syncope.core.misc.ExceptionUtils2; +import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; +import org.apache.syncope.core.persistence.api.entity.Any; +import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.syncope.core.persistence.api.entity.group.Group; +import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; +import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.provisioning.api.notification.NotificationManager; import org.identityconnectors.framework.common.exceptions.ConnectorException; @@ -88,6 +90,12 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask protected ConnObjectUtils connObjectUtils; /** + * Any object DAO. + */ + @Autowired + protected AnyObjectDAO anyObjectDAO; + + /** * User DAO. */ @Autowired @@ -118,7 +126,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask protected AuditManager auditManager; @Autowired - protected AttributableUtilsFactory attrUtilsFactory; + protected AnyUtilsFactory anyUtilsFactory; @Autowired protected EntityFactory entityFactory; @@ -232,40 +240,46 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask } } - protected Subject<?, ?, ?> getSubject(final PropagationTask task) { - Subject<?, ?, ?> subject = null; + protected Any<?, ?, ?> getAny(final PropagationTask task) { + Any<?, ?, ?> any = null; - if (task.getSubjectKey() != null) { - switch (task.getSubjectType()) { + if (task.getAnyKey() != null) { + switch (task.getAnyTypeKind()) { case USER: try { - subject = userDAO.authFetch(task.getSubjectKey()); + any = userDAO.authFind(task.getAnyKey()); } catch (Exception e) { - LOG.error("Could not read user {}", task.getSubjectKey(), e); + LOG.error("Could not read user {}", task.getAnyKey(), e); } break; case GROUP: try { - subject = groupDAO.authFetch(task.getSubjectKey()); + any = groupDAO.authFind(task.getAnyKey()); } catch (Exception e) { - LOG.error("Could not read group {}", task.getSubjectKey(), e); + LOG.error("Could not read group {}", task.getAnyKey(), e); } break; - case MEMBERSHIP: + case ANY_OBJECT: default: + try { + any = anyObjectDAO.authFind(task.getAnyKey()); + } catch (Exception e) { + LOG.error("Could not read any object {}", task.getAnyKey(), e); + } + break; } } - return subject; + return any; } protected void delete(final PropagationTask task, final ConnectorObject beforeObj, final Connector connector, final Set<String> propagationAttempted) { if (beforeObj == null) { - LOG.debug("{} not found on external resource: ignoring delete", task.getAccountId()); + LOG.debug("{} not found on external resource: ignoring delete", task.getConnObjectKey()); } else { /* * We must choose here whether to @@ -282,7 +296,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask * update, this user / group used to have the current resource assigned by more than one mean (for example, * two different memberships with the same resource). */ - Subject<?, ?, ?> subject = getSubject(task); + Any<?, ?, ?> subject = getAny(task); Collection<String> resources = subject instanceof User ? userDAO.findAllResourceNames((User) subject) : subject instanceof Group @@ -305,11 +319,11 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask @Override public TaskExec execute(final PropagationTask task, final PropagationReporter reporter) { - final List<PropagationActions> actions = getPropagationActions(task.getResource()); + List<PropagationActions> actions = getPropagationActions(task.getResource()); - final Date startDate = new Date(); + Date startDate = new Date(); - final TaskExec execution = entityFactory.newEntity(TaskExec.class); + TaskExec execution = entityFactory.newEntity(TaskExec.class); execution.setStatus(PropagationTaskExecStatus.CREATED.name()); String taskExecutionMessage = null; @@ -321,13 +335,21 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask ConnectorObject beforeObj = null; ConnectorObject afterObj = null; + Provision provision = null; Connector connector = null; Result result; try { + Any<?, ?, ?> any = getAny(task); + provision = task.getResource().getProvision(any.getType()); + if (provision == null) { + throw new IllegalArgumentException("No provision found for " + any.getType() + " on " + task. + getResource()); + } + connector = connFactory.getConnector(task.getResource()); - // Try to read remote object (user / group) BEFORE any actual operation - beforeObj = getRemoteObject(task, connector, false); + // Try to read remote object BEFORE any actual operation + beforeObj = getRemoteObject(task, connector, provision, false); for (PropagationActions action : actions) { action.before(task, beforeObj); @@ -390,10 +412,10 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask action.onError(task, execution, e); } } finally { - // Try to read remote object (user / group) AFTER any actual operation + // Try to read remote object AFTER any actual operation if (connector != null) { try { - afterObj = getRemoteObject(task, connector, true); + afterObj = getRemoteObject(task, connector, provision, true); } catch (Exception ignore) { // ignore exception LOG.error("Error retrieving after object", ignore); @@ -434,7 +456,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask notificationManager.createTasks( AuditElements.EventCategoryType.PROPAGATION, - task.getSubjectType().name().toLowerCase(), + task.getAnyTypeKind().name().toLowerCase(), task.getResource().getKey(), task.getPropagationOperation().name().toLowerCase(), result, @@ -444,7 +466,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask auditManager.audit( AuditElements.EventCategoryType.PROPAGATION, - task.getSubjectType().name().toLowerCase(), + task.getAnyTypeKind().name().toLowerCase(), task.getResource().getKey(), task.getPropagationOperation().name().toLowerCase(), result, @@ -504,29 +526,30 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask * * @param connector connector facade proxy. * @param task current propagation task. + * @param provision provision * @param latest 'FALSE' to retrieve object using old accountId if not null. * @return remote connector object. */ protected ConnectorObject getRemoteObject(final PropagationTask task, final Connector connector, - final boolean latest) { + final Provision provision, final boolean latest) { - String accountId = latest || task.getOldAccountId() == null - ? task.getAccountId() - : task.getOldAccountId(); + String connObjectKey = latest || task.getOldConnObjectKey() == null + ? task.getConnObjectKey() + : task.getOldConnObjectKey(); ConnectorObject obj = null; try { obj = connector.getObject(task.getPropagationMode(), task.getPropagationOperation(), new ObjectClass(task.getObjectClassName()), - new Uid(accountId), - connector.getOperationOptions(attrUtilsFactory.getInstance(task.getSubjectType()). - getMappingItems(task.getResource(), MappingPurpose.PROPAGATION))); + new Uid(connObjectKey), + connector.getOperationOptions(anyUtilsFactory.getInstance(task.getAnyTypeKind()). + getMappingItems(provision, MappingPurpose.PROPAGATION))); } catch (TimeoutException toe) { LOG.debug("Request timeout", toe); throw toe; } catch (RuntimeException ignore) { - LOG.debug("While resolving {}", accountId, ignore); + LOG.debug("While resolving {}", connObjectKey, ignore); } return obj; http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java index 1e75acb..6b4760b 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java @@ -22,7 +22,7 @@ import java.util.HashSet; import java.util.Set; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; -import org.apache.syncope.common.lib.types.AttributableType; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.CipherAlgorithm; import org.apache.syncope.common.lib.types.ConnConfProperty; import org.apache.syncope.core.persistence.api.dao.UserDAO; @@ -56,8 +56,8 @@ public class DBPasswordPropagationActions extends DefaultPropagationActions { public void before(final PropagationTask task, final ConnectorObject beforeObj) { super.before(task, beforeObj); - if (AttributableType.USER == task.getSubjectType()) { - User user = userDAO.find(task.getSubjectKey()); + if (AnyTypeKind.USER == task.getAnyTypeKind()) { + User user = userDAO.find(task.getAnyKey()); if (user != null && user.getPassword() != null) { Attribute missing = AttributeUtil.find( @@ -72,7 +72,7 @@ public class DBPasswordPropagationActions extends DefaultPropagationActions { Attribute passwordAttribute = AttributeBuilder.buildPassword( new GuardedString(user.getPassword().toCharArray())); - Set<Attribute> attributes = new HashSet<Attribute>(task.getAttributes()); + Set<Attribute> attributes = new HashSet<>(task.getAttributes()); attributes.add(passwordAttribute); attributes.remove(missing); http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java index c246d8f..d01b5c5 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java @@ -25,12 +25,14 @@ import java.util.Set; import org.apache.commons.jexl2.JexlContext; import org.apache.commons.jexl2.MapContext; import org.apache.commons.lang3.StringUtils; -import org.apache.syncope.common.lib.types.AttributableType; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.core.persistence.api.dao.UserDAO; import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.task.PropagationTask; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.misc.jexl.JexlUtils; +import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; +import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.identityconnectors.framework.common.objects.Attribute; import org.identityconnectors.framework.common.objects.AttributeBuilder; import org.identityconnectors.framework.common.objects.AttributeUtil; @@ -51,6 +53,9 @@ public class LDAPMembershipPropagationActions extends DefaultPropagationActions protected static final Logger LOG = LoggerFactory.getLogger(LDAPMembershipPropagationActions.class); @Autowired + protected AnyTypeDAO anyTypeDAO; + + @Autowired protected UserDAO userDAO; /** @@ -67,23 +72,24 @@ public class LDAPMembershipPropagationActions extends DefaultPropagationActions public void before(final PropagationTask task, final ConnectorObject beforeObj) { super.before(task, beforeObj); - if (AttributableType.USER == task.getSubjectType() && task.getResource().getGmapping() != null) { - User user = userDAO.find(task.getSubjectKey()); + Provision provision = task.getResource().getProvision(anyTypeDAO.findGroup()); + if (AnyTypeKind.USER == task.getAnyTypeKind() && provision.getMapping() != null) { + User user = userDAO.find(task.getAnyKey()); if (user != null) { List<String> groupAccountLinks = new ArrayList<>(); for (Group group : userDAO.findAllGroups(user)) { if (group.getResourceNames().contains(task.getResource().getKey()) - && StringUtils.isNotBlank(task.getResource().getGmapping().getAccountLink())) { + && StringUtils.isNotBlank(provision.getMapping().getConnObjectLink())) { LOG.debug("Evaluating accountLink for {}", group); - final JexlContext jexlContext = new MapContext(); + JexlContext jexlContext = new MapContext(); JexlUtils.addFieldsToContext(group, jexlContext); JexlUtils.addAttrsToContext(group.getPlainAttrs(), jexlContext); JexlUtils.addDerAttrsToContext(group.getDerAttrs(), group.getPlainAttrs(), jexlContext); - final String groupAccountLink = - JexlUtils.evaluate(task.getResource().getGmapping().getAccountLink(), jexlContext); + String groupAccountLink = + JexlUtils.evaluate(provision.getMapping().getConnObjectLink(), jexlContext); LOG.debug("AccountLink for {} is '{}'", group, groupAccountLink); if (StringUtils.isNotBlank(groupAccountLink)) { groupAccountLinks.add(groupAccountLink); http://git-wip-us.apache.org/repos/asf/syncope/blob/081d9a04/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java index 35358af..dca9084 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java @@ -22,7 +22,7 @@ import java.util.HashSet; import java.util.Set; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; -import org.apache.syncope.common.lib.types.AttributableType; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.CipherAlgorithm; import org.apache.syncope.common.lib.types.ConnConfProperty; import org.apache.syncope.core.persistence.api.dao.UserDAO; @@ -58,8 +58,8 @@ public class LDAPPasswordPropagationActions extends DefaultPropagationActions { public void before(final PropagationTask task, final ConnectorObject beforeObj) { super.before(task, beforeObj); - if (AttributableType.USER == task.getSubjectType()) { - User user = userDAO.find(task.getSubjectKey()); + if (AnyTypeKind.USER == task.getAnyTypeKind()) { + User user = userDAO.find(task.getAnyKey()); if (user != null && user.getPassword() != null) { Attribute missing = AttributeUtil.find(
