Remove AutoDetach conf for OpenJPA (stick to JPA defaults) + remove 
SerializationUtils#clone for JPA entities, in attempt to eliminate the 
'Multiple concurrent threads attempted to access a single broker' error, 
popping up sometimes


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/89ef5169
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/89ef5169
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/89ef5169

Branch: refs/heads/master
Commit: 89ef5169158a6ea3c71e3d305c4389ded3496c5a
Parents: 7f4fe85
Author: Francesco Chicchiriccò <[email protected]>
Authored: Tue Aug 23 09:36:39 2016 +0200
Committer: Francesco Chicchiriccò <[email protected]>
Committed: Tue Aug 23 09:36:39 2016 +0200

----------------------------------------------------------------------
 .../syncope/core/logic/ConnectorLogic.java      |  4 +++-
 .../core/persistence/api/entity/AnyUtils.java   |  2 ++
 .../persistence/jpa/entity/JPAAnyUtils.java     | 20 ++++++++++++++++++++
 .../src/main/resources/domains.xml              |  1 -
 .../provisioning/java/ConnectorManager.java     | 20 ++++++++++++++++++--
 .../provisioning/java/MappingManagerImpl.java   | 14 +++-----------
 .../java/data/ResourceDataBinderImpl.java       |  5 +----
 7 files changed, 47 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/89ef5169/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
