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 2021/06/09 11:30:27 UTC

[syncope] branch master updated: Upgrading commons-jexl + various changes to allow more for extendability

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new 7d6aa51  Upgrading commons-jexl + various changes to allow more for extendability
7d6aa51 is described below

commit 7d6aa51867055b2b6741c1926ea2cd31216ff5c4
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Jun 9 12:49:55 2021 +0200

    Upgrading commons-jexl + various changes to allow more for extendability
---
 .../core/persistence/jpa/dao/JPATaskExecDAO.java   |  7 +--
 .../provisioning/api/jexl/SandboxUberspect.java    |  5 +-
 .../core/provisioning/java/ConnectorManager.java   |  2 +-
 .../provisioning/java/DefaultAuditManager.java     | 46 ++++++++---------
 .../java/job/AbstractSchedTaskJobDelegate.java     |  6 ++-
 .../notification/DefaultNotificationManager.java   |  9 ++--
 .../java/pushpull/PullJobDelegate.java             | 57 +++++++++++++---------
 .../elasticsearch/client/ElasticsearchUtils.java   |  4 +-
 pom.xml                                            |  2 +-
 9 files changed, 80 insertions(+), 58 deletions(-)

diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
index eb70532..cca3e2a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
@@ -128,12 +128,12 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec> implements TaskExecDAO
     private static String toOrderByStatement(final List<OrderByClause> orderByClauses) {
         StringBuilder statement = new StringBuilder();
 
-        for (OrderByClause clause : orderByClauses) {
+        orderByClauses.forEach(clause -> {
             String field = clause.getField().trim();
             if (ReflectionUtils.findField(JPATaskExec.class, field) != null) {
                 statement.append("e.").append(field).append(' ').append(clause.getDirection().name());
             }
-        }
+        });
 
         if (statement.length() == 0) {
             statement.append("ORDER BY e.id DESC");
@@ -164,13 +164,14 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec> implements TaskExecDAO
         return query.getResultList();
     }
 
+    @Transactional(rollbackFor = { Throwable.class })
     @Override
     public TaskExec save(final TaskExec execution) {
         return entityManager().merge(execution);
     }
 
-    @Override
     @Transactional(rollbackFor = { Throwable.class })
+    @Override
     public void saveAndAdd(final String taskKey, final TaskExec execution) {
         Task task = taskDAO.find(taskKey);
         task.add(execution);
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/SandboxUberspect.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/SandboxUberspect.java
index 08f9168..985b32f 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/SandboxUberspect.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/SandboxUberspect.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import org.apache.commons.jexl3.JexlEngine;
+import org.apache.commons.jexl3.internal.TemplateInterpreter;
 import org.apache.commons.jexl3.internal.introspection.Uberspect;
 import org.apache.commons.jexl3.introspection.JexlMethod;
 import org.apache.commons.jexl3.introspection.JexlPropertySet;
@@ -65,7 +66,9 @@ class SandboxUberspect extends Uberspect {
 
     @Override
     public JexlMethod getMethod(final Object obj, final String method, final Object... args) {
-        if (obj instanceof AnyTO || obj instanceof Any
+        if (obj instanceof TemplateInterpreter) { // https://issues.apache.org/jira/browse/JEXL-351
+            return super.getMethod(obj, method, args);
+        } else if (obj instanceof AnyTO || obj instanceof Any
                 || obj instanceof PlainAttr || obj instanceof Attr
                 || obj instanceof MembershipTO || obj instanceof Membership
                 || obj instanceof Realm || obj instanceof RealmTO) {
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
index 57e861a..0f2bce3 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
@@ -78,7 +78,7 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory {
     @Override
     public Connector getConnector(final ExternalResource resource) {
         // Try to re-create connector bean from underlying resource (useful for managing failover scenarios)
-        if (!ApplicationContextProvider.getBeanFactory().containsBean(getBeanName(resource))) {
+        if (!ApplicationContextProvider.getBeanFactory().containsSingleton(getBeanName(resource))) {
             registerConnector(resource);
         }
 
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
index 1610019..934f03a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
@@ -136,31 +136,33 @@ public class DefaultAuditManager implements AuditManager {
             final Object output,
             final Object... input) {
 
-        Throwable throwable = null;
-        if (output instanceof Throwable) {
-            throwable = (Throwable) output;
-        }
-
-        AuditEntry auditEntry = new AuditEntry();
-        auditEntry.setWho(who);
-        auditEntry.setLogger(new AuditLoggerName(type, category, subcategory, event, condition));
-        auditEntry.setDate(new Date());
-        auditEntry.setBefore(POJOHelper.serialize((maskSensitive(before))));
-        if (throwable == null) {
-            auditEntry.setOutput(POJOHelper.serialize((maskSensitive(output))));
-        } else {
-            auditEntry.setOutput(throwable.getMessage());
-            auditEntry.setThrowable(ExceptionUtils2.getFullStackTrace(throwable));
-        }
-        if (input != null) {
-            auditEntry.getInputs().addAll(Arrays.stream(input).
-                    map(DefaultAuditManager::maskSensitive).map(POJOHelper::serialize).
-                    collect(Collectors.toList()));
-        }
+        AuditLoggerName auditLoggerName = new AuditLoggerName(type, category, subcategory, event, condition);
 
         org.apache.syncope.core.persistence.api.entity.Logger syncopeLogger =
-                loggerDAO.find(auditEntry.getLogger().toLoggerName());
+                loggerDAO.find(auditLoggerName.toLoggerName());
         if (syncopeLogger != null && syncopeLogger.getLevel() == LoggerLevel.DEBUG) {
+            Throwable throwable = null;
+            if (output instanceof Throwable) {
+                throwable = (Throwable) output;
+            }
+
+            AuditEntry auditEntry = new AuditEntry();
+            auditEntry.setWho(who);
+            auditEntry.setLogger(auditLoggerName);
+            auditEntry.setDate(new Date());
+            auditEntry.setBefore(POJOHelper.serialize((maskSensitive(before))));
+            if (throwable == null) {
+                auditEntry.setOutput(POJOHelper.serialize((maskSensitive(output))));
+            } else {
+                auditEntry.setOutput(throwable.getMessage());
+                auditEntry.setThrowable(ExceptionUtils2.getFullStackTrace(throwable));
+            }
+            if (input != null) {
+                auditEntry.getInputs().addAll(Arrays.stream(input).
+                        map(DefaultAuditManager::maskSensitive).map(POJOHelper::serialize).
+                        collect(Collectors.toList()));
+            }
+
             Logger logger = LoggerFactory.getLogger(
                     AuditLoggerName.getAuditLoggerName(AuthContextUtils.getDomain()));
             Logger eventLogger = LoggerFactory.getLogger(
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AbstractSchedTaskJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AbstractSchedTaskJobDelegate.java
index e8aac13..08017a7 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AbstractSchedTaskJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AbstractSchedTaskJobDelegate.java
@@ -141,7 +141,7 @@ public abstract class AbstractSchedTaskJobDelegate implements SchedTaskJobDelega
         execution.setEnd(new Date());
 
         if (hasToBeRegistered(execution)) {
-            taskExecDAO.saveAndAdd(taskKey, execution);
+            register(execution);
         }
         task = taskDAO.save(task);
 
@@ -189,4 +189,8 @@ public abstract class AbstractSchedTaskJobDelegate implements SchedTaskJobDelega
     protected boolean hasToBeRegistered(final TaskExec execution) {
         return false;
     }
+
+    protected void register(final TaskExec execution) {
+        taskExecDAO.saveAndAdd(task.getKey(), execution);
+    }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/DefaultNotificationManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/DefaultNotificationManager.java
index b294c82..9d5a171 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/DefaultNotificationManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/DefaultNotificationManager.java
@@ -295,6 +295,8 @@ public class DefaultNotificationManager implements NotificationManager {
             final Object output,
             final Object... input) {
 
+        String currentEvent = AuditLoggerName.buildEvent(type, category, subcategory, event, condition);
+
         Any<?> any = null;
 
         if (before instanceof UserTO) {
@@ -333,12 +335,11 @@ public class DefaultNotificationManager implements NotificationManager {
         List<NotificationTask> notifications = new ArrayList<>();
         for (Notification notification : notificationDAO.findAll()) {
             if (LOG.isDebugEnabled()) {
-                notification.getAbouts().forEach(
-                        about -> LOG.debug("Notification about {} defined: {}", about.getAnyType(), about.get()));
+                notification.getAbouts().
+                        forEach(a -> LOG.debug("Notification about {} defined: {}", a.getAnyType(), a.get()));
             }
 
             if (notification.isActive()) {
-                String currentEvent = AuditLoggerName.buildEvent(type, category, subcategory, event, condition);
                 if (!notification.getEvents().contains(currentEvent)) {
                     LOG.debug("No events found about {}", any);
                 } else if (anyType == null || any == null
@@ -348,7 +349,7 @@ public class DefaultNotificationManager implements NotificationManager {
 
                     LOG.debug("Creating notification task for event {} about {}", currentEvent, any);
 
-                    final Map<String, Object> model = new HashMap<>();
+                    Map<String, Object> model = new HashMap<>();
                     model.put("who", who);
                     model.put("type", type);
                     model.put("category", category);
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
index e056751..4ac8352 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
@@ -95,11 +95,11 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
 
     @Override
     public void reportHandled(final ObjectClass objectClass, final Name name) {
-        MutablePair<Integer, String> pair = handled.get(objectClass);
-        if (pair == null) {
-            pair = MutablePair.of(0, null);
-            handled.put(objectClass, pair);
-        }
+        MutablePair<Integer, String> pair = Optional.ofNullable(handled.get(objectClass)).orElseGet(() -> {
+            MutablePair<Integer, String> p = MutablePair.of(0, null);
+            handled.put(objectClass, p);
+            return p;
+        });
         pair.setLeft(pair.getLeft() + 1);
         pair.setRight(name.getNameValue());
     }
@@ -160,17 +160,35 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
         });
     }
 
-    protected static RealmPullResultHandler buildRealmHandler() {
+    protected List<PullActions> buildPullActions(final PullTask pullTask) {
+        List<PullActions> actions = new ArrayList<>();
+        pullTask.getActions().forEach(impl -> {
+            try {
+                actions.add(ImplementationManager.build(impl));
+            } catch (Exception e) {
+                LOG.warn("While building {}", impl, e);
+            }
+        });
+        return actions;
+    }
+
+    protected ReconFilterBuilder buildReconFilterBuilder(final PullTask pullTask)
+            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+
+        return ImplementationManager.build(pullTask.getReconFilterBuilder());
+    }
+
+    protected RealmPullResultHandler buildRealmHandler() {
         return (RealmPullResultHandler) ApplicationContextProvider.getBeanFactory().
                 createBean(DefaultRealmPullResultHandler.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false);
     }
 
-    protected static AnyObjectPullResultHandler buildAnyObjectHandler() {
+    protected AnyObjectPullResultHandler buildAnyObjectHandler() {
         return (AnyObjectPullResultHandler) ApplicationContextProvider.getBeanFactory().
                 createBean(DefaultAnyObjectPullResultHandler.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false);
     }
 
-    protected static UserPullResultHandler buildUserHandler() {
+    protected UserPullResultHandler buildUserHandler() {
         return (UserPullResultHandler) ApplicationContextProvider.getBeanFactory().
                 createBean(DefaultUserPullResultHandler.class, AbstractBeanDefinition.AUTOWIRE_BY_NAME, false);
     }
@@ -194,14 +212,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
 
         LOG.debug("Executing pull on {}", pullTask.getResource());
 
-        List<PullActions> actions = new ArrayList<>();
-        pullTask.getActions().forEach(impl -> {
-            try {
-                actions.add(ImplementationManager.build(impl));
-            } catch (Exception e) {
-                LOG.warn("While building {}", impl, e);
-            }
-        });
+        List<PullActions> actions = buildPullActions(pullTask);
 
         profile = new ProvisioningProfile<>(connector, pullTask);
         profile.getActions().addAll(actions);
@@ -256,10 +267,9 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
                         break;
 
                     case FILTERED_RECONCILIATION:
-                        ReconFilterBuilder filterBuilder =
-                                ImplementationManager.build(pullTask.getReconFilterBuilder());
-                        connector.filteredReconciliation(orgUnit.getObjectClass(),
-                                filterBuilder,
+                        connector.filteredReconciliation(
+                                orgUnit.getObjectClass(),
+                                buildReconFilterBuilder(pullTask),
                                 handler,
                                 options);
                         break;
@@ -340,7 +350,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
                     case FILTERED_RECONCILIATION:
                         connector.filteredReconciliation(
                                 provision.getObjectClass(),
-                                ImplementationManager.build(pullTask.getReconFilterBuilder()),
+                                buildReconFilterBuilder(pullTask),
                                 handler,
                                 options);
                         break;
@@ -360,9 +370,8 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
                             filter(result -> result.getUidValue() != null && result.getKey() != null
                             && result.getOperation() == ResourceOperation.CREATE
                             && result.getAnyType().equals(provision.getAnyType().getKey())).
-                            forEach(result -> {
-                                anyUtils.addAttr(result.getKey(), provision.getUidOnCreate(), result.getUidValue());
-                            });
+                            forEach(result -> anyUtils.addAttr(
+                            result.getKey(), provision.getUidOnCreate(), result.getUidValue()));
                 }
             } catch (Throwable t) {
                 throw new JobExecutionException("While pulling from connector", t);
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
index 122c96f..490a457 100644
--- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
@@ -131,9 +131,11 @@ public class ElasticsearchUtils {
                 field("realm", any.getRealm().getFullPath()).
                 field("anyType", any.getType().getKey()).
                 field("creationDate", any.getCreationDate()).
+                field("creationContext", any.getCreationContext()).
                 field("creator", any.getCreator()).
                 field("lastChangeDate", any.getLastChangeDate()).
                 field("lastModifier", any.getLastModifier()).
+                field("lastChangeContext", any.getLastChangeContext()).
                 field("status", any.getStatus()).
                 field("resources", resources).
                 field("dynRealms", dynRealms);
@@ -169,7 +171,7 @@ public class ElasticsearchUtils {
                 builder = builder.field("groupOwner", group.getGroupOwner().getKey());
             }
 
-            List<String> members = new ArrayList<>();
+            Set<String> members = new HashSet<>();
             AuthContextUtils.callAsAdmin(domain, () -> {
                 members.addAll(groupDAO.findUMemberships(group).stream().
                         map(membership -> membership.getLeftEnd().getKey()).collect(Collectors.toList()));
diff --git a/pom.xml b/pom.xml
index 8f659f6..e810109 100644
--- a/pom.xml
+++ b/pom.xml
@@ -439,7 +439,7 @@ under the License.
     <log4j.version>2.14.1</log4j.version>
     <disruptor.version>3.4.4</disruptor.version>
     
-    <commons-jexl.version>3.1</commons-jexl.version>
+    <commons-jexl.version>3.2</commons-jexl.version>
     <commons-lang.version>3.12.0</commons-lang.version>
     <commons-text.version>1.9</commons-text.version>
     <commons-codec.version>1.15</commons-codec.version>