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ò <[email protected]> Authored: Mon Oct 2 10:54:36 2017 +0200 Committer: Francesco Chicchiriccò <[email protected]> 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>
