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>