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/05/21 03:55:53 UTC

[syncope] branch 2_1_X updated: [SYNCOPE-1635] Use singleton bean for each domain for each rule with conf (#264)

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


The following commit(s) were added to refs/heads/2_1_X by this push:
     new 3ca3354  [SYNCOPE-1635] Use singleton bean for each domain for each rule with conf (#264)
3ca3354 is described below

commit 3ca3354a89fe0fed1476c14ae747c98fb8a85aa7
Author: DmitriyBrashevets <47...@users.noreply.github.com>
AuthorDate: Fri May 21 06:55:46 2021 +0300

    [SYNCOPE-1635] Use singleton bean for each domain for each rule with conf (#264)
---
 .../syncope/core/spring/ImplementationManager.java | 39 +++++++++++-----------
 1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/ImplementationManager.java b/core/spring/src/main/java/org/apache/syncope/core/spring/ImplementationManager.java
index f1481b3..6b637d8 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/ImplementationManager.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/ImplementationManager.java
@@ -18,11 +18,11 @@
  */
 package org.apache.syncope.core.spring;
 
-import groovy.lang.GroovyClassLoader;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
+import groovy.lang.GroovyClassLoader;
 import org.apache.syncope.common.lib.policy.AccountRuleConf;
 import org.apache.syncope.common.lib.policy.PasswordRuleConf;
 import org.apache.syncope.common.lib.policy.PullCorrelationRuleConf;
@@ -31,14 +31,16 @@ import org.apache.syncope.common.lib.report.ReportletConf;
 import org.apache.syncope.core.persistence.api.ImplementationLookup;
 import org.apache.syncope.core.persistence.api.dao.AccountRule;
 import org.apache.syncope.core.persistence.api.dao.PasswordRule;
-import org.apache.syncope.core.persistence.api.dao.Reportlet;
-import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.dao.PullCorrelationRule;
 import org.apache.syncope.core.persistence.api.dao.PushCorrelationRule;
+import org.apache.syncope.core.persistence.api.dao.Reportlet;
+import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
+import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
 
 public final class ImplementationManager {
 
@@ -217,27 +219,26 @@ public final class ImplementationManager {
 
     @SuppressWarnings("unchecked")
     private static <T> T buildJavaWithConf(final Class<T> clazz) {
-        T bean = null;
-
         if (clazz != null) {
-            if (ApplicationContextProvider.getBeanFactory().containsSingleton(clazz.getName())) {
-                bean = (T) ApplicationContextProvider.getBeanFactory().getSingleton(clazz.getName());
-            } else {
-                try {
-                    bean = (T) ApplicationContextProvider.getBeanFactory().
-                            createBean(clazz, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
-                    ApplicationContextProvider.getBeanFactory().registerSingleton(clazz.getName(), bean);
-                } catch (IllegalStateException e) {
-                    LOG.debug("While attempting to register {}", clazz.getName(), e);
+            String domainableBeanNameWithConf = AuthContextUtils.getDomain() + clazz.getName();
+            DefaultListableBeanFactory beanFactory = ApplicationContextProvider.getBeanFactory();
+
+            if (beanFactory.containsSingleton(domainableBeanNameWithConf)) {
+                return (T) beanFactory.getSingleton(domainableBeanNameWithConf);
+            }
 
-                    // if this exception was raised, it means another bean for same name is already registered,
-                    // revert to it
-                    bean = (T) ApplicationContextProvider.getBeanFactory().getSingleton(clazz.getName());
+            synchronized (beanFactory.getSingletonMutex()) {
+                if (beanFactory.containsSingleton(domainableBeanNameWithConf)) {
+                    return (T) beanFactory.getSingleton(domainableBeanNameWithConf);
+                } else {
+                    T bean = (T) beanFactory.
+                            createBean(clazz, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
+                    beanFactory.registerSingleton(domainableBeanNameWithConf, bean);
+                    return bean;
                 }
             }
         }
-
-        return bean;
+        return null;
     }
 
     public static Class<?> purge(final String implementation) {