/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.test.boot.binding.cacheable; import java.io.File; import java.io.FileNotFoundException; import java.net.URL; import org.hibernate.boot.MappingException; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.jaxb.internal.CacheableFileXmlSource; import org.hibernate.boot.jaxb.internal.MappingBinder; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.spi.XmlMappingBinderAccess; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.jboss.logging.Logger; import static org.junit.Assert.fail; /** * Originally developed to help diagnose HHH-10131 - the original tests * check 4 conditions:<ol> * <li>strict usage where the cached file does exist</li> * <li>strict usage where the cached file does not exist</li> * <li>non-strict usage where the cached file does exist</li> * <li>non-strict usage where the cached file does not exist</li> * </ol> * * @author Steve Ebersole */ public class CacheableHbmXmlTest { private static final Logger log = Logger.getLogger( CacheableHbmXmlTest.class ); private static final String HBM_RESOURCE_NAME = "org/hibernate/test/boot/binding/cacheable/SimpleEntity.hbm.xml"; private StandardServiceRegistry ssr; private MappingBinder binder; private File hbmXmlFile; private File hbmXmlBinFile; @Before public void before() throws Exception { ssr = new StandardServiceRegistryBuilder() .build(); binder = new XmlMappingBinderAccess( ssr ).getMappingBinder(); final URL hbmXmlUrl = getClass().getClassLoader().getResource( HBM_RESOURCE_NAME ); if ( hbmXmlUrl == null ) { throw couldNotFindHbmXmlFile(); } hbmXmlFile = new File( hbmXmlUrl.getFile() ); if ( ! hbmXmlFile.exists() ) { throw couldNotFindHbmXmlFile(); } hbmXmlBinFile = CacheableFileXmlSource.determineCachedFile( hbmXmlFile ); } private Exception couldNotFindHbmXmlFile() { throw new IllegalStateException( "Could not locate hbm.xml file by resource lookup" ); } @After public void after() { if ( ssr != null ) { StandardServiceRegistryBuilder.destroy( ssr ); } } @Test public void testStrictCaseWhereFileDoesPreviouslyExist() throws FileNotFoundException { deleteBinFile(); createBinFile(); try { new MetadataSources( ssr ).addCacheableFileStrictly( hbmXmlFile ).buildMetadata(); } catch (MappingException e) { fail( "addCacheableFileStrictly led to MappingException when bin file existed" ); } } @Test public void testStrictCaseWhereFileDoesNotPreviouslyExist() throws FileNotFoundException { deleteBinFile(); try { new MetadataSources( ssr ).addCacheableFileStrictly( hbmXmlFile ).buildMetadata(); fail( "addCacheableFileStrictly should be led to MappingException when bin file does not exist" ); } catch (MappingException ignore) { // this is the expected result } } @Test public void testNonStrictCaseWhereFileDoesPreviouslyExist() { deleteBinFile(); createBinFile(); new MetadataSources( ssr ).addCacheableFile( hbmXmlFile ).buildMetadata(); } @Test public void testNonStrictCaseWhereFileDoesNotPreviouslyExist() { deleteBinFile(); new MetadataSources( ssr ).addCacheableFile( hbmXmlFile ).buildMetadata(); } private void deleteBinFile() { // if it exists if ( hbmXmlBinFile.exists() ) { final boolean success = hbmXmlBinFile.delete(); if ( !success ) { log.warn( "Unable to delete existing cached hbm.xml.bin file", new Exception() ); } } } private void createBinFile() { if ( hbmXmlBinFile.exists() ) { log.warn( "Cached hbm.xml.bin file already existed on request to create", new Exception() ); } else { CacheableFileXmlSource.createSerFile( hbmXmlFile, binder ); } } }