[SYNCOPE-666] More cleanup + test for using realm in ConnObjectLink
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/54de3984 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/54de3984 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/54de3984 Branch: refs/heads/master Commit: 54de3984790735467e69b46feb934d17f2fd2b42 Parents: a64ef15 Author: Francesco Chicchiriccò <[email protected]> Authored: Mon Jun 8 09:04:50 2015 +0200 Committer: Francesco Chicchiriccò <[email protected]> Committed: Mon Jun 8 09:04:50 2015 +0200 ---------------------------------------------------------------------- .../syncope/core/logic/ResourceLogic.java | 8 +- .../apache/syncope/core/logic/AbstractTest.java | 41 +++++++++ .../apache/syncope/core/logic/MappingTest.java | 67 ++++++++++++++ .../syncope/core/logic/NotificationTest.java | 21 +---- .../syncope/core/misc/ConnObjectUtils.java | 2 +- .../apache/syncope/core/misc/MappingUtils.java | 97 +++++++++++++++----- .../syncope/core/misc/jexl/JexlUtils.java | 23 +++-- .../core/persistence/api/entity/AnyUtils.java | 10 -- .../persistence/jpa/entity/JPAAnyUtils.java | 83 ----------------- .../core/provisioning/api/VirAttrHandler.java | 6 +- .../provisioning/java/VirAttrHandlerImpl.java | 24 ++--- .../java/data/AbstractAnyDataBinder.java | 10 +- .../AbstractPropagationTaskExecutor.java | 8 +- .../propagation/PropagationManagerImpl.java | 21 ++--- .../core/provisioning/java/sync/SyncUtils.java | 13 +-- .../core/reference/AuthenticationITCase.java | 12 ++- 16 files changed, 247 insertions(+), 199 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java ---------------------------------------------------------------------- diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java index 863af12..df09b5f 100644 --- a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java +++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java @@ -50,7 +50,6 @@ import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; import org.apache.syncope.core.persistence.api.entity.Any; import org.apache.syncope.core.persistence.api.entity.AnyType; -import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.identityconnectors.framework.common.objects.Attribute; @@ -201,10 +200,7 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> { if (any == null) { throw new NotFoundException(anyType + " " + key); } - - AnyUtils attrUtils = anyUtilsFactory.getInstance(anyType.getKind()); - - MappingItem connObjectKeyItem = attrUtils.getConnObjectKeyItem(provision); + MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision); if (connObjectKeyItem == null) { throw new NotFoundException( "ConnObjectKey mapping for " + anyType + " " + key + " on resource '" + resourceKey + "'"); @@ -214,7 +210,7 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> { Connector connector = connFactory.getConnector(resource); ConnectorObject connectorObject = connector.getObject( provision.getObjectClass(), new Uid(connObjectKeyValue), - connector.getOperationOptions(attrUtils.getMappingItems(provision, MappingPurpose.BOTH))); + connector.getOperationOptions(MappingUtils.getMappingItems(provision, MappingPurpose.BOTH))); if (connectorObject == null) { throw new NotFoundException("Object " + connObjectKeyValue + " with class " + provision.getObjectClass() + " not found on resource " + resourceKey); http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java ---------------------------------------------------------------------- diff --git a/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java b/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java new file mode 100644 index 0000000..161d0c1 --- /dev/null +++ b/core/logic/src/test/java/org/apache/syncope/core/logic/AbstractTest.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.core.logic; + +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { + "classpath:provisioningContext.xml", + "classpath:logicContext.xml", + "classpath:workflowContext.xml", + "classpath:persistenceTest.xml", + "classpath:logicTest.xml" +}) +@Transactional +public abstract class AbstractTest { + + protected static final Logger LOG = LoggerFactory.getLogger(AbstractTest.class); + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/logic/src/test/java/org/apache/syncope/core/logic/MappingTest.java ---------------------------------------------------------------------- diff --git a/core/logic/src/test/java/org/apache/syncope/core/logic/MappingTest.java b/core/logic/src/test/java/org/apache/syncope/core/logic/MappingTest.java new file mode 100644 index 0000000..1f1dab7 --- /dev/null +++ b/core/logic/src/test/java/org/apache/syncope/core/logic/MappingTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.core.logic; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.apache.syncope.core.misc.MappingUtils; +import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO; +import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO; +import org.apache.syncope.core.persistence.api.dao.UserDAO; +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.identityconnectors.framework.common.objects.Name; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +public class MappingTest extends AbstractTest { + + @Autowired + private ExternalResourceDAO resourceDAO; + + @Autowired + private AnyTypeDAO anyTypeDAO; + + @Autowired + private UserDAO userDAO; + + @Test + public void connObjectLink() { + ExternalResource ldap = resourceDAO.find("resource-ldap"); + assertNotNull(ldap); + + Provision provision = ldap.getProvision(anyTypeDAO.findUser()); + assertNotNull(provision); + assertNotNull(provision.getMapping()); + assertNotNull(provision.getMapping().getConnObjectLink()); + + User user = userDAO.find("rossini"); + assertNotNull(user); + + Name name = MappingUtils.evaluateNAME(user, provision, user.getUsername()); + assertEquals("uid=rossini,ou=people,o=isp", name.getNameValue()); + + provision.getMapping().setConnObjectLink("'uid=' + username + ',o=' + realm + ',ou=people,o=isp'"); + + name = MappingUtils.evaluateNAME(user, provision, user.getUsername()); + assertEquals("uid=rossini,o=even,ou=people,o=isp", name.getNameValue()); + } +} http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java ---------------------------------------------------------------------- diff --git a/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java b/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java index 4401a6b..bc425dc 100644 --- a/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java +++ b/core/logic/src/test/java/org/apache/syncope/core/logic/NotificationTest.java @@ -70,9 +70,6 @@ import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; @@ -82,22 +79,8 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.transaction.annotation.Transactional; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = { - "classpath:provisioningContext.xml", - "classpath:logicContext.xml", - "classpath:workflowContext.xml", - "classpath:persistenceTest.xml", - "classpath:logicTest.xml" -}) -@Transactional -public class NotificationTest { - - private static final Logger LOG = LoggerFactory.getLogger(NotificationTest.class); + +public class NotificationTest extends AbstractTest { private static final String SMTP_HOST = "localhost"; http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/misc/src/main/java/org/apache/syncope/core/misc/ConnObjectUtils.java ---------------------------------------------------------------------- diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/ConnObjectUtils.java b/core/misc/src/main/java/org/apache/syncope/core/misc/ConnObjectUtils.java index c86ee7c..807ea0f 100644 --- a/core/misc/src/main/java/org/apache/syncope/core/misc/ConnObjectUtils.java +++ b/core/misc/src/main/java/org/apache/syncope/core/misc/ConnObjectUtils.java @@ -199,7 +199,7 @@ public class ConnObjectUtils { // 1. fill with data from connector object anyTO.setRealm(syncTask.getDestinatioRealm().getFullPath()); - for (MappingItem item : anyUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION)) { + for (MappingItem item : MappingUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION)) { Attribute attr = obj.getAttributeByName(item.getExtAttrName()); AttrTO attrTO; http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java ---------------------------------------------------------------------- diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java b/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java index 97008d0..140c5ad 100644 --- a/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java +++ b/core/misc/src/main/java/org/apache/syncope/core/misc/MappingUtils.java @@ -120,7 +120,6 @@ public final class MappingUtils { /** * Prepare attributes for sending to a connector instance. * - * @param anyUtils any object * @param any given any object * @param password clear-text password * @param changePwd whether password should be included for propagation attributes or not @@ -130,8 +129,8 @@ public final class MappingUtils { * @param provision provision information * @return connObjectLink + prepared attributes */ - public static Pair<String, Set<Attribute>> prepareAttributes( - final AnyUtils anyUtils, final Any<?, ?, ?> any, + public static Pair<String, Set<Attribute>> prepareAttrs( + final Any<?, ?, ?> any, final String password, final boolean changePwd, final Set<String> vAttrsToBeRemoved, @@ -149,7 +148,7 @@ public final class MappingUtils { Set<Attribute> attributes = new HashSet<>(); String connObjectKey = null; - for (MappingItem mapping : anyUtils.getMappingItems(provision, MappingPurpose.PROPAGATION)) { + for (MappingItem mapping : getMappingItems(provision, MappingPurpose.PROPAGATION)) { LOG.debug("Processing schema {}", mapping.getIntAttrName()); try { @@ -188,11 +187,10 @@ public final class MappingUtils { } Attribute connObjectKeyExtAttr = - AttributeUtil.find(anyUtils.getConnObjectKeyItem(provision).getExtAttrName(), attributes); + AttributeUtil.find(getConnObjectKeyItem(provision).getExtAttrName(), attributes); if (connObjectKeyExtAttr != null) { attributes.remove(connObjectKeyExtAttr); - attributes.add(AttributeBuilder.build( - anyUtils.getConnObjectKeyItem(provision).getExtAttrName(), connObjectKey)); + attributes.add(AttributeBuilder.build(getConnObjectKeyItem(provision).getExtAttrName(), connObjectKey)); } attributes.add(evaluateNAME(any, provision, connObjectKey)); @@ -373,26 +371,23 @@ public final class MappingUtils { * @param connObjectKey connector object key * @return the value to be propagated as __NAME__ */ - public static Name evaluateNAME(final Any<?, ?, ?> any, - final Provision provision, final String connObjectKey) { - - final AnyUtilsFactory anyUtilsFactory = - ApplicationContextProvider.getApplicationContext().getBean(AnyUtilsFactory.class); - final AnyUtils anyUtils = anyUtilsFactory.getInstance(any); - + public static Name evaluateNAME(final Any<?, ?, ?> any, final Provision provision, final String connObjectKey) { if (StringUtils.isBlank(connObjectKey)) { // LOG error but avoid to throw exception: leave it to the external resource LOG.error("Missing ConnObjectKey for '{}': ", provision.getResource()); } // Evaluate connObjectKey expression + String connObjectLink = provision == null || provision.getMapping() == null + ? null + : provision.getMapping().getConnObjectLink(); String evalConnObjectLink = null; - if (StringUtils.isNotBlank(anyUtils.getConnObjectLink(provision))) { - final JexlContext jexlContext = new MapContext(); + if (StringUtils.isNotBlank(connObjectLink)) { + JexlContext jexlContext = new MapContext(); JexlUtils.addFieldsToContext(any, jexlContext); JexlUtils.addPlainAttrsToContext(any.getPlainAttrs(), jexlContext); JexlUtils.addDerAttrsToContext(any.getDerAttrs(), any.getPlainAttrs(), jexlContext); - evalConnObjectLink = JexlUtils.evaluate(anyUtils.getConnObjectLink(provision), jexlContext); + evalConnObjectLink = JexlUtils.evaluate(connObjectLink, jexlContext); } // If connObjectLink evaluates to an empty string, just use the provided connObjectKey as Name(), @@ -414,11 +409,7 @@ public final class MappingUtils { } private static String getGroupOwnerValue(final Provision provision, final Any<?, ?, ?> any) { - AnyUtilsFactory anyUtilsFactory = - ApplicationContextProvider.getApplicationContext().getBean(AnyUtilsFactory.class); - - Pair<String, Attribute> preparedAttr = prepareAttr( - provision, anyUtilsFactory.getInstance(any).getConnObjectKeyItem(provision), + Pair<String, Attribute> preparedAttr = prepareAttr(provision, getConnObjectKeyItem(provision), any, null, null, Collections.<String>emptySet(), Collections.<String, AttrMod>emptyMap()); String connObjectKey = preparedAttr.getKey(); @@ -611,6 +602,68 @@ public final class MappingUtils { : values.get(0).getValueAsString(); } + public static MappingItem getConnObjectKeyItem(final Provision provision) { + Mapping mapping = null; + if (provision != null) { + mapping = provision.getMapping(); + } + + return mapping == null + ? null + : mapping.getConnObjectKeyItem(); + } + + public static List<MappingItem> getMappingItems(final Provision provision, final MappingPurpose purpose) { + List<? extends MappingItem> items = Collections.<MappingItem>emptyList(); + if (provision != null) { + items = provision.getMapping().getItems(); + } + + List<MappingItem> result = new ArrayList<>(); + + switch (purpose) { + case SYNCHRONIZATION: + for (MappingItem item : items) { + if (MappingPurpose.PROPAGATION != item.getPurpose() + && MappingPurpose.NONE != item.getPurpose()) { + + result.add(item); + } + } + break; + + case PROPAGATION: + for (MappingItem item : items) { + if (MappingPurpose.SYNCHRONIZATION != item.getPurpose() + && MappingPurpose.NONE != item.getPurpose()) { + + result.add(item); + } + } + break; + + case BOTH: + for (MappingItem item : items) { + if (MappingPurpose.NONE != item.getPurpose()) { + result.add(item); + } + } + break; + + case NONE: + for (MappingItem item : items) { + if (MappingPurpose.NONE == item.getPurpose()) { + result.add(item); + } + } + break; + + default: + } + + return result; + } + /** * Private default constructor, for static-only classes. */ http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/misc/src/main/java/org/apache/syncope/core/misc/jexl/JexlUtils.java ---------------------------------------------------------------------- diff --git a/core/misc/src/main/java/org/apache/syncope/core/misc/jexl/JexlUtils.java b/core/misc/src/main/java/org/apache/syncope/core/misc/jexl/JexlUtils.java index 9aad079..443bbae 100644 --- a/core/misc/src/main/java/org/apache/syncope/core/misc/jexl/JexlUtils.java +++ b/core/misc/src/main/java/org/apache/syncope/core/misc/jexl/JexlUtils.java @@ -22,7 +22,6 @@ import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.Collection; import java.util.Date; import java.util.List; @@ -106,24 +105,22 @@ public final class JexlUtils { try { for (PropertyDescriptor desc : Introspector.getBeanInfo(object.getClass()).getPropertyDescriptors()) { - final Class<?> type = desc.getPropertyType(); - final String fieldName = desc.getName(); + Class<?> type = desc.getPropertyType(); + String fieldName = desc.getName(); if ((!fieldName.startsWith("pc")) && (!ArrayUtils.contains(IGNORE_FIELDS, fieldName)) && (!Iterable.class.isAssignableFrom(type)) && (!type.isArray())) { - try { - final Method getter = desc.getReadMethod(); - - final Object fieldValue; - if (getter == null) { + try { + Object fieldValue; + if (desc.getReadMethod() == null) { final Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); fieldValue = field.get(object); } else { - fieldValue = getter.invoke(object); + fieldValue = desc.getReadMethod().invoke(object); } context.set(fieldName, fieldValue == null @@ -133,7 +130,6 @@ public final class JexlUtils { : fieldValue)); LOG.debug("Add field {} with value {}", fieldName, fieldValue); - } catch (Exception iae) { LOG.error("Reading '{}' value error", fieldName, iae); } @@ -143,6 +139,13 @@ public final class JexlUtils { LOG.error("Reading class attributes error", ie); } + if (object instanceof Any) { + Any<?, ?, ?> any = (Any<?, ?, ?>) object; + if (any.getRealm() != null) { + context.set("realm", any.getRealm().getName()); + } + } + return context; } http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java index 836f0e3..8c64086 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java @@ -18,13 +18,9 @@ */ package org.apache.syncope.core.persistence.api.entity; -import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; -import java.util.List; import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.IntMappingType; -import org.apache.syncope.common.lib.types.MappingPurpose; -import org.apache.syncope.core.persistence.api.entity.resource.Provision; public interface AnyUtils { @@ -52,12 +48,6 @@ public interface AnyUtils { <T extends VirAttr<?>> T newVirAttr(); - MappingItem getConnObjectKeyItem(Provision provision); - - String getConnObjectLink(Provision provision); - - List<MappingItem> getMappingItems(Provision provision, MappingPurpose purpose); - IntMappingType plainIntMappingType(); IntMappingType derIntMappingType(); http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java index 989c642..9d0f798 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java @@ -18,25 +18,18 @@ */ package org.apache.syncope.core.persistence.jpa.entity; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import org.apache.syncope.common.lib.to.AnyObjectTO; import org.apache.syncope.common.lib.to.AnyTO; import org.apache.syncope.common.lib.to.GroupTO; import org.apache.syncope.common.lib.to.UserTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.IntMappingType; -import org.apache.syncope.common.lib.types.MappingPurpose; import org.apache.syncope.core.persistence.api.entity.Any; import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.DerAttr; -import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.PlainAttr; import org.apache.syncope.core.persistence.api.entity.PlainAttrValue; import org.apache.syncope.core.persistence.api.entity.VirAttr; -import org.apache.syncope.core.persistence.api.entity.resource.Mapping; -import org.apache.syncope.core.persistence.api.entity.resource.Provision; import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADerAttr; import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttr; import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttrUniqueValue; @@ -319,82 +312,6 @@ public class JPAAnyUtils implements AnyUtils { } @Override - public MappingItem getConnObjectKeyItem(final Provision provision) { - Mapping mapping = null; - if (provision != null) { - mapping = provision.getMapping(); - } - - return mapping == null - ? null - : mapping.getConnObjectKeyItem(); - } - - @Override - public String getConnObjectLink(final Provision provision) { - Mapping mapping = null; - if (provision != null) { - mapping = provision.getMapping(); - } - - return mapping == null - ? null - : mapping.getConnObjectLink(); - } - - @Override - public List<MappingItem> getMappingItems(final Provision provision, final MappingPurpose purpose) { - List<? extends MappingItem> items = Collections.<MappingItem>emptyList(); - if (provision != null) { - items = provision.getMapping().getItems(); - } - - List<MappingItem> result = new ArrayList<>(); - - switch (purpose) { - case SYNCHRONIZATION: - for (MappingItem item : items) { - if (MappingPurpose.PROPAGATION != item.getPurpose() - && MappingPurpose.NONE != item.getPurpose()) { - - result.add(item); - } - } - break; - - case PROPAGATION: - for (MappingItem item : items) { - if (MappingPurpose.SYNCHRONIZATION != item.getPurpose() - && MappingPurpose.NONE != item.getPurpose()) { - - result.add(item); - } - } - break; - - case BOTH: - for (MappingItem item : items) { - if (MappingPurpose.NONE != item.getPurpose()) { - result.add(item); - } - } - break; - - case NONE: - for (MappingItem item : items) { - if (MappingPurpose.NONE == item.getPurpose()) { - result.add(item); - } - } - break; - - default: - } - - return result; - } - - @Override public IntMappingType plainIntMappingType() { IntMappingType result = null; http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/VirAttrHandler.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/VirAttrHandler.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/VirAttrHandler.java index 4cec074..8916d27 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/VirAttrHandler.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/VirAttrHandler.java @@ -26,7 +26,6 @@ import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.IntMappingType; import org.apache.syncope.common.lib.types.PropagationByResource; import org.apache.syncope.core.persistence.api.entity.Any; -import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.VirSchema; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; @@ -64,8 +63,7 @@ public interface VirAttrHandler { void retrieveVirAttrValues(Any<?, ?, ?> any); void updateOnResourcesIfMappingMatches( - Any<?, ?, ?> any, AnyUtils anyUtils, String schemaKey, - Iterable<? extends ExternalResource> resources, IntMappingType mappingType, - PropagationByResource propByRes); + Any<?, ?, ?> any, String schemaKey, Iterable<? extends ExternalResource> resources, + IntMappingType mappingType, PropagationByResource propByRes); } http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java index 21626f5..888329c 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java @@ -117,12 +117,12 @@ public class VirAttrHandlerImpl implements VirAttrHandler { } @Override - public void updateOnResourcesIfMappingMatches(final Any<?, ?, ?> any, final AnyUtils anyUtils, - final String schemaKey, final Iterable<? extends ExternalResource> resources, - final IntMappingType mappingType, final PropagationByResource propByRes) { + public void updateOnResourcesIfMappingMatches(final Any<?, ?, ?> any, final String schemaKey, + final Iterable<? extends ExternalResource> resources, final IntMappingType mappingType, + final PropagationByResource propByRes) { for (ExternalResource resource : resources) { - for (MappingItem mapItem : anyUtils.getMappingItems( + for (MappingItem mapItem : MappingUtils.getMappingItems( resource.getProvision(any.getType()), MappingPurpose.PROPAGATION)) { if (schemaKey.equals(mapItem.getIntAttrName()) && mapItem.getIntMappingType() == mappingType) { @@ -166,7 +166,7 @@ public class VirAttrHandlerImpl implements VirAttrHandler { } for (ExternalResource resource : externalResources) { - for (MappingItem mapItem : anyUtils.getMappingItems( + for (MappingItem mapItem : MappingUtils.getMappingItems( resource.getProvision(any.getType()), MappingPurpose.PROPAGATION)) { if (virSchema.getKey().equals(mapItem.getIntAttrName()) @@ -199,8 +199,8 @@ public class VirAttrHandlerImpl implements VirAttrHandler { any.add(virAttr); } - updateOnResourcesIfMappingMatches(any, anyUtils, virSchema.getKey(), - externalResources, anyUtils.derIntMappingType(), propByRes); + updateOnResourcesIfMappingMatches( + any, virSchema.getKey(), externalResources, anyUtils.derIntMappingType(), propByRes); List<String> values = new ArrayList<>(virAttr.getValues()); values.removeAll(vAttrToBeUpdated.getValuesToBeRemoved()); @@ -322,19 +322,19 @@ public class VirAttrHandlerImpl implements VirAttrHandler { AnyUtils anyUtils = anyUtilsFactory.getInstance(any); - for (ExternalResource resource : getTargetResources(virAttr, type, anyUtils, any.getType())) { + for (ExternalResource resource : getTargetResources(virAttr, type, any.getType())) { Provision provision = resource.getProvision(any.getType()); LOG.debug("Search values into {},{}", resource, provision); try { - List<MappingItem> mappings = anyUtils.getMappingItems(provision, MappingPurpose.BOTH); + List<MappingItem> mappings = MappingUtils.getMappingItems(provision, MappingPurpose.BOTH); ConnectorObject connectorObject; if (externalResources.containsKey(resource.getKey())) { connectorObject = externalResources.get(resource.getKey()); } else { LOG.debug("Perform connection to {}", resource.getKey()); - String connObjectKey = anyUtils.getConnObjectKeyItem(provision) == null + String connObjectKey = MappingUtils.getConnObjectKeyItem(provision) == null ? null : MappingUtils.getConnObjectKeyValue(any, provision); @@ -395,7 +395,7 @@ public class VirAttrHandlerImpl implements VirAttrHandler { } private Collection<ExternalResource> getTargetResources( - final VirAttr<?> attr, final IntMappingType type, final AnyUtils anyUtils, final AnyType anyType) { + final VirAttr<?> attr, final IntMappingType type, final AnyType anyType) { return CollectionUtils.select(getAllResources(attr.getOwner()), new Predicate<ExternalResource>() { @@ -403,7 +403,7 @@ public class VirAttrHandlerImpl implements VirAttrHandler { public boolean evaluate(final ExternalResource resource) { return resource.getProvision(anyType) != null && !MappingUtils.getMatchingMappingItems( - anyUtils.getMappingItems(resource.getProvision(anyType), MappingPurpose.BOTH), + MappingUtils.getMappingItems(resource.getProvision(anyType), MappingPurpose.BOTH), attr.getSchema().getKey(), type).isEmpty(); } }); http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java index 4a8a35b..90f5e91 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java @@ -368,7 +368,7 @@ abstract class AbstractAnyDataBinder { } for (ExternalResource resource : resources) { - for (MappingItem mapItem : anyUtils.getMappingItems( + for (MappingItem mapItem : MappingUtils.getMappingItems( resource.getProvision(any.getType()), MappingPurpose.PROPAGATION)) { if (schema.getKey().equals(mapItem.getIntAttrName()) @@ -402,7 +402,7 @@ abstract class AbstractAnyDataBinder { } if (schema != null && attr != null && attr.getSchema() != null) { - virAttrHander.updateOnResourcesIfMappingMatches(any, anyUtils, schema.getKey(), + virAttrHander.updateOnResourcesIfMappingMatches(any, schema.getKey(), resources, anyUtils.plainIntMappingType(), propByRes); // 1.1 remove values @@ -460,7 +460,7 @@ abstract class AbstractAnyDataBinder { } for (ExternalResource resource : resources) { - for (MappingItem mapItem : anyUtils.getMappingItems( + for (MappingItem mapItem : MappingUtils.getMappingItems( resource.getProvision(any.getType()), MappingPurpose.PROPAGATION)) { if (derSchema.getKey().equals(mapItem.getIntAttrName()) @@ -486,7 +486,7 @@ abstract class AbstractAnyDataBinder { for (String derAttrToBeAdded : anyMod.getDerAttrsToAdd()) { DerSchema derSchema = getDerSchema(derAttrToBeAdded); if (derSchema != null) { - virAttrHander.updateOnResourcesIfMappingMatches(any, anyUtils, derSchema.getKey(), + virAttrHander.updateOnResourcesIfMappingMatches(any, derSchema.getKey(), resources, anyUtils.derIntMappingType(), propByRes); DerAttr derAttr = any.getDerAttr(derSchema.getKey()); @@ -700,7 +700,7 @@ abstract class AbstractAnyDataBinder { for (ExternalResource resource : iterable) { Provision provision = resource.getProvision(any.getType()); if (provision != null && provision.getMapping() != null) { - MappingItem connObjectKeyItem = anyUtilsFactory.getInstance(any).getConnObjectKeyItem(provision); + MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision); if (connObjectKeyItem == null) { throw new NotFoundException( "ConnObjectKey mapping for " + any.getType().getKey() + " " + any.getKey() http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/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 6a67ccf..e557699 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 @@ -48,9 +48,9 @@ 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.misc.MappingUtils; 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.anyobject.AnyObject; import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; @@ -124,9 +124,6 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask protected AuditManager auditManager; @Autowired - protected AnyUtilsFactory anyUtilsFactory; - - @Autowired protected EntityFactory entityFactory; @Override @@ -537,8 +534,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask task.getPropagationOperation(), new ObjectClass(task.getObjectClassName()), new Uid(connObjectKey), - connector.getOperationOptions(anyUtilsFactory.getInstance(task.getAnyTypeKind()). - getMappingItems(provision, MappingPurpose.PROPAGATION))); + connector.getOperationOptions(MappingUtils.getMappingItems(provision, MappingPurpose.PROPAGATION))); } catch (TimeoutException toe) { LOG.debug("Request timeout", toe); throw toe; http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java index 2649623..59f8994 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java @@ -49,8 +49,6 @@ import org.apache.syncope.core.misc.MappingUtils; import org.apache.syncope.core.misc.jexl.JexlUtils; 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.AnyUtils; -import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; @@ -102,9 +100,6 @@ public class PropagationManagerImpl implements PropagationManager { protected ConnObjectUtils connObjectUtils; @Autowired - protected AnyUtilsFactory anyUtilsFactory; - - @Autowired protected VirAttrHandler virAttrHandler; @Override @@ -412,8 +407,6 @@ public class PropagationManagerImpl implements PropagationManager { LOG.debug("Provisioning any {}:\n{}", any, propByRes); - AnyUtils anyUtils = anyUtilsFactory.getInstance(any); - if (!propByRes.get(ResourceOperation.CREATE).isEmpty() && vAttrsToBeRemoved != null && vAttrsToBeUpdated != null) { @@ -421,9 +414,9 @@ public class PropagationManagerImpl implements PropagationManager { // update vAttrsToBeUpdated as well for (VirAttr<?> virAttr : any.getVirAttrs()) { - final String schema = virAttr.getSchema().getKey(); + String schema = virAttr.getSchema().getKey(); - final AttrMod attributeMod = new AttrMod(); + AttrMod attributeMod = new AttrMod(); attributeMod.setSchema(schema); attributeMod.getValuesToBeAdded().addAll(virAttr.getValues()); @@ -446,7 +439,7 @@ public class PropagationManagerImpl implements PropagationManager { } else if (provision == null) { LOG.error("No provision specified on resource {} for type {}, ignoring...", resource, any.getType()); - } else if (anyUtils.getMappingItems(provision, MappingPurpose.PROPAGATION).isEmpty()) { + } else if (MappingUtils.getMappingItems(provision, MappingPurpose.PROPAGATION).isEmpty()) { LOG.warn("Requesting propagation for {} but no propagation mapping provided for {}", any.getType(), resource); } else { @@ -454,7 +447,7 @@ public class PropagationManagerImpl implements PropagationManager { task.setResource(resource); task.setObjectClassName( resource.getProvision(any.getType()).getObjectClass().getObjectClassValue()); - task.setAnyTypeKind(anyUtils.getAnyTypeKind()); + task.setAnyTypeKind(any.getType().getKind()); if (!deleteOnResource) { task.setAnyKey(any.getKey()); } @@ -462,15 +455,15 @@ public class PropagationManagerImpl implements PropagationManager { task.setPropagationMode(resource.getPropagationMode()); task.setOldConnObjectKey(propByRes.getOldConnObjectKey(resource.getKey())); - Pair<String, Set<Attribute>> preparedAttrs = MappingUtils.prepareAttributes(anyUtils, any, - password, changePwd, vAttrsToBeRemoved, vAttrsToBeUpdated, enable, provision); + Pair<String, Set<Attribute>> preparedAttrs = MappingUtils.prepareAttrs( + any, password, changePwd, vAttrsToBeRemoved, vAttrsToBeUpdated, enable, provision); task.setConnObjectKey(preparedAttrs.getKey()); // Check if any of mandatory attributes (in the mapping) is missing or not received any value: // if so, add special attributes that will be evaluated by PropagationTaskExecutor List<String> mandatoryMissing = new ArrayList<>(); List<String> mandatoryNullOrEmpty = new ArrayList<>(); - for (MappingItem item : anyUtils.getMappingItems(provision, MappingPurpose.PROPAGATION)) { + for (MappingItem item : MappingUtils.getMappingItems(provision, MappingPurpose.PROPAGATION)) { if (!item.isConnObjectKey() && JexlUtils.evaluateMandatoryCondition(item.getMandatoryCondition(), any)) { http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java index 71ad319..14c94f70 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/sync/SyncUtils.java @@ -28,6 +28,7 @@ import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.MappingPurpose; import org.apache.syncope.common.lib.types.SyncPolicySpec; +import org.apache.syncope.core.misc.MappingUtils; import org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException; import org.apache.syncope.core.persistence.api.dao.AnyDAO; import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO; @@ -119,7 +120,7 @@ public class SyncUtils { List<ConnectorObject> found = connector.search(provision.getObjectClass(), new EqualsFilter(new Name(name)), connector.getOperationOptions( - anyUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION))); + MappingUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION))); if (found.isEmpty()) { LOG.debug("No {} found on {} with __NAME__ {}", provision.getObjectClass(), resource, name); @@ -162,7 +163,7 @@ public class SyncUtils { List<Long> result = new ArrayList<>(); - MappingItem connObjectKeyItem = anyUtils.getConnObjectKeyItem(provision); + MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision); switch (connObjectKeyItem.getIntMappingType()) { case UserPlainSchema: case GroupPlainSchema: @@ -249,12 +250,12 @@ public class SyncUtils { final ConnectorObject connObj, final List<String> altSearchSchemas, final Provision provision, - final AnyUtils anyUtils) { + final AnyTypeKind anyTypeKind) { // search for external attribute's name/value of each specified name Map<String, Attribute> extValues = new HashMap<>(); - for (MappingItem item : anyUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION)) { + for (MappingItem item : MappingUtils.getMappingItems(provision, MappingPurpose.SYNCHRONIZATION)) { extValues.put(item.getIntAttrName(), connObj.getAttributeByName(item.getExtAttrName())); } @@ -309,7 +310,7 @@ public class SyncUtils { : SearchCond.getAndCond(searchCond, nodeCond); } - return search(searchCond, anyUtils.getAnyTypeKind()); + return search(searchCond, anyTypeKind); } private SyncCorrelationRule getCorrelationRule(final Provision provision, final SyncPolicySpec policySpec) { @@ -367,7 +368,7 @@ public class SyncUtils { return syncRule == null ? altSearchSchemas == null || altSearchSchemas.isEmpty() ? findByConnObjectKeyItem(uid, provision, anyUtils) - : findByAnySearch(connObj, altSearchSchemas, provision, anyUtils) + : findByAnySearch(connObj, altSearchSchemas, provision, anyUtils.getAnyTypeKind()) : findByCorrelationRule(connObj, syncRule, anyUtils.getAnyTypeKind()); } http://git-wip-us.apache.org/repos/asf/syncope/blob/54de3984/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java index 8005b24..6ea8cb0 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AuthenticationITCase.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.Set; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.Transformer; import org.apache.commons.lang3.tuple.Pair; import org.apache.syncope.client.lib.SyncopeClient; @@ -194,6 +195,8 @@ public class AuthenticationITCase extends AbstractITCase { userTO = createUser(userTO); assertNotNull(userTO); + // 1. user assigned to role 1, with search entitlement on realms /odd and /even: won't find anything with + // root realm UserService userService2 = clientFactory.create(userTO.getUsername(), "password123"). getService(UserService.class); @@ -214,13 +217,20 @@ public class AuthenticationITCase extends AbstractITCase { assertFalse(matchedUserKeys.contains(2L)); assertFalse(matchedUserKeys.contains(5L)); + // 2. user assigned to role 4, with search entitlement on realm /even/two UserService userService3 = clientFactory.create("puccini", ADMIN_PWD).getService(UserService.class); matchedUsers = userService3.search( SyncopeClient.getAnySearchQueryBuilder().realm("/even/two"). fiql(SyncopeClient.getUserSearchConditionBuilder().isNotNull("loginDate").query()).build()); assertNotNull(matchedUsers); - assertTrue(matchedUsers.getResult().isEmpty()); + assertTrue(CollectionUtils.matchesAll(matchedUsers.getResult(), new Predicate<UserTO>() { + + @Override + public boolean evaluate(final UserTO matched) { + return "/even/two".equals(matched.getRealm()); + } + })); } @Test
