You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/06/11 16:17:36 UTC
[46/70] syncope git commit: [SYNCOPE-666] All tests are green,
time to add more
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
new file mode 100644
index 0000000..8747631
--- /dev/null
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
@@ -0,0 +1,131 @@
+/*
+ * 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 java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.types.Entitlement;
+import org.apache.syncope.core.persistence.api.dao.NotFoundException;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
+import org.apache.syncope.core.provisioning.api.data.AnyTypeClassDataBinder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AnyTypeClassLogic extends AbstractTransactionalLogic<AnyTypeClassTO> {
+
+ @Autowired
+ private AnyTypeClassDataBinder binder;
+
+ @Autowired
+ private AnyTypeClassDAO anyTypeDAO;
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPECLASS_READ + "')")
+ public AnyTypeClassTO read(final String key) {
+ AnyTypeClass anyType = anyTypeDAO.find(key);
+ if (anyType == null) {
+ LOG.error("Could not find anyType '" + key + "'");
+
+ throw new NotFoundException(String.valueOf(key));
+ }
+
+ return binder.getAnyTypeClassTO(anyType);
+ }
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPECLASS_LIST + "')")
+ public List<AnyTypeClassTO> list() {
+ return CollectionUtils.collect(anyTypeDAO.findAll(), new Transformer<AnyTypeClass, AnyTypeClassTO>() {
+
+ @Override
+ public AnyTypeClassTO transform(final AnyTypeClass input) {
+ return binder.getAnyTypeClassTO(input);
+ }
+ }, new ArrayList<AnyTypeClassTO>());
+ }
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPECLASS_CREATE + "')")
+ public AnyTypeClassTO create(final AnyTypeClassTO anyTypeTO) {
+ return binder.getAnyTypeClassTO(anyTypeDAO.save(binder.create(anyTypeTO)));
+ }
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPECLASS_UPDATE + "')")
+ public AnyTypeClassTO update(final AnyTypeClassTO anyTypeTO) {
+ AnyTypeClass anyType = anyTypeDAO.find(anyTypeTO.getKey());
+ if (anyType == null) {
+ LOG.error("Could not find anyType '" + anyTypeTO.getKey() + "'");
+ throw new NotFoundException(String.valueOf(anyTypeTO.getKey()));
+ }
+
+ binder.update(anyType, anyTypeTO);
+ anyType = anyTypeDAO.save(anyType);
+
+ return binder.getAnyTypeClassTO(anyType);
+ }
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPECLASS_DELETE + "')")
+ public AnyTypeClassTO delete(final String key) {
+ AnyTypeClass anyType = anyTypeDAO.find(key);
+ if (anyType == null) {
+ LOG.error("Could not find anyType '" + key + "'");
+
+ throw new NotFoundException(String.valueOf(key));
+ }
+
+ AnyTypeClassTO deleted = binder.getAnyTypeClassTO(anyType);
+ anyTypeDAO.delete(key);
+ return deleted;
+ }
+
+ @Override
+ protected AnyTypeClassTO resolveReference(final Method method, final Object... args)
+ throws UnresolvedReferenceException {
+
+ String key = null;
+
+ if (ArrayUtils.isNotEmpty(args)) {
+ for (int i = 0; key == null && i < args.length; i++) {
+ if (args[i] instanceof Long) {
+ key = (String) args[i];
+ } else if (args[i] instanceof AnyTypeClassTO) {
+ key = ((AnyTypeClassTO) args[i]).getKey();
+ }
+ }
+ }
+
+ if (StringUtils.isNotBlank(key)) {
+ try {
+ return binder.getAnyTypeClassTO(anyTypeDAO.find(key));
+ } catch (Throwable ignore) {
+ LOG.debug("Unresolved reference", ignore);
+ throw new UnresolvedReferenceException(ignore);
+ }
+ }
+
+ throw new UnresolvedReferenceException();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
new file mode 100644
index 0000000..93af622
--- /dev/null
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
@@ -0,0 +1,131 @@
+/*
+ * 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 java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.types.Entitlement;
+import org.apache.syncope.core.persistence.api.dao.NotFoundException;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.provisioning.api.data.AnyTypeDataBinder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AnyTypeLogic extends AbstractTransactionalLogic<AnyTypeTO> {
+
+ @Autowired
+ private AnyTypeDataBinder binder;
+
+ @Autowired
+ private AnyTypeDAO anyTypeDAO;
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPE_READ + "')")
+ public AnyTypeTO read(final String key) {
+ AnyType anyType = anyTypeDAO.find(key);
+ if (anyType == null) {
+ LOG.error("Could not find anyType '" + key + "'");
+
+ throw new NotFoundException(String.valueOf(key));
+ }
+
+ return binder.getAnyTypeTO(anyType);
+ }
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPE_LIST + "')")
+ public List<AnyTypeTO> list() {
+ return CollectionUtils.collect(anyTypeDAO.findAll(), new Transformer<AnyType, AnyTypeTO>() {
+
+ @Override
+ public AnyTypeTO transform(final AnyType input) {
+ return binder.getAnyTypeTO(input);
+ }
+ }, new ArrayList<AnyTypeTO>());
+ }
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPE_CREATE + "')")
+ public AnyTypeTO create(final AnyTypeTO anyTypeTO) {
+ return binder.getAnyTypeTO(anyTypeDAO.save(binder.create(anyTypeTO)));
+ }
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPE_UPDATE + "')")
+ public AnyTypeTO update(final AnyTypeTO anyTypeTO) {
+ AnyType anyType = anyTypeDAO.find(anyTypeTO.getKey());
+ if (anyType == null) {
+ LOG.error("Could not find anyType '" + anyTypeTO.getKey() + "'");
+ throw new NotFoundException(String.valueOf(anyTypeTO.getKey()));
+ }
+
+ binder.update(anyType, anyTypeTO);
+ anyType = anyTypeDAO.save(anyType);
+
+ return binder.getAnyTypeTO(anyType);
+ }
+
+ @PreAuthorize("hasRole('" + Entitlement.ANYTYPE_DELETE + "')")
+ public AnyTypeTO delete(final String key) {
+ AnyType anyType = anyTypeDAO.find(key);
+ if (anyType == null) {
+ LOG.error("Could not find anyType '" + key + "'");
+
+ throw new NotFoundException(String.valueOf(key));
+ }
+
+ AnyTypeTO deleted = binder.getAnyTypeTO(anyType);
+ anyTypeDAO.delete(key);
+ return deleted;
+ }
+
+ @Override
+ protected AnyTypeTO resolveReference(final Method method, final Object... args)
+ throws UnresolvedReferenceException {
+
+ String key = null;
+
+ if (ArrayUtils.isNotEmpty(args)) {
+ for (int i = 0; key == null && i < args.length; i++) {
+ if (args[i] instanceof Long) {
+ key = (String) args[i];
+ } else if (args[i] instanceof AnyTypeTO) {
+ key = ((AnyTypeTO) args[i]).getKey();
+ }
+ }
+ }
+
+ if (StringUtils.isNotBlank(key)) {
+ try {
+ return binder.getAnyTypeTO(anyTypeDAO.find(key));
+ } catch (Throwable ignore) {
+ LOG.debug("Unresolved reference", ignore);
+ throw new UnresolvedReferenceException(ignore);
+ }
+ }
+
+ throw new UnresolvedReferenceException();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
index 968a34c..77ff7b5 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
@@ -34,9 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired;
@Aspect
public class LogicInvocationHandler {
- /**
- * Logger.
- */
private static final Logger LOG = LoggerFactory.getLogger(LogicInvocationHandler.class);
@Autowired
@@ -47,16 +44,16 @@ public class LogicInvocationHandler {
@Around("execution(* org.apache.syncope.core.logic.AbstractLogic+.*(..))")
public Object around(final ProceedingJoinPoint joinPoint) throws Throwable {
- final Class<?> clazz = joinPoint.getTarget().getClass();
+ Class<?> clazz = joinPoint.getTarget().getClass();
- final Object[] input = joinPoint.getArgs();
+ Object[] input = joinPoint.getArgs();
- final String category = clazz.getSimpleName();
+ String category = clazz.getSimpleName();
- final MethodSignature ms = (MethodSignature) joinPoint.getSignature();
+ MethodSignature ms = (MethodSignature) joinPoint.getSignature();
Method method = ms.getMethod();
- final String event = joinPoint.getSignature().getName();
+ String event = joinPoint.getSignature().getName();
AuditElements.Result result = null;
Object output = null;
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/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 073150b..863af12 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
@@ -217,7 +217,7 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
connector.getOperationOptions(attrUtils.getMappingItems(provision, MappingPurpose.BOTH)));
if (connectorObject == null) {
throw new NotFoundException("Object " + connObjectKeyValue + " with class " + provision.getObjectClass()
- + "not found on resource " + resourceKey);
+ + " not found on resource " + resourceKey);
}
final Set<Attribute> attributes = connectorObject.getAttributes();
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
index 37acf19..4ecab47 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
@@ -50,12 +50,12 @@ import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.apache.syncope.core.provisioning.java.VirAttrHandler;
import org.apache.syncope.core.misc.security.AuthContextUtils;
import org.apache.syncope.core.misc.security.UnauthorizedException;
import org.apache.syncope.core.misc.serialization.POJOHelper;
import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
import org.apache.syncope.core.provisioning.api.AnyTransformer;
+import org.apache.syncope.core.provisioning.api.VirAttrHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Component;
@@ -205,7 +205,7 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserMod> {
Map.Entry<Long, List<PropagationStatus>> created = provisioningManager.create(actual, storePassword);
- final UserTO savedTO = binder.getUserTO(created.getKey());
+ UserTO savedTO = binder.getUserTO(created.getKey());
savedTO.getPropagationStatusTOs().addAll(created.getValue());
return savedTO;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java b/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java
index 106ed36..6a8289a 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/init/JobInstanceLoaderImpl.java
@@ -57,6 +57,7 @@ import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@@ -126,6 +127,30 @@ public class JobInstanceLoaderImpl implements JobInstanceLoader, SyncopeLoader {
}
}
+ private Job createSpringBean(final Class<?> jobClass) {
+ Job jobInstance = null;
+ for (int i = 0; i < 5 && jobInstance == null; i++) {
+ LOG.debug("{} attempt to create Spring bean for {}", i, jobClass);
+ try {
+ jobInstance = (Job) ApplicationContextProvider.getBeanFactory().
+ createBean(jobClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
+ LOG.debug("{} attempt to create Spring bean for {} succeeded", i, jobClass);
+ } catch (BeanCreationException e) {
+ LOG.error("Could not create Spring bean for {}", jobClass, e);
+ try {
+ Thread.sleep(1000);
+ } catch (final InterruptedException ex) {
+ // ignore
+ }
+ }
+ }
+ if (jobInstance == null) {
+ throw new NotFoundException("Spring bean for " + jobClass);
+ }
+
+ return jobInstance;
+ }
+
@SuppressWarnings("unchecked")
@Override
public void registerJob(final Task task, final String jobClassName, final String cronExpression)
@@ -137,8 +162,8 @@ public class JobInstanceLoaderImpl implements JobInstanceLoader, SyncopeLoader {
} else if (PushJob.class.equals(jobClass)) {
jobClass = PushJobImpl.class;
}
- Job jobInstance = (Job) ApplicationContextProvider.getBeanFactory().
- createBean(jobClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
+
+ Job jobInstance = createSpringBean(jobClass);
if (jobInstance instanceof TaskJob) {
((TaskJob) jobInstance).setTaskId(task.getKey());
}
@@ -151,10 +176,8 @@ public class JobInstanceLoaderImpl implements JobInstanceLoader, SyncopeLoader {
try {
Class<?> actionsClass = Class.forName(className);
- final SyncActions syncActions =
- (SyncActions) ApplicationContextProvider.getBeanFactory().
+ SyncActions syncActions = (SyncActions) ApplicationContextProvider.getBeanFactory().
createBean(actionsClass, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
-
actions.add(syncActions);
} catch (Exception e) {
LOG.info("Class '{}' not found", className, e);
@@ -182,8 +205,7 @@ public class JobInstanceLoaderImpl implements JobInstanceLoader, SyncopeLoader {
@Override
public void registerJob(final Report report) throws SchedulerException, ParseException {
- Job jobInstance = (Job) ApplicationContextProvider.getBeanFactory().
- createBean(ReportJob.class, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
+ Job jobInstance = createSpringBean(ReportJob.class);
((ReportJob) jobInstance).setReportKey(report.getKey());
registerJob(JobNamer.getJobName(report), jobInstance, report.getCronExpression());
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java b/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java
index b4087a7..b05c4e6 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/report/UserReportlet.java
@@ -29,6 +29,7 @@ import org.apache.syncope.common.lib.report.UserReportletConf.Feature;
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.RelationshipTO;
import org.apache.syncope.common.lib.to.UserTO;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
@@ -38,6 +39,8 @@ import org.apache.syncope.core.misc.search.SearchCondConverter;
import org.apache.syncope.core.misc.DataFormat;
import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
import org.apache.syncope.core.persistence.api.entity.user.UMembership;
+import org.apache.syncope.core.persistence.api.entity.user.URelationship;
+import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder;
import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
import org.springframework.beans.factory.annotation.Autowired;
@@ -62,6 +65,9 @@ public class UserReportlet extends AbstractReportlet<UserReportletConf> {
@Autowired
private GroupDataBinder groupDataBinder;
+ @Autowired
+ private AnyObjectDataBinder anyObjectDataBinder;
+
private List<User> getPagedUsers(final int page) {
List<User> result;
@@ -264,14 +270,39 @@ public class UserReportlet extends AbstractReportlet<UserReportletConf> {
doExtractAttributes(handler, userTO, conf.getPlainAttrs(), conf.getDerAttrs(), conf.getVirAttrs());
+ if (conf.getFeatures().contains(Feature.relationships)) {
+ handler.startElement("", "", "relationships", null);
+
+ for (RelationshipTO rel : userTO.getRelationships()) {
+ atts.clear();
+
+ atts.addAttribute("", "", "anyObjectKey",
+ ReportXMLConst.XSD_LONG, String.valueOf(rel.getRightKey()));
+ handler.startElement("", "", "relationship", atts);
+
+ if (conf.getFeatures().contains(Feature.resources)) {
+ URelationship actualRel = user.getRelationship(rel.getRightKey());
+ if (actualRel == null) {
+ LOG.warn("Unexpected: cannot find relationship for any object {} for user {}",
+ rel.getRightKey(), user);
+ } else {
+ doExtractResources(handler, anyObjectDataBinder.getAnyObjectTO(actualRel.getRightEnd()));
+ }
+ }
+
+ handler.endElement("", "", "relationship");
+ }
+
+ handler.endElement("", "", "relationships");
+ }
if (conf.getFeatures().contains(Feature.memberships)) {
handler.startElement("", "", "memberships", null);
for (MembershipTO memb : userTO.getMemberships()) {
atts.clear();
- atts.addAttribute("", "", "id", ReportXMLConst.XSD_LONG, String.valueOf(memb.getKey()));
- atts.addAttribute("", "", "groupId", ReportXMLConst.XSD_LONG, String.valueOf(memb.getRightKey()));
+ atts.addAttribute("", "", "groupKey",
+ ReportXMLConst.XSD_LONG, String.valueOf(memb.getRightKey()));
atts.addAttribute("", "", "groupName", ReportXMLConst.XSD_STRING, String.
valueOf(memb.getGroupName()));
handler.startElement("", "", "membership", atts);
@@ -279,8 +310,8 @@ public class UserReportlet extends AbstractReportlet<UserReportletConf> {
if (conf.getFeatures().contains(Feature.resources)) {
UMembership actualMemb = user.getMembership(memb.getRightKey());
if (actualMemb == null) {
- LOG.warn("Unexpected: cannot find membership for group {} for user {}", memb.getRightKey(),
- user);
+ LOG.warn("Unexpected: cannot find membership for group {} for user {}",
+ memb.getRightKey(), user);
} else {
doExtractResources(handler, groupDataBinder.getGroupTO(actualMemb.getRightEnd()));
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/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 279ef77..766c5cf 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
@@ -25,23 +25,21 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.common.lib.AnyOperations;
import org.apache.syncope.common.lib.mod.AnyMod;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.syncope.common.lib.to.AttrTO;
import org.apache.syncope.common.lib.to.ConnObjectTO;
import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.MembershipTO;
+import org.apache.syncope.common.lib.to.RelationshipTO;
import org.apache.syncope.common.lib.to.UserTO;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.lib.types.AttrSchemaType;
-import org.apache.syncope.common.lib.types.IntMappingType;
import org.apache.syncope.common.lib.types.MappingPurpose;
import org.apache.syncope.common.lib.types.PasswordPolicySpec;
import org.apache.syncope.core.persistence.api.attrvalue.validation.ParsingValidationException;
@@ -54,24 +52,13 @@ import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
import org.apache.syncope.core.persistence.api.entity.PlainSchema;
-import org.apache.syncope.core.persistence.api.entity.VirAttr;
import org.apache.syncope.core.persistence.api.entity.group.Group;
import org.apache.syncope.core.persistence.api.entity.task.SyncTask;
import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.provisioning.api.Connector;
-import org.apache.syncope.core.provisioning.api.ConnectorFactory;
-import org.apache.syncope.core.provisioning.api.cache.VirAttrCache;
-import org.apache.syncope.core.provisioning.api.cache.VirAttrCacheValue;
import org.apache.syncope.core.misc.security.Encryptor;
-import org.apache.syncope.core.misc.spring.ApplicationContextProvider;
import org.apache.syncope.core.misc.jexl.JexlUtils;
-import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
import org.apache.syncope.core.persistence.api.dao.RealmDAO;
-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.AnyUtilsFactory;
import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
import org.apache.syncope.core.persistence.api.entity.resource.Provision;
import org.apache.syncope.core.persistence.api.entity.task.AnyTemplate;
import org.identityconnectors.common.Base64;
@@ -79,12 +66,9 @@ import org.identityconnectors.common.security.GuardedByteArray;
import org.identityconnectors.common.security.GuardedString;
import org.identityconnectors.framework.common.objects.Attribute;
import org.identityconnectors.framework.common.objects.ConnectorObject;
-import org.identityconnectors.framework.common.objects.OperationOptions;
-import org.identityconnectors.framework.common.objects.Uid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -100,9 +84,6 @@ public class ConnObjectUtils {
private UserDAO userDAO;
@Autowired
- private AnyObjectDAO anyObjectDAO;
-
- @Autowired
private GroupDAO groupDAO;
@Autowired
@@ -114,18 +95,9 @@ public class ConnObjectUtils {
@Autowired
private PasswordGenerator pwdGen;
- @Autowired
- private AnyUtilsFactory anyUtilsFactory;
-
private final Encryptor encryptor = Encryptor.getInstance();
/**
- * Virtual attribute cache.
- */
- @Autowired
- private VirAttrCache virAttrCache;
-
- /**
* Build a UserTO / GroupTO / AnyObjectTO out of connector object attributes and schema mapping.
*
* @param obj connector object
@@ -213,6 +185,8 @@ public class ConnObjectUtils {
return (T) AnyOperations.diff(((UserTO) updated), ((UserTO) original), true);
} else if (AnyTypeKind.GROUP == anyUtils.getAnyTypeKind()) {
return (T) AnyOperations.diff(((GroupTO) updated), ((GroupTO) original), true);
+ } else if (AnyTypeKind.ANY_OBJECT == anyUtils.getAnyTypeKind()) {
+ return (T) AnyOperations.diff(((AnyObjectTO) updated), ((AnyObjectTO) original), true);
}
return null;
@@ -348,12 +322,14 @@ public class ConnObjectUtils {
AnyTemplate anyTypeTemplate = syncTask.getTemplate(provision.getAnyType());
if (anyTypeTemplate != null) {
AnyTO template = anyTypeTemplate.get();
+ fillFromTemplate(anyTO, template);
- if (template.getRealm() != null) {
- anyTO.setRealm(template.getRealm());
- }
-
- if (template instanceof UserTO) {
+ if (template instanceof AnyObjectTO) {
+ fillRelationshipsFromTemplate(((AnyObjectTO) anyTO).getRelationshipMap(),
+ ((AnyObjectTO) anyTO).getRelationships(), ((AnyObjectTO) template).getRelationships());
+ fillMembershipsFromTemplate(((AnyObjectTO) anyTO).getMembershipMap(),
+ ((AnyObjectTO) anyTO).getMemberships(), ((AnyObjectTO) template).getMemberships());
+ } else if (template instanceof UserTO) {
if (StringUtils.isNotBlank(((UserTO) template).getUsername())) {
String evaluated = JexlUtils.evaluate(((UserTO) template).getUsername(), anyTO);
if (StringUtils.isNotBlank(evaluated)) {
@@ -367,8 +343,12 @@ public class ConnObjectUtils {
((UserTO) anyTO).setPassword(evaluated);
}
}
- }
- if (template instanceof GroupTO) {
+
+ fillRelationshipsFromTemplate(((UserTO) anyTO).getRelationshipMap(),
+ ((UserTO) anyTO).getRelationships(), ((UserTO) template).getRelationships());
+ fillMembershipsFromTemplate(((UserTO) anyTO).getMembershipMap(),
+ ((UserTO) anyTO).getMemberships(), ((UserTO) template).getMemberships());
+ } else if (template instanceof GroupTO) {
if (StringUtils.isNotBlank(((GroupTO) template).getName())) {
String evaluated = JexlUtils.evaluate(((GroupTO) template).getName(), anyTO);
if (StringUtils.isNotBlank(evaluated)) {
@@ -389,12 +369,6 @@ public class ConnObjectUtils {
}
}
}
-
- fillFromTemplate(anyTO, template);
-
- for (String resource : template.getResources()) {
- anyTO.getResources().add(resource);
- }
}
return anyTO;
@@ -467,171 +441,34 @@ public class ConnObjectUtils {
return connObjectTO;
}
- /**
- * Query connected external resources for values to populated virtual attributes associated with the given owner.
- *
- * @param any any object
- */
- public void retrieveVirAttrValues(final Any<?, ?, ?> any) {
- ConfigurableApplicationContext context = ApplicationContextProvider.getApplicationContext();
- ConnectorFactory connFactory = context.getBean(ConnectorFactory.class);
-
- IntMappingType type = any.getType().getKind() == AnyTypeKind.USER
- ? IntMappingType.UserVirtualSchema
- : any.getType().getKind() == AnyTypeKind.GROUP
- ? IntMappingType.GroupVirtualSchema
- : IntMappingType.AnyVirtualSchema;
-
- Map<String, ConnectorObject> resources = new HashMap<>();
-
- // -----------------------
- // Retrieve virtual attribute values if and only if they have not been retrieved yet
- // -----------------------
- for (VirAttr<?> virAttr : any.getVirAttrs()) {
- // reset value set
- if (virAttr.getValues().isEmpty()) {
- retrieveVirAttrValue(any, virAttr, type, resources, connFactory);
- }
- }
- // -----------------------
- }
-
- private void retrieveVirAttrValue(
- final Any<?, ?, ?> any,
- final VirAttr<?> virAttr,
- final IntMappingType type,
- final Map<String, ConnectorObject> externalResources,
- final ConnectorFactory connFactory) {
-
- String schemaName = virAttr.getSchema().getKey();
- VirAttrCacheValue virAttrCacheValue = virAttrCache.get(any.getType().getKey(), any.getKey(), schemaName);
-
- LOG.debug("Retrieve values for virtual attribute {} ({})", schemaName, type);
-
- if (virAttrCache.isValidEntry(virAttrCacheValue)) {
- // cached ...
- LOG.debug("Values found in cache {}", virAttrCacheValue);
- virAttr.getValues().clear();
- virAttr.getValues().addAll(new ArrayList<>(virAttrCacheValue.getValues()));
- } else {
- // not cached ...
- LOG.debug("Need one or more remote connections");
-
- VirAttrCacheValue toBeCached = new VirAttrCacheValue();
-
- AnyUtils anyUtils = anyUtilsFactory.getInstance(any);
- Collection<ExternalResource> targetResources = getTargetResources(virAttr, type, anyUtils, any.getType());
-
- for (ExternalResource resource : targetResources) {
- Provision provision = resource.getProvision(any.getType());
- LOG.debug("Search values into {},{}", resource, provision);
-
- if (provision != null) {
- try {
- List<MappingItem> mappings = anyUtils.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
- ? null
- : MappingUtils.getConnObjectKeyValue(any, provision);
-
- if (StringUtils.isBlank(connObjectKey)) {
- throw new IllegalArgumentException("No ConnObjectKey found for " + resource.getKey());
- }
-
- Connector connector = connFactory.getConnector(resource);
-
- OperationOptions oo =
- connector.getOperationOptions(MappingUtils.getMatchingMappingItems(mappings, type));
-
- connectorObject =
- connector.getObject(provision.getObjectClass(), new Uid(connObjectKey), oo);
- externalResources.put(resource.getKey(), connectorObject);
- }
-
- if (connectorObject != null) {
- // ask for searched virtual attribute value
- Collection<MappingItem> virAttrMappings =
- MappingUtils.getMatchingMappingItems(mappings, schemaName, type);
-
- // the same virtual attribute could be mapped with one or more external attribute
- for (MappingItem mapping : virAttrMappings) {
- Attribute attribute = connectorObject.getAttributeByName(mapping.getExtAttrName());
-
- if (attribute != null && attribute.getValue() != null) {
- for (Object obj : attribute.getValue()) {
- if (obj != null) {
- virAttr.getValues().add(obj.toString());
- }
- }
- }
- }
-
- toBeCached.setResourceValues(resource.getKey(), new HashSet<>(virAttr.getValues()));
+ private AttrTO evaluateAttrFromTemplate(final AnyTO anyTO, final AttrTO template) {
+ AttrTO result = new AttrTO();
+ result.setSchema(template.getSchema());
- LOG.debug("Retrieved values {}", virAttr.getValues());
- }
- } catch (Exception e) {
- LOG.error("Error reading connector object from {}", resource.getKey(), e);
-
- if (virAttrCacheValue != null) {
- toBeCached.forceExpiring();
- LOG.debug("Search for a cached value (even expired!) ...");
- final Set<String> cachedValues = virAttrCacheValue.getValues(resource.getKey());
- if (cachedValues != null) {
- LOG.debug("Use cached value {}", cachedValues);
- virAttr.getValues().addAll(cachedValues);
- toBeCached.setResourceValues(resource.getKey(), new HashSet<>(cachedValues));
- }
- }
- }
+ if (template.getValues() != null && !template.getValues().isEmpty()) {
+ for (String value : template.getValues()) {
+ String evaluated = JexlUtils.evaluate(value, anyTO);
+ if (StringUtils.isNotBlank(evaluated)) {
+ result.getValues().add(evaluated);
}
}
-
- virAttrCache.put(any.getType().getKey(), any.getKey(), schemaName, toBeCached);
}
- }
-
- private Collection<ExternalResource> getTargetResources(
- final VirAttr<?> attr, final IntMappingType type, final AnyUtils anyUtils, final AnyType anyType) {
-
- Iterable<? extends ExternalResource> iterable = attr.getOwner() instanceof User
- ? userDAO.findAllResources((User) attr.getOwner())
- : attr.getOwner() instanceof AnyObject
- ? anyObjectDAO.findAllResources((AnyObject) attr.getOwner())
- : attr.getOwner() instanceof Group
- ? ((Group) attr.getOwner()).getResources()
- : Collections.<ExternalResource>emptySet();
- return getTargetResources(attr, type, anyUtils, iterable, anyType);
- }
-
- private Collection<ExternalResource> getTargetResources(final VirAttr<?> attr, final IntMappingType type,
- final AnyUtils anyUtils, final Iterable<? extends ExternalResource> ownerResources, final AnyType anyType) {
-
- return CollectionUtils.select(ownerResources, new Predicate<ExternalResource>() {
- @Override
- public boolean evaluate(final ExternalResource resource) {
- return resource.getProvision(anyType) != null
- && !MappingUtils.getMatchingMappingItems(
- anyUtils.getMappingItems(resource.getProvision(anyType), MappingPurpose.BOTH),
- attr.getSchema().getKey(), type).isEmpty();
- }
- });
+ return result;
}
private void fillFromTemplate(final AnyTO anyTO, final AnyTO template) {
+ if (template.getRealm() != null) {
+ anyTO.setRealm(template.getRealm());
+ }
+
Map<String, AttrTO> currentAttrMap = anyTO.getPlainAttrMap();
- for (AttrTO templateAttr : template.getPlainAttrs()) {
- if (templateAttr.getValues() != null && !templateAttr.getValues().isEmpty()
- && (!currentAttrMap.containsKey(templateAttr.getSchema())
- || currentAttrMap.get(templateAttr.getSchema()).getValues().isEmpty())) {
+ for (AttrTO templatePlainAttr : template.getPlainAttrs()) {
+ if (!templatePlainAttr.getValues().isEmpty()
+ && (!currentAttrMap.containsKey(templatePlainAttr.getSchema())
+ || currentAttrMap.get(templatePlainAttr.getSchema()).getValues().isEmpty())) {
- anyTO.getPlainAttrs().add(evaluateAttrTemplate(anyTO, templateAttr));
+ anyTO.getPlainAttrs().add(evaluateAttrFromTemplate(anyTO, templatePlainAttr));
}
}
@@ -644,29 +481,39 @@ public class ConnObjectUtils {
currentAttrMap = anyTO.getVirAttrMap();
for (AttrTO templateVirAttr : template.getVirAttrs()) {
- if (templateVirAttr.getValues() != null && !templateVirAttr.getValues().isEmpty()
+ if (!templateVirAttr.getValues().isEmpty()
&& (!currentAttrMap.containsKey(templateVirAttr.getSchema())
|| currentAttrMap.get(templateVirAttr.getSchema()).getValues().isEmpty())) {
- anyTO.getVirAttrs().add(evaluateAttrTemplate(anyTO, templateVirAttr));
+ anyTO.getVirAttrs().add(evaluateAttrFromTemplate(anyTO, templateVirAttr));
}
}
+
+ for (String resource : template.getResources()) {
+ anyTO.getResources().add(resource);
+ }
+
+ anyTO.getAuxClasses().addAll(template.getAuxClasses());
}
- private AttrTO evaluateAttrTemplate(final AnyTO anyTO, final AttrTO template) {
- AttrTO result = new AttrTO();
- result.setSchema(template.getSchema());
+ private void fillRelationshipsFromTemplate(final Map<Long, RelationshipTO> anyRelMap,
+ final List<RelationshipTO> anyRels, final List<RelationshipTO> templateRels) {
- if (template.getValues() != null && !template.getValues().isEmpty()) {
- for (String value : template.getValues()) {
- String evaluated = JexlUtils.evaluate(value, anyTO);
- if (StringUtils.isNotBlank(evaluated)) {
- result.getValues().add(evaluated);
- }
+ for (RelationshipTO memb : templateRels) {
+ if (!anyRelMap.containsKey(memb.getRightKey())) {
+ anyRels.add(memb);
}
}
+ }
- return result;
+ private void fillMembershipsFromTemplate(final Map<Long, MembershipTO> anyMembMap,
+ final List<MembershipTO> anyMembs, final List<MembershipTO> templateMembs) {
+
+ for (MembershipTO memb : templateMembs) {
+ if (!anyMembMap.containsKey(memb.getRightKey())) {
+ anyMembs.add(memb);
+ }
+ }
}
/**
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/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 a1931c1..2efae81 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
@@ -64,6 +64,7 @@ import org.apache.syncope.core.persistence.api.entity.Any;
import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
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.provisioning.api.VirAttrHandler;
import org.identityconnectors.framework.common.FrameworkUtil;
import org.identityconnectors.framework.common.objects.Attribute;
import org.identityconnectors.framework.common.objects.AttributeBuilder;
@@ -230,7 +231,7 @@ public final class MappingUtils {
ConfigurableApplicationContext context = ApplicationContextProvider.getApplicationContext();
AnyUtilsFactory anyUtilsFactory = context.getBean(AnyUtilsFactory.class);
- ConnObjectUtils connObjectUtils = context.getBean(ConnObjectUtils.class);
+ VirAttrHandler virAttrHandler = context.getBean(VirAttrHandler.class);
switch (mapItem.getIntMappingType().getAnyTypeKind()) {
case USER:
@@ -243,7 +244,7 @@ public final class MappingUtils {
if (any instanceof User) {
UserDAO userDAO = context.getBean(UserDAO.class);
for (Group group : userDAO.findAllGroups((User) any)) {
- connObjectUtils.retrieveVirAttrValues(group);
+ virAttrHandler.retrieveVirAttrValues(group);
anys.add(group);
}
} else if (any instanceof Group) {
@@ -266,7 +267,7 @@ public final class MappingUtils {
PlainSchema schema = null;
boolean readOnlyVirSchema = false;
AttrSchemaType schemaType;
- final Pair<String, Attribute> result;
+ Pair<String, Attribute> result;
switch (mapItem.getIntMappingType()) {
case UserPlainSchema:
@@ -290,7 +291,7 @@ public final class MappingUtils {
schemaType = AttrSchemaType.String;
}
- final String extAttrName = mapItem.getExtAttrName();
+ String extAttrName = mapItem.getExtAttrName();
LOG.debug("Define mapping for: "
+ "\n* ExtAttrName " + extAttrName
@@ -389,7 +390,7 @@ public final class MappingUtils {
if (StringUtils.isNotBlank(anyUtils.getConnObjectLink(provision))) {
final JexlContext jexlContext = new MapContext();
JexlUtils.addFieldsToContext(any, jexlContext);
- JexlUtils.addAttrsToContext(any.getPlainAttrs(), jexlContext);
+ JexlUtils.addPlainAttrsToContext(any.getPlainAttrs(), jexlContext);
JexlUtils.addDerAttrsToContext(any.getDerAttrs(), any.getPlainAttrs(), jexlContext);
evalConnObjectLink = JexlUtils.evaluate(anyUtils.getConnObjectLink(provision), jexlContext);
}
@@ -443,6 +444,8 @@ public final class MappingUtils {
EntityFactory entityFactory =
ApplicationContextProvider.getApplicationContext().getBean(EntityFactory.class);
+ AnyUtilsFactory anyUtilsFactory =
+ ApplicationContextProvider.getApplicationContext().getBean(AnyUtilsFactory.class);
List<PlainAttrValue> values = new ArrayList<>();
PlainAttrValue attrValue;
switch (mappingItem.getIntMappingType()) {
@@ -472,6 +475,7 @@ public final class MappingUtils {
case GroupVirtualSchema:
case AnyVirtualSchema:
for (Any<?, ?, ?> any : anys) {
+ AnyUtils anyUtils = anyUtilsFactory.getInstance(any);
VirAttr<?> virAttr = any.getVirAttr(mappingItem.getIntAttrName());
if (virAttr != null) {
if (vAttrsToBeRemoved != null && vAttrsToBeUpdated != null) {
@@ -488,7 +492,7 @@ public final class MappingUtils {
}
if (virAttr.getValues() != null) {
for (String value : virAttr.getValues()) {
- attrValue = entityFactory.newEntity(UPlainAttrValue.class);
+ attrValue = anyUtils.newPlainAttrValue();
attrValue.setStringValue(value);
values.add(attrValue);
}
@@ -508,11 +512,10 @@ public final class MappingUtils {
case GroupDerivedSchema:
case AnyDerivedSchema:
for (Any<?, ?, ?> any : anys) {
+ AnyUtils anyUtils = anyUtilsFactory.getInstance(any);
DerAttr<?> derAttr = any.getDerAttr(mappingItem.getIntAttrName());
if (derAttr != null) {
- attrValue = any instanceof Group
- ? entityFactory.newEntity(GPlainAttrValue.class)
- : entityFactory.newEntity(UPlainAttrValue.class);
+ attrValue = anyUtils.newPlainAttrValue();
attrValue.setStringValue(derAttr.getValue(any.getPlainAttrs()));
values.add(attrValue);
}
@@ -529,7 +532,8 @@ public final class MappingUtils {
case GroupId:
case AnyId:
for (Any<?, ?, ?> any : anys) {
- attrValue = entityFactory.newEntity(UPlainAttrValue.class);
+ AnyUtils anyUtils = anyUtilsFactory.getInstance(any);
+ attrValue = anyUtils.newPlainAttrValue();
attrValue.setStringValue(any.getKey().toString());
values.add(attrValue);
}
@@ -600,7 +604,6 @@ public final class MappingUtils {
* @return connObjectKey internal value
*/
public static String getConnObjectKeyValue(final Any<?, ?, ?> any, final Provision provision) {
-
List<PlainAttrValue> values = getIntValues(provision, provision.getMapping().getConnObjectKeyItem(),
Collections.<Any<?, ?, ?>>singletonList(any), null, null);
return values == null || values.isEmpty()
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/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 83e98ec..9aad079 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
@@ -146,7 +146,7 @@ public final class JexlUtils {
return context;
}
- public static JexlContext addAttrsToContext(final Collection<? extends PlainAttr<?>> attrs,
+ public static JexlContext addPlainAttrsToContext(final Collection<? extends PlainAttr<?>> attrs,
final JexlContext jexlContext) {
JexlContext context = jexlContext == null
@@ -215,11 +215,9 @@ public final class JexlUtils {
return context;
}
- public static boolean evaluateMandatoryCondition(
- final String mandatoryCondition, final Any<?, ?, ?> any) {
-
+ public static boolean evaluateMandatoryCondition(final String mandatoryCondition, final Any<?, ?, ?> any) {
JexlContext jexlContext = new MapContext();
- addAttrsToContext(any.getPlainAttrs(), jexlContext);
+ addPlainAttrsToContext(any.getPlainAttrs(), jexlContext);
addDerAttrsToContext(any.getDerAttrs(), any.getPlainAttrs(), jexlContext);
addVirAttrsToContext(any.getVirAttrs(), jexlContext);
@@ -229,8 +227,8 @@ public final class JexlUtils {
public static String evaluate(final String expression,
final Any<?, ?, ?> any, final Collection<? extends PlainAttr<?>> attributes) {
- final JexlContext jexlContext = new MapContext();
- JexlUtils.addAttrsToContext(attributes, jexlContext);
+ JexlContext jexlContext = new MapContext();
+ JexlUtils.addPlainAttrsToContext(attributes, jexlContext);
JexlUtils.addFieldsToContext(any, jexlContext);
// Evaluate expression using the context prepared before
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UnallowedSchemaException.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UnallowedSchemaException.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UnallowedSchemaException.java
new file mode 100644
index 0000000..04f67dd
--- /dev/null
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/UnallowedSchemaException.java
@@ -0,0 +1,29 @@
+/*
+ * 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.persistence.api.dao;
+
+public class UnallowedSchemaException extends RuntimeException {
+
+ private static final long serialVersionUID = -9206535191442808016L;
+
+ public UnallowedSchemaException(final String schemaName) {
+ super(schemaName + " not allowed");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/anyobject/AnyObject.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/anyobject/AnyObject.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/anyobject/AnyObject.java
index ddb047e..19d0f6b 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/anyobject/AnyObject.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/anyobject/AnyObject.java
@@ -27,7 +27,7 @@ public interface AnyObject extends Any<APlainAttr, ADerAttr, AVirAttr> {
boolean remove(ARelationship relationship);
- ARelationship getRelationship(AnyObject rightEnd);
+ ARelationship getRelationship(Long relationshipKey);
List<? extends ARelationship> getRelationships();
@@ -35,7 +35,7 @@ public interface AnyObject extends Any<APlainAttr, ADerAttr, AVirAttr> {
boolean remove(AMembership membership);
- AMembership getMembership(Long groupKey);
+ AMembership getMembership(Long membershipKey);
List<? extends AMembership> getMemberships();
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java
index e1b9a5e..296de84 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java
@@ -18,7 +18,7 @@
*/
package org.apache.syncope.core.persistence.api.entity.task;
-import java.util.List;
+import java.util.Set;
import org.apache.syncope.common.lib.types.MatchingRule;
import org.apache.syncope.common.lib.types.UnmatchingRule;
import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
@@ -29,7 +29,7 @@ public interface ProvisioningTask extends SchedTask {
void setResource(ExternalResource resource);
- List<String> getActionsClassNames();
+ Set<String> getActionsClassNames();
MatchingRule getMatchingRule();
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
index d896984..f02c555 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/user/User.java
@@ -23,7 +23,6 @@ import java.util.List;
import org.apache.syncope.common.lib.types.CipherAlgorithm;
import org.apache.syncope.core.persistence.api.entity.Any;
import org.apache.syncope.core.persistence.api.entity.Role;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
public interface User extends Any<UPlainAttr, UDerAttr, UVirAttr> {
@@ -133,7 +132,7 @@ public interface User extends Any<UPlainAttr, UDerAttr, UVirAttr> {
boolean remove(URelationship relationship);
- URelationship getRelationship(AnyObject rightEnd);
+ URelationship getRelationship(Long anyObjectKey);
List<? extends URelationship> getRelationships();
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index 3448737..ef2161e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -89,7 +89,8 @@ public abstract class AbstractAnyDAO<A extends Any<?, ?, ?>> extends AbstractDAO
A any = find(key);
if (any == null) {
- throw new NotFoundException("Any " + key);
+ throw new NotFoundException(StringUtils.substringBefore(
+ StringUtils.substringAfter(getClass().getSimpleName(), "JPA"), "DAO") + " " + key);
}
securityChecks(any);
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
index a849ef5..18b6636 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java
@@ -102,7 +102,9 @@ public class JPADerSchemaDAO extends AbstractDAO<DerSchema, String> implements D
resourceDAO.deleteMapping(key, anyUtils.derIntMappingType());
}
- schema.getAnyTypeClass().remove(schema);
+ if (schema.getAnyTypeClass() != null) {
+ schema.getAnyTypeClass().remove(schema);
+ }
entityManager.remove(schema);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
index 50865c3..c3c94ce 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
@@ -102,7 +102,9 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema, String> implemen
resourceDAO.deleteMapping(key, anyUtils.plainIntMappingType());
}
- schema.getAnyTypeClass().remove(schema);
+ if (schema.getAnyTypeClass() != null) {
+ schema.getAnyTypeClass().remove(schema);
+ }
entityManager.remove(schema);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
index cc4ffe4..dae6afc 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java
@@ -102,7 +102,9 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema, String> implements V
resourceDAO.deleteMapping(key, anyUtils.virIntMappingType());
}
- schema.getAnyTypeClass().remove(schema);
+ if (schema.getAnyTypeClass() != null) {
+ schema.getAnyTypeClass().remove(schema);
+ }
entityManager.remove(schema);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
index 914bd02..ec37649 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAttr.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity;
import java.util.Collections;
import java.util.Set;
+import org.apache.syncope.core.persistence.api.dao.UnallowedSchemaException;
import org.apache.syncope.core.persistence.api.entity.Any;
import org.apache.syncope.core.persistence.api.entity.Attr;
import org.apache.syncope.core.persistence.api.entity.DerSchema;
@@ -53,7 +54,7 @@ public abstract class AbstractAttr<S extends Schema, O extends Any<?, ?, ?>>
}
if (!getAllowedSchemas(getOwner()).contains(schema)) {
- throw new IllegalArgumentException(schema + " not allowed for this instance");
+ throw new UnallowedSchemaException(schema.getKey());
}
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
index fba234d..4500a4e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractDerAttr.java
@@ -21,9 +21,6 @@ package org.apache.syncope.core.persistence.jpa.entity;
import java.util.Collection;
import javax.persistence.Column;
import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import org.apache.syncope.core.persistence.api.entity.DerAttr;
@@ -38,20 +35,11 @@ public abstract class AbstractDerAttr<O extends Any<?, ?, ?>>
private static final long serialVersionUID = 4740924251090424771L;
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- protected Long id;
-
@ManyToOne(fetch = FetchType.EAGER)
@Column(name = "schema_name")
private JPADerSchema schema;
@Override
- public Long getKey() {
- return id;
- }
-
- @Override
public DerSchema getSchema() {
return schema;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java
index 946b09b..aebc8da 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractVirAttr.java
@@ -22,9 +22,6 @@ import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;
@@ -38,10 +35,6 @@ public abstract class AbstractVirAttr<O extends Any<?, ?, ?>>
private static final long serialVersionUID = 5023204776925954907L;
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- protected Long id;
-
@Transient
protected List<String> values = new ArrayList<>();
@@ -50,11 +43,6 @@ public abstract class AbstractVirAttr<O extends Any<?, ?, ?>>
private JPAVirSchema schema;
@Override
- public Long getKey() {
- return id;
- }
-
- @Override
public List<String> getValues() {
return values;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java
index abd6676..1525de9 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADerAttr.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.persistence.jpa.entity.anyobject;
import javax.persistence.Entity;
+import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.anyobject.ADerAttr;
@@ -33,10 +34,18 @@ public class JPAADerAttr extends AbstractDerAttr<AnyObject> implements ADerAttr
public static final String TABLE = "ADerAttr";
+ @Id
+ private Long id;
+
@ManyToOne
private JPAAnyObject owner;
@Override
+ public Long getKey() {
+ return id;
+ }
+
+ @Override
public AnyObject getOwner() {
return owner;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java
index 7469799..62e2ea5 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAVirAttr.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.persistence.jpa.entity.anyobject;
import javax.persistence.Entity;
+import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.anyobject.AVirAttr;
@@ -33,10 +34,18 @@ public class JPAAVirAttr extends AbstractVirAttr<AnyObject> implements AVirAttr
public static final String TABLE = "AVirAttr";
+ @Id
+ private Long id;
+
@ManyToOne
private JPAAnyObject owner;
@Override
+ public Long getKey() {
+ return id;
+ }
+
+ @Override
public AnyObject getOwner() {
return owner;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
index 6442c2d..a8e842b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAAnyObject.java
@@ -198,12 +198,12 @@ public class JPAAnyObject extends AbstractAny<APlainAttr, ADerAttr, AVirAttr> im
}
@Override
- public ARelationship getRelationship(final AnyObject rightEnd) {
+ public ARelationship getRelationship(final Long anyObjectKey) {
return CollectionUtils.find(getRelationships(), new Predicate<ARelationship>() {
@Override
public boolean evaluate(final ARelationship relationship) {
- return rightEnd != null && rightEnd.equals(relationship.getRightEnd());
+ return anyObjectKey != null && anyObjectKey.equals(relationship.getRightEnd().getKey());
}
});
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java
index 46fc1cd..73911f8 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGDerAttr.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.persistence.jpa.entity.group;
import javax.persistence.Entity;
+import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.group.GDerAttr;
@@ -33,10 +34,18 @@ public class JPAGDerAttr extends AbstractDerAttr<Group> implements GDerAttr {
public static final String TABLE = "GDerAttr";
+ @Id
+ private Long id;
+
@ManyToOne
private JPAGroup owner;
@Override
+ public Long getKey() {
+ return id;
+ }
+
+ @Override
public Group getOwner() {
return owner;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java
index 302e056..47b8886 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGVirAttr.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.persistence.jpa.entity.group;
import javax.persistence.Entity;
+import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.group.GVirAttr;
@@ -33,10 +34,18 @@ public class JPAGVirAttr extends AbstractVirAttr<Group> implements GVirAttr {
public static final String TABLE = "GVirAttr";
+ @Id
+ private Long id;
+
@ManyToOne
private JPAGroup owner;
@Override
+ public Long getKey() {
+ return id;
+ }
+
+ @Override
public Group getOwner() {
return owner;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAAnyTemplate.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAAnyTemplate.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAAnyTemplate.java
index d90f605..7af8491 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAAnyTemplate.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAAnyTemplate.java
@@ -87,7 +87,9 @@ public class JPAAnyTemplate extends AbstractEntity<Long> implements AnyTemplate
? anyType == null
? null
: new JPAAnyUtilsFactory().getInstance(anyType.getKind()).newAnyTO()
- : POJOHelper.deserialize(template, AnyTO.class);
+ : anyType == null
+ ? null
+ : POJOHelper.deserialize(template, anyType.getKind().getToClass());
}
@Override
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
index 07e6f00..0592a9d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
@@ -19,7 +19,9 @@
package org.apache.syncope.core.persistence.jpa.entity.task;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
@@ -48,7 +50,7 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask {
@CollectionTable(name = "PushTask_actionsClassNames",
joinColumns =
@JoinColumn(name = "pushTask_id", referencedColumnName = "id"))
- private List<String> actionsClassNames = new ArrayList<>();
+ private Set<String> actionsClassNames = new HashSet<>();
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "pushTask")
private List<JPAAnyFilter> filters = new ArrayList<>();
@@ -61,7 +63,7 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask {
}
@Override
- public List<String> getActionsClassNames() {
+ public Set<String> getActionsClassNames() {
return actionsClassNames;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASyncTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASyncTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASyncTask.java
index 0106a65..41eb4ea 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASyncTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPASyncTask.java
@@ -19,7 +19,9 @@
package org.apache.syncope.core.persistence.jpa.entity.task;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
@@ -57,7 +59,7 @@ public class JPASyncTask extends AbstractProvisioningTask implements SyncTask {
@CollectionTable(name = "SyncTask_actionsClassNames",
joinColumns =
@JoinColumn(name = "syncTask_id", referencedColumnName = "id"))
- private List<String> actionsClassNames = new ArrayList<>();
+ private Set<String> actionsClassNames = new HashSet<>();
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, mappedBy = "syncTask")
private List<JPAAnyTemplate> templates = new ArrayList<>();
@@ -86,7 +88,7 @@ public class JPASyncTask extends AbstractProvisioningTask implements SyncTask {
}
@Override
- public List<String> getActionsClassNames() {
+ public Set<String> getActionsClassNames() {
return actionsClassNames;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java
index 90bee1b..754fd59 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDerAttr.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.persistence.jpa.entity.user;
import javax.persistence.Entity;
+import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.user.UDerAttr;
@@ -33,10 +34,18 @@ public class JPAUDerAttr extends AbstractDerAttr<User> implements UDerAttr {
public static final String TABLE = "UDerAttr";
+ @Id
+ private Long id;
+
@ManyToOne
private JPAUser owner;
@Override
+ public Long getKey() {
+ return id;
+ }
+
+ @Override
public User getOwner() {
return owner;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttr.java
index 56898d4..50ce967 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUPlainAttr.java
@@ -45,9 +45,6 @@ public class JPAUPlainAttr extends AbstractPlainAttr<User> implements UPlainAttr
public static final String TABLE = "UPlainAttr";
- /**
- * Auto-generated id for this table.
- */
@Id
private Long id;
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUVirAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUVirAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUVirAttr.java
index 52a168e..a6931ce 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUVirAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUVirAttr.java
@@ -19,6 +19,7 @@
package org.apache.syncope.core.persistence.jpa.entity.user;
import javax.persistence.Entity;
+import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.apache.syncope.core.persistence.api.entity.user.UVirAttr;
@@ -33,10 +34,18 @@ public class JPAUVirAttr extends AbstractVirAttr<User> implements UVirAttr {
public static final String TABLE = "UVirAttr";
+ @Id
+ private Long id;
+
@ManyToOne
private JPAUser owner;
@Override
+ public Long getKey() {
+ return id;
+ }
+
+ @Override
public User getOwner() {
return owner;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
index f9c0c81..06d8f04 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
@@ -65,7 +65,6 @@ 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.AnyTypeClass;
import org.apache.syncope.core.persistence.api.entity.Role;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
import org.apache.syncope.core.persistence.api.entity.user.UMembership;
import org.apache.syncope.core.persistence.api.entity.user.URelationship;
import org.apache.syncope.core.persistence.jpa.entity.AbstractAny;
@@ -538,12 +537,12 @@ public class JPAUser extends AbstractAny<UPlainAttr, UDerAttr, UVirAttr> impleme
}
@Override
- public URelationship getRelationship(final AnyObject rightEnd) {
+ public URelationship getRelationship(final Long anyObjectKey) {
return CollectionUtils.find(getRelationships(), new Predicate<URelationship>() {
@Override
public boolean evaluate(final URelationship relationship) {
- return rightEnd != null && rightEnd.equals(relationship.getRightEnd());
+ return anyObjectKey != null && anyObjectKey.equals(relationship.getRightEnd().getKey());
}
});
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/dd88efbd/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
index c592c31..a75e4b6 100644
--- a/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
+++ b/core/persistence-jpa/src/main/resources/META-INF/spring-orm-oracle.xml
@@ -312,6 +312,56 @@ under the License.
</attributes>
</entity>
+ <entity class="org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADerAttr">
+ <attributes>
+ <id name="id">
+ <generated-value generator="SEQ_ADerAttr" strategy="TABLE"/>
+ <table-generator name="SEQ_ADerAttr" pk-column-value="SEQ_ADerAttr" initial-value="1000"/>
+ </id>
+ </attributes>
+ </entity>
+ <entity class="org.apache.syncope.core.persistence.jpa.entity.user.JPAUDerAttr">
+ <attributes>
+ <id name="id">
+ <generated-value generator="SEQ_UDerAttr" strategy="TABLE"/>
+ <table-generator name="SEQ_UDerAttr" pk-column-value="SEQ_UDerAttr" initial-value="1000"/>
+ </id>
+ </attributes>
+ </entity>
+ <entity class="org.apache.syncope.core.persistence.jpa.entity.group.JPAGDerAttr">
+ <attributes>
+ <id name="id">
+ <generated-value generator="SEQ_GDerAttr" strategy="TABLE"/>
+ <table-generator name="SEQ_GDerAttr" pk-column-value="SEQ_GDerAttr" initial-value="1000"/>
+ </id>
+ </attributes>
+ </entity>
+
+ <entity class="org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAVirAttr">
+ <attributes>
+ <id name="id">
+ <generated-value generator="SEQ_AVirAttr" strategy="TABLE"/>
+ <table-generator name="SEQ_AVirAttr" pk-column-value="SEQ_AVirAttr" initial-value="1000"/>
+ </id>
+ </attributes>
+ </entity>
+ <entity class="org.apache.syncope.core.persistence.jpa.entity.user.JPAUVirAttr">
+ <attributes>
+ <id name="id">
+ <generated-value generator="SEQ_UVirAttr" strategy="TABLE"/>
+ <table-generator name="SEQ_UVirAttr" pk-column-value="SEQ_UVirAttr" initial-value="1000"/>
+ </id>
+ </attributes>
+ </entity>
+ <entity class="org.apache.syncope.core.persistence.jpa.entity.group.JPAGVirAttr">
+ <attributes>
+ <id name="id">
+ <generated-value generator="SEQ_GVirAttr" strategy="TABLE"/>
+ <table-generator name="SEQ_GVirAttr" pk-column-value="SEQ_GVirAttr" initial-value="1000"/>
+ </id>
+ </attributes>
+ </entity>
+
<entity class="org.apache.syncope.core.persistence.jpa.entity.task.JPAAnyTemplate">
<attributes>
<id name="id">