diff --git a/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkExceptionTranslator.java b/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkExceptionTranslator.java new file mode 100644 index 0000000000000000000000000000000000000000..6bfcf1698387a4677a566a9059ca4634d11310a4 --- /dev/null +++ b/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkExceptionTranslator.java @@ -0,0 +1,51 @@ +/* + * 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.eclipselink; + +import org.eclipse.persistence.exceptions.EclipseLinkException; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.support.PersistenceExceptionTranslator; + +/** + * {@link PersistenceExceptionTranslator} capable of translating {@link EclipseLinkException} + * instances to Spring's {@link DataAccessException} hierarchy. + * + * @author Jan Stamer + * @since 4.1 + * @see org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor + */ +public class EclipseLinkExceptionTranslator implements PersistenceExceptionTranslator { + + public DataAccessException translateExceptionIfPossible(RuntimeException ex) { + if (ex instanceof EclipseLinkException) { + return convertEclipseLinkAccessException((EclipseLinkException) ex); + } + return null; + } + + /** + * Convert the given EclipseLinkException to an appropriate exception from + * the {@code org.springframework.dao} hierarchy. + * @param ex EclipseLinkException that occurred + * @return a corresponding DataAccessException + * @see EclipseLinkUtils#convertEclipseLinkAccessException + */ + protected DataAccessException convertEclipseLinkAccessException(EclipseLinkException ex) { + return EclipseLinkUtils.convertEclipseLinkAccessException(ex); + } + +} diff --git a/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkSystemException.java b/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkSystemException.java new file mode 100644 index 0000000000000000000000000000000000000000..4392b3de20a2f5150199de2de78e2dc8da8f5aad --- /dev/null +++ b/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkSystemException.java @@ -0,0 +1,43 @@ +/* + * 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.eclipselink; + +import org.eclipse.persistence.exceptions.EclipseLinkException; +import org.springframework.dao.UncategorizedDataAccessException; + +/** + * EclipseLink-specific subclass of UncategorizedDataAccessException, for + * EclipseLink system errors that do not match any concrete + * org.springframework.dao exceptions. + * + * @author Jan Stamer + * @since 4.1 + * @see EclipseLinkUtils#convertEclipseLinkAccessException(EclipseLinkException) + */ +@SuppressWarnings("serial") +public class EclipseLinkSystemException extends UncategorizedDataAccessException { + + /** + * Create a new HibernateSystemException, wrapping an arbitrary + * {@link EclipseLinkException}. + * @param cause the HibernateException thrown + */ + public EclipseLinkSystemException(EclipseLinkException cause) { + super(cause != null ? cause.getMessage() : null, cause); + } + +} diff --git a/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkUtils.java b/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..0d5e9cef05fdf0359f025cac2df64f78fe82bfbf --- /dev/null +++ b/spring-orm/src/main/java/org/springframework/orm/eclipselink/EclipseLinkUtils.java @@ -0,0 +1,42 @@ +/* + * 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.eclipselink; + +import org.eclipse.persistence.exceptions.EclipseLinkException; +import org.springframework.dao.DataAccessException; + +/** + * Helper class featuring methods for Eclipse Link. Also provides support for + * exception translation. + * + * @author Jan Stamer + * @since 3.2 + */ +public abstract class EclipseLinkUtils { + + /** + * Convert the given EclipseLinkException to an appropriate exception from + * the org.springframework.dao hierarchy. + * @param ex EclipseLinkException that occurred + * @return the corresponding DataAccessException instance + * @see EclipseLinkExceptionTranslator#convertEclipseLinkAccessException(EclipseLinkException) + */ + public static DataAccessException convertEclipseLinkAccessException(EclipseLinkException ex) { + return new EclipseLinkSystemException(ex); + } + +} diff --git a/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkExceptionTranslatorTests.java b/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkExceptionTranslatorTests.java new file mode 100644 index 0000000000000000000000000000000000000000..397c456222f4dfc5b957fe6fa7887e191c76bd11 --- /dev/null +++ b/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkExceptionTranslatorTests.java @@ -0,0 +1,44 @@ +/* + * 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.eclipselink; + +import static org.junit.Assert.*; + +import org.eclipse.persistence.exceptions.DatabaseException; +import org.junit.Test; + +/** + * @author Jan Stamer + */ +public class EclipseLinkExceptionTranslatorTests { + + @Test + public void wrongException() { + EclipseLinkExceptionTranslator exceptionTranslator = new EclipseLinkExceptionTranslator(); + assertNull(exceptionTranslator.translateExceptionIfPossible(new IllegalArgumentException())); + } + + @SuppressWarnings("ThrowableResultOfMethodCallIgnored") + @Test + public void eclipseLinkException() { + EclipseLinkExceptionTranslator exceptionTranslator = new EclipseLinkExceptionTranslator(); + assertNotNull(exceptionTranslator.translateExceptionIfPossible(DatabaseException.databaseAccessorNotConnected())); + assertNotNull(exceptionTranslator.translateExceptionIfPossible( + DatabaseException.databaseAccessorNotConnected())); + } + +} diff --git a/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkSystemExceptionTests.java b/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkSystemExceptionTests.java new file mode 100644 index 0000000000000000000000000000000000000000..0774dac0fe57db686060167254f102958ed95b6f --- /dev/null +++ b/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkSystemExceptionTests.java @@ -0,0 +1,56 @@ +/* + * 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.eclipselink; + +import static org.junit.Assert.*; + +import org.eclipse.persistence.exceptions.DatabaseException; +import org.hibernate.HibernateException; +import org.junit.Test; + +/** + * @author Jan Stamer + */ +@SuppressWarnings("serial") +public class EclipseLinkSystemExceptionTests { + + @Test + public void withNull() { + EclipseLinkSystemException exception = new EclipseLinkSystemException(null); + assertNull(exception.getCause()); + assertNull(exception.getMessage()); + } + + @Test + public void createWithCause() { + DatabaseException dbExceptionWithCause = new DatabaseException("my custom exception cause") { + }; + EclipseLinkSystemException elSystemException = new EclipseLinkSystemException(dbExceptionWithCause); + assertEquals(dbExceptionWithCause, elSystemException.getCause()); + assertTrue(elSystemException.getMessage().contains("my custom exception cause")); + } + + @Test + public void createWithNullCause() throws HibernateException { + DatabaseException dbExceptionWithCause = new DatabaseException((String) null) { + }; + EclipseLinkSystemException elSystemException = new EclipseLinkSystemException(dbExceptionWithCause); + assertEquals(dbExceptionWithCause, elSystemException.getCause()); + assertTrue(elSystemException.getMessage().contains("null")); + } + +} diff --git a/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkUtilsTests.java b/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkUtilsTests.java new file mode 100644 index 0000000000000000000000000000000000000000..fa9d804efde7f74c5f477eafbef2aa0293a08f9b --- /dev/null +++ b/spring-orm/src/test/java/org/springframework/orm/eclipselink/EclipseLinkUtilsTests.java @@ -0,0 +1,40 @@ +/* + * 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.eclipselink; + +import static org.junit.Assert.*; + +import org.eclipse.persistence.exceptions.DatabaseException; +import org.junit.Test; + +/** + * @author Jan Stamer + */ +public class EclipseLinkUtilsTests { + + @Test + public void withNull() { + assertNotNull(EclipseLinkUtils.convertEclipseLinkAccessException(null)); + } + + @Test + public void testWithEclipseLinkException() { + assertNotNull(EclipseLinkUtils.convertEclipseLinkAccessException( + DatabaseException.databaseAccessorNotConnected())); + } + +}