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 2017/10/02 08:54:43 UTC
syncope git commit: [SYNCOPE-1216] Spring 5 in: had to backport
OpenJpaVendorAdapter from Spring 4.3.x due to SPR-16035
Repository: syncope
Updated Branches:
refs/heads/master 428857e0f -> 17a8eb5d9
[SYNCOPE-1216] Spring 5 in: had to backport OpenJpaVendorAdapter from Spring 4.3.x due to SPR-16035
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/17a8eb5d
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/17a8eb5d
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/17a8eb5d
Branch: refs/heads/master
Commit: 17a8eb5d99a84608a64927b00e7d9352d640517e
Parents: 428857e
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Oct 2 10:54:36 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Oct 2 10:54:36 2017 +0200
----------------------------------------------------------------------
.../orm/jpa/vendor/OpenJpaDialect.java | 159 +++++++++++++++++++
.../orm/jpa/vendor/OpenJpaVendorAdapter.java | 131 +++++++++++++++
.../camel/component/PropagateComponent.java | 8 +-
fit/build-tools/pom.xml | 4 +
pom.xml | 2 +-
5 files changed, 297 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/17a8eb5d/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java b/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java
new file mode 100644
index 0000000..aec657c
--- /dev/null
+++ b/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaDialect.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2002-2014 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.orm.jpa.vendor;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceException;
+
+import org.apache.commons.logging.LogFactory;
+import org.apache.openjpa.persistence.FetchPlan;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+import org.apache.openjpa.persistence.jdbc.IsolationLevel;
+import org.apache.openjpa.persistence.jdbc.JDBCFetchPlan;
+
+import org.springframework.jdbc.datasource.ConnectionHandle;
+import org.springframework.jdbc.datasource.ConnectionHolder;
+import org.springframework.jdbc.support.JdbcUtils;
+import org.springframework.orm.jpa.DefaultJpaDialect;
+import org.springframework.transaction.SavepointManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionException;
+
+/**
+ * {@link org.springframework.orm.jpa.JpaDialect} implementation for Apache OpenJPA.
+ * Developed and tested against OpenJPA 2.2.
+ *
+ * @author Juergen Hoeller
+ * @author Costin Leau
+ * @since 2.0
+ */
+public class OpenJpaDialect extends DefaultJpaDialect {
+
+ private static final long serialVersionUID = 2099118508988476959L;
+
+ @Override
+ public Object beginTransaction(final EntityManager entityManager, final TransactionDefinition definition)
+ throws PersistenceException, SQLException, TransactionException {
+
+ OpenJPAEntityManager openJpaEntityManager = getOpenJPAEntityManager(entityManager);
+
+ if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {
+ // Pass custom isolation level on to OpenJPA's JDBCFetchPlan configuration
+ FetchPlan fetchPlan = openJpaEntityManager.getFetchPlan();
+ if (fetchPlan instanceof JDBCFetchPlan) {
+ IsolationLevel isolation = IsolationLevel.fromConnectionConstant(definition.getIsolationLevel());
+ ((JDBCFetchPlan) fetchPlan).setIsolation(isolation);
+ }
+ }
+
+ entityManager.getTransaction().begin();
+
+ if (!definition.isReadOnly()) {
+ // Like with EclipseLink, make sure to start the logic transaction early so that other
+ // participants using the connection (such as JdbcTemplate) run in a transaction.
+ openJpaEntityManager.beginStore();
+ }
+
+ // Custom implementation for OpenJPA savepoint handling
+ return new OpenJpaTransactionData(openJpaEntityManager);
+ }
+
+ @Override
+ public ConnectionHandle getJdbcConnection(final EntityManager entityManager, final boolean readOnly)
+ throws PersistenceException, SQLException {
+
+ return new OpenJpaConnectionHandle(getOpenJPAEntityManager(entityManager));
+ }
+
+ /**
+ * Return the OpenJPA-specific variant of {@code EntityManager}.
+ *
+ * @param em the generic {@code EntityManager} instance
+ * @return the OpenJPA-specific variant of {@code EntityManager}
+ */
+ protected OpenJPAEntityManager getOpenJPAEntityManager(final EntityManager em) {
+ return OpenJPAPersistence.cast(em);
+ }
+
+ /**
+ * Transaction data Object exposed from {@code beginTransaction},
+ * implementing the {@link SavepointManager} interface.
+ */
+ private static class OpenJpaTransactionData implements SavepointManager {
+
+ private final OpenJPAEntityManager entityManager;
+
+ private int savepointCounter = 0;
+
+ OpenJpaTransactionData(final OpenJPAEntityManager entityManager) {
+ this.entityManager = entityManager;
+ }
+
+ @Override
+ public Object createSavepoint() throws TransactionException {
+ this.savepointCounter++;
+ String savepointName = ConnectionHolder.SAVEPOINT_NAME_PREFIX + this.savepointCounter;
+ this.entityManager.setSavepoint(savepointName);
+ return savepointName;
+ }
+
+ @Override
+ public void rollbackToSavepoint(final Object savepoint) throws TransactionException {
+ this.entityManager.rollbackToSavepoint((String) savepoint);
+ }
+
+ @Override
+ public void releaseSavepoint(final Object savepoint) throws TransactionException {
+ try {
+ this.entityManager.releaseSavepoint((String) savepoint);
+ } catch (Throwable ex) {
+ LogFactory.getLog(OpenJpaTransactionData.class).debug(
+ "Could not explicitly release OpenJPA savepoint", ex);
+ }
+ }
+ }
+
+ /**
+ * {@link ConnectionHandle} implementation that fetches a new OpenJPA-provided
+ * Connection for every {@code getConnection} call and closes the Connection on
+ * {@code releaseConnection}. This is necessary because OpenJPA requires the
+ * fetched Connection to be closed before continuing EntityManager work.
+ *
+ * @see org.apache.openjpa.persistence.OpenJPAEntityManager#getConnection()
+ */
+ private static class OpenJpaConnectionHandle implements ConnectionHandle {
+
+ private final OpenJPAEntityManager entityManager;
+
+ OpenJpaConnectionHandle(final OpenJPAEntityManager entityManager) {
+ this.entityManager = entityManager;
+ }
+
+ @Override
+ public Connection getConnection() {
+ return (Connection) this.entityManager.getConnection();
+ }
+
+ @Override
+ public void releaseConnection(final Connection con) {
+ JdbcUtils.closeConnection(con);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/17a8eb5d/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaVendorAdapter.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaVendorAdapter.java b/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaVendorAdapter.java
new file mode 100644
index 0000000..a801637
--- /dev/null
+++ b/core/persistence-jpa/src/main/java/org/springframework/orm/jpa/vendor/OpenJpaVendorAdapter.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2002-2014 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.orm.jpa.vendor;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.spi.PersistenceProvider;
+
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
+import org.apache.openjpa.persistence.PersistenceProviderImpl;
+
+/**
+ * {@link org.springframework.orm.jpa.JpaVendorAdapter} implementation for Apache OpenJPA.
+ * Developed and tested against OpenJPA 3.0.
+ *
+ * Exposes OpenJPA's persistence provider and EntityManager extension interface,
+ * and adapts {@link AbstractJpaVendorAdapter}'s common configuration settings.
+ * No support for the detection of annotated packages (through
+ * {@link org.springframework.orm.jpa.persistenceunit.SmartPersistenceUnitInfo#getManagedPackages()})
+ * since OpenJPA doesn't use package-level metadata.
+ *
+ * @author Juergen Hoeller
+ * @author Costin Leau
+ * @since 2.0
+ * @see OpenJpaDialect
+ * @see org.apache.openjpa.persistence.PersistenceProviderImpl
+ * @see org.apache.openjpa.persistence.OpenJPAEntityManager
+ */
+public class OpenJpaVendorAdapter extends AbstractJpaVendorAdapter {
+
+ private final PersistenceProvider persistenceProvider = new PersistenceProviderImpl();
+
+ private final OpenJpaDialect jpaDialect = new OpenJpaDialect();
+
+ @Override
+ public PersistenceProvider getPersistenceProvider() {
+ return this.persistenceProvider;
+ }
+
+ @Override
+ public String getPersistenceProviderRootPackage() {
+ return "org.apache.openjpa";
+ }
+
+ @Override
+ public Map<String, Object> getJpaPropertyMap() {
+ Map<String, Object> jpaProperties = new HashMap<>();
+
+ if (getDatabasePlatform() != null) {
+ jpaProperties.put("openjpa.jdbc.DBDictionary", getDatabasePlatform());
+ } else if (getDatabase() != null) {
+ String databaseDictonary = determineDatabaseDictionary(getDatabase());
+ if (databaseDictonary != null) {
+ jpaProperties.put("openjpa.jdbc.DBDictionary", databaseDictonary);
+ }
+ }
+
+ if (isGenerateDdl()) {
+ jpaProperties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
+ }
+ if (isShowSql()) {
+ // Taken from the OpenJPA 0.9.6 docs ("Standard OpenJPA Log Configuration + All SQL Statements")
+ jpaProperties.put("openjpa.Log", "DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE");
+ }
+
+ return jpaProperties;
+ }
+
+ /**
+ * Determine the OpenJPA database dictionary name for the given database.
+ *
+ * @param database the specified database
+ * @return the OpenJPA database dictionary name, or {@code null} if none found
+ */
+ protected String determineDatabaseDictionary(final Database database) {
+ switch (database) {
+ case DB2:
+ return "db2";
+ case DERBY:
+ return "derby";
+ case HSQL:
+ return "hsql(SimulateLocking=true)";
+ case INFORMIX:
+ return "informix";
+ case MYSQL:
+ return "mysql";
+ case ORACLE:
+ return "oracle";
+ case POSTGRESQL:
+ return "postgres";
+ case SQL_SERVER:
+ return "sqlserver";
+ case SYBASE:
+ return "sybase";
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public OpenJpaDialect getJpaDialect() {
+ return this.jpaDialect;
+ }
+
+ @Override
+ public Class<? extends EntityManagerFactory> getEntityManagerFactoryInterface() {
+ return OpenJPAEntityManagerFactorySPI.class;
+ }
+
+ @Override
+ public Class<? extends EntityManager> getEntityManagerInterface() {
+ return OpenJPAEntityManagerSPI.class;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/17a8eb5d/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
index f443c1d..d1e36bd 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
@@ -21,7 +21,7 @@ package org.apache.syncope.core.provisioning.camel.component;
import java.util.Map;
import org.apache.camel.Endpoint;
-import org.apache.camel.impl.UriEndpointComponent;
+import org.apache.camel.impl.DefaultComponent;
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
@@ -31,7 +31,7 @@ import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecu
import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
import org.springframework.beans.factory.annotation.Autowired;
-public class PropagateComponent extends UriEndpointComponent {
+public class PropagateComponent extends DefaultComponent {
@Autowired
protected PropagationManager propagationManager;
@@ -54,10 +54,6 @@ public class PropagateComponent extends UriEndpointComponent {
@Autowired
protected UserWorkflowAdapter uwfAdapter;
- public PropagateComponent() {
- super(PropagateEndpoint.class);
- }
-
@Override
protected Endpoint createEndpoint(final String uri, final String remaining,
final Map<String, Object> parameters) throws Exception {
http://git-wip-us.apache.org/repos/asf/syncope/blob/17a8eb5d/fit/build-tools/pom.xml
----------------------------------------------------------------------
diff --git a/fit/build-tools/pom.xml b/fit/build-tools/pom.xml
index 878ef5e..f6aa1c5 100644
--- a/fit/build-tools/pom.xml
+++ b/fit/build-tools/pom.xml
@@ -101,6 +101,10 @@ under the License.
</dependency>
<dependency>
<groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/syncope/blob/17a8eb5d/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index b7e278e..2c3e450 100644
--- a/pom.xml
+++ b/pom.xml
@@ -369,7 +369,7 @@ under the License.
<jackson.version>2.9.1</jackson.version>
- <spring.version>4.3.11.RELEASE</spring.version>
+ <spring.version>5.0.0.RELEASE</spring.version>
<spring-security.version>4.2.3.RELEASE</spring-security.version>
<openjpa.version>3.0.0-SNAPSHOT</openjpa.version>