/*
* 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.jpa.test.packaging;
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.hibernate.boot.archive.scan.internal.StandardScanOptions;
import org.hibernate.boot.archive.scan.internal.StandardScanParameters;
import org.hibernate.boot.archive.scan.internal.StandardScanner;
import org.hibernate.boot.archive.scan.spi.ClassDescriptor;
import org.hibernate.boot.archive.scan.spi.MappingFileDescriptor;
import org.hibernate.boot.archive.scan.spi.ScanEnvironment;
import org.hibernate.boot.archive.scan.spi.ScanOptions;
import org.hibernate.boot.archive.scan.spi.ScanResult;
import org.hibernate.boot.archive.scan.spi.Scanner;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor;
import org.hibernate.jpa.boot.internal.StandardJpaScanEnvironmentImpl;
import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor;
import org.hibernate.jpa.test.pack.defaultpar.ApplicationServer;
import org.hibernate.jpa.test.pack.defaultpar.Version;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* @author Emmanuel Bernard
* @author Hardy Ferentschik
*/
public class ScannerTest extends PackagingTestCase {
@Test
public void testNativeScanner() throws Exception {
File defaultPar = buildDefaultPar();
addPackageToClasspath( defaultPar );
PersistenceUnitDescriptor descriptor = new ParsedPersistenceXmlDescriptor( defaultPar.toURL() );
ScanEnvironment env = new StandardJpaScanEnvironmentImpl( descriptor );
ScanOptions options = new StandardScanOptions( "hbm,class", descriptor.isExcludeUnlistedClasses() );
Scanner scanner = new StandardScanner();
ScanResult scanResult = scanner.scan(
env,
options,
StandardScanParameters.INSTANCE
);
assertEquals( 3, scanResult.getLocatedClasses().size() );
assertClassesContained( scanResult, ApplicationServer.class );
assertClassesContained( scanResult, Version.class );
assertEquals( 2, scanResult.getLocatedMappingFiles().size() );
for ( MappingFileDescriptor mappingFileDescriptor : scanResult.getLocatedMappingFiles() ) {
assertNotNull( mappingFileDescriptor.getName() );
assertNotNull( mappingFileDescriptor.getStreamAccess() );
InputStream stream = mappingFileDescriptor.getStreamAccess().accessInputStream();
assertNotNull( stream );
stream.close();
}
}
private void assertClassesContained(ScanResult scanResult, Class classToCheckFor) {
for ( ClassDescriptor classDescriptor : scanResult.getLocatedClasses() ) {
if ( classDescriptor.getName().equals( classToCheckFor.getName() ) ) {
return;
}
}
fail( "ScanResult did not contain expected Class : " + classToCheckFor.getName() );
}
@Test
public void testCustomScanner() throws Exception {
File defaultPar = buildDefaultPar();
File explicitPar = buildExplicitPar();
addPackageToClasspath( defaultPar, explicitPar );
EntityManagerFactory emf;
CustomScanner.resetUsed();
final HashMap integration = new HashMap();
emf = Persistence.createEntityManagerFactory( "defaultpar", integration );
assertTrue( ! CustomScanner.isUsed() );
emf.close();
CustomScanner.resetUsed();
emf = Persistence.createEntityManagerFactory( "manager1", integration );
assertTrue( CustomScanner.isUsed() );
emf.close();
CustomScanner.resetUsed();
integration.put( AvailableSettings.SCANNER, new CustomScanner() );
emf = Persistence.createEntityManagerFactory( "defaultpar", integration );
assertTrue( CustomScanner.isUsed() );
emf.close();
CustomScanner.resetUsed();
emf = Persistence.createEntityManagerFactory( "defaultpar", null );
assertTrue( ! CustomScanner.isUsed() );
emf.close();
}
}