HHH-8309 - Create hibernate-orm subprojects for maven and gradle plugins

This commit is contained in:
Steve Ebersole 2013-09-06 13:14:36 -05:00
parent 41e29b7bad
commit cf7bb0dcec
9 changed files with 141 additions and 158 deletions

View File

@ -1,34 +1,7 @@
/*
* 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
*/
apply plugin: 'groovy' apply plugin: 'groovy'
apply plugin: 'maven' apply plugin: 'maven'
apply plugin: 'java' apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies { dependencies {
compile( project(':hibernate-core') ) compile( project(':hibernate-core') )
compile( libraries.jpa ) compile( libraries.jpa )
@ -36,12 +9,3 @@ dependencies {
compile gradleApi() compile gradleApi()
compile localGroovy() compile localGroovy()
} }
/* Available for testing locally. */
install {
repositories.mavenInstaller {
pom.groupId = 'org.hibernate'
pom.artifactId = 'hibernate-gradle-plugin'
pom.version = '1.0'
}
}

View File

@ -1,62 +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.bytecode.enhance.plugins;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.JavaBasePlugin;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.plugins.JavaPlugin;
import org.hibernate.bytecode.enhance.plugins.EnhanceTask;
/**
* This plugin will add Entity enhancement behaviour to the build lifecycle.
*
* @author Jeremy Whiting
*/
@SuppressWarnings("serial")
public class EnhancePlugin implements Plugin<Project>{
public static final String ENHANCE_TASK_NAME = "enhance";
public static final String HAPPENS_AFTER_ENHANCE_TASK_NAME = JavaPlugin.JAR_TASK_NAME;
public void apply(Project project) {
project.getLogger().debug( "Applying enhance plugin to project." );
configureTask( project );
project.getLogger().debug( String.format( "DAG has been configured with enhance task dependent on [%s].", JavaPlugin.CLASSES_TASK_NAME ) );
}
private void configureTask(Project project) {
EnhanceTask enhanceTask = project.getTasks().create( ENHANCE_TASK_NAME, EnhanceTask.class );
enhanceTask.setGroup(BasePlugin.BUILD_GROUP);
// connect up the task in the task dependency graph
Task classesTask = project.getTasks().getByName( JavaPlugin.CLASSES_TASK_NAME );
enhanceTask.dependsOn( classesTask );
Task jarTask = project.getTasks().getByName( HAPPENS_AFTER_ENHANCE_TASK_NAME );
jarTask.dependsOn( enhanceTask );
}
}

View File

@ -21,73 +21,76 @@
* 51 Franklin Street, Fifth Floor * 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA * Boston, MA 02110-1301 USA
*/ */
package org.hibernate.bytecode.enhance.plugins package org.hibernate.tooling.gradle
import org.hibernate.bytecode.enhance.spi.Enhancer
import org.hibernate.bytecode.enhance.spi.EnhancementContext
import javassist.ClassPool import javassist.ClassPool
import javassist.CtClass import javassist.CtClass
import javassist.CtField import javassist.CtField
import javax.persistence.Transient
import javax.persistence.Entity
import java.io.FileInputStream
import java.io.FileOutputStream
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.plugins.Convention
import org.gradle.api.tasks.TaskAction
import org.gradle.api.file.FileTree import org.gradle.api.file.FileTree
import org.gradle.api.tasks.TaskAction
import org.hibernate.bytecode.enhance.spi.EnhancementContext
import org.hibernate.bytecode.enhance.spi.Enhancer
import javax.persistence.Entity
import javax.persistence.Transient
/** /**
* Plugin to enhance Entities using the context(s) to determine * Gradle Task to apply Hibernate's bytecode Enhancer
* which to apply. *
* @author Jeremy Whiting * @author Jeremy Whiting
*/ */
public class EnhanceTask extends DefaultTask implements EnhancementContext { public class EnhancerTask extends DefaultTask implements EnhancementContext {
private ClassLoader overridden private ClassLoader overridden
public EnhanceTask() { public EnhancerTask() {
super() super()
setDescription('Enhances Entity classes for efficient association referencing.') setDescription( 'Enhances Entity classes for efficient association referencing.' )
} }
@TaskAction @TaskAction
def enhance () { def enhance() {
logger.info( 'enhance task started') logger.info( 'enhance task started' )
ext.pool = new ClassPool(false) ext.pool = new ClassPool( false )
ext.enhancer = new Enhancer(this) ext.enhancer = new Enhancer( this )
FileTree tree = project.fileTree(dir: project.sourceSets.main.output.classesDir) FileTree tree = project.fileTree( dir: project.sourceSets.main.output.classesDir )
tree.include '**/*.class' tree.include '**/*.class'
tree.each( tree.each( { File file ->
{ File file ->
final byte[] enhancedBytecode; final byte[] enhancedBytecode;
InputStream is = null; InputStream is = null;
CtClass clas = null; CtClass clas = null;
try { try {
is = new FileInputStream(file.toString()) is = new FileInputStream( file.toString() )
clas =ext.pool.makeClass(is) clas = ext.pool.makeClass( is )
if (!clas.hasAnnotation(Entity.class)){ // Enhancer already does this check to see if it should enhance, why are we doing it again here?
logger.debug("Class $file not an annotated Entity class. skipping...") if ( !clas.hasAnnotation( Entity.class ) ) {
} else { logger.debug( "Class $file not an annotated Entity class. skipping..." )
}
else {
enhancedBytecode = ext.enhancer.enhance( clas.getName(), clas.toBytecode() ); enhancedBytecode = ext.enhancer.enhance( clas.getName(), clas.toBytecode() );
} }
} }
catch (Exception e) { catch (Exception e) {
logger.error( "Unable to enhance class [${file.toString()}]", e ) logger.error( "Unable to enhance class [${file.toString()}]", e )
return return
} finally {
try {
if (null != is) is.close();
} finally{}
} }
if (null != enhancedBytecode){ finally {
try {
if ( null != is ) {
is.close()
};
}
finally {}
}
if ( null != enhancedBytecode ) {
if ( file.delete() ) { if ( file.delete() ) {
if ( ! file.createNewFile() ) { if ( !file.createNewFile() ) {
logger.error( "Unable to recreate class file [" + clas.getName() + "]") logger.error( "Unable to recreate class file [" + clas.getName() + "]" )
} }
} }
else { else {
logger.error( "Unable to delete class file [" + clas.getName() + "]") logger.error( "Unable to delete class file [" + clas.getName() + "]" )
} }
FileOutputStream outputStream = new FileOutputStream( file, false ) FileOutputStream outputStream = new FileOutputStream( file, false )
try { try {
@ -96,15 +99,17 @@ public class EnhanceTask extends DefaultTask implements EnhancementContext {
} }
finally { finally {
try { try {
if (outputStream != null) outputStream.close() if ( outputStream != null ) {
outputStream.close()
}
clas.detach()//release memory clas.detach()//release memory
} }
catch ( IOException ignore) { catch (IOException ignore) {
} }
} }
} }
}) } )
logger.info( 'enhance task finished') logger.info( 'enhance task finished' )
} }
public ClassLoader getLoadingClassLoader() { public ClassLoader getLoadingClassLoader() {
@ -135,6 +140,7 @@ public class EnhanceTask extends DefaultTask implements EnhancementContext {
public boolean isCompositeClass(CtClass classDescriptor) { public boolean isCompositeClass(CtClass classDescriptor) {
return false; return false;
} }
public boolean doDirtyCheckingInline(CtClass classDescriptor) { public boolean doDirtyCheckingInline(CtClass classDescriptor) {
return false; return false;
} }

View File

@ -0,0 +1,75 @@
/*
* 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.tooling.gradle;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.JavaPlugin;
/**
* The Hibernate Gradle plugin. Adds Hibernate build-time capabilities into your Gradle-based build.
*
* @author Jeremy Whiting
* @author Steve Ebersole
*/
@SuppressWarnings("serial")
public class HibernatePlugin implements Plugin<Project> {
public static final String ENHANCE_TASK_NAME = "enhance";
public void apply(Project project) {
applyEnhancement( project );
}
private void applyEnhancement(Project project) {
project.getLogger().debug( "Applying Hibernate enhancement to project." );
// few things...
// 1) would probably be best as a doLast Action attached to the compile task rather than
// a task. Really ideally would be a task association for "always run after", but Gradle
// does not yet have that (mustRunAfter is very different semantic, finalizedBy is closer but
// will run even if the first task fails). The initial attempt here fell into the "maven" trap
// of trying to run a dependent task by attaching it to a task know to run after the we want to run after;
// which is a situation tailored made for Task.doLast
// 2) would be better to allow specifying which SourceSet to apply this to. For example, in the Hibernate
// build itself, this would be best applied to the 'test' sourceSet; though generally speaking the
// 'main' sourceSet is more appropriate
// for now, we'll just:
// 1) use a EnhancerTask + finalizedBy
// 2) apply to main sourceSet
EnhancerTask enhancerTask = project.getTasks().create( ENHANCE_TASK_NAME, EnhancerTask.class );
enhancerTask.setGroup( BasePlugin.BUILD_GROUP );
// connect up the task in the task dependency graph
Task classesTask = project.getTasks().getByName( JavaPlugin.CLASSES_TASK_NAME );
enhancerTask.dependsOn( classesTask );
classesTask.finalizedBy( enhancerTask );
}
}

View File

@ -1 +0,0 @@
implementation-class=org.hibernate.bytecode.enhance.plugins.EnhancePlugin

View File

@ -0,0 +1 @@
implementation-class=org.hibernate.tooling.gradle.HibernatePlugin

View File

@ -55,7 +55,7 @@ import org.apache.maven.plugins.annotations.Parameter;
* @author Jeremy Whiting * @author Jeremy Whiting
*/ */
@Mojo(name = "enhance") @Mojo(name = "enhance")
public class MavenEnhancePlugin extends AbstractMojo { public class HibernateEnhancementMojo extends AbstractMojo {
/** /**
* The contexts to use during enhancement. * The contexts to use during enhancement.

View File

@ -11,7 +11,7 @@ include 'hibernate-proxool'
include 'hibernate-ehcache' include 'hibernate-ehcache'
include 'hibernate-infinispan' include 'hibernate-infinispan'
include 'hibernate-gradle-plugin' include 'hibernate-gradle-plugin'
include 'enhance-maven-plugin' include 'hibernate-maven-plugin'
include 'documentation' include 'documentation'
include 'release' include 'release'