----------------------------------------------------------------------
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
index 8f7ec57..65d02d3 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
@@ -248,7 +248,9 @@ public class ConnectorLogic extends 
AbstractTransactionalLogic<ConnInstanceTO> {
         if (resource == null) {
             throw new NotFoundException("Resource '" + resourceName + "'");
         }
-        return 
binder.getConnInstanceTO(connFactory.getConnector(resource).getConnInstance());
+        ConnInstanceTO connInstance = 
binder.getConnInstanceTO(connFactory.getConnector(resource).getConnInstance());
+        connInstance.setKey(resource.getConnector().getKey());
+        return connInstance;
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_RELOAD + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/89ef5169/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java
 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java
index 84812b2..09079da 100644
--- 
a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java
+++ 
b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyUtils.java
@@ -44,6 +44,8 @@ public interface AnyUtils {
 
     <T extends PlainAttrValue> T newPlainAttrUniqueValue();
 
+    <T extends PlainAttrValue> T clonePlainAttrValue(T src);
+    
     <T extends AnyTO> T newAnyTO();
 
     Set<ExternalResource> getAllResources(Any<?> any);

http://git-wip-us.apache.org/repos/asf/syncope/blob/89ef5169/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
----------------------------------------------------------------------
diff --git 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
index 99b9d22..b687aa1 100644
--- 
a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
+++ 
b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyUtils.java
@@ -38,6 +38,7 @@ import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
+import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.Schema;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
@@ -295,6 +296,25 @@ public class JPAAnyUtils implements AnyUtils {
     }
 
     @Override
+    public <T extends PlainAttrValue> T clonePlainAttrValue(final T src) {
+        T dst;
+        if (src instanceof PlainAttrUniqueValue) {
+            dst = newPlainAttrUniqueValue();
+        } else {
+            dst = newPlainAttrValue();
+        }
+
+        dst.setBinaryValue(src.getBinaryValue());
+        dst.setBooleanValue(src.getBooleanValue());
+        dst.setDateValue(src.getDateValue());
+        dst.setDoubleValue(src.getDoubleValue());
+        dst.setLongValue(src.getLongValue());
+        dst.setStringValue(src.getStringValue());
+
+        return dst;
+    }
+
+    @Override
     public <T extends AnyTO> T newAnyTO() {
         T result = null;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/89ef5169/core/persistence-jpa/src/main/resources/domains.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/resources/domains.xml 
b/core/persistence-jpa/src/main/resources/domains.xml
index d58f2cb..c793d83 100644
--- a/core/persistence-jpa/src/main/resources/domains.xml
+++ b/core/persistence-jpa/src/main/resources/domains.xml
@@ -42,7 +42,6 @@ under the License.
         value="PrintParameters=true, PrettyPrint=true, 
PrettyPrintLineLength=80"/>-->
                                 
         <entry key="openjpa.NontransactionalWrite" value="false"/>
-        <entry key="openjpa.AutoDetach" value="close, commit, nontx-read, 
rollback"/>
 
         <!-- Removed: see https://s.apache.org/openjpaSchemaFactory for more 
information
         <entry key="openjpa.jdbc.SchemaFactory" 
value="native(ForeignKeys=true)"/>-->

http://git-wip-us.apache.org/repos/asf/syncope/blob/89ef5169/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorManager.java
----------------------------------------------------------------------
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 f97a311..e63eb2c 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
@@ -23,7 +23,6 @@ import java.util.HashSet;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -31,6 +30,7 @@ import 
org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.SyncopeLoader;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
+import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
 import org.apache.syncope.core.provisioning.api.Connector;
 import org.apache.syncope.core.provisioning.api.ConnectorFactory;
@@ -55,6 +55,8 @@ public class ConnectorManager implements ConnectorRegistry, 
ConnectorFactory, Sy
     @Autowired
     private ExternalResourceDAO resourceDAO;
 
+    private EntityFactory entityFactory;
+
     @Override
     public Integer getPriority() {
         return 100;
@@ -81,7 +83,21 @@ public class ConnectorManager implements ConnectorRegistry, 
ConnectorFactory, Sy
             final Set<ConnConfProperty> confOverride,
             final Set<ConnectorCapability> capabilitiesOverride) {
 
-        ConnInstance override = SerializationUtils.clone(connInstance);
+        synchronized (this) {
+            if (entityFactory == null) {
+                entityFactory = 
ApplicationContextProvider.getApplicationContext().getBean(EntityFactory.class);
+            }
+        }
+
+        ConnInstance override = entityFactory.newEntity(ConnInstance.class);
+        override.setConnectorName(connInstance.getConnectorName());
+        override.setDisplayName(connInstance.getDisplayName());
+        override.setBundleName(connInstance.getBundleName());
+        override.setVersion(connInstance.getVersion());
+        override.setLocation(connInstance.getLocation());
+        override.setConf(connInstance.getConf());
+        override.getCapabilities().addAll(connInstance.getCapabilities());
+        override.setConnRequestTimeout(connInstance.getConnRequestTimeout());
 
         Map<String, ConnConfProperty> overridable = new HashMap<>();
         Set<ConnConfProperty> conf = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/89ef5169/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
index d8884fd..85392c4 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
@@ -24,7 +24,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -60,7 +59,6 @@ import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.GroupableRelatable;
 import org.apache.syncope.core.persistence.api.entity.Membership;
-import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Schema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
@@ -352,8 +350,8 @@ public class MappingManagerImpl implements MappingManager {
         List<PlainAttrValue> values = new ArrayList<>();
         boolean transform = true;
 
+        AnyUtils anyUtils = anyUtilsFactory.getInstance(reference);
         if (intAttrName.getField() != null) {
-            AnyUtils anyUtils = anyUtilsFactory.getInstance(reference);
             PlainAttrValue attrValue = anyUtils.newPlainAttrValue();
 
             switch (intAttrName.getField()) {
@@ -434,14 +432,10 @@ public class MappingManagerImpl implements MappingManager 
{
                     }
                     if (attr != null) {
                         if (attr.getUniqueValue() != null) {
-                            PlainAttrUniqueValue value = 
SerializationUtils.clone(attr.getUniqueValue());
-                            value.setAttr(null);
-                            values.add(value);
+                            
values.add(anyUtils.clonePlainAttrValue(attr.getUniqueValue()));
                         } else if (attr.getValues() != null) {
                             for (PlainAttrValue value : attr.getValues()) {
-                                PlainAttrValue shadow = 
SerializationUtils.clone(value);
-                                shadow.setAttr(null);
-                                values.add(shadow);
+                                
values.add(anyUtils.clonePlainAttrValue(value));
                             }
                         }
                     }
@@ -454,7 +448,6 @@ public class MappingManagerImpl implements MappingManager {
                                 ? derAttrHandler.getValue(reference, derSchema)
                                 : derAttrHandler.getValue(reference, 
membership, derSchema);
                         if (value != null) {
-                            AnyUtils anyUtils = 
anyUtilsFactory.getInstance(reference);
                             PlainAttrValue attrValue = 
anyUtils.newPlainAttrValue();
                             attrValue.setStringValue(value);
                             values.add(attrValue);
@@ -472,7 +465,6 @@ public class MappingManagerImpl implements MappingManager {
                         virAttrCache.expire(
                                 reference.getType().getKey(), 
reference.getKey(), intAttrName.getSchemaName());
 
-                        AnyUtils anyUtils = 
anyUtilsFactory.getInstance(reference);
                         List<String> virValues = membership == null
                                 ? virAttrHandler.getValues(reference, 
virSchema)
                                 : virAttrHandler.getValues(reference, 
membership, virSchema);

http://git-wip-us.apache.org/repos/asf/syncope/blob/89ef5169/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
index 53d121c..8e730b7 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
@@ -22,7 +22,6 @@ import java.util.HashSet;
 import java.util.Iterator;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.IteratorUtils;
-import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -193,7 +192,6 @@ public class ResourceDataBinderImpl implements 
ResourceDataBinder {
                     populateMapping(
                             provisionTO.getMapping(),
                             mapping,
-                            entityFactory.newEntity(MappingItem.class),
                             allowedSchemas);
                 }
 
@@ -292,7 +290,6 @@ public class ResourceDataBinderImpl implements 
ResourceDataBinder {
     private void populateMapping(
             final MappingTO mappingTO,
             final Mapping mapping,
-            final MappingItem prototype,
             final AnyTypeClassTO allowedSchemas) {
 
         mapping.setConnObjectLink(mappingTO.getConnObjectLink());
@@ -350,7 +347,7 @@ public class ResourceDataBinderImpl implements 
ResourceDataBinder {
                             scce.addException(invalidMandatoryCondition);
                         }
 
-                        MappingItem item = SerializationUtils.clone(prototype);
+                        MappingItem item = 
entityFactory.newEntity(MappingItem.class);
                         BeanUtils.copyProperties(itemTO, item, 
MAPPINGITEM_IGNORE_PROPERTIES);
                         item.setMapping(mapping);
                         if (item.isConnObjectKey()) {

Reply via email to