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()) {
