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/11 13:12:52 UTC

[syncope] 02/02: Futher enhancements for extendability

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

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

commit 90ad51cf1f570a32d79af6cd61433a15c5853719
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Jun 11 14:22:42 2021 +0200

    Futher enhancements for extendability
---
 .../core/provisioning/api/ConnectorFactory.java    | 14 +++++++--
 .../provisioning/java/ConnectorFacadeProxy.java    | 16 ++++-------
 .../core/provisioning/java/ConnectorManager.java   | 33 +++++++++++++---------
 .../pushpull/AbstractProvisioningJobDelegate.java  | 22 +++++++++------
 4 files changed, 50 insertions(+), 35 deletions(-)

diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
index 2494df3..815a847 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ConnectorFactory.java
@@ -55,13 +55,21 @@ public interface ConnectorFactory {
     Connector createConnector(ConnInstance connInstance);
 
     /**
-     * Get existing connector for the given resource.
+     * Get existing connector bean for the given resource or create if not found.
      *
-     * @param resource the resource.
-     * @return live connector bran for given resource
+     * @param resource the resource
+     * @return live connector bean for given resource
      */
     Connector getConnector(ExternalResource resource);
 
+    /*
+     * Get existing connector bean for the given resource if found.
+     *
+     * @param resource the resource.
+     * @return live connector bean for given resource
+     */
+    Optional<Connector> readConnector(ExternalResource resource);
+
     /**
      * Load connectors for all existing resources.
      *
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
index a3bebe5..e363a38 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
@@ -33,6 +33,7 @@ import org.apache.syncope.core.provisioning.api.Connector;
 import org.apache.syncope.core.provisioning.api.TimeoutException;
 import org.apache.syncope.core.provisioning.api.pushpull.ReconFilterBuilder;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
+import org.identityconnectors.common.CollectionUtil;
 import org.identityconnectors.common.security.GuardedByteArray;
 import org.identityconnectors.common.security.GuardedString;
 import org.identityconnectors.framework.api.APIConfiguration;
@@ -54,10 +55,7 @@ import org.identityconnectors.framework.common.objects.filter.Filter;
 import org.identityconnectors.framework.spi.SearchResultsHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ClassUtils;
-import org.springframework.util.CollectionUtils;
 
 public class ConnectorFacadeProxy implements Connector {
 
@@ -75,20 +73,21 @@ public class ConnectorFacadeProxy implements Connector {
      */
     private final ConnInstance connInstance;
 
-    @Autowired
-    private AsyncConnectorFacade asyncFacade;
+    private final AsyncConnectorFacade asyncFacade;
 
     /**
      * Use the passed connector instance to build a ConnectorFacade that will be used to make all wrapped calls.
      *
      * @param connInstance the connector instance
+     * @param asyncFacade the async connectot facade
      * @see ConnectorInfo
      * @see APIConfiguration
      * @see ConfigurationProperties
      * @see ConnectorFacade
      */
-    public ConnectorFacadeProxy(final ConnInstance connInstance) {
+    public ConnectorFacadeProxy(final ConnInstance connInstance, final AsyncConnectorFacade asyncFacade) {
         this.connInstance = connInstance;
+        this.asyncFacade = asyncFacade;
 
         ConnIdBundleManager connIdBundleManager =
                 ApplicationContextProvider.getBeanFactory().getBean(ConnIdBundleManager.class);
@@ -105,7 +104,7 @@ public class ConnectorFacadeProxy implements Connector {
         // set connector configuration according to conninstance's
         ConfigurationProperties properties = apiConfig.getConfigurationProperties();
         connInstance.getConf().stream().
-                filter(property -> !CollectionUtils.isEmpty(property.getValues())).
+                filter(property -> !CollectionUtil.isEmpty(property.getValues())).
                 forEach(property -> properties.setPropertyValue(
                 property.getSchema().getName(),
                 getPropertyValue(property.getSchema().getType(), property.getValues())));
@@ -257,7 +256,6 @@ public class ConnectorFacadeProxy implements Connector {
         }
     }
 
-    @Transactional
     @Override
     public void sync(final ObjectClass objectClass, final SyncToken token, final SyncResultsHandler handler,
             final OperationOptions options) {
@@ -298,7 +296,6 @@ public class ConnectorFacadeProxy implements Connector {
         return result;
     }
 
-    @Transactional
     @Override
     public void fullReconciliation(
             final ObjectClass objectClass,
@@ -308,7 +305,6 @@ public class ConnectorFacadeProxy implements Connector {
         Connector.super.fullReconciliation(objectClass, handler, options);
     }
 
-    @Transactional
     @Override
     public void filteredReconciliation(
             final ObjectClass objectClass,
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 305095d..ace4c7c 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
@@ -67,6 +67,9 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory, Sy
     @Autowired
     private ConnInstanceDataBinder connInstanceDataBinder;
 
+    @Autowired
+    private AsyncConnectorFacade asyncFacade;
+
     private EntityFactory entityFactory;
 
     @Override
@@ -80,13 +83,18 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory, Sy
     }
 
     @Override
+    public Optional<Connector> readConnector(final ExternalResource resource) {
+        return Optional.ofNullable((Connector) ApplicationContextProvider.getBeanFactory().
+                getSingleton(getBeanName(resource)));
+    }
+
+    @Override
     public Connector getConnector(final ExternalResource resource) {
         // Try to re-create connector bean from underlying resource (useful for managing failover scenarios)
-        if (!ApplicationContextProvider.getBeanFactory().containsSingleton(getBeanName(resource))) {
+        return readConnector(resource).orElseGet(() -> {
             registerConnector(resource);
-        }
-
-        return ApplicationContextProvider.getBeanFactory().getBean(getBeanName(resource), Connector.class);
+            return (Connector) ApplicationContextProvider.getBeanFactory().getSingleton(getBeanName(resource));
+        });
     }
 
     @Override
@@ -152,14 +160,17 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory, Sy
 
     @Override
     public Connector createConnector(final ConnInstance connInstance) {
-        Connector connector = new ConnectorFacadeProxy(connInstance);
-        ApplicationContextProvider.getBeanFactory().autowireBean(connector);
-
-        return connector;
+        return new ConnectorFacadeProxy(connInstance, asyncFacade);
     }
 
     @Override
     public void registerConnector(final ExternalResource resource) {
+        String beanName = getBeanName(resource);
+
+        if (ApplicationContextProvider.getBeanFactory().containsSingleton(beanName)) {
+            unregisterConnector(beanName);
+        }
+
         ConnInstance connInstance = buildConnInstanceOverride(
                 connInstanceDataBinder.getConnInstanceTO(resource.getConnector()),
                 resource.getConfOverride(),
@@ -167,12 +178,6 @@ public class ConnectorManager implements ConnectorRegistry, ConnectorFactory, Sy
         Connector connector = createConnector(connInstance);
         LOG.debug("Connector to be registered: {}", connector);
 
-        String beanName = getBeanName(resource);
-
-        if (ApplicationContextProvider.getBeanFactory().containsSingleton(beanName)) {
-            unregisterConnector(beanName);
-        }
-
         ApplicationContextProvider.getBeanFactory().registerSingleton(beanName, connector);
         LOG.debug("Successfully registered bean {}", beanName);
     }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
index 6ae50d2..fb83490 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
@@ -630,6 +630,19 @@ public abstract class AbstractProvisioningJobDelegate<T extends ProvisioningTask
         return report.toString();
     }
 
+    protected Connector getConnector(final T provisioningTask) throws JobExecutionException {
+        Connector connector;
+        try {
+            connector = connFactory.getConnector(provisioningTask.getResource());
+        } catch (Exception e) {
+            String msg = String.format("Connector instance bean for resource %s and connInstance %s not found",
+                    provisioningTask.getResource(), provisioningTask.getResource().getConnector());
+            throw new JobExecutionException(msg, e);
+        }
+
+        return connector;
+    }
+
     @Override
     protected String doExecute(final boolean dryRun, final JobExecutionContext context) throws JobExecutionException {
         try {
@@ -640,14 +653,7 @@ public abstract class AbstractProvisioningJobDelegate<T extends ProvisioningTask
 
             T provisioningTask = clazz.cast(task);
 
-            Connector connector;
-            try {
-                connector = connFactory.getConnector(provisioningTask.getResource());
-            } catch (Exception e) {
-                String msg = String.format("Connector instance bean for resource %s and connInstance %s not found",
-                        provisioningTask.getResource(), provisioningTask.getResource().getConnector());
-                throw new JobExecutionException(msg, e);
-            }
+            Connector connector = getConnector(provisioningTask);
 
             boolean noMapping = true;
             for (Provision provision : provisioningTask.getResource().getProvisions()) {