From f410417f2569ee9bb7488b7161bd1a0b40b9657c Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Mon, 5 May 2014 12:39:14 -0500 Subject: [PATCH] HHH-9143 - Build baseline Jandex as part of scanning --- build.gradle | 22 ++ .../org/hibernate/cfg/AvailableSettings.java | 45 +++ .../hibernate/internal/DeprecationLogger.java | 57 ++++ .../hibernate/internal/UrlMessageBundle.java | 111 +++++++ .../hibernate/metamodel/MetadataBuilder.java | 40 +++ .../hibernate/metamodel/MetadataSources.java | 262 +++------------ .../archive/internal/ArchiveHelper.java | 10 +- .../internal/ByteArrayInputStreamAccess.java | 12 +- .../internal/ExplodedArchiveDescriptor.java | 31 +- .../internal/FileInputStreamAccess.java | 14 +- .../JarFileBasedArchiveDescriptor.java | 35 +- .../JarInputStreamBasedArchiveDescriptor.java | 28 +- .../JarProtocolArchiveDescriptor.java | 10 +- .../StandardArchiveDescriptorFactory.java | 40 +-- .../internal/UrlInputStreamAccess.java | 16 +- .../archive/internal/package-info.java | 10 +- .../scan}/internal/ClassDescriptorImpl.java | 8 +- .../internal/MappingFileDescriptorImpl.java | 31 +- .../scan}/internal/PackageDescriptorImpl.java | 8 +- .../scan/internal/ResultCoordinator.java | 12 +- .../scan/internal/ScanResultCollector.java | 89 +---- .../scan/internal/ScanResultImpl.java | 10 +- .../scan/internal/StandardScanOptions.java | 39 +-- .../scan/internal/StandardScanner.java | 10 +- .../scan/spi/AbstractScannerImpl.java | 60 +++- .../scan/spi/ArchiveEntryHandlers.java | 4 +- .../archive/scan/spi/ClassDescriptor.java | 47 +++ .../spi/ClassFileArchiveEntryHandler.java | 17 +- .../archive/scan/spi/JandexInitializer.java | 15 +- .../scan/spi/MappingFileDescriptor.java | 49 +++ .../spi/NonClassFileArchiveEntryHandler.java | 14 +- .../archive/scan/spi/PackageDescriptor.java | 47 +++ .../spi/PackageInfoArchiveEntryHandler.java | 15 +- .../archive/scan/spi/ScanEnvironment.java | 81 +++++ .../archive}/scan/spi/ScanOptions.java | 25 +- .../archive/scan/spi/ScanParameters.java | 12 +- .../archive}/scan/spi/ScanResult.java | 25 +- .../metamodel/archive}/scan/spi/Scanner.java | 19 +- .../spi/AbstractArchiveDescriptor.java | 13 +- .../spi/AbstractArchiveDescriptorFactory.java | 30 +- .../archive/spi/ArchiveContext.java | 13 +- .../archive/spi/ArchiveDescriptor.java | 4 +- .../archive/spi/ArchiveDescriptorFactory.java | 4 +- .../metamodel}/archive/spi/ArchiveEntry.java | 6 +- .../archive/spi/ArchiveEntryHandler.java | 4 +- .../archive/spi/ArchiveException.java | 4 +- .../archive}/spi/InputStreamAccess.java | 9 +- .../metamodel/archive/spi/package-info.java | 20 +- .../internal/ClassLoaderAccessImpl.java | 10 +- .../metamodel/internal/JandexInitManager.java | 309 ++++++++++++++++++ .../internal/MetadataBuilderImpl.java | 80 +++++ .../internal/MetadataBuildingProcess.java | 216 ++++++++++-- .../metamodel/spi/ClassLoaderAccess.java | 4 + .../spi/MetadataBuildingOptions.java | 37 +++ .../ejb/packaging/NamedInputStream.java | 38 --- .../org/hibernate/jpa/AvailableSettings.java | 24 +- .../boot/archive/internal/package-info.java | 4 - .../jpa/boot/archive/spi/package-info.java | 15 - .../EntityManagerFactoryBuilderImpl.java | 190 +---------- .../internal/MappingFileDescriptorImpl.java | 73 ----- .../boot/internal/PersistenceXmlParser.java | 2 +- .../StandardJpaScanEnvironmentImpl.java | 9 +- .../jpa/boot/scan/spi/ArchiveContextImpl.java | 73 ----- .../internal/EntityManagerMessageLogger.java | 25 ++ .../jpa/test/packaging/CustomScanner.java | 17 +- .../jpa/test/packaging/JarVisitorTest.java | 105 +++--- .../jpa/test/packaging/PackagingTestCase.java | 9 +- .../jpa/test/packaging/ScannerTest.java | 39 ++- .../hibernate/osgi/OsgiArchiveDescriptor.java | 14 +- .../osgi/OsgiArchiveDescriptorFactory.java | 4 +- .../java/org/hibernate/osgi/OsgiScanner.java | 2 +- 71 files changed, 1621 insertions(+), 1165 deletions(-) create mode 100644 hibernate-core/src/main/java/org/hibernate/internal/DeprecationLogger.java create mode 100644 hibernate-core/src/main/java/org/hibernate/internal/UrlMessageBundle.java rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/internal/ArchiveHelper.java (94%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/internal/ByteArrayInputStreamAccess.java (81%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/internal/ExplodedArchiveDescriptor.java (85%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/internal/FileInputStreamAccess.java (83%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/internal/JarFileBasedArchiveDescriptor.java (82%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/internal/JarInputStreamBasedArchiveDescriptor.java (83%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/internal/JarProtocolArchiveDescriptor.java (89%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/internal/StandardArchiveDescriptorFactory.java (70%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/internal/UrlInputStreamAccess.java (74%) rename hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/MappingFileDescriptor.java => hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/package-info.java (80%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan}/internal/ClassDescriptorImpl.java (87%) rename hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/NamedInputStream.java => hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/MappingFileDescriptorImpl.java (65%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan}/internal/PackageDescriptorImpl.java (87%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/internal/ResultCoordinator.java (81%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/internal/ScanResultCollector.java (71%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/internal/ScanResultImpl.java (85%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/internal/StandardScanOptions.java (68%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/internal/StandardScanner.java (80%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/spi/AbstractScannerImpl.java (64%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/spi/ArchiveEntryHandlers.java (92%) create mode 100644 hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ClassDescriptor.java rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/spi/ClassFileArchiveEntryHandler.java (82%) rename hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/ClassDescriptor.java => hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/JandexInitializer.java (74%) create mode 100644 hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/MappingFileDescriptor.java rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/spi/NonClassFileArchiveEntryHandler.java (78%) create mode 100644 hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/PackageDescriptor.java rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/spi/PackageInfoArchiveEntryHandler.java (81%) create mode 100644 hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanEnvironment.java rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/spi/ScanOptions.java (77%) rename hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/PackageDescriptor.java => hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanParameters.java (74%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/spi/ScanResult.java (70%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/scan/spi/Scanner.java (67%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/spi/AbstractArchiveDescriptor.java (89%) rename hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanEnvironment.java => hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/AbstractArchiveDescriptorFactory.java (65%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/spi/ArchiveContext.java (81%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/spi/ArchiveDescriptor.java (92%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/spi/ArchiveDescriptorFactory.java (95%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/spi/ArchiveEntry.java (90%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/spi/ArchiveEntryHandler.java (92%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel}/archive/spi/ArchiveException.java (93%) rename {hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot => hibernate-core/src/main/java/org/hibernate/metamodel/archive}/spi/InputStreamAccess.java (87%) rename hibernate-entitymanager/src/main/java/org/hibernate/ejb/packaging/Scanner.java => hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/package-info.java (66%) create mode 100644 hibernate-core/src/main/java/org/hibernate/metamodel/internal/JandexInitManager.java delete mode 100644 hibernate-entitymanager/src/main/java/org/hibernate/ejb/packaging/NamedInputStream.java delete mode 100644 hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/package-info.java delete mode 100644 hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/package-info.java delete mode 100644 hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/MappingFileDescriptorImpl.java rename hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/{scan => }/internal/StandardJpaScanEnvironmentImpl.java (91%) delete mode 100644 hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ArchiveContextImpl.java diff --git a/build.gradle b/build.gradle index f8bf8854b1..b06f4032f3 100644 --- a/build.gradle +++ b/build.gradle @@ -207,6 +207,28 @@ subprojects { subProject -> ] } + compileJava { + File mainAptDir = mkdir( "${subProject.buildDir}/generated-src/apt/main" ) + options.compilerArgs += [ "-s", "$mainAptDir.absolutePath" ] + + doFirst { + if ( !mainAptDir.exists() ) { + mainAptDir.mkdirs(); + } + } + } + + compileTestJava { + File testAptDir = mkdir( "${subProject.buildDir}/generated-src/apt/test" ); + options.compilerArgs += [ "-s", "$testAptDir.absolutePath" ] + + doFirst { + if ( !testAptDir.exists() ) { + testAptDir.mkdirs(); + } + } + } + jar { manifest = osgiManifest { // GRADLE-1411: Even if we override Imports and Exports diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/AvailableSettings.java b/hibernate-core/src/main/java/org/hibernate/cfg/AvailableSettings.java index bee2baa4f7..c85343b93c 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/AvailableSettings.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/AvailableSettings.java @@ -764,4 +764,49 @@ public interface AvailableSettings { String AUTO_SESSION_EVENTS_LISTENER = "hibernate.session.events.auto"; + /** + * Names a Jandex {@link org.jboss.jandex.Index} instance to use. + */ + String JANDEX_INDEX = "hibernate.jandex_index"; + + /** + * The deprecated name. Use {@link #SCANNER} instead. + */ + String SCANNER_DEPRECATED = "hibernate.ejb.resource_scanner"; + + /** + * Pass an implementation of {@link org.hibernate.metamodel.archive.scan.spi.Scanner}. + * Accepts either: + */ + String SCANNER = "hibernate.archive.scanner"; + + /** + * Pass {@link org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory} to use + * in the scanning process. Accepts either: + *

+ * See information on {@link org.hibernate.metamodel.archive.scan.spi.Scanner} + * about expected constructor forms. + * + * @see #SCANNER + * @see org.hibernate.metamodel.archive.scan.spi.Scanner + * @see org.hibernate.metamodel.archive.scan.spi.AbstractScannerImpl + */ + String SCANNER_ARCHIVE_INTERPRETER = "hibernate.archive.interpreter"; + + /** + * Identifies a comma-separate list of values indicating the types of + * things we should auto-detect during scanning. Allowable values include:

+ */ + String SCANNER_DISCOVERY = "hibernate.archive.autodetection"; } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/DeprecationLogger.java b/hibernate-core/src/main/java/org/hibernate/internal/DeprecationLogger.java new file mode 100644 index 0000000000..29e9a68675 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/internal/DeprecationLogger.java @@ -0,0 +1,57 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.internal; + +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; +import org.jboss.logging.annotations.ValidIdRange; + +import static org.jboss.logging.Logger.Level.INFO; + +/** + * Class to consolidate logging about usage of deprecated features. + * + * @author Steve Ebersole + */ +@MessageLogger( projectCode = "HHH" ) +@ValidIdRange( min = 90000001, max = 90001000 ) +public interface DeprecationLogger { + public static final DeprecationLogger DEPRECATION_LOGGER = Logger.getMessageLogger( + DeprecationLogger.class, + "org.hibernate.orm.deprecation" + ); + + /** + * Log about usage of deprecated Scanner setting + */ + @LogMessage( level = INFO ) + @Message( + value = "Found usage of deprecated setting for specifying Scanner [hibernate.ejb.resource_scanner]; " + + "use [hibernate.archive.scanner] instead", + id = 90000001 + ) + public void logScannerDeprecation(); +} diff --git a/hibernate-core/src/main/java/org/hibernate/internal/UrlMessageBundle.java b/hibernate-core/src/main/java/org/hibernate/internal/UrlMessageBundle.java new file mode 100644 index 0000000000..4c7c6e835a --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/internal/UrlMessageBundle.java @@ -0,0 +1,111 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.internal; + +import java.net.URISyntaxException; +import java.net.URL; + +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.Cause; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageBundle; +import org.jboss.logging.annotations.MessageLogger; + +import static org.jboss.logging.Logger.Level.WARN; + +/** + * Acts as the {@link org.jboss.logging.annotations.MessageLogger} and + * {@link org.jboss.logging.annotations.MessageBundle} for messages related to + * processing URLs. + * + * @author Steve Ebersole + */ +@MessageLogger( projectCode = "HHH" ) +//@MessageBundle( projectCode = "HHH" ) +public interface UrlMessageBundle { + + public static final UrlMessageBundle URL_LOGGER = Logger.getMessageLogger( + UrlMessageBundle.class, + "org.hibernate.orm.url" + ); + + /** + * Logs a warning about a malformed URL, caused by a {@link URISyntaxException} + * + * @param jarUrl The URL that lead to the {@link URISyntaxException} + * @param e The underlying URISyntaxException + */ + @LogMessage( level = WARN ) + @Message( value = "Malformed URL: %s", id = 100001 ) + void logMalformedUrl(URL jarUrl, @Cause URISyntaxException e); + + /** + * Logs a warning about not being able to find a file by a specified URL. This is different + * from {@link #logFileDoesNotExist}. + * + * @param url The URL is supposed to identify the file which we cannot locate + * @param e The underlying URISyntaxException + */ + @LogMessage( level = WARN ) + @Message( value = "File or directory named by URL [%s] could not be found. URL will be ignored", id = 100002 ) + void logUnableToFindFileByUrl(URL url, @Cause Exception e); + + /** + * Logs a warning that the File (file/directory) to which the URL resolved + * reported that it did not exist. + * + * @param url The URL that named the file/directory + * + * @see java.io.File#exists() + */ + @LogMessage( level = WARN ) + @Message( value = "File or directory named by URL [%s] did not exist. URL will be ignored", id = 100003 ) + void logFileDoesNotExist(URL url); + + /** + * Logs a warning indicating that the URL resolved to a File that we were expecting + * to be a directory, but {@link java.io.File#isDirectory()} reported it was not. + * + * @param url The URL that named the file/directory + * + * @see java.io.File#isDirectory() + */ + @LogMessage( level = WARN ) + @Message( value = "Expecting resource named by URL [%s] to be a directory, but it was not. URL will be ignored", id = 100004 ) + void logFileIsNotDirectory(URL url); + + /** + * Access to the exception message used when a URL references names a file that does not exist. + *

+ * TODO : detail when this is a warning {@link #logFileDoesNotExist} versus an exception... + * + * @param filePart The "file part" that we gleaned from the URL + * @param url The given URL + * + * @return The message + */ + @Message( value = "File [%s] referenced by given URL [%s] does not exist", id = 100005 ) + String fileDoesNotExist(String filePart, URL url); +} diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/MetadataBuilder.java b/hibernate-core/src/main/java/org/hibernate/metamodel/MetadataBuilder.java index c8ed401fef..492f913330 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/MetadataBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/MetadataBuilder.java @@ -28,6 +28,10 @@ import javax.persistence.SharedCacheMode; import org.hibernate.boot.spi.CacheRegionDefinition; import org.hibernate.cache.spi.access.AccessType; import org.hibernate.cfg.NamingStrategy; +import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment; +import org.hibernate.metamodel.archive.scan.spi.ScanOptions; +import org.hibernate.metamodel.archive.scan.spi.Scanner; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; import org.hibernate.metamodel.spi.PersistentAttributeMemberResolver; import org.hibernate.metamodel.spi.TypeContributor; import org.hibernate.type.BasicType; @@ -109,6 +113,42 @@ public interface MetadataBuilder { */ public MetadataBuilder with(IndexView jandexView); + /** + * Specify the options to be used in performing scanning. + * + * @param scanOptions The scan options. + * + * @return {@code this}, for method chaining + */ + public MetadataBuilder with(ScanOptions scanOptions); + + /** + * Consider this temporary as discussed on {@link ScanEnvironment} + * + * @param scanEnvironment The environment for scanning + * + * @return {@code this}, for method chaining + */ + public MetadataBuilder with(ScanEnvironment scanEnvironment); + + /** + * Specify a particular Scanner instance to use. + * + * @param scanner The scanner to use. + * + * @return {@code this}, for method chaining + */ + public MetadataBuilder with(Scanner scanner); + + /** + * Specify a particular ArchiveDescriptorFactory instance to use in scanning. + * + * @param factory The ArchiveDescriptorFactory to use. + * + * @return {@code this}, for method chaining + */ + public MetadataBuilder with(ArchiveDescriptorFactory factory); + /** * Should the new (well "new" since 3.2) identifier generators be used for * {@link javax.persistence.GenerationType#SEQUENCE}, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/MetadataSources.java b/hibernate-core/src/main/java/org/hibernate/metamodel/MetadataSources.java index 691a56970f..8a2939d222 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/MetadataSources.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/MetadataSources.java @@ -33,28 +33,23 @@ import java.io.Serializable; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import javax.persistence.AttributeConverter; -import org.hibernate.HibernateException; import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.internal.util.ReflectHelper; import org.hibernate.internal.util.SerializationHelper; import org.hibernate.internal.util.StringHelper; +import org.hibernate.metamodel.internal.ClassLoaderAccessImpl; +import org.hibernate.metamodel.internal.JandexInitManager; import org.hibernate.metamodel.internal.MetadataBuilderImpl; -import org.hibernate.metamodel.source.internal.annotations.util.HibernateDotNames; -import org.hibernate.metamodel.source.internal.annotations.util.JPADotNames; -import org.hibernate.metamodel.source.internal.annotations.util.JandexHelper; import org.hibernate.metamodel.source.internal.jaxb.JaxbConverter; import org.hibernate.metamodel.source.internal.jaxb.JaxbEmbeddable; import org.hibernate.metamodel.source.internal.jaxb.JaxbEntity; @@ -64,11 +59,6 @@ import org.hibernate.metamodel.source.internal.jaxb.JaxbEntityMappings; import org.hibernate.metamodel.source.internal.jaxb.JaxbMappedSuperclass; import org.hibernate.metamodel.source.internal.jaxb.JaxbPersistenceUnitDefaults; import org.hibernate.metamodel.source.internal.jaxb.JaxbPersistenceUnitMetadata; -import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbClassElement; -import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbHibernateMapping; -import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbJoinedSubclassElement; -import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbSubclassElement; -import org.hibernate.metamodel.source.internal.jaxb.hbm.JaxbUnionSubclassElement; import org.hibernate.metamodel.source.spi.InvalidMappingException; import org.hibernate.metamodel.source.spi.MappingException; import org.hibernate.metamodel.source.spi.MappingNotFoundException; @@ -79,13 +69,8 @@ import org.hibernate.xml.spi.BindResult; import org.hibernate.xml.spi.Origin; import org.hibernate.xml.spi.SourceType; -import org.jboss.jandex.AnnotationInstance; -import org.jboss.jandex.ClassInfo; import org.jboss.jandex.DotName; -import org.jboss.jandex.Index; import org.jboss.jandex.IndexView; -import org.jboss.jandex.Indexer; -import org.jboss.jandex.Type; import org.jboss.logging.Logger; import org.w3c.dom.Document; @@ -564,6 +549,10 @@ public class MetadataSources { return this; } + /** + * @deprecated Use {@link #indexKnownClasses} instead + */ + @Deprecated public IndexView buildJandexView() { return buildJandexView( false ); } @@ -573,46 +562,55 @@ public class MetadataSources { * * @param autoIndexMemberTypes Should the types of class members automatically be added to the built index? * - * @return + * @return The built Jandex Index + * + * @deprecated Use {@link #indexKnownClasses} instead */ + @Deprecated public IndexView buildJandexView(boolean autoIndexMemberTypes) { - return JandexIndexBuilder.process( autoIndexMemberTypes, this ); + JandexInitManager jandexInitManager = new JandexInitManager( + null, + new ClassLoaderAccessImpl( + null, + getServiceRegistry().getService( ClassLoaderService.class ) + ), + autoIndexMemberTypes + ); + JandexIndexBuilder.process( jandexInitManager, this ); + return jandexInitManager.buildIndex(); + } + + public void indexKnownClasses(JandexInitManager jandexInitManager) { + JandexIndexBuilder.process( jandexInitManager, this ); } public static class JandexIndexBuilder { private static final Logger log = Logger.getLogger( JandexIndexBuilder.class ); - private final DotName OBJECT_DOT_NAME = DotName.createSimple( Object.class.getName() ); + private final JandexInitManager jandexInitManager; - private final boolean autoIndexMemberTypes; - private final ClassLoaderService classLoaderService; - - private final Indexer indexer = new Indexer(); - private final Set processedClassNames = new HashSet(); - - private JandexIndexBuilder(boolean autoIndexMemberTypes, ServiceRegistry serviceRegistry) { - this.classLoaderService = serviceRegistry.getService( ClassLoaderService.class ); - this.autoIndexMemberTypes = autoIndexMemberTypes; + private JandexIndexBuilder(JandexInitManager jandexInitManager) { + this.jandexInitManager = jandexInitManager; } - public static IndexView process(boolean autoIndexMemberTypes, MetadataSources sources) { - return new JandexIndexBuilder( autoIndexMemberTypes, sources.getServiceRegistry() ).process( sources ); + public static void process(JandexInitManager jandexInitManager, MetadataSources sources) { + new JandexIndexBuilder( jandexInitManager ).process( sources ); } - private IndexView process(MetadataSources sources) { + private void process(MetadataSources sources) { // start off with any already-loaded Class references... for ( Class clazz : sources.getAnnotatedClasses() ) { - indexLoadedClass( clazz ); + jandexInitManager.indexLoadedClass( clazz ); } if ( sources.converterClasses != null ) { for ( Class converterClass : sources.converterClasses ) { - indexLoadedClass( converterClass ); + jandexInitManager.indexLoadedClass( converterClass ); } } for ( String className : sources.getAnnotatedClassNames() ) { - indexClassName( DotName.createSimple( className ) ); + jandexInitManager.indexClassName( DotName.createSimple( className ) ); } // add package-info from the configured packages @@ -620,7 +618,7 @@ public class MetadataSources { // older code seemed to simply ignore packages that did not have package-info, // so do same try { - indexResource( packageName.replace( '.', '/' ) + "/package-info.class" ); + jandexInitManager.indexResource( packageName.replace( '.', '/' ) + "/package-info.class" ); } catch (Exception e) { log.debugf( "Skipping package [%s] which caused error indexing : %s", packageName, e.getMessage() ); @@ -636,164 +634,6 @@ public class MetadataSources { } } } - - final Index jandexIndex = indexer.complete(); - if ( log.isTraceEnabled() ) { - jandexIndex.printSubclasses(); - jandexIndex.printAnnotations(); - } - return jandexIndex; - } - - private void indexLoadedClass(Class loadedClass) { - if ( loadedClass == null ) { - return; - } - - final DotName classDotName = DotName.createSimple( loadedClass.getName() ); - if ( !needsProcessing( classDotName ) ) { - return; - } - - // index super type first - indexLoadedClass( loadedClass.getSuperclass() ); - - // index any inner classes - for ( Class innerClass : loadedClass.getDeclaredClasses() ) { - indexLoadedClass( innerClass ); - } - - // then index the class itself - ClassInfo classInfo = indexResource( loadedClass.getName().replace( '.', '/' ) + ".class" ); - - if ( !autoIndexMemberTypes ) { - return; - } - - for ( Class fieldType : ReflectHelper.getMemberTypes( loadedClass ) ) { - if ( !fieldType.isPrimitive() && fieldType != Object.class ) { - indexLoadedClass( fieldType ); - } - } - - // Also check for classes within a @Target annotation. - // [steve] - not so sure about this. target would name an entity, which should be - // known to us somehow - for ( AnnotationInstance targetAnnotation : JandexHelper.getAnnotations( classInfo, HibernateDotNames.TARGET ) ) { - String targetClassName = targetAnnotation.value().asClass().name().toString(); - Class targetClass = classLoaderService.classForName( targetClassName ); - indexLoadedClass( targetClass ); - } - } - - - private boolean needsProcessing(DotName classDotName) { - if ( classDotName == null || OBJECT_DOT_NAME.equals( classDotName ) ) { - return false; - } - - if ( processedClassNames.contains( classDotName ) ) { - return false; - } - - processedClassNames.add( classDotName ); - return true; - } - - private ClassInfo indexResource(String resourceName) { - final URL resourceUrl = classLoaderService.locateResource( resourceName ); - - if ( resourceUrl == null ) { - throw new IllegalArgumentException( "Could not locate resource [" + resourceName + "]" ); - } - - try { - final InputStream stream = resourceUrl.openStream(); - try { - final ClassInfo classInfo = indexer.index( stream ); - furtherProcess( classInfo ); - return classInfo; - } - catch ( IOException e ) { - throw new HibernateException( "Unable to index from resource stream [" + resourceName + "]", e ); - } - finally { - try { - stream.close(); - } - catch ( IOException e ) { - log.debug( "Unable to close resource stream [" + resourceName + "] : " + e.getMessage() ); - } - } - } - catch ( IOException e ) { - throw new HibernateException( "Unable to open input stream for resource [" + resourceName + "]", e ); - } - } - - private void furtherProcess(ClassInfo classInfo) { - final List entityListenerAnnotations = classInfo.annotations().get( JPADotNames.ENTITY_LISTENERS ); - if ( entityListenerAnnotations != null ) { - for ( AnnotationInstance entityListenerAnnotation : entityListenerAnnotations ) { - final Type[] entityListenerClassTypes = entityListenerAnnotation.value().asClassArray(); - for ( Type entityListenerClassType : entityListenerClassTypes ) { - indexClassName( entityListenerClassType.name() ); - } - } - } - - // todo : others? - } - - private void indexClassName(DotName classDotName) { - if ( !needsProcessing( classDotName ) ) { - return; - } - - ClassInfo classInfo = indexResource( classDotName.toString().replace( '.', '/' ) + ".class" ); - if ( classInfo.superName() != null ) { - indexClassName( classInfo.superName() ); - } - } - - private void indexHbmReferences(JaxbHibernateMapping hbmRoot) { - final String packageName = hbmRoot.getPackage(); - - for ( JaxbClassElement hbmRootClass : hbmRoot.getClazz() ) { - if ( StringHelper.isNotEmpty( hbmRootClass.getName() ) ) { - indexClassName( toDotName( hbmRootClass.getName(), packageName ) ); - - for ( JaxbSubclassElement hbmSubclassElement : hbmRootClass.getSubclass() ) { - processHbmSubclass( hbmSubclassElement, packageName ); - } - - for ( JaxbJoinedSubclassElement hbmJoinedSubclass : hbmRootClass.getJoinedSubclass() ) { - processHbmJoinedSubclass( hbmJoinedSubclass, packageName ); - } - - for ( JaxbUnionSubclassElement hbmUnionSubclass : hbmRoot.getUnionSubclass() ) { - processHbmUnionSubclass( hbmUnionSubclass, packageName ); - } - } - } - - for ( JaxbSubclassElement hbmSubclassElement : hbmRoot.getSubclass() ) { - if ( StringHelper.isNotEmpty( hbmSubclassElement.getName() ) ) { - processHbmSubclass( hbmSubclassElement, packageName ); - } - } - - for ( JaxbJoinedSubclassElement hbmJoinedSubclass : hbmRoot.getJoinedSubclass() ) { - if ( StringHelper.isNotEmpty( hbmJoinedSubclass.getName() ) ) { - processHbmJoinedSubclass( hbmJoinedSubclass, packageName ); - } - } - - for ( JaxbUnionSubclassElement hbmUnionSubclass : hbmRoot.getUnionSubclass() ) { - if ( StringHelper.isNotEmpty( hbmUnionSubclass.getName() ) ) { - processHbmUnionSubclass( hbmUnionSubclass, packageName ); - } - } } private DotName toDotName(String className, String packageName) { @@ -806,30 +646,6 @@ public class MetadataSources { return DotName.createSimple( className ); } - private void processHbmSubclass(JaxbSubclassElement hbmSubclassElement, String packageName) { - indexClassName( toDotName( hbmSubclassElement.getName(), packageName ) ); - - for ( JaxbSubclassElement hbmSubclassElement2 : hbmSubclassElement.getSubclass() ) { - processHbmSubclass( hbmSubclassElement2, packageName ); - } - } - - private void processHbmJoinedSubclass(JaxbJoinedSubclassElement hbmJoinedSubclass, String packageName) { - indexClassName( toDotName( hbmJoinedSubclass.getName(), packageName ) ); - - for ( JaxbJoinedSubclassElement hbmJoinedSubclass2 : hbmJoinedSubclass.getJoinedSubclass() ) { - processHbmJoinedSubclass( hbmJoinedSubclass2, packageName ); - } - } - - private void processHbmUnionSubclass(JaxbUnionSubclassElement hbmUnionSubclass, String packageName) { - indexClassName( toDotName( hbmUnionSubclass.getName(), packageName ) ); - - for ( JaxbUnionSubclassElement hbmUnionSubclass2 : hbmUnionSubclass.getUnionSubclass() ) { - processHbmUnionSubclass( hbmUnionSubclass2, packageName ); - } - } - private boolean isMappingMetadataComplete(JaxbEntityMappings ormXmlRoot) { return ormXmlRoot.getPersistenceUnitMetadata() != null && ormXmlRoot.getPersistenceUnitMetadata().getXmlMappingMetadataComplete() != null; @@ -847,19 +663,19 @@ public class MetadataSources { } for ( JaxbConverter jaxbConverter : ormXmlRoot.getConverter() ) { - indexClassName( toDotName( jaxbConverter.getClazz(), packageName ) ); + jandexInitManager.indexClassName( toDotName( jaxbConverter.getClazz(), packageName ) ); } for ( JaxbEmbeddable jaxbEmbeddable : ormXmlRoot.getEmbeddable() ) { - indexClassName( toDotName( jaxbEmbeddable.getClazz(), packageName ) ); + jandexInitManager.indexClassName( toDotName( jaxbEmbeddable.getClazz(), packageName ) ); } for ( JaxbMappedSuperclass jaxbMappedSuperclass : ormXmlRoot.getMappedSuperclass() ) { - indexClassName( toDotName( jaxbMappedSuperclass.getClazz(), packageName ) ); + jandexInitManager.indexClassName( toDotName( jaxbMappedSuperclass.getClazz(), packageName ) ); } for ( JaxbEntity jaxbEntity : ormXmlRoot.getEntity() ) { - indexClassName( toDotName( jaxbEntity.getClazz(), packageName ) ); + jandexInitManager.indexClassName( toDotName( jaxbEntity.getClazz(), packageName ) ); indexEntityListeners( jaxbEntity.getEntityListeners(), packageName ); } } @@ -871,7 +687,7 @@ public class MetadataSources { for ( JaxbEntityListener listener : listeners.getEntityListener() ) { if ( StringHelper.isNotEmpty( listener.getClazz() ) ) { - indexClassName( toDotName( listener.getClazz(), packageName ) ); + jandexInitManager.indexClassName( toDotName( listener.getClazz(), packageName ) ); } } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/ArchiveHelper.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ArchiveHelper.java similarity index 94% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/ArchiveHelper.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ArchiveHelper.java index 2a31b9357a..54ebb47c32 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/ArchiveHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ArchiveHelper.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.internal; +package org.hibernate.metamodel.archive.internal; import java.io.File; import java.io.IOException; @@ -31,7 +31,7 @@ import java.net.URL; import java.util.LinkedList; import java.util.List; -import org.hibernate.jpa.boot.archive.spi.ArchiveException; +import org.hibernate.metamodel.archive.spi.ArchiveException; import org.jboss.logging.Logger; @@ -143,7 +143,7 @@ public class ArchiveHelper { /** * Extracts the bytes out of an InputStream. This form is the same as {@link #getBytesFromInputStream} - * except that any {@link IOException} are wrapped as (runtime) {@link ArchiveException} + * except that any {@link java.io.IOException} are wrapped as (runtime) {@link ArchiveException} * * @param inputStream The stream from which to extract bytes. * @@ -167,7 +167,7 @@ public class ArchiveHelper { * * @return The bytes * - * @throws IOException Indicates a problem accessing the stream + * @throws java.io.IOException Indicates a problem accessing the stream * * @see #getBytesFromInputStreamSafely(java.io.InputStream) */ diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/ByteArrayInputStreamAccess.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ByteArrayInputStreamAccess.java similarity index 81% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/ByteArrayInputStreamAccess.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ByteArrayInputStreamAccess.java index 8b949206ce..1b3373e28e 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/ByteArrayInputStreamAccess.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ByteArrayInputStreamAccess.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,13 +21,12 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.internal; +package org.hibernate.metamodel.archive.internal; import java.io.ByteArrayInputStream; import java.io.InputStream; -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.boot.spi.NamedInputStream; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; /** * An InputStreamAccess implementation based on a byte array @@ -52,9 +51,4 @@ public class ByteArrayInputStreamAccess implements InputStreamAccess { public InputStream accessInputStream() { return new ByteArrayInputStream( bytes ); } - - @Override - public NamedInputStream asNamedInputStream() { - return new NamedInputStream( getStreamName(), accessInputStream() ); - } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/ExplodedArchiveDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ExplodedArchiveDescriptor.java similarity index 85% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/ExplodedArchiveDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ExplodedArchiveDescriptor.java index 6633e870a8..16bc095d4b 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/ExplodedArchiveDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/ExplodedArchiveDescriptor.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.internal; +package org.hibernate.metamodel.archive.internal; import java.io.File; import java.io.IOException; @@ -31,16 +31,14 @@ import java.util.Enumeration; import java.util.jar.JarFile; import java.util.zip.ZipEntry; -import org.hibernate.jpa.boot.archive.spi.AbstractArchiveDescriptor; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntry; -import org.hibernate.jpa.boot.archive.spi.ArchiveException; -import org.hibernate.jpa.boot.internal.FileInputStreamAccess; -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.internal.EntityManagerMessageLogger; +import org.hibernate.metamodel.archive.spi.AbstractArchiveDescriptor; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.spi.ArchiveEntry; +import org.hibernate.metamodel.archive.spi.ArchiveException; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; -import org.jboss.logging.Logger; +import static org.hibernate.internal.UrlMessageBundle.URL_LOGGER; /** * Descriptor for exploded (directory) archives @@ -48,11 +46,6 @@ import org.jboss.logging.Logger; * @author Steve Ebersole */ public class ExplodedArchiveDescriptor extends AbstractArchiveDescriptor { - private static final EntityManagerMessageLogger LOG = Logger.getMessageLogger( - EntityManagerMessageLogger.class, - ExplodedArchiveDescriptor.class.getName() - ); - /** * Constructs an ExplodedArchiveDescriptor * @@ -96,16 +89,16 @@ public class ExplodedArchiveDescriptor extends AbstractArchiveDescriptor { } } catch (URISyntaxException e) { - LOG.malformedUrl( getArchiveUrl(), e ); + URL_LOGGER.logMalformedUrl( getArchiveUrl(), e ); return null; } if ( !archiveUrlDirectory.exists() ) { - LOG.explodedJarDoesNotExist( getArchiveUrl() ); + URL_LOGGER.logFileDoesNotExist( getArchiveUrl() ); return null; } if ( !archiveUrlDirectory.isDirectory() ) { - LOG.explodedJarNotDirectory( getArchiveUrl() ); + URL_LOGGER.logFileIsNotDirectory( getArchiveUrl() ); return null; } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/FileInputStreamAccess.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/FileInputStreamAccess.java similarity index 83% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/FileInputStreamAccess.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/FileInputStreamAccess.java index 7d9294364a..c89825ed2e 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/FileInputStreamAccess.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/FileInputStreamAccess.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.internal; +package org.hibernate.metamodel.archive.internal; import java.io.BufferedInputStream; import java.io.File; @@ -30,9 +30,8 @@ import java.io.FileNotFoundException; import java.io.InputStream; import org.hibernate.HibernateException; -import org.hibernate.jpa.boot.archive.spi.ArchiveException; -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.boot.spi.NamedInputStream; +import org.hibernate.metamodel.archive.spi.ArchiveException; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; /** * An InputStreamAccess implementation based on a File reference @@ -69,9 +68,4 @@ public class FileInputStreamAccess implements InputStreamAccess { ); } } - - @Override - public NamedInputStream asNamedInputStream() { - return new NamedInputStream( getStreamName(), accessInputStream() ); - } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarFileBasedArchiveDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarFileBasedArchiveDescriptor.java similarity index 82% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarFileBasedArchiveDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarFileBasedArchiveDescriptor.java index 66df6c1dc3..7cf9e2a726 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarFileBasedArchiveDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarFileBasedArchiveDescriptor.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.internal; +package org.hibernate.metamodel.archive.internal; import java.io.BufferedInputStream; import java.io.IOException; @@ -33,28 +33,22 @@ import java.util.jar.JarFile; import java.util.jar.JarInputStream; import java.util.zip.ZipEntry; -import org.hibernate.jpa.boot.archive.spi.AbstractArchiveDescriptor; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntry; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntryHandler; -import org.hibernate.jpa.boot.archive.spi.ArchiveException; -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.internal.EntityManagerMessageLogger; +import org.hibernate.metamodel.archive.spi.AbstractArchiveDescriptor; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.spi.ArchiveEntry; +import org.hibernate.metamodel.archive.spi.ArchiveEntryHandler; +import org.hibernate.metamodel.archive.spi.ArchiveException; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; -import org.jboss.logging.Logger; +import static org.hibernate.internal.UrlMessageBundle.URL_LOGGER; /** - * An ArchiveDescriptor implementation leveraging the {@link JarFile} API for processing. + * An ArchiveDescriptor implementation leveraging the {@link java.util.jar.JarFile} API for processing. * * @author Steve Ebersole */ public class JarFileBasedArchiveDescriptor extends AbstractArchiveDescriptor { - private static final EntityManagerMessageLogger LOG = Logger.getMessageLogger( - EntityManagerMessageLogger.class, - JarFileBasedArchiveDescriptor.class.getName() - ); - /** * Constructs a JarFileBasedArchiveDescriptor * @@ -103,8 +97,7 @@ public class JarFileBasedArchiveDescriptor extends AbstractArchiveDescriptor { final String name = extractName( subZipEntry ); final String relativeName = extractRelativeName( subZipEntry ); - final InputStreamAccess inputStreamAccess - = buildByteBasedInputStreamAccess( name, jarInputStream ); + final InputStreamAccess inputStreamAccess = buildByteBasedInputStreamAccess( name, jarInputStream ); final ArchiveEntry entry = new ArchiveEntry() { @Override @@ -190,10 +183,10 @@ public class JarFileBasedArchiveDescriptor extends AbstractArchiveDescriptor { } } catch (IOException e) { - LOG.unableToFindFile( getArchiveUrl(), e ); + URL_LOGGER.logUnableToFindFileByUrl( getArchiveUrl(), e ); } catch (URISyntaxException e) { - LOG.malformedUrlWarning( getArchiveUrl(), e ); + URL_LOGGER.logMalformedUrl( getArchiveUrl(), e ); } return null; } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarInputStreamBasedArchiveDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarInputStreamBasedArchiveDescriptor.java similarity index 83% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarInputStreamBasedArchiveDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarInputStreamBasedArchiveDescriptor.java index 40dd37b06c..43e7646348 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarInputStreamBasedArchiveDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarInputStreamBasedArchiveDescriptor.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.internal; +package org.hibernate.metamodel.archive.internal; import java.io.IOException; import java.net.URL; @@ -29,15 +29,14 @@ import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import java.util.zip.ZipEntry; -import org.hibernate.jpa.boot.archive.spi.AbstractArchiveDescriptor; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntry; -import org.hibernate.jpa.boot.archive.spi.ArchiveException; -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.internal.EntityManagerMessageLogger; +import org.hibernate.metamodel.archive.spi.AbstractArchiveDescriptor; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.spi.ArchiveEntry; +import org.hibernate.metamodel.archive.spi.ArchiveException; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; -import org.jboss.logging.Logger; +import static org.hibernate.internal.UrlMessageBundle.URL_LOGGER; /** * An ArchiveDescriptor implementation that works on archives accessible through a {@link java.util.jar.JarInputStream}. @@ -47,10 +46,6 @@ import org.jboss.logging.Logger; * @author Steve Ebersole */ public class JarInputStreamBasedArchiveDescriptor extends AbstractArchiveDescriptor { - private static final EntityManagerMessageLogger LOG = Logger.getMessageLogger( - EntityManagerMessageLogger.class, - JarInputStreamBasedArchiveDescriptor.class.getName() - ); /** * Constructs a JarInputStreamBasedArchiveDescriptor @@ -74,7 +69,7 @@ public class JarInputStreamBasedArchiveDescriptor extends AbstractArchiveDescrip } catch (Exception e) { //really should catch IOException but Eclipse is buggy and raise NPE... - LOG.unableToFindFile( getArchiveUrl(), e ); + URL_LOGGER.logUnableToFindFileByUrl( getArchiveUrl(), e ); return; } @@ -102,8 +97,7 @@ public class JarInputStreamBasedArchiveDescriptor extends AbstractArchiveDescrip while (subZipEntry != null) { if ( ! subZipEntry.isDirectory() ) { final String subName = extractName( subZipEntry ); - final InputStreamAccess inputStreamAccess - = buildByteBasedInputStreamAccess( subName, subJarInputStream ); + final InputStreamAccess inputStreamAccess = buildByteBasedInputStreamAccess( subName, subJarInputStream ); final ArchiveEntry entry = new ArchiveEntry() { @Override diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarProtocolArchiveDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarProtocolArchiveDescriptor.java similarity index 89% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarProtocolArchiveDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarProtocolArchiveDescriptor.java index d25c981308..8e53efe87a 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/JarProtocolArchiveDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/JarProtocolArchiveDescriptor.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,14 +21,14 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.internal; +package org.hibernate.metamodel.archive.internal; import java.net.URL; import org.hibernate.annotations.common.AssertionFailure; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptor; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptor; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; /** * An ArchiveDescriptor implementation for handling archives whose url reported a JAR protocol (i.e., jar://). diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/StandardArchiveDescriptorFactory.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/StandardArchiveDescriptorFactory.java similarity index 70% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/StandardArchiveDescriptorFactory.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/StandardArchiveDescriptorFactory.java index 5b974c2a12..0d940d0c01 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/StandardArchiveDescriptorFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/StandardArchiveDescriptorFactory.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,15 +21,18 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.internal; +package org.hibernate.metamodel.archive.internal; import java.io.File; import java.net.URISyntaxException; import java.net.URL; +import org.hibernate.metamodel.archive.spi.AbstractArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptor; +import org.hibernate.metamodel.archive.spi.ArchiveException; import org.hibernate.internal.util.StringHelper; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptor; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; + +import static org.hibernate.internal.UrlMessageBundle.URL_LOGGER; /** * Standard implementation of ArchiveDescriptorFactory @@ -37,17 +40,12 @@ import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; * @author Emmanuel Bernard * @author Steve Ebersole */ -public class StandardArchiveDescriptorFactory implements ArchiveDescriptorFactory { +public class StandardArchiveDescriptorFactory extends AbstractArchiveDescriptorFactory { /** * Singleton access */ public static final StandardArchiveDescriptorFactory INSTANCE = new StandardArchiveDescriptorFactory(); - @Override - public ArchiveDescriptor buildArchiveDescriptor(URL url) { - return buildArchiveDescriptor( url, "" ); - } - @Override public ArchiveDescriptor buildArchiveDescriptor(URL url, String entry) { final String protocol = url.getProtocol(); @@ -70,19 +68,11 @@ public class StandardArchiveDescriptorFactory implements ArchiveDescriptorFactor } if ( ! file.exists() ) { - throw new IllegalArgumentException( - String.format( - "File [%s] referenced by given URL [%s] does not exist", - filePart, - url.toExternalForm() - ) - ); + throw new ArchiveException( URL_LOGGER.fileDoesNotExist( filePart, url ) ); } } catch (URISyntaxException e) { - throw new IllegalArgumentException( - "Unable to visit JAR " + url + ". Cause: " + e.getMessage(), e - ); + throw new ArchiveException( "Unable to visit JAR : " + url, e ); } if ( file.isDirectory() ) { @@ -97,14 +87,4 @@ public class StandardArchiveDescriptorFactory implements ArchiveDescriptorFactor return new JarInputStreamBasedArchiveDescriptor( this, url, entry ); } } - - @Override - public URL getJarURLFromURLEntry(URL url, String entry) throws IllegalArgumentException { - return ArchiveHelper.getJarURLFromURLEntry( url, entry ); - } - - @Override - public URL getURLFromPath(String jarPath) { - return ArchiveHelper.getURLFromPath( jarPath ); - } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/UrlInputStreamAccess.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/UrlInputStreamAccess.java similarity index 74% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/UrlInputStreamAccess.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/UrlInputStreamAccess.java index 4281201381..a936faaf55 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/UrlInputStreamAccess.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/UrlInputStreamAccess.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,14 +21,13 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.internal; +package org.hibernate.metamodel.archive.internal; import java.io.InputStream; import java.net.URL; -import org.hibernate.HibernateException; -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.boot.spi.NamedInputStream; +import org.hibernate.metamodel.archive.spi.ArchiveException; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; /** * @author Steve Ebersole @@ -51,12 +50,7 @@ public class UrlInputStreamAccess implements InputStreamAccess { return url.openStream(); } catch (Exception e) { - throw new HibernateException( "Could not open url stream : " + url.toExternalForm() ); + throw new ArchiveException( "Could not open url stream : " + url.toExternalForm() ); } } - - @Override - public NamedInputStream asNamedInputStream() { - return new NamedInputStream( getStreamName(), accessInputStream() ); - } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/MappingFileDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/package-info.java similarity index 80% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/MappingFileDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/package-info.java index 5dfec7b9cb..6abbaac867 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/MappingFileDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/internal/package-info.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,12 +21,8 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.spi; /** - * @author Steve Ebersole + * The internals of archive scanning support */ -public interface MappingFileDescriptor { - public String getName(); - public InputStreamAccess getStreamAccess(); -} +package org.hibernate.metamodel.archive.internal; diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/ClassDescriptorImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ClassDescriptorImpl.java similarity index 87% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/ClassDescriptorImpl.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ClassDescriptorImpl.java index f8d15c1419..30c5e06542 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/ClassDescriptorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ClassDescriptorImpl.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,10 +21,10 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.internal; +package org.hibernate.metamodel.archive.scan.internal; -import org.hibernate.jpa.boot.spi.ClassDescriptor; -import org.hibernate.jpa.boot.spi.InputStreamAccess; +import org.hibernate.metamodel.archive.scan.spi.ClassDescriptor; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; /** * @author Steve Ebersole diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/NamedInputStream.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/MappingFileDescriptorImpl.java similarity index 65% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/NamedInputStream.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/MappingFileDescriptorImpl.java index fd6abed28f..7eba23c173 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/NamedInputStream.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/MappingFileDescriptorImpl.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2012, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,33 +21,30 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.spi; +package org.hibernate.metamodel.archive.scan.internal; -import java.io.InputStream; +import org.hibernate.metamodel.archive.scan.spi.MappingFileDescriptor; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; /** - * Bundles together a stream and the name that was used to locate it. The name is often useful for logging. - * - * @deprecated Use {@link org.hibernate.jpa.boot.spi.InputStreamAccess} instead. - * - * @author Emmanuel Bernard * @author Steve Ebersole */ -@Deprecated -public class NamedInputStream { +public class MappingFileDescriptorImpl implements MappingFileDescriptor { private final String name; - private final InputStream stream; + private final InputStreamAccess streamAccess; - public NamedInputStream(String name, InputStream stream) { + public MappingFileDescriptorImpl(String name, InputStreamAccess streamAccess) { this.name = name; - this.stream = stream; - } - - public InputStream getStream() { - return stream; + this.streamAccess = streamAccess; } + @Override public String getName() { return name; } + + @Override + public InputStreamAccess getStreamAccess() { + return streamAccess; + } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/PackageDescriptorImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/PackageDescriptorImpl.java similarity index 87% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/PackageDescriptorImpl.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/PackageDescriptorImpl.java index c40eb48786..dbd97e6a7b 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/PackageDescriptorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/PackageDescriptorImpl.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,10 +21,10 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.internal; +package org.hibernate.metamodel.archive.scan.internal; -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.boot.spi.PackageDescriptor; +import org.hibernate.metamodel.archive.scan.spi.PackageDescriptor; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; /** * @author Steve Ebersole diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ResultCoordinator.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ResultCoordinator.java similarity index 81% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ResultCoordinator.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ResultCoordinator.java index cba41b0baf..44df183cca 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ResultCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ResultCoordinator.java @@ -21,13 +21,13 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.internal; +package org.hibernate.metamodel.archive.scan.internal; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntryHandler; -import org.hibernate.jpa.boot.scan.spi.ArchiveEntryHandlers; -import org.hibernate.jpa.boot.scan.spi.ClassFileArchiveEntryHandler; -import org.hibernate.jpa.boot.scan.spi.NonClassFileArchiveEntryHandler; -import org.hibernate.jpa.boot.scan.spi.PackageInfoArchiveEntryHandler; +import org.hibernate.metamodel.archive.scan.spi.ArchiveEntryHandlers; +import org.hibernate.metamodel.archive.scan.spi.ClassFileArchiveEntryHandler; +import org.hibernate.metamodel.archive.scan.spi.NonClassFileArchiveEntryHandler; +import org.hibernate.metamodel.archive.scan.spi.PackageInfoArchiveEntryHandler; +import org.hibernate.metamodel.archive.spi.ArchiveEntryHandler; /** * @author Steve Ebersole diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ScanResultCollector.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ScanResultCollector.java similarity index 71% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ScanResultCollector.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ScanResultCollector.java index ac41d25350..2678707896 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ScanResultCollector.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ScanResultCollector.java @@ -21,25 +21,22 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.internal; +package org.hibernate.metamodel.archive.scan.internal; -import java.io.IOException; -import java.io.InputStream; import java.util.Collections; import java.util.HashSet; import java.util.Set; -import javax.persistence.PersistenceException; -import org.hibernate.jpa.boot.scan.spi.ScanEnvironment; -import org.hibernate.jpa.boot.scan.spi.ScanOptions; -import org.hibernate.jpa.boot.scan.spi.ScanResult; -import org.hibernate.jpa.boot.spi.ClassDescriptor; -import org.hibernate.jpa.boot.spi.MappingFileDescriptor; -import org.hibernate.jpa.boot.spi.PackageDescriptor; +import org.hibernate.metamodel.archive.scan.spi.ClassDescriptor; +import org.hibernate.metamodel.archive.scan.spi.MappingFileDescriptor; +import org.hibernate.metamodel.archive.scan.spi.PackageDescriptor; +import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment; +import org.hibernate.metamodel.archive.scan.spi.ScanOptions; +import org.hibernate.metamodel.archive.scan.spi.ScanParameters; +import org.hibernate.metamodel.archive.scan.spi.ScanResult; import org.hibernate.metamodel.source.internal.annotations.util.JPADotNames; import org.jboss.jandex.ClassInfo; -import org.jboss.jandex.DotName; import org.jboss.logging.Logger; /** @@ -51,17 +48,17 @@ public class ScanResultCollector { private final ScanEnvironment environment; private final ScanOptions options; + private final ScanParameters scanParameters; + private final Set discoveredClasses; private final Set discoveredPackages; private final Set discoveredMappingFiles; - public ScanResultCollector(ScanEnvironment environment, ScanOptions options) { + public ScanResultCollector(ScanEnvironment environment, ScanOptions options, ScanParameters parameters) { this.environment = environment; this.options = options; - if ( options.getJandexIndexer() == null && options.getJandexView() == null ) { - throw new IllegalArgumentException( "Indexer and IndexView cannot both be null" ); - } + this.scanParameters = parameters; if ( environment.getExplicitlyListedClassNames() == null ) { throw new IllegalArgumentException( "ScanEnvironment#getExplicitlyListedClassNames should not return null" ); @@ -77,22 +74,7 @@ public class ScanResultCollector { } public void handleClass(ClassDescriptor classDescriptor, boolean rootUrl) { - // Always make sure the Jandex entry is created. - final ClassInfo classInfo; - if ( options.getJandexIndexer() != null ) { - classInfo = indexStream( classDescriptor ); - } - else { - classInfo = options.getJandexView().getClassByName( DotName.createSimple( classDescriptor.getName() ) ); - } - - if ( classInfo == null ) { - log.debugf( - "Could not locate class [%s] in Jandex; this will most likely lead to problems later", - classDescriptor.getName() - ); - return; - } + final ClassInfo classInfo = scanParameters.getJandexInitializer().handle( classDescriptor ); // see if "discovery" of this entry is allowed @@ -128,26 +110,6 @@ public class ScanResultCollector { } } - private ClassInfo indexStream(ClassDescriptor classDescriptor) { - InputStream stream = classDescriptor.getStreamAccess().accessInputStream(); - try { - return options.getJandexIndexer().index( stream ); - } - catch (IOException e) { - throw new PersistenceException( - "Could not add class [" + classDescriptor.getName() + "] to Jandex Indexer", - e - ); - } - finally { - try { - stream.close(); - } - catch (IOException ignore) { - } - } - } - @SuppressWarnings("SimplifiableIfStatement") private boolean containsClassAnnotationsOfInterest(ClassInfo classInfo) { if ( classInfo.annotations() == null ) { @@ -161,10 +123,7 @@ public class ScanResultCollector { } public void handlePackage(PackageDescriptor packageDescriptor, boolean rootUrl) { - // Always make sure the Jandex entry is created. - if ( options.getJandexIndexer() != null ) { - indexStream( packageDescriptor ); - } + final ClassInfo classInfo = scanParameters.getJandexInitializer().handle( packageDescriptor ); if ( !isListedOrDetectable( packageDescriptor.getName(), rootUrl ) ) { // not strictly needed, but helps cut down on the size of discoveredPackages @@ -174,26 +133,6 @@ public class ScanResultCollector { discoveredPackages.add( packageDescriptor ); } - private ClassInfo indexStream(PackageDescriptor packageDescriptor) { - InputStream stream = packageDescriptor.getStreamAccess().accessInputStream(); - try { - return options.getJandexIndexer().index( stream ); - } - catch (IOException e) { - throw new PersistenceException( - "Could not add package [" + packageDescriptor.getName() + "] to Jandex Indexer", - e - ); - } - finally { - try { - stream.close(); - } - catch (IOException ignore) { - } - } - } - public void handleMappingFile(MappingFileDescriptor mappingFileDescriptor, boolean rootUrl) { if ( acceptAsMappingFile( mappingFileDescriptor, rootUrl ) ) { discoveredMappingFiles.add( mappingFileDescriptor ); diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ScanResultImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ScanResultImpl.java similarity index 85% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ScanResultImpl.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ScanResultImpl.java index efae163cc0..f12eba7d21 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/ScanResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/ScanResultImpl.java @@ -21,14 +21,14 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.internal; +package org.hibernate.metamodel.archive.scan.internal; import java.util.Set; -import org.hibernate.jpa.boot.scan.spi.ScanResult; -import org.hibernate.jpa.boot.spi.ClassDescriptor; -import org.hibernate.jpa.boot.spi.MappingFileDescriptor; -import org.hibernate.jpa.boot.spi.PackageDescriptor; +import org.hibernate.metamodel.archive.scan.spi.ClassDescriptor; +import org.hibernate.metamodel.archive.scan.spi.MappingFileDescriptor; +import org.hibernate.metamodel.archive.scan.spi.PackageDescriptor; +import org.hibernate.metamodel.archive.scan.spi.ScanResult; /** * @author Steve Ebersole diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardScanOptions.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/StandardScanOptions.java similarity index 68% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardScanOptions.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/StandardScanOptions.java index 54ad912095..462a8fe54a 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardScanOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/StandardScanOptions.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,31 +21,19 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.internal; +package org.hibernate.metamodel.archive.scan.internal; -import org.hibernate.jpa.boot.scan.spi.ScanOptions; - -import org.jboss.jandex.IndexView; -import org.jboss.jandex.Indexer; +import org.hibernate.metamodel.archive.scan.spi.ScanOptions; /** * @author Steve Ebersole */ public class StandardScanOptions implements ScanOptions { - private final Indexer jandexIndexer; - private final IndexView jandexView; - private final boolean detectClassesInRoot; private final boolean detectClassesInNonRoot; private final boolean detectHibernateMappingFiles; - public StandardScanOptions( - Indexer jandexIndexer, - IndexView jandexView, - String explicitDetectionSetting, - boolean persistenceUnitExcludeUnlistedClassesValue) { - this.jandexIndexer = jandexIndexer; - this.jandexView = jandexView; + public StandardScanOptions(String explicitDetectionSetting, boolean persistenceUnitExcludeUnlistedClassesValue) { if ( explicitDetectionSetting == null ) { this.detectHibernateMappingFiles = true; this.detectClassesInRoot = ! persistenceUnitExcludeUnlistedClassesValue; @@ -65,25 +53,6 @@ public class StandardScanOptions implements ScanOptions { this( "hbm,class", false ); } - /** - * INTENDED FOR TESTING ONLY - */ - public StandardScanOptions( - String explicitDetectionSetting, - boolean persistenceUnitExcludeUnlistedClassesValue) { - this( new Indexer(), null, explicitDetectionSetting, persistenceUnitExcludeUnlistedClassesValue ); - } - - @Override - public Indexer getJandexIndexer() { - return jandexIndexer; - } - - @Override - public IndexView getJandexView() { - return jandexView; - } - @Override public boolean canDetectUnlistedClassesInRoot() { return detectClassesInRoot; diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardScanner.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/StandardScanner.java similarity index 80% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardScanner.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/StandardScanner.java index 11389f4612..54a4e96e83 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardScanner.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/internal/StandardScanner.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,11 +21,11 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.internal; +package org.hibernate.metamodel.archive.scan.internal; -import org.hibernate.jpa.boot.archive.internal.StandardArchiveDescriptorFactory; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; -import org.hibernate.jpa.boot.scan.spi.AbstractScannerImpl; +import org.hibernate.metamodel.archive.internal.StandardArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.scan.spi.AbstractScannerImpl; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; /** * Standard implementation of the Scanner contract, supporting typical archive walking support where diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/AbstractScannerImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/AbstractScannerImpl.java similarity index 64% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/AbstractScannerImpl.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/AbstractScannerImpl.java index f24e5ae9aa..d800fc04c0 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/AbstractScannerImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/AbstractScannerImpl.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,17 +21,18 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; +package org.hibernate.metamodel.archive.scan.spi; import java.net.URL; import java.util.HashMap; import java.util.Map; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptor; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; -import org.hibernate.jpa.boot.scan.internal.ResultCoordinator; -import org.hibernate.jpa.boot.scan.internal.ScanResultCollector; +import org.hibernate.metamodel.archive.scan.internal.ScanResultCollector; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptor; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.spi.ArchiveEntry; +import org.hibernate.metamodel.archive.spi.ArchiveEntryHandler; /** * @author Steve Ebersole @@ -45,12 +46,11 @@ public abstract class AbstractScannerImpl implements Scanner { } @Override - public ScanResult scan(ScanEnvironment environment, ScanOptions options) { - final ScanResultCollector collector = new ScanResultCollector( environment, options ); - final ResultCoordinator resultCoordinator = new ResultCoordinator( collector ); + public ScanResult scan(ScanEnvironment environment, ScanOptions options, ScanParameters parameters) { + final ScanResultCollector collector = new ScanResultCollector( environment, options, parameters ); if ( environment.getNonRootUrls() != null ) { - final ArchiveContext context = new ArchiveContextImpl( environment, false, resultCoordinator ); + final ArchiveContext context = new ArchiveContextImpl( false, collector ); for ( URL url : environment.getNonRootUrls() ) { final ArchiveDescriptor descriptor = buildArchiveDescriptor( url, false ); descriptor.visitArchive( context ); @@ -58,7 +58,7 @@ public abstract class AbstractScannerImpl implements Scanner { } if ( environment.getRootUrl() != null ) { - final ArchiveContext context = new ArchiveContextImpl( environment, true, resultCoordinator ); + final ArchiveContext context = new ArchiveContextImpl( true, collector ); final ArchiveDescriptor descriptor = buildArchiveDescriptor( environment.getRootUrl(), true ); descriptor.visitArchive( context ); } @@ -103,4 +103,40 @@ public abstract class AbstractScannerImpl implements Scanner { throw new IllegalStateException( "ArchiveDescriptor reused; can URLs be processed multiple times?" ); } + + public static class ArchiveContextImpl implements ArchiveContext { + private final boolean isRootUrl; + + private final ClassFileArchiveEntryHandler classEntryHandler; + private final PackageInfoArchiveEntryHandler packageEntryHandler; + private final ArchiveEntryHandler fileEntryHandler; + + public ArchiveContextImpl(boolean isRootUrl, ScanResultCollector scanResultCollector) { + this.isRootUrl = isRootUrl; + + this.classEntryHandler = new ClassFileArchiveEntryHandler( scanResultCollector ); + this.packageEntryHandler = new PackageInfoArchiveEntryHandler( scanResultCollector ); + this.fileEntryHandler = new NonClassFileArchiveEntryHandler( scanResultCollector ); + } + + @Override + public boolean isRootUrl() { + return isRootUrl; + } + + @Override + public ArchiveEntryHandler obtainArchiveEntryHandler(ArchiveEntry entry) { + final String nameWithinArchive = entry.getNameWithinArchive(); + + if ( nameWithinArchive.endsWith( "package-info.class" ) ) { + return packageEntryHandler; + } + else if ( nameWithinArchive.endsWith( ".class" ) ) { + return classEntryHandler; + } + else { + return fileEntryHandler; + } + } + } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ArchiveEntryHandlers.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ArchiveEntryHandlers.java similarity index 92% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ArchiveEntryHandlers.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ArchiveEntryHandlers.java index c6bd9575ca..5680a07af2 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ArchiveEntryHandlers.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ArchiveEntryHandlers.java @@ -21,9 +21,9 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; +package org.hibernate.metamodel.archive.scan.spi; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntryHandler; +import org.hibernate.metamodel.archive.spi.ArchiveEntryHandler; /** * Composite of the various types of ArchiveEntryHandlers diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ClassDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ClassDescriptor.java new file mode 100644 index 0000000000..4499f90f9e --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ClassDescriptor.java @@ -0,0 +1,47 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.metamodel.archive.scan.spi; + +import org.hibernate.metamodel.archive.spi.InputStreamAccess; + +/** + * Descriptor for a class file. + * + * @author Steve Ebersole + */ +public interface ClassDescriptor { + /** + * Retrieves the class name, not the file name. + * + * @return The name (FQN) of the class + */ + public String getName(); + + /** + * Retrieves access to the InputStream for the class file. + * + * @return Access to the InputStream for the class file. + */ + public InputStreamAccess getStreamAccess(); +} diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ClassFileArchiveEntryHandler.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ClassFileArchiveEntryHandler.java similarity index 82% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ClassFileArchiveEntryHandler.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ClassFileArchiveEntryHandler.java index 49c5cee5b8..2c648c1f85 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ClassFileArchiveEntryHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ClassFileArchiveEntryHandler.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; +package org.hibernate.metamodel.archive.scan.spi; import java.io.DataInputStream; import java.io.IOException; @@ -29,13 +29,12 @@ import java.io.InputStream; import javassist.bytecode.ClassFile; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntry; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntryHandler; -import org.hibernate.jpa.boot.archive.spi.ArchiveException; -import org.hibernate.jpa.boot.internal.ClassDescriptorImpl; -import org.hibernate.jpa.boot.scan.internal.ScanResultCollector; -import org.hibernate.jpa.boot.spi.ClassDescriptor; +import org.hibernate.metamodel.archive.scan.internal.ClassDescriptorImpl; +import org.hibernate.metamodel.archive.scan.internal.ScanResultCollector; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveEntry; +import org.hibernate.metamodel.archive.spi.ArchiveEntryHandler; +import org.hibernate.metamodel.archive.spi.ArchiveException; /** * Defines handling and filtering for class file entries within an archive diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/ClassDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/JandexInitializer.java similarity index 74% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/ClassDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/JandexInitializer.java index c04e57d9c0..7c745b54f2 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/ClassDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/JandexInitializer.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,14 +21,17 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.spi; +package org.hibernate.metamodel.archive.scan.spi; + +import org.jboss.jandex.ClassInfo; /** - * Defines the result of scanning a persistence unit for classes. + * Helper for preparing Jandex for later use.. * * @author Steve Ebersole */ -public interface ClassDescriptor { - public String getName(); - public InputStreamAccess getStreamAccess(); +public interface JandexInitializer { + ClassInfo handle(PackageDescriptor packageDescriptor); + + ClassInfo handle(ClassDescriptor classDescriptor); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/MappingFileDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/MappingFileDescriptor.java new file mode 100644 index 0000000000..155109daf9 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/MappingFileDescriptor.java @@ -0,0 +1,49 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.metamodel.archive.scan.spi; + +import org.hibernate.metamodel.archive.spi.InputStreamAccess; + +/** + * Descriptor for a mapping (XML) file. + * + * @author Steve Ebersole + */ +public interface MappingFileDescriptor { + /** + * The mapping file name. This is its name within the archive, the + * expectation being that most times this will equate to a "classpath + * lookup resource name". + * + * @return The mapping file resource name. + */ + public String getName(); + + /** + * Retrieves access to the InputStream for the mapping file. + * + * @return Access to the InputStream for the mapping file. + */ + public InputStreamAccess getStreamAccess(); +} diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/NonClassFileArchiveEntryHandler.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/NonClassFileArchiveEntryHandler.java similarity index 78% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/NonClassFileArchiveEntryHandler.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/NonClassFileArchiveEntryHandler.java index 0e9702c29f..6e76858166 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/NonClassFileArchiveEntryHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/NonClassFileArchiveEntryHandler.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,13 +21,13 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; +package org.hibernate.metamodel.archive.scan.spi; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntry; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntryHandler; -import org.hibernate.jpa.boot.internal.MappingFileDescriptorImpl; -import org.hibernate.jpa.boot.scan.internal.ScanResultCollector; +import org.hibernate.metamodel.archive.scan.internal.MappingFileDescriptorImpl; +import org.hibernate.metamodel.archive.scan.internal.ScanResultCollector; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveEntry; +import org.hibernate.metamodel.archive.spi.ArchiveEntryHandler; /** * Defines handling and filtering for all non-class file (package-info is also a class file...) entries within an archive diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/PackageDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/PackageDescriptor.java new file mode 100644 index 0000000000..e58960a852 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/PackageDescriptor.java @@ -0,0 +1,47 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.metamodel.archive.scan.spi; + +import org.hibernate.metamodel.archive.spi.InputStreamAccess; + +/** + * Descriptor for a package (as indicated by a package-info.class file). + * + * @author Steve Ebersole + */ +public interface PackageDescriptor { + /** + * Retrieves the package name. + * + * @return The package name + */ + public String getName(); + + /** + * Retrieves access to the InputStream for the {@code package-info.class} file. + * + * @return Access to the InputStream for the {@code package-info.class} file. + */ + public InputStreamAccess getStreamAccess(); +} diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/PackageInfoArchiveEntryHandler.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/PackageInfoArchiveEntryHandler.java similarity index 81% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/PackageInfoArchiveEntryHandler.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/PackageInfoArchiveEntryHandler.java index fc8287750e..fd485455c2 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/PackageInfoArchiveEntryHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/PackageInfoArchiveEntryHandler.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,14 +21,13 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; +package org.hibernate.metamodel.archive.scan.spi; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntry; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntryHandler; -import org.hibernate.jpa.boot.internal.PackageDescriptorImpl; -import org.hibernate.jpa.boot.scan.internal.ScanResultCollector; -import org.hibernate.jpa.boot.spi.PackageDescriptor; +import org.hibernate.metamodel.archive.scan.internal.PackageDescriptorImpl; +import org.hibernate.metamodel.archive.scan.internal.ScanResultCollector; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveEntry; +import org.hibernate.metamodel.archive.spi.ArchiveEntryHandler; /** * Defines handling and filtering for package-info file entries within an archive diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanEnvironment.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanEnvironment.java new file mode 100644 index 0000000000..7a2d6862cb --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanEnvironment.java @@ -0,0 +1,81 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.metamodel.archive.scan.spi; + +import java.net.URL; +import java.util.List; + +/** + * Describes the environment in which the scan will occur. + *

+ * Note that much of this comes from the PU in JPA sense. This is + * intended as an abstraction over the PU in JPA cases, as well as a + * delegate allowing usage in non-JPA cases. With the planned move + * to unify the cfg.xml and persistence.xml schemas (like we are doing + * with hbm.xml and orm.xml) this becomes less needed (at least parts + * of it). + *

+ * After unification, I think the biggest difference is that we will + * not need to pass ScanEnvironment into the MetadataSources/MetadataBuilder + * while for the time being we will need to. + * + * @author Steve Ebersole + */ +public interface ScanEnvironment { + /** + * Returns the root URL for scanning. Can be {@code null}, indicating that + * no root URL scanning should be done (aka, if maybe a root URL is not known). + * + * @return The root URL + * + * @see ScanOptions#canDetectUnlistedClassesInRoot() + */ + public URL getRootUrl(); + + /** + * Returns any non-root URLs for scanning. Can be null/empty to indicate + * that no non-root URL scanning should be done. + * + * @return The non-root URLs + * + * @see ScanOptions#canDetectUnlistedClassesInNonRoot() + */ + public List getNonRootUrls(); + + /** + * Returns any classes which are explicitly listed as part of the + * "persistence unit". + * + * @return The explicitly listed classes + */ + public List getExplicitlyListedClassNames(); + + /** + * Returns the mapping files which are explicitly listed as part of the + * "persistence unit". + * + * @return The explicitly listed mapping files. + */ + public List getExplicitlyListedMappingFiles(); +} diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanOptions.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanOptions.java similarity index 77% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanOptions.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanOptions.java index c6353909e0..334a9ec399 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanOptions.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,10 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; - -import org.jboss.jandex.IndexView; -import org.jboss.jandex.Indexer; +package org.hibernate.metamodel.archive.scan.spi; /** * Options for performing scanning @@ -32,24 +29,6 @@ import org.jboss.jandex.Indexer; * @author Steve Ebersole */ public interface ScanOptions { - /** - * The Jandex Indexer to use. - *

- * Note that either this or {@link #getJandexView()} must return non-null. - * - * @return The Jandex Indexer to use - */ - public Indexer getJandexIndexer(); - - /** - * The Jandex index to use. - *

- * Note that either this or {@link #getJandexIndexer()} must return non-null. - * - * @return The Jandex index to use. - */ - public IndexView getJandexView(); - /** * Is detection of managed classes from root url allowed? In strict JPA * sense, this would be controlled by the {@code } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/PackageDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanParameters.java similarity index 74% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/PackageDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanParameters.java index 101e516575..473ab7012f 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/PackageDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanParameters.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,14 +21,14 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.spi; +package org.hibernate.metamodel.archive.scan.spi; /** - * Defines the result of scanning a persistence unit for packages. + * A "parameter object" passed to {@link Scanner#scan} to help support future + * changes in terms of needing to pass additional stuff to scanning. * * @author Steve Ebersole */ -public interface PackageDescriptor { - public String getName(); - public InputStreamAccess getStreamAccess(); +public interface ScanParameters { + public JandexInitializer getJandexInitializer(); } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanResult.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanResult.java similarity index 70% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanResult.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanResult.java index 13e0fa02f9..743ac9ce5b 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanResult.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/ScanResult.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,21 +21,34 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; +package org.hibernate.metamodel.archive.scan.spi; import java.util.Set; -import org.hibernate.jpa.boot.spi.ClassDescriptor; -import org.hibernate.jpa.boot.spi.MappingFileDescriptor; -import org.hibernate.jpa.boot.spi.PackageDescriptor; - /** * Defines the result of scanning * * @author Steve Ebersole */ public interface ScanResult { + /** + * Returns descriptors for all packages discovered as part of the scan + * + * @return Descriptors for discovered packages + */ public Set getLocatedPackages(); + + /** + * Returns descriptors for all classes discovered as part of the scan + * + * @return Descriptors for discovered classes + */ public Set getLocatedClasses(); + + /** + * Returns descriptors for all mapping files discovered as part of the scan + * + * @return Descriptors for discovered mapping files + */ public Set getLocatedMappingFiles(); } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/Scanner.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/Scanner.java similarity index 67% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/Scanner.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/Scanner.java index 2182e7a304..3361076bed 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/Scanner.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/scan/spi/Scanner.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2012, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,11 +21,19 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; +package org.hibernate.metamodel.archive.scan.spi; /** * Defines the contract for Hibernate to be able to scan for classes, packages and resources inside a * persistence unit. + *

+ * Constructors are expected in one of 2 forms:

+ *

+ * If a ArchiveDescriptorFactory is specified in the configuration, but the Scanner + * to be used does not accept a ArchiveDescriptorFactory an exception will be thrown. * * @author Emmanuel Bernard * @author Steve Ebersole @@ -35,8 +43,9 @@ public interface Scanner { * Perform the scanning against the described environment using the * defined options, and return the scan results. * - * @param environment The scan environment - * @param options The options to control the scanning + * @param environment The scan environment. + * @param options The options to control the scanning. + * @param params The parameters for scanning */ - public ScanResult scan(ScanEnvironment environment, ScanOptions options); + public ScanResult scan(ScanEnvironment environment, ScanOptions options, ScanParameters params); } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/AbstractArchiveDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/AbstractArchiveDescriptor.java similarity index 89% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/AbstractArchiveDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/AbstractArchiveDescriptor.java index 1870ebd05a..a0c4779ba4 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/AbstractArchiveDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/AbstractArchiveDescriptor.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,16 +21,15 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.spi; +package org.hibernate.metamodel.archive.spi; import java.io.InputStream; import java.net.URL; import java.util.zip.ZipEntry; +import org.hibernate.metamodel.archive.internal.ByteArrayInputStreamAccess; import org.hibernate.internal.util.StringHelper; -import org.hibernate.jpa.boot.archive.internal.ArchiveHelper; -import org.hibernate.jpa.boot.internal.ByteArrayInputStreamAccess; -import org.hibernate.jpa.boot.spi.InputStreamAccess; +import org.hibernate.metamodel.archive.internal.ArchiveHelper; /** * Base support for ArchiveDescriptor implementors. @@ -74,7 +73,9 @@ public abstract class AbstractArchiveDescriptor implements ArchiveDescriptor { protected String extractRelativeName(ZipEntry zipEntry) { final String entryName = extractName( zipEntry ); - return entryBasePrefix != null && entryName.contains( entryBasePrefix ) ? entryName.substring( entryBasePrefix.length() ) : entryName; + return entryBasePrefix != null && entryName.contains( entryBasePrefix ) + ? entryName.substring( entryBasePrefix.length() ) + : entryName; } protected String extractName(ZipEntry zipEntry) { diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanEnvironment.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/AbstractArchiveDescriptorFactory.java similarity index 65% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanEnvironment.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/AbstractArchiveDescriptorFactory.java index a935defae3..b89a323862 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ScanEnvironment.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/AbstractArchiveDescriptorFactory.java @@ -21,28 +21,28 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.spi; +package org.hibernate.metamodel.archive.spi; import java.net.URL; -import java.util.List; -import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; +import org.hibernate.metamodel.archive.internal.ArchiveHelper; /** * @author Steve Ebersole */ -public interface ScanEnvironment { - public URL getRootUrl(); - public List getNonRootUrls(); +public abstract class AbstractArchiveDescriptorFactory implements ArchiveDescriptorFactory { + @Override + public ArchiveDescriptor buildArchiveDescriptor(URL url) { + return buildArchiveDescriptor( url, "" ); + } - public List getExplicitlyListedClassNames(); - public List getExplicitlyListedMappingFiles(); + @Override + public URL getJarURLFromURLEntry(URL url, String entry) throws IllegalArgumentException { + return ArchiveHelper.getJarURLFromURLEntry( url, entry ); + } - /** - * @deprecated Added temporarily to support legacy - * {@link org.hibernate.jpa.boot.archive.spi.ArchiveContext#getPersistenceUnitDescriptor()} - * calls - */ - @Deprecated - public PersistenceUnitDescriptor getPersistenceUnitDescriptor(); + @Override + public URL getURLFromPath(String jarPath) { + return ArchiveHelper.getURLFromPath( jarPath ); + } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveContext.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveContext.java similarity index 81% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveContext.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveContext.java index eeea27eca4..f21ae4d26a 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveContext.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveContext.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,9 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.spi; - -import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; +package org.hibernate.metamodel.archive.spi; /** * Describes the context for visiting the entries within an archive @@ -31,13 +29,6 @@ import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; * @author Steve Ebersole */ public interface ArchiveContext { - /** - * The persistence-unit descriptor which led to this archive being scanned. - * - * @return The persistence-unit descriptor - */ - public PersistenceUnitDescriptor getPersistenceUnitDescriptor(); - /** * Is the archive described (and being visited) the root url for the persistence-unit? * diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveDescriptor.java similarity index 92% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveDescriptor.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveDescriptor.java index 8cd12792b2..13d73e78b0 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveDescriptor.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.spi; +package org.hibernate.metamodel.archive.spi; /** * Contract for visiting an archive, which might be a jar, a zip, an exploded directory, etc. diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveDescriptorFactory.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveDescriptorFactory.java similarity index 95% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveDescriptorFactory.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveDescriptorFactory.java index 937a34d546..bff47bc0a1 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveDescriptorFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveDescriptorFactory.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.spi; +package org.hibernate.metamodel.archive.spi; import java.net.URL; diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveEntry.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveEntry.java similarity index 90% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveEntry.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveEntry.java index eeaaf85f79..97c2de79df 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveEntry.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveEntry.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,9 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.spi; - -import org.hibernate.jpa.boot.spi.InputStreamAccess; +package org.hibernate.metamodel.archive.spi; /** * Represent an entry in the archive. diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveEntryHandler.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveEntryHandler.java similarity index 92% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveEntryHandler.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveEntryHandler.java index 3110b78c87..d27faedd3f 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveEntryHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveEntryHandler.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.spi; +package org.hibernate.metamodel.archive.spi; /** * Handler for archive entries, based on the classified type of the entry diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveException.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveException.java similarity index 93% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveException.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveException.java index 204ac79b00..f9c69b4ee4 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/ArchiveException.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/ArchiveException.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.archive.spi; +package org.hibernate.metamodel.archive.spi; import org.hibernate.HibernateException; diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/InputStreamAccess.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/InputStreamAccess.java similarity index 87% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/InputStreamAccess.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/InputStreamAccess.java index cb51b1ada5..9f85287afe 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/spi/InputStreamAccess.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/InputStreamAccess.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,7 +21,7 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.spi; +package org.hibernate.metamodel.archive.spi; import java.io.InputStream; @@ -44,9 +44,4 @@ public interface InputStreamAccess { * @return The stream */ public InputStream accessInputStream(); - - /** - * @deprecated Needed until we can remove NamedInputStream - */ - public NamedInputStream asNamedInputStream(); } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/packaging/Scanner.java b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/package-info.java similarity index 66% rename from hibernate-entitymanager/src/main/java/org/hibernate/ejb/packaging/Scanner.java rename to hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/package-info.java index a452e66495..598ed3a493 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/packaging/Scanner.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/archive/spi/package-info.java @@ -1,7 +1,7 @@ /* * Hibernate, Relational Persistence for Idiomatic Java * - * Copyright (c) 2009, 2012, Red Hat Inc. or third-party contributors as + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. All third-party contributions are * distributed under license by Red Hat Inc. @@ -21,11 +21,19 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.ejb.packaging; /** - * @deprecated Use {@link org.hibernate.jpa.boot.scan.spi.Scanner} instead + * Defines the SPI for support of "scanning" of "archives". + *

+ * Scanning might mean:

+ * And "archive" might mean: */ -@Deprecated -public interface Scanner extends org.hibernate.jpa.boot.scan.spi.Scanner { -} +package org.hibernate.metamodel.archive.spi; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ClassLoaderAccessImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ClassLoaderAccessImpl.java index 2a30722c72..e6d720dfee 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ClassLoaderAccessImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/ClassLoaderAccessImpl.java @@ -23,6 +23,8 @@ */ package org.hibernate.metamodel.internal; +import java.net.URL; + import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; @@ -51,7 +53,8 @@ public class ClassLoaderAccessImpl implements ClassLoaderAccess { } @Override - public Class classForName(String name) { + @SuppressWarnings("unchecked") + public Class classForName(String name) { if ( isSafeClass( name ) ) { return classLoaderService.classForName( name ); } @@ -87,4 +90,9 @@ public class ClassLoaderAccessImpl implements ClassLoaderAccess { || name.startsWith( "org.hibernate" ); } + + @Override + public URL locateResource(String resourceName) { + return classLoaderService.locateResource( resourceName ); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/JandexInitManager.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/JandexInitManager.java new file mode 100644 index 0000000000..1a1b0a6db8 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/JandexInitManager.java @@ -0,0 +1,309 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2014, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.metamodel.internal; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.HibernateException; +import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; +import org.hibernate.internal.util.ReflectHelper; +import org.hibernate.metamodel.archive.scan.spi.ClassDescriptor; +import org.hibernate.metamodel.archive.scan.spi.JandexInitializer; +import org.hibernate.metamodel.archive.scan.spi.PackageDescriptor; +import org.hibernate.metamodel.source.internal.annotations.util.HibernateDotNames; +import org.hibernate.metamodel.source.internal.annotations.util.JPADotNames; +import org.hibernate.metamodel.source.internal.annotations.util.JandexHelper; +import org.hibernate.metamodel.spi.ClassLoaderAccess; + +import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.DotName; +import org.jboss.jandex.Index; +import org.jboss.jandex.IndexView; +import org.jboss.jandex.Indexer; +import org.jboss.jandex.Type; +import org.jboss.logging.Logger; + +/** + * Manages the steps needed to get Jandex properly initialized for later use. + * + * @author Steve Ebersole + */ +public class JandexInitManager implements JandexInitializer { + private static final Logger log = Logger.getLogger( JandexInitManager.class ); + + private final DotName OBJECT_DOT_NAME = DotName.createSimple( Object.class.getName() ); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // supplied index + private final IndexView suppliedIndexView; + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // indexer + private final Indexer indexer; + private final Map inflightClassInfoMap; + private final ClassLoaderAccess classLoaderAccess; + private final boolean autoIndexMembers; + + public JandexInitManager( + IndexView suppliedIndexView, + ClassLoaderAccess classLoaderAccess, + boolean autoIndexMembers) { + + this.suppliedIndexView = suppliedIndexView; + this.classLoaderAccess = classLoaderAccess; + this.autoIndexMembers = autoIndexMembers; + + if ( suppliedIndexView == null ) { + this.indexer = new Indexer(); + this.inflightClassInfoMap = new HashMap(); + } + else { + this.indexer = null; + this.inflightClassInfoMap = null; + } + } + + /** + * INTENDED FOR TESTING ONLY + */ + public JandexInitManager() { + this( + null, + new ClassLoaderAccess() { + @Override + @SuppressWarnings("unchecked") + public Class classForName(String name) { + try { + return (Class) getClass().getClassLoader().loadClass( name ); + } + catch ( Exception e ) { + throw new ClassLoadingException( "Could not load class by name : " + name ); + } + } + + @Override + public URL locateResource(String resourceName) { + return getClass().getClassLoader().getResource( resourceName ); + } + }, + false + ); + } + + public boolean wasIndexSupplied() { + return suppliedIndexView != null; + } + + @Override + public ClassInfo handle(ClassDescriptor classFileDescriptor) { + if ( suppliedIndexView != null ) { + return suppliedIndexView.getClassByName( DotName.createSimple( classFileDescriptor.getName() ) ); + } + else { + return index( classFileDescriptor ); + } + } + + private ClassInfo index(ClassDescriptor classDescriptor) { + InputStream stream = classDescriptor.getStreamAccess().accessInputStream(); + try { + return index( stream, classDescriptor.getName() ); + } + finally { + try { + stream.close(); + } + catch (IOException ignore) { + } + } + } + + protected ClassInfo index(InputStream stream, String name) { + try { + final ClassInfo classInfo = indexer.index( stream ); + inflightClassInfoMap.put( classInfo.name(), classInfo ); + furtherProcess( classInfo ); + return classInfo; + } + catch ( IOException e ) { + throw new HibernateException( "Unable to index from resource stream [" + name + "]", e ); + } + } + + private void furtherProcess(ClassInfo classInfo) { + final List entityListenerAnnotations = classInfo.annotations().get( JPADotNames.ENTITY_LISTENERS ); + if ( entityListenerAnnotations != null ) { + for ( AnnotationInstance entityListenerAnnotation : entityListenerAnnotations ) { + final Type[] entityListenerClassTypes = entityListenerAnnotation.value().asClassArray(); + for ( Type entityListenerClassType : entityListenerClassTypes ) { + indexClassName( entityListenerClassType.name() ); + } + } + } + + // todo : others? + } + + + public void indexClassName(DotName classDotName) { + if ( !needsIndexing( classDotName ) ) { + return; + } + + ClassInfo classInfo = indexResource( classDotName.toString().replace( '.', '/' ) + ".class" ); + inflightClassInfoMap.put( classInfo.name(), classInfo ); + if ( classInfo.superName() != null ) { + indexClassName( classInfo.superName() ); + } + } + + protected boolean needsIndexing(DotName classDotName) { + if ( classDotName == null || OBJECT_DOT_NAME.equals( classDotName ) ) { + return false; + } + + if ( suppliedIndexView != null ) { + // we do not build an index if one is supplied to us. + return false; + } + + // otherwise, return true if the map does not contain this class + return !inflightClassInfoMap.containsKey( classDotName ); + } + + + public ClassInfo indexResource(String resourceName) { + final URL resourceUrl = classLoaderAccess.locateResource( resourceName ); + + if ( resourceUrl == null ) { + throw new IllegalArgumentException( "Could not locate resource [" + resourceName + "]" ); + } + + try { + final InputStream stream = resourceUrl.openStream(); + try { + return index( stream, resourceName ); + } + finally { + try { + stream.close(); + } + catch ( IOException e ) { + log.debug( "Unable to close resource stream [" + resourceName + "] : " + e.getMessage() ); + } + } + } + catch ( IOException e ) { + throw new HibernateException( "Unable to open input stream for resource [" + resourceName + "]", e ); + } + } + + @Override + public ClassInfo handle(PackageDescriptor packageInfoFileDescriptor) { + if ( suppliedIndexView != null ) { + return suppliedIndexView.getClassByName( DotName.createSimple( packageInfoFileDescriptor.getName() ) ); + } + else { + return index( packageInfoFileDescriptor ); + } + } + + private ClassInfo index(PackageDescriptor packageDescriptor) { + InputStream stream = packageDescriptor.getStreamAccess().accessInputStream(); + try { + return index( stream, packageDescriptor.getName() ); + } + finally { + try { + stream.close(); + } + catch (IOException ignore) { + } + } + } + + public void indexLoadedClass(Class loadedClass) { + assert !wasIndexSupplied() : "We are not indexing"; + + if ( loadedClass == null ) { + return; + } + + final DotName classDotName = DotName.createSimple( loadedClass.getName() ); + if ( !needsIndexing( classDotName ) ) { + return; + } + + // index super type first + indexLoadedClass( loadedClass.getSuperclass() ); + + // index any inner classes + for ( Class innerClass : loadedClass.getDeclaredClasses() ) { + indexLoadedClass( innerClass ); + } + + // then index the class itself + ClassInfo classInfo = indexResource( loadedClass.getName().replace( '.', '/' ) + ".class" ); + inflightClassInfoMap.put( classDotName, classInfo ); + + if ( !autoIndexMembers ) { + return; + } + + for ( Class fieldType : ReflectHelper.getMemberTypes( loadedClass ) ) { + if ( !fieldType.isPrimitive() && fieldType != Object.class ) { + indexLoadedClass( fieldType ); + } + } + + // Also check for classes within a @Target annotation. + // [steve] - not so sure about this. target would name an entity, which should be + // known to us somehow + for ( AnnotationInstance targetAnnotation : JandexHelper.getAnnotations( classInfo, HibernateDotNames.TARGET ) ) { + String targetClassName = targetAnnotation.value().asClass().name().toString(); + Class targetClass = classLoaderAccess.classForName( targetClassName ); + indexLoadedClass( targetClass ); + } + } + + public IndexView buildIndex() { + if ( suppliedIndexView != null ) { + return suppliedIndexView; + } + else { + final Index jandexIndex = indexer.complete(); + if ( log.isTraceEnabled() ) { + jandexIndex.printSubclasses(); + jandexIndex.printAnnotations(); + } + return jandexIndex; + } + } +} diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataBuilderImpl.java index a120a1b338..4017036e5a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataBuilderImpl.java @@ -33,6 +33,7 @@ import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; +import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.boot.spi.CacheRegionDefinition; import org.hibernate.cache.spi.access.AccessType; import org.hibernate.cfg.AvailableSettings; @@ -44,6 +45,11 @@ import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.metamodel.MetadataBuilder; import org.hibernate.metamodel.MetadataSourceProcessingOrder; import org.hibernate.metamodel.MetadataSources; +import org.hibernate.metamodel.archive.scan.internal.StandardScanOptions; +import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment; +import org.hibernate.metamodel.archive.scan.spi.ScanOptions; +import org.hibernate.metamodel.archive.scan.spi.Scanner; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; import org.hibernate.metamodel.spi.MetadataSourcesContributor; import org.hibernate.metamodel.spi.PersistentAttributeMemberResolver; import org.hibernate.metamodel.spi.StandardPersistentAttributeMemberResolver; @@ -62,6 +68,8 @@ import org.jboss.logging.Logger; import org.xml.sax.EntityResolver; +import static org.hibernate.internal.DeprecationLogger.DEPRECATION_LOGGER; + /** * The implementation of the {@link MetadataBuilder} contract. * @@ -152,6 +160,30 @@ public class MetadataBuilderImpl implements MetadataBuilder, TypeContributions { return this; } + @Override + public MetadataBuilder with(ScanOptions scanOptions) { + this.options.scanOptions = scanOptions; + return this; + } + + @Override + public MetadataBuilder with(ScanEnvironment scanEnvironment) { + this.options.scanEnvironment = scanEnvironment; + return this; + } + + @Override + public MetadataBuilder with(Scanner scanner) { + this.options.scannerSetting = scanner; + return this; + } + + @Override + public MetadataBuilder with(ArchiveDescriptorFactory factory) { + this.options.archiveDescriptorFactory = factory; + return this; + } + @Override public MetadataBuilder withNewIdentifierGeneratorsEnabled(boolean enabled) { this.options.useNewIdentifierGenerators = enabled; @@ -287,6 +319,12 @@ public class MetadataBuilderImpl implements MetadataBuilder, TypeContributions { private IndexView jandexView; private ClassLoader tempClassLoader; + + private ScanOptions scanOptions; + private ScanEnvironment scanEnvironment; + private Object scannerSetting; + private ArchiveDescriptorFactory archiveDescriptorFactory; + private NamingStrategy namingStrategy = EJB3NamingStrategy.INSTANCE; private SharedCacheMode sharedCacheMode = SharedCacheMode.ENABLE_SELECTIVE; private AccessType defaultCacheAccessType; @@ -306,7 +344,9 @@ public class MetadataBuilderImpl implements MetadataBuilder, TypeContributions { public Options(StandardServiceRegistry serviceRegistry) { this.serviceRegistry = serviceRegistry; + final StrategySelector strategySelector = serviceRegistry.getService( StrategySelector.class ); final ConfigurationService configService = serviceRegistry.getService( ConfigurationService.class ); + this.databaseDefaults = new DatabaseDefaults( configService ); // cache access type @@ -320,6 +360,25 @@ public class MetadataBuilderImpl implements MetadataBuilder, TypeContributions { } ); + jandexView = (IndexView) configService.getSettings().get( AvailableSettings.JANDEX_INDEX ); + + scanOptions = new StandardScanOptions( + (String) configService.getSettings().get( AvailableSettings.SCANNER_DISCOVERY ), + false + ); + // ScanEnvironment must be set explicitly + scannerSetting = configService.getSettings().get( AvailableSettings.SCANNER ); + if ( scannerSetting == null ) { + scannerSetting = configService.getSettings().get( AvailableSettings.SCANNER_DEPRECATED ); + if ( scannerSetting != null ) { + DEPRECATION_LOGGER.logScannerDeprecation(); + } + } + archiveDescriptorFactory = strategySelector.resolveStrategy( + ArchiveDescriptorFactory.class, + configService.getSettings().get( AvailableSettings.SCANNER_ARCHIVE_INTERPRETER ) + ); + useNewIdentifierGenerators = configService.getSetting( AvailableSettings.USE_NEW_ID_GENERATOR_MAPPINGS, StandardConverters.BOOLEAN, @@ -361,6 +420,27 @@ public class MetadataBuilderImpl implements MetadataBuilder, TypeContributions { return jandexView; } + @Override + public ScanOptions getScanOptions() { + return scanOptions; + } + + @Override + public ScanEnvironment getScanEnvironment() { + return scanEnvironment; + } + + + @Override + public Object getScanner() { + return scannerSetting; + } + + @Override + public ArchiveDescriptorFactory getArchiveDescriptorFactory() { + return archiveDescriptorFactory; + } + @Override public ClassLoader getTempClassLoader() { return tempClassLoader; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataBuildingProcess.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataBuildingProcess.java index 36b66ab819..ecc528a416 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataBuildingProcess.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetadataBuildingProcess.java @@ -23,6 +23,9 @@ */ package org.hibernate.metamodel.internal; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -41,14 +44,12 @@ import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.spi.CacheRegionDefinition; import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.NamingStrategy; import org.hibernate.cfg.ObjectNameNormalizer; import org.hibernate.cfg.annotations.NamedEntityGraphDefinition; import org.hibernate.dialect.Dialect; import org.hibernate.engine.ResultSetMappingDefinition; import org.hibernate.engine.config.spi.ConfigurationService; -import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.FilterDefinition; import org.hibernate.engine.spi.NamedQueryDefinition; @@ -58,10 +59,21 @@ import org.hibernate.id.EntityIdentifierNature; import org.hibernate.id.factory.IdentifierGeneratorFactory; import org.hibernate.id.factory.spi.MutableIdentifierGeneratorFactory; import org.hibernate.internal.util.collections.CollectionHelper; +import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.metamodel.MetadataSourceProcessingOrder; import org.hibernate.metamodel.MetadataSources; import org.hibernate.metamodel.NamedStoredProcedureQueryDefinition; import org.hibernate.metamodel.SessionFactoryBuilder; +import org.hibernate.metamodel.archive.internal.StandardArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.scan.internal.StandardScanner; +import org.hibernate.metamodel.archive.scan.spi.ClassDescriptor; +import org.hibernate.metamodel.archive.scan.spi.JandexInitializer; +import org.hibernate.metamodel.archive.scan.spi.MappingFileDescriptor; +import org.hibernate.metamodel.archive.scan.spi.PackageDescriptor; +import org.hibernate.metamodel.archive.scan.spi.ScanParameters; +import org.hibernate.metamodel.archive.scan.spi.ScanResult; +import org.hibernate.metamodel.archive.scan.spi.Scanner; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; import org.hibernate.metamodel.internal.binder.Binder; import org.hibernate.metamodel.reflite.internal.JavaTypeDescriptorRepositoryImpl; import org.hibernate.metamodel.reflite.spi.JavaTypeDescriptor; @@ -137,19 +149,53 @@ public class MetadataBuildingProcess { private static final Logger log = Logger.getLogger( MetadataBuildingProcess.class ); public static MetadataImpl build(MetadataSources sources, final MetadataBuildingOptions options) { + final ClassLoaderAccess classLoaderAccess = new ClassLoaderAccessImpl( + options.getTempClassLoader(), + options.getServiceRegistry() + ); + + final JandexInitManager jandexInitializer = buildJandexInitializer( options, classLoaderAccess ); + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // preliminary phases - final IndexView jandexView = handleJandex( options, sources ); + // scanning - Jandex initialization and source discovery + if ( options.getScanEnvironment() != null ) { + final Scanner scanner = buildScanner( options, classLoaderAccess ); + final ScanResult scanResult = scanner.scan( + options.getScanEnvironment(), + options.getScanOptions(), + new ScanParameters() { + @Override + public JandexInitializer getJandexInitializer() { + return jandexInitializer; + } + } + ); + + // Add to the MetadataSources any classes/packages/mappings discovered during scanning + addScanResultsToSources( scanResult, sources ); + } + + // todo : add options.getScanEnvironment().getExplicitlyListedClassNames() to jandex? + // ^^ - another option is to make sure that they are added to sources + + if ( !jandexInitializer.wasIndexSupplied() ) { + // If the Jandex Index(View) was supplied, we consider that supplied + // one "complete". + // Here though we were NOT supplied an index; in this case we want to + // additionally ensure that any-and-all "known" classes are added to + // the index we are building + sources.indexKnownClasses( jandexInitializer ); + } + + final IndexView jandexView = augmentJandexFromMappings( jandexInitializer.buildIndex(), sources, options ); + + final BasicTypeRegistry basicTypeRegistry = handleTypes( options ); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // prep to start handling binding in earnest final MappingDefaultsImpl mappingDefaults = new MappingDefaultsImpl( options ); - final ClassLoaderAccess classLoaderAccess = new ClassLoaderAccessImpl( - options.getTempClassLoader(), - options.getServiceRegistry() - ); final JandexAccessImpl jandexAccess = new JandexAccessImpl( jandexView, classLoaderAccess @@ -229,22 +275,154 @@ public class MetadataBuildingProcess { return metadataCollector.buildMetadataInstance(); } - private static IndexView handleJandex(MetadataBuildingOptions options, MetadataSources sources) { - final ConfigurationService configurationService = options.getServiceRegistry().getService( ConfigurationService.class ); + private static JandexInitManager buildJandexInitializer( + MetadataBuildingOptions options, + ClassLoaderAccess classLoaderAccess) { + final boolean autoIndexMembers = ConfigurationHelper.getBoolean( + org.hibernate.cfg.AvailableSettings.ENABLE_AUTO_INDEX_MEMBER_TYPES, + options.getServiceRegistry().getService( ConfigurationService.class ).getSettings(), + false + ); - final IndexView baseJandexIndex; - if ( options.getJandexView() != null ) { - baseJandexIndex = options.getJandexView(); + return new JandexInitManager( options.getJandexView(), classLoaderAccess, autoIndexMembers ); + } + + private static final Class[] SINGLE_ARG = new Class[] { ArchiveDescriptorFactory.class }; + + private static Scanner buildScanner(MetadataBuildingOptions options, ClassLoaderAccess classLoaderAccess) { + final Object scannerSetting = options.getScanner(); + final ArchiveDescriptorFactory archiveDescriptorFactory = options.getArchiveDescriptorFactory(); + + if ( scannerSetting == null ) { + // No custom Scanner specified, use the StandardScanner + if ( archiveDescriptorFactory == null ) { + return new StandardScanner(); + } + else { + return new StandardScanner( archiveDescriptorFactory ); + } } else { - final boolean autoIndexMemberTypes = configurationService.getSetting( - AvailableSettings.ENABLE_AUTO_INDEX_MEMBER_TYPES, - StandardConverters.BOOLEAN, - false - ); - baseJandexIndex = sources.buildJandexView( autoIndexMemberTypes ); + if ( Scanner.class.isInstance( scannerSetting ) ) { + if ( archiveDescriptorFactory != null ) { + throw new IllegalStateException( + "A Scanner instance and an ArchiveDescriptorFactory were both specified; please " + + "specify one or the other, or if you need to supply both, Scanner class to use " + + "(assuming it has a constructor accepting a ArchiveDescriptorFactory). " + + "Alternatively, just pass the ArchiveDescriptorFactory during your own " + + "Scanner constructor assuming it is statically known." + ); + } + return (Scanner) scannerSetting; + } + + final Class scannerImplClass; + if ( Class.class.isInstance( scannerSetting ) ) { + scannerImplClass = (Class) scannerSetting; + } + else { + scannerImplClass = classLoaderAccess.classForName( scannerSetting.toString() ); + } + + + if ( archiveDescriptorFactory != null ) { + // find the single-arg constructor - its an error if none exists + try { + final Constructor constructor = scannerImplClass.getConstructor( SINGLE_ARG ); + try { + return constructor.newInstance( archiveDescriptorFactory ); + } + catch (Exception e) { + throw new IllegalStateException( + "Error trying to instantiate custom specified Scanner [" + + scannerImplClass.getName() + "]", + e + ); + } + } + catch (NoSuchMethodException e) { + throw new IllegalArgumentException( + "Configuration named a custom Scanner and a custom ArchiveDescriptorFactory, but " + + "Scanner impl did not define a constructor accepting ArchiveDescriptorFactory" + ); + } + } + else { + // could be either ctor form... + // find the single-arg constructor - its an error if none exists + try { + final Constructor constructor = scannerImplClass.getConstructor( SINGLE_ARG ); + try { + return constructor.newInstance( StandardArchiveDescriptorFactory.INSTANCE ); + } + catch (Exception e) { + throw new IllegalStateException( + "Error trying to instantiate custom specified Scanner [" + + scannerImplClass.getName() + "]", + e + ); + } + } + catch (NoSuchMethodException e) { + try { + final Constructor constructor = scannerImplClass.getConstructor(); + try { + return constructor.newInstance(); + } + catch (Exception e2) { + throw new IllegalStateException( + "Error trying to instantiate custom specified Scanner [" + + scannerImplClass.getName() + "]", + e2 + ); + } + } + catch (NoSuchMethodException ignore) { + throw new IllegalArgumentException( + "Configuration named a custom Scanner, but we were unable to locate " + + "an appropriate constructor" + ); + } + } + } + } + } + + private static void addScanResultsToSources(ScanResult scanResult, MetadataSources sources) { + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Add mapping files found as a result of scanning + for ( MappingFileDescriptor mappingFileDescriptor : scanResult.getLocatedMappingFiles() ) { + final InputStream stream = mappingFileDescriptor.getStreamAccess().accessInputStream(); + try { + sources.addInputStream( stream ); + } + finally { + try { + stream.close(); + } + catch ( IOException ignore ) { + log.trace( "Was unable to close input stream" ); + } + } } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Add packages found as a result of scanning + for ( PackageDescriptor packageDescriptor : scanResult.getLocatedPackages() ) { + sources.addPackage( packageDescriptor.getName() ); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Add classes found as a result of scanning + for ( ClassDescriptor classDescriptor : scanResult.getLocatedClasses() ) { + sources.addAnnotatedClassName( classDescriptor.getName() ); + } + } + + private static IndexView augmentJandexFromMappings( + IndexView baseJandexIndex, + MetadataSources sources, + MetadataBuildingOptions options) { final List> jpaXmlBindings = new ArrayList>(); for ( BindResult bindResult : sources.getBindResultList() ) { if ( JaxbEntityMappings.class.isInstance( bindResult.getRoot() ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/ClassLoaderAccess.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/ClassLoaderAccess.java index f9cebf0e5c..4f511909e2 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/ClassLoaderAccess.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/ClassLoaderAccess.java @@ -23,6 +23,8 @@ */ package org.hibernate.metamodel.spi; +import java.net.URL; + /** * During the process of building this metamodel, accessing the ClassLoader * is very discouraged. However, sometimes it is needed. This contract helps @@ -39,4 +41,6 @@ public interface ClassLoaderAccess { * @return The Class. */ public Class classForName(String name); + + public URL locateResource(String resourceName); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/MetadataBuildingOptions.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/MetadataBuildingOptions.java index c9e4763ee5..21448abe47 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/MetadataBuildingOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/MetadataBuildingOptions.java @@ -32,6 +32,10 @@ import org.hibernate.boot.spi.CacheRegionDefinition; import org.hibernate.cache.spi.access.AccessType; import org.hibernate.cfg.NamingStrategy; import org.hibernate.metamodel.MetadataSourceProcessingOrder; +import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment; +import org.hibernate.metamodel.archive.scan.spi.ScanOptions; +import org.hibernate.metamodel.archive.scan.spi.Scanner; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; import org.hibernate.metamodel.spi.relational.Database; import org.hibernate.type.BasicType; @@ -80,6 +84,39 @@ public interface MetadataBuildingOptions { */ IndexView getJandexView(); + /** + * Access to the options to be used for scanning + * + * @return The scan options + */ + ScanOptions getScanOptions(); + + /** + * Access to the environment for scanning. Consider this temporary; see discussion on + * {@link ScanEnvironment} + * + * @return The scan environment + */ + ScanEnvironment getScanEnvironment(); + + /** + * Access to the Scanner to be used for scanning. Can be:
    + *
  • A Scanner instance
  • + *
  • A Class reference to the Scanner implementor
  • + *
  • A String naming the Scanner implementor
  • + *
+ * + * @return The scanner + */ + Object getScanner(); + + /** + * Access to the ArchiveDescriptorFactory to be used for scanning + * + * @return The ArchiveDescriptorFactory + */ + ArchiveDescriptorFactory getArchiveDescriptorFactory(); + /** * Access the temporary ClassLoader passed to us as defined by * {@link javax.persistence.spi.PersistenceUnitInfo#getNewTempClassLoader()}, if any. diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/packaging/NamedInputStream.java b/hibernate-entitymanager/src/main/java/org/hibernate/ejb/packaging/NamedInputStream.java deleted file mode 100644 index 733455bf7e..0000000000 --- a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/packaging/NamedInputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2009, 2012, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.ejb.packaging; - -import java.io.InputStream; - -/** - * @deprecated Doubly deprecated actually :) Moved to {@link org.hibernate.jpa.boot.spi.NamedInputStream} - * due to package renaming (org.hibernate.ejb -> org.hibernate.jpa). But also, the role fulfilled by this class - * was moved to the new {@link org.hibernate.jpa.boot.spi.InputStreamAccess} contract. - */ -@Deprecated -public class NamedInputStream extends org.hibernate.jpa.boot.spi.NamedInputStream { - public NamedInputStream(String name, InputStream stream) { - super( name, stream ); - } -} diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/AvailableSettings.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/AvailableSettings.java index 7af1646bfe..142bd5908b 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/AvailableSettings.java +++ b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/AvailableSettings.java @@ -453,29 +453,7 @@ public interface AvailableSettings { //Use the org.hibernate prefix. instead of hibernate. as it is a query hint se QueryHints String FLUSH_MODE = "org.hibernate.flushMode"; - /** - * Pass an implementation of {@link org.hibernate.jpa.boot.scan.spi.Scanner} - * (or the deprecated {@link org.hibernate.ejb.packaging.Scanner}). Accepts - * either:
    - *
  • an actual instance
  • - *
  • a reference to a Class that implements Scanner
  • - *
  • a fully qualified name of a Class that implements Scanner
  • - *
- */ - String SCANNER = "hibernate.ejb.resource_scanner"; - - /** - * Pass {@link org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory} to use - * in the scanning process. Accepts either:
    - *
  • an ArchiveDescriptorFactory instance
  • - *
  • a reference to a Class that implements ArchiveDescriptorFactory
  • - *
  • a fully qualified name of a Class that implements ArchiveDescriptorFactory
  • - *
- * - * @see #SCANNER - * @see org.hibernate.jpa.boot.scan.spi.Scanner - */ - String SCANNER_ARCHIVE_DELEGATE = "hibernate.jpa.scanner_archive_delegate"; + String SCANNER = org.hibernate.cfg.AvailableSettings.SCANNER; /** * List of classes names diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/package-info.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/package-info.java deleted file mode 100644 index 7fe8de9a17..0000000000 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/internal/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * The internals of archive scanning support - */ -package org.hibernate.jpa.boot.archive.internal; diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/package-info.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/package-info.java deleted file mode 100644 index 0f7106647d..0000000000 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/archive/spi/package-info.java +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Defines the SPI for support of "scanning" of "archives". - *

- * Scanning might mean:

    - *
  • searching for classes/packages that define certain interfaces
  • - *
  • locating named resources
  • - *
- * And "archive" might mean:
    - *
  • a {@code .jar} file
  • - *
  • an exploded directory
  • - *
  • an OSGi bundle
  • - *
  • etc
  • - *
- */ -package org.hibernate.jpa.boot.archive.spi; diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java index 5243430948..e643d5edbd 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java +++ b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java @@ -24,8 +24,6 @@ package org.hibernate.jpa.boot.internal; import java.io.File; -import java.io.IOException; -import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; @@ -64,19 +62,8 @@ import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.ValueHolder; import org.hibernate.jaxb.spi.cfg.JaxbHibernateConfiguration; import org.hibernate.jpa.AvailableSettings; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; -import org.hibernate.jpa.boot.scan.internal.StandardJpaScanEnvironmentImpl; -import org.hibernate.jpa.boot.scan.internal.StandardScanOptions; -import org.hibernate.jpa.boot.scan.internal.StandardScanner; -import org.hibernate.jpa.boot.scan.spi.ScanEnvironment; -import org.hibernate.jpa.boot.scan.spi.ScanOptions; -import org.hibernate.jpa.boot.scan.spi.ScanResult; -import org.hibernate.jpa.boot.scan.spi.Scanner; -import org.hibernate.jpa.boot.spi.ClassDescriptor; import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder; import org.hibernate.jpa.boot.spi.IntegratorProvider; -import org.hibernate.jpa.boot.spi.MappingFileDescriptor; -import org.hibernate.jpa.boot.spi.PackageDescriptor; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; import org.hibernate.jpa.boot.spi.StrategyRegistrationProviderList; import org.hibernate.jpa.boot.spi.TypeContributorList; @@ -90,6 +77,7 @@ import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider; import org.hibernate.metamodel.MetadataBuilder; import org.hibernate.metamodel.MetadataSources; import org.hibernate.metamodel.SessionFactoryBuilder; +import org.hibernate.metamodel.archive.scan.internal.StandardScanOptions; import org.hibernate.metamodel.spi.MetadataImplementor; import org.hibernate.metamodel.spi.TypeContributor; import org.hibernate.metamodel.spi.binding.EntityBinding; @@ -100,9 +88,6 @@ import org.hibernate.service.ConfigLoader; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.spi.ServiceRegistryImplementor; -import org.jboss.jandex.Index; -import org.jboss.jandex.IndexView; -import org.jboss.jandex.Indexer; import org.jboss.logging.Logger; import static org.hibernate.cfg.AvailableSettings.JACC_CONTEXT_ID; @@ -147,11 +132,6 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil * Names a {@link TypeContributorList} */ public static final String TYPE_CONTRIBUTORS = "hibernate.type_contributors"; - - /** - * Names a Jandex {@link Index} instance to use. - */ - public static final String JANDEX_INDEX = "hibernate.jandex_index"; // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -202,13 +182,9 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil this.standardServiceRegistry = ssrBuilder.build(); configure( standardServiceRegistry, mergedSettings ); - - // Perform deployment scanning - final ScanResult scanResult = scanDeployment( bsr ); - // Build the Metadata object final MetadataSources metadataSources = new MetadataSources( bsr ); - populate( metadataSources, scanResult, mergedSettings, standardServiceRegistry ); + populate( metadataSources, mergedSettings, standardServiceRegistry ); final MetadataBuilder metamodelBuilder = metadataSources.getMetadataBuilder( standardServiceRegistry ); populate( metamodelBuilder, mergedSettings, standardServiceRegistry ); this.metadata = (MetadataImplementor) metamodelBuilder.build(); @@ -691,135 +667,14 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil } } - @SuppressWarnings("unchecked") - private ScanResult scanDeployment(BootstrapServiceRegistry bootstrapServiceRegistry) { - IndexView jandexIndex = (IndexView) configurationValues.remove( JANDEX_INDEX ); - Indexer jandexIndexer = null; - if ( jandexIndex == null ) { - // If we don't have a Jandex index passed to us, we need to build one. - jandexIndexer = new Indexer(); - } - - final Scanner scanner = locateOrBuildScanner( bootstrapServiceRegistry ); - final ScanEnvironment environment = new StandardJpaScanEnvironmentImpl( persistenceUnit ); - final ScanOptions options = determineScanOptions( jandexIndexer, jandexIndex ); - final ScanResult result = scanner.scan( environment, options ); - - if ( jandexIndexer != null ) { - jandexIndex = jandexIndexer.complete(); - // if the indexer indexed anything use that index - // - // IMPL NOTE : (unfortunately?) Jandex has no way to see if an Indexer - // actually indexed anything. But, it also manages package-info.class - // as any other class, so this check should be fine - if ( !jandexIndex.getKnownClasses().isEmpty() ) { - configurationValues.put( JANDEX_INDEX, jandexIndex ); - } - } - - return result; - } - - @SuppressWarnings("unchecked") - private Scanner locateOrBuildScanner(BootstrapServiceRegistry bootstrapServiceRegistry) { - final Object value = configurationValues.remove( AvailableSettings.SCANNER ); - if ( value == null ) { - return createStandardScanner( bootstrapServiceRegistry ); - } - - if ( Scanner.class.isInstance( value ) ) { - return (Scanner) value; - } - - Class scannerClass; - if ( Class.class.isInstance( value ) ) { - try { - scannerClass = (Class) value; - } - catch ( ClassCastException e ) { - throw persistenceException( "Expecting Scanner implementation, but found " + ((Class) value).getName() ); - } - } - else { - final String scannerClassName = value.toString(); - try { - scannerClass = bootstrapServiceRegistry.getService( ClassLoaderService.class ).classForName( scannerClassName ); - } - catch ( ClassCastException e ) { - throw persistenceException( "Expecting Scanner implementation, but found " + scannerClassName ); - } - } - - try { - return scannerClass.newInstance(); - } - catch ( Exception e ) { - throw persistenceException( "Unable to instantiate Scanner class: " + scannerClass, e ); - } - } - - @SuppressWarnings("unchecked") - private Scanner createStandardScanner(BootstrapServiceRegistry bootstrapServiceRegistry) { - final Object value = configurationValues.remove( AvailableSettings.SCANNER_ARCHIVE_DELEGATE ); - if ( value == null ) { - return new StandardScanner(); - } - - if ( ArchiveDescriptorFactory.class.isInstance( value ) ) { - return new StandardScanner( (ArchiveDescriptorFactory) value ); - } - - final Class delegateClass; - if ( Class.class.isInstance( value ) ) { - try { - delegateClass = (Class) value; - } - catch ( ClassCastException e ) { - throw persistenceException( - "Expecting ArchiveDescriptorFactory implementation, but found " + ((Class) value).getName() - ); - } - } - else { - final String delegateClassName = value.toString(); - try { - delegateClass = bootstrapServiceRegistry.getService( ClassLoaderService.class ).classForName( delegateClassName ); - } - catch ( ClassCastException e ) { - throw persistenceException( - "Expecting ArchiveDescriptorFactory implementation, but found " + delegateClassName - ); - } - } - - try { - final ArchiveDescriptorFactory delegate = delegateClass.newInstance(); - return new StandardScanner( delegate ); - } - catch (Exception e) { - throw persistenceException( "Unable to instantiate ArchiveDescriptorFactory class: " + delegateClass, e ); - } - - } - - private ScanOptions determineScanOptions(Indexer indexer, IndexView jandexIndex) { - return new StandardScanOptions( - indexer, - jandexIndex, - (String) configurationValues.get( AvailableSettings.AUTODETECTION ), - persistenceUnit.isExcludeUnlistedClasses() - ); - } - @SuppressWarnings("unchecked") private void populate( MetadataSources metadataSources, - ScanResult scanResult, MergedSettings mergedSettings, StandardServiceRegistry ssr) { final ClassLoaderService classLoaderService = ssr.getService( ClassLoaderService.class ); - // todo : make MetadataSources/Metadata capable of handling duplicates + // todo : make sure MetadataSources/Metadata are capable of handling duplicate sources // explicit persistence unit mapping files listings if ( persistenceUnit.getMappingFileNames() != null ) { @@ -904,35 +759,17 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil metadataSources.addResource( ormXml ); } } - - // Add mapping files found as a result of scanning - for ( MappingFileDescriptor mappingFileDescriptor : scanResult.getLocatedMappingFiles() ) { - final InputStream stream = mappingFileDescriptor.getStreamAccess().accessInputStream(); - try { - metadataSources.addInputStream( stream ); - } - finally { - try { - stream.close(); - } - catch ( IOException ignore ) { - LOG.trace( "Was unable to close input stream" ); - } - } - } - - // Add packages found as a result of scanning - for ( PackageDescriptor packageDescriptor : scanResult.getLocatedPackages() ) { - metadataSources.addPackage( packageDescriptor.getName() ); - } - - // Add classes found as a result of scanning - for ( ClassDescriptor classDescriptor : scanResult.getLocatedClasses() ) { - metadataSources.addAnnotatedClassName( classDescriptor.getName() ); - } } private void populate(MetadataBuilder metamodelBuilder, MergedSettings mergedSettings, StandardServiceRegistry ssr) { + metamodelBuilder.with( new StandardJpaScanEnvironmentImpl( persistenceUnit ) ); + metamodelBuilder.with( + new StandardScanOptions( + (String) configurationValues.get( AvailableSettings.AUTODETECTION ), + persistenceUnit.isExcludeUnlistedClasses() + ) + ); + if ( mergedSettings.cacheRegionDefinitions != null ) { for ( CacheRegionDefinition localCacheRegionDefinition : mergedSettings.cacheRegionDefinitions ) { metamodelBuilder.with( localCacheRegionDefinition ); @@ -953,11 +790,6 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil metamodelBuilder.with( typeContributor ); } } - - IndexView jandexIndex = (IndexView) configurationValues.remove( JANDEX_INDEX ); - if ( jandexIndex != null ) { - metamodelBuilder.with( jandexIndex ); - } } /** diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/MappingFileDescriptorImpl.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/MappingFileDescriptorImpl.java deleted file mode 100644 index 1a073c4002..0000000000 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/MappingFileDescriptorImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2013, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.jpa.boot.internal; - -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.boot.spi.MappingFileDescriptor; - -/** - * @author Steve Ebersole - */ -public class MappingFileDescriptorImpl implements MappingFileDescriptor { - private final String name; - private final InputStreamAccess streamAccess; - - public MappingFileDescriptorImpl(String name, InputStreamAccess streamAccess) { - this.name = name; - this.streamAccess = streamAccess; - } - - @Override - public String getName() { - return name; - } - - @Override - public InputStreamAccess getStreamAccess() { - return streamAccess; - } - -// @Override -// public boolean equals(Object o) { -// if ( this == o ) { -// return true; -// } -// if ( o == null || getClass() != o.getClass() ) { -// return false; -// } -// -// MappingFileDescriptorImpl that = (MappingFileDescriptorImpl) o; -// -// return name.equals( that.name ) -// && streamAccess.getStreamName().equals( that.streamAccess.getStreamName() ); -// -// } -// -// @Override -// public int hashCode() { -// int result = name.hashCode(); -// result = 31 * result + streamAccess.getStreamName().hashCode(); -// return result; -// } -} diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/PersistenceXmlParser.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/PersistenceXmlParser.java index b05a743ca8..cdc915596b 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/PersistenceXmlParser.java +++ b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/PersistenceXmlParser.java @@ -47,9 +47,9 @@ import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.internal.util.StringHelper; import org.hibernate.jpa.AvailableSettings; -import org.hibernate.jpa.boot.archive.internal.ArchiveHelper; import org.hibernate.jpa.internal.EntityManagerMessageLogger; import org.hibernate.jpa.internal.util.ConfigurationHelper; +import org.hibernate.metamodel.archive.internal.ArchiveHelper; import org.hibernate.metamodel.source.spi.XsdException; import org.jboss.logging.Logger; diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardJpaScanEnvironmentImpl.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/StandardJpaScanEnvironmentImpl.java similarity index 91% rename from hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardJpaScanEnvironmentImpl.java rename to hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/StandardJpaScanEnvironmentImpl.java index 96eeecbc4b..8410ddd834 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/internal/StandardJpaScanEnvironmentImpl.java +++ b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/internal/StandardJpaScanEnvironmentImpl.java @@ -21,14 +21,14 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.jpa.boot.scan.internal; +package org.hibernate.jpa.boot.internal; import java.net.URL; import java.util.Collections; import java.util.List; -import org.hibernate.jpa.boot.scan.spi.ScanEnvironment; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; +import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment; /** * Implementation of ScanEnvironment leveraging a JPA deployment descriptor. @@ -72,9 +72,4 @@ public class StandardJpaScanEnvironmentImpl implements ScanEnvironment { public List getExplicitlyListedMappingFiles() { return explicitlyListedMappingFiles; } - - @Override - public PersistenceUnitDescriptor getPersistenceUnitDescriptor() { - return persistenceUnitDescriptor; - } } diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ArchiveContextImpl.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ArchiveContextImpl.java deleted file mode 100644 index c8db580e3c..0000000000 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/boot/scan/spi/ArchiveContextImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2014, Red Hat Inc. or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Inc. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.jpa.boot.scan.spi; - -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntry; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntryHandler; -import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; - -/** -* @author Steve Ebersole -*/ -public class ArchiveContextImpl implements ArchiveContext { - private final ScanEnvironment environment; - private final boolean isRootUrl; - private final ArchiveEntryHandlers entryHandlers; - - public ArchiveContextImpl( - ScanEnvironment environment, - boolean isRootUrl, - ArchiveEntryHandlers entryHandlers) { - this.environment = environment; - this.isRootUrl = isRootUrl; - this.entryHandlers = entryHandlers; - } - - @Override - @SuppressWarnings("deprecation") - public PersistenceUnitDescriptor getPersistenceUnitDescriptor() { - return environment.getPersistenceUnitDescriptor(); - } - - @Override - public boolean isRootUrl() { - return isRootUrl; - } - - @Override - public ArchiveEntryHandler obtainArchiveEntryHandler(ArchiveEntry entry) { - final String nameWithinArchive = entry.getNameWithinArchive(); - - if ( nameWithinArchive.endsWith( "package-info.class" ) ) { - return entryHandlers.getPackageInfoHandler(); - } - else if ( nameWithinArchive.endsWith( ".class" ) ) { - return entryHandlers.getClassFileHandler(); - } - else { - return entryHandlers.getFileHandler(); - } - } -} diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/internal/EntityManagerMessageLogger.java b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/internal/EntityManagerMessageLogger.java index 2eb79ea4cd..a2b14268cf 100644 --- a/hibernate-entitymanager/src/main/java/org/hibernate/jpa/internal/EntityManagerMessageLogger.java +++ b/hibernate-entitymanager/src/main/java/org/hibernate/jpa/internal/EntityManagerMessageLogger.java @@ -63,24 +63,49 @@ public interface EntityManagerMessageLogger extends CoreMessageLogger { @Message( value = "An Ejb3Configuration was unbound from name: %s", id = 15004 ) void ejb3ConfigurationUnboundFromName( String name ); + /** + * @deprecated Moved to the {@link org.hibernate.internal.UrlMessageBundle} + * contract + */ + @Deprecated @LogMessage( level = WARN ) @Message( value = "Exploded jar file does not exist (ignored): %s", id = 15005 ) void explodedJarDoesNotExist( URL jarUrl ); + /** + * @deprecated Moved to the {@link org.hibernate.internal.UrlMessageBundle} + * contract + */ + @Deprecated @LogMessage( level = WARN ) @Message( value = "Exploded jar file not a directory (ignored): %s", id = 15006 ) void explodedJarNotDirectory( URL jarUrl ); + /** + * @deprecated Moved to the {@link org.hibernate.internal.UrlMessageBundle} + * contract + */ + @Deprecated @LogMessage( level = ERROR ) @Message( value = "Malformed URL: %s", id = 15008 ) void malformedUrl( URL jarUrl, @Cause URISyntaxException e ); + /** + * @deprecated Moved to the {@link org.hibernate.internal.UrlMessageBundle} + * contract + */ + @Deprecated @LogMessage( level = WARN ) @Message( value = "Malformed URL: %s", id = 15009 ) void malformedUrlWarning( URL jarUrl, @Cause URISyntaxException e ); + /** + * @deprecated Moved to the {@link org.hibernate.internal.UrlMessageBundle} + * contract + */ + @Deprecated @LogMessage( level = WARN ) @Message( value = "Unable to find file (ignored): %s", id = 15010 ) void unableToFindFile( URL jarUrl, diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/CustomScanner.java b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/CustomScanner.java index 2904e1c046..fe25899906 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/CustomScanner.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/CustomScanner.java @@ -1,10 +1,10 @@ package org.hibernate.jpa.test.packaging; -import org.hibernate.jpa.boot.scan.internal.StandardScanner; -import org.hibernate.jpa.boot.scan.spi.ScanEnvironment; -import org.hibernate.jpa.boot.scan.spi.ScanOptions; -import org.hibernate.jpa.boot.scan.spi.ScanResult; -import org.hibernate.jpa.boot.scan.spi.Scanner; +import org.hibernate.metamodel.archive.scan.internal.StandardScanner; +import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment; +import org.hibernate.metamodel.archive.scan.spi.ScanOptions; +import org.hibernate.metamodel.archive.scan.spi.ScanParameters; +import org.hibernate.metamodel.archive.scan.spi.Scanner; /** * @author Emmanuel Bernard @@ -22,8 +22,11 @@ public class CustomScanner implements Scanner { } @Override - public ScanResult scan(ScanEnvironment environment, ScanOptions options) { + public org.hibernate.metamodel.archive.scan.spi.ScanResult scan( + ScanEnvironment environment, + ScanOptions options, + ScanParameters parameters) { isUsed = true; - return delegate.scan( environment, options ); + return delegate.scan( environment, options, parameters ); } } diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/JarVisitorTest.java b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/JarVisitorTest.java index a866e7fdf7..4bc265f113 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/JarVisitorTest.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/JarVisitorTest.java @@ -36,25 +36,25 @@ import java.util.Collections; import java.util.List; import org.hibernate.dialect.H2Dialect; -import org.hibernate.jpa.boot.archive.internal.ArchiveHelper; -import org.hibernate.jpa.boot.archive.internal.ExplodedArchiveDescriptor; -import org.hibernate.jpa.boot.archive.internal.JarFileBasedArchiveDescriptor; -import org.hibernate.jpa.boot.archive.internal.JarProtocolArchiveDescriptor; -import org.hibernate.jpa.boot.archive.internal.StandardArchiveDescriptorFactory; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptor; -import org.hibernate.jpa.boot.internal.ClassDescriptorImpl; -import org.hibernate.jpa.boot.scan.internal.ResultCoordinator; -import org.hibernate.jpa.boot.scan.internal.ScanResultCollector; -import org.hibernate.jpa.boot.scan.internal.StandardScanOptions; -import org.hibernate.jpa.boot.scan.internal.StandardScanner; -import org.hibernate.jpa.boot.scan.spi.ArchiveContextImpl; -import org.hibernate.jpa.boot.scan.spi.ScanEnvironment; -import org.hibernate.jpa.boot.scan.spi.ScanResult; -import org.hibernate.jpa.boot.spi.MappingFileDescriptor; -import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; import org.hibernate.jpa.test.pack.defaultpar.Version; import org.hibernate.jpa.test.pack.explodedpar.Carpet; +import org.hibernate.metamodel.archive.internal.ArchiveHelper; +import org.hibernate.metamodel.archive.internal.ExplodedArchiveDescriptor; +import org.hibernate.metamodel.archive.internal.JarFileBasedArchiveDescriptor; +import org.hibernate.metamodel.archive.internal.JarProtocolArchiveDescriptor; +import org.hibernate.metamodel.archive.internal.StandardArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.scan.internal.ClassDescriptorImpl; +import org.hibernate.metamodel.archive.scan.internal.ScanResultCollector; +import org.hibernate.metamodel.archive.scan.internal.StandardScanOptions; +import org.hibernate.metamodel.archive.scan.internal.StandardScanner; +import org.hibernate.metamodel.archive.scan.spi.AbstractScannerImpl; +import org.hibernate.metamodel.archive.scan.spi.JandexInitializer; +import org.hibernate.metamodel.archive.scan.spi.MappingFileDescriptor; +import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment; +import org.hibernate.metamodel.archive.scan.spi.ScanParameters; +import org.hibernate.metamodel.archive.scan.spi.ScanResult; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptor; +import org.hibernate.metamodel.internal.JandexInitManager; import org.hibernate.testing.RequiresDialect; import org.hibernate.testing.TestForIssue; @@ -97,7 +97,17 @@ public class JarVisitorTest extends PackagingTestCase { private ScanResult standardScan(URL url) { ScanEnvironment env = new ScanEnvironmentImpl( url ); - return new StandardScanner().scan( env, new StandardScanOptions() ); + return new StandardScanner().scan( + env, + new StandardScanOptions(), + new ScanParameters() { + private final JandexInitManager jandexInitManager = new JandexInitManager(); + @Override + public JandexInitializer getJandexInitializer() { + return jandexInitManager; + } + } + ); } private static class ScanEnvironmentImpl implements ScanEnvironment { @@ -126,11 +136,6 @@ public class JarVisitorTest extends PackagingTestCase { public List getExplicitlyListedMappingFiles() { return Collections.emptyList(); } - - @Override - public PersistenceUnitDescriptor getPersistenceUnitDescriptor() { - return null; - } } @Test @@ -178,14 +183,20 @@ public class JarVisitorTest extends PackagingTestCase { ); ScanEnvironment environment = new ScanEnvironmentImpl( rootUrl ); - ScanResultCollector collector = new ScanResultCollector( environment, new StandardScanOptions() ); + ScanResultCollector collector = new ScanResultCollector( + environment, + new StandardScanOptions(), + new ScanParameters() { + private final JandexInitManager jandexInitManager = new JandexInitManager(); + @Override + public JandexInitializer getJandexInitializer() { + return jandexInitManager; + } + } + ); archiveDescriptor.visitArchive( - new ArchiveContextImpl( - environment, - true, - new ResultCoordinator( collector ) - ) + new AbstractScannerImpl.ArchiveContextImpl( true, collector ) ); validateResults( @@ -203,14 +214,20 @@ public class JarVisitorTest extends PackagingTestCase { ); environment = new ScanEnvironmentImpl( rootUrl ); - collector = new ScanResultCollector( environment, new StandardScanOptions() ); + collector = new ScanResultCollector( + environment, + new StandardScanOptions(), + new ScanParameters() { + private final JandexInitManager jandexInitManager = new JandexInitManager(); + @Override + public JandexInitializer getJandexInitializer() { + return jandexInitManager; + } + } + ); archiveDescriptor.visitArchive( - new ArchiveContextImpl( - environment, - true, - new ResultCoordinator( collector ) - ) + new AbstractScannerImpl.ArchiveContextImpl( true, collector ) ); validateResults( collector.toScanResult(), @@ -234,14 +251,20 @@ public class JarVisitorTest extends PackagingTestCase { ); final ScanEnvironment environment = new ScanEnvironmentImpl( rootUrl ); - final ScanResultCollector collector = new ScanResultCollector( environment, new StandardScanOptions() ); + final ScanResultCollector collector = new ScanResultCollector( + environment, + new StandardScanOptions(), + new ScanParameters() { + private final JandexInitManager jandexInitManager = new JandexInitManager(); + @Override + public JandexInitializer getJandexInitializer() { + return jandexInitManager; + } + } + ); archiveDescriptor.visitArchive( - new ArchiveContextImpl( - environment, - true, - new ResultCoordinator( collector ) - ) + new AbstractScannerImpl.ArchiveContextImpl( true, collector ) ); validateResults( diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/PackagingTestCase.java b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/PackagingTestCase.java index a6c0d3b075..52f537bb3b 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/PackagingTestCase.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/PackagingTestCase.java @@ -69,6 +69,7 @@ import org.hibernate.jpa.test.pack.various.Airplane; import org.hibernate.jpa.test.pack.various.Seat; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.hibernate.testing.junit4.BaseUnitTestCase; import static org.junit.Assert.fail; @@ -76,7 +77,7 @@ import static org.junit.Assert.fail; * @author Hardy Ferentschik * @author Brett Meyer */ -public abstract class PackagingTestCase extends BaseCoreFunctionalTestCase { +public abstract class PackagingTestCase extends BaseUnitTestCase { protected static ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); protected static ClassLoader bundleClassLoader; protected static File packageTargetDir; @@ -290,11 +291,7 @@ public abstract class PackagingTestCase extends BaseCoreFunctionalTestCase { JavaArchive archive = ShrinkWrap.create( JavaArchive.class,fileName ); archive.addClasses( Morito.class, - Item.class, - Distributor.class, - Cat.class, - Kitten.class, - LastUpdateListener.class + Item.class ); ArchivePath path = ArchivePaths.create( "META-INF/persistence.xml" ); diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/ScannerTest.java b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/ScannerTest.java index 8205d3c236..71c74b7749 100644 --- a/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/ScannerTest.java +++ b/hibernate-entitymanager/src/test/java/org/hibernate/jpa/test/packaging/ScannerTest.java @@ -31,19 +31,21 @@ import java.util.HashMap; import org.hibernate.jpa.AvailableSettings; import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor; -import org.hibernate.jpa.boot.scan.internal.StandardJpaScanEnvironmentImpl; -import org.hibernate.jpa.boot.scan.internal.StandardScanOptions; -import org.hibernate.jpa.boot.scan.spi.ScanEnvironment; -import org.hibernate.jpa.boot.scan.spi.ScanOptions; +import org.hibernate.jpa.boot.internal.StandardJpaScanEnvironmentImpl; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; -import org.hibernate.jpa.boot.scan.internal.StandardScanner; -import org.hibernate.jpa.boot.spi.ClassDescriptor; -import org.hibernate.jpa.boot.spi.MappingFileDescriptor; -import org.hibernate.jpa.boot.spi.NamedInputStream; -import org.hibernate.jpa.boot.scan.spi.ScanResult; -import org.hibernate.jpa.boot.scan.spi.Scanner; import org.hibernate.jpa.test.pack.defaultpar.ApplicationServer; import org.hibernate.jpa.test.pack.defaultpar.Version; +import org.hibernate.metamodel.archive.scan.internal.StandardScanOptions; +import org.hibernate.metamodel.archive.scan.internal.StandardScanner; +import org.hibernate.metamodel.archive.scan.spi.ClassDescriptor; +import org.hibernate.metamodel.archive.scan.spi.JandexInitializer; +import org.hibernate.metamodel.archive.scan.spi.MappingFileDescriptor; +import org.hibernate.metamodel.archive.scan.spi.ScanEnvironment; +import org.hibernate.metamodel.archive.scan.spi.ScanOptions; +import org.hibernate.metamodel.archive.scan.spi.ScanParameters; +import org.hibernate.metamodel.archive.scan.spi.ScanResult; +import org.hibernate.metamodel.archive.scan.spi.Scanner; +import org.hibernate.metamodel.internal.JandexInitManager; import org.junit.Test; @@ -66,7 +68,17 @@ public class ScannerTest extends PackagingTestCase { ScanEnvironment env = new StandardJpaScanEnvironmentImpl( descriptor ); ScanOptions options = new StandardScanOptions( "hbm,class", descriptor.isExcludeUnlistedClasses() ); Scanner scanner = new StandardScanner(); - ScanResult scanResult = scanner.scan( env, options ); + ScanResult scanResult = scanner.scan( + env, + options, + new ScanParameters() { + private final JandexInitManager jandexInitManager = new JandexInitManager(); + @Override + public JandexInitializer getJandexInitializer() { + return jandexInitManager; + } + } + ); assertEquals( 3, scanResult.getLocatedClasses().size() ); assertClassesContained( scanResult, ApplicationServer.class ); @@ -79,11 +91,6 @@ public class ScannerTest extends PackagingTestCase { InputStream stream = mappingFileDescriptor.getStreamAccess().accessInputStream(); assertNotNull( stream ); stream.close(); - NamedInputStream namedInputStream = mappingFileDescriptor.getStreamAccess().asNamedInputStream(); - assertNotNull( namedInputStream ); - stream = namedInputStream.getStream(); - assertNotNull( stream ); - stream.close(); } } diff --git a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptor.java b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptor.java index 2a5c7c1175..58786dbcb1 100644 --- a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptor.java +++ b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptor.java @@ -27,11 +27,10 @@ import javax.persistence.PersistenceException; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.jpa.boot.archive.spi.ArchiveContext; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptor; -import org.hibernate.jpa.boot.archive.spi.ArchiveEntry; -import org.hibernate.jpa.boot.spi.InputStreamAccess; -import org.hibernate.jpa.boot.spi.NamedInputStream; +import org.hibernate.metamodel.archive.spi.ArchiveContext; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptor; +import org.hibernate.metamodel.archive.spi.ArchiveEntry; +import org.hibernate.metamodel.archive.spi.InputStreamAccess; import org.osgi.framework.Bundle; import org.osgi.framework.wiring.BundleWiring; @@ -77,11 +76,6 @@ public class OsgiArchiveDescriptor implements ArchiveDescriptor { public InputStream accessInputStream() { return openInputStream(); } - - @Override - public NamedInputStream asNamedInputStream() { - return new NamedInputStream( resource, openInputStream() ); - } private InputStream openInputStream() { try { diff --git a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptorFactory.java b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptorFactory.java index 74b08c8b41..3495f4e03a 100644 --- a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptorFactory.java +++ b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptorFactory.java @@ -22,8 +22,8 @@ package org.hibernate.osgi; import java.net.URL; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptor; -import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptor; +import org.hibernate.metamodel.archive.spi.ArchiveDescriptorFactory; import org.osgi.framework.Bundle; diff --git a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiScanner.java b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiScanner.java index dc28e4bb1c..94d4be8863 100644 --- a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiScanner.java +++ b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiScanner.java @@ -20,7 +20,7 @@ */ package org.hibernate.osgi; -import org.hibernate.jpa.boot.scan.spi.AbstractScannerImpl; +import org.hibernate.metamodel.archive.scan.spi.AbstractScannerImpl; import org.osgi.framework.Bundle;