diff --git a/hibernate-gradle-plugin/build.gradle b/hibernate-gradle-plugin/hibernate-gradle-plugin.gradle similarity index 82% rename from hibernate-gradle-plugin/build.gradle rename to hibernate-gradle-plugin/hibernate-gradle-plugin.gradle index cb180bd5a3..3d576e8941 100644 --- a/hibernate-gradle-plugin/build.gradle +++ b/hibernate-gradle-plugin/hibernate-gradle-plugin.gradle @@ -30,9 +30,9 @@ repositories { } dependencies { - compile group: 'org.hibernate', name: 'hibernate-core', version: '4.2.2.Final' - compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.0.Draft-16' - compile group: 'org.javassist', name: 'javassist', version: '3.15.0-GA' + compile( project(':hibernate-core') ) + compile( libraries.jpa ) + compile( libraries.javassist ) compile gradleApi() compile localGroovy() } @@ -42,6 +42,6 @@ install { repositories.mavenInstaller { pom.groupId = 'org.hibernate' pom.artifactId = 'hibernate-gradle-plugin' - pom.version = '0.1' + pom.version = '1.0' } } diff --git a/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhancePlugin.java b/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhancePlugin.java index 1bbd0724e6..5ccbeacfbe 100644 --- a/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhancePlugin.java +++ b/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhancePlugin.java @@ -31,34 +31,30 @@ 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; -import org.hibernate.bytecode.enhance.plugins.EnhancePluginConvention; /** * This plugin will add Entity enhancement behaviour to the build lifecycle. * * @author Jeremy Whiting */ -public class EnhancePlugin implements Plugin { - +@SuppressWarnings("serial") +public class EnhancePlugin implements Plugin{ + public static final String ENHANCE_TASK_NAME = "enhance"; - public static final String PLUGIN_CONVENTION_NAME = "enhance"; - public static final String HAPPENS_BEFORE_ENHANCE_TASK_NAME = JavaPlugin.CLASSES_TASK_NAME; 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." ); - project.getConvention().getPlugins().put( PLUGIN_CONVENTION_NAME, new EnhancePluginConvention() ); configureTask( project ); - project.getLogger().debug( String.format( "DAG has been configured with enhance task dependent on [%s].", HAPPENS_BEFORE_ENHANCE_TASK_NAME ) ); + 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 - final Configuration config = enhanceTask.getProject().getConfigurations().getByName( JavaPlugin.COMPILE_CONFIGURATION_NAME ); Task classesTask = project.getTasks().getByName( JavaPlugin.CLASSES_TASK_NAME ); enhanceTask.dependsOn( classesTask ); - enhanceTask.mustRunAfter( HAPPENS_BEFORE_ENHANCE_TASK_NAME ); Task jarTask = project.getTasks().getByName( HAPPENS_AFTER_ENHANCE_TASK_NAME ); jarTask.dependsOn( enhanceTask ); diff --git a/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhancePluginConvention.groovy b/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhancePluginConvention.groovy deleted file mode 100644 index 7c29ede44a..0000000000 --- a/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhancePluginConvention.groovy +++ /dev/null @@ -1,46 +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 - -/** -* Convention object for plugin. -*/ -class EnhancePluginConvention { - - def contexts = [] - - public EnhancePluginConvention() { - contexts.add('org.hibernate.bytecode.enhance.contexts.AssociationReference') - } - - def add(final String fullyQualifiedClassName) { - contexts.add(fullyQualifiedClassName); - } - List getContexts() { - return contexts - } - def clear() { - contexts.clear(); - } -} diff --git a/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhanceTask.groovy b/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhanceTask.groovy index 5ba698fa43..4edbdb7f98 100644 --- a/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhanceTask.groovy +++ b/hibernate-gradle-plugin/src/main/groovy/org/hibernate/bytecode/enhance/plugins/EnhanceTask.groovy @@ -24,6 +24,7 @@ package org.hibernate.bytecode.enhance.plugins import org.hibernate.bytecode.enhance.spi.Enhancer +import org.hibernate.bytecode.enhance.spi.EnhancementContext import javassist.ClassPool import javassist.CtClass import javassist.CtField @@ -41,8 +42,10 @@ import org.gradle.api.file.FileTree * which to apply. * @author Jeremy Whiting */ -public class EnhanceTask extends DefaultTask { - +public class EnhanceTask extends DefaultTask implements EnhancementContext { + + private ClassLoader overridden + public EnhanceTask() { super() setDescription('Enhances Entity classes for efficient association referencing.') @@ -52,59 +55,96 @@ public class EnhanceTask extends DefaultTask { def enhance () { logger.info( 'enhance task started') ext.pool = new ClassPool(false) - EnhancePluginConvention convention = (EnhancePluginConvention)project.getConvention().getPlugins().get( EnhancePlugin.PLUGIN_CONVENTION_NAME) - convention.contexts.each( - { String context -> - ext.enhancer = new Enhancer(EnhanceTask.class.getClassLoader().loadClass(context).newInstance()) - FileTree tree = project.fileTree(dir: project.sourceSets.main.output.classesDir) - tree.include '**/*.class' - tree.each( - { File file -> - final byte[] enhancedBytecode; - InputStream is = null; - CtClass clas = null; + ext.enhancer = new Enhancer(this) + FileTree tree = project.fileTree(dir: project.sourceSets.main.output.classesDir) + tree.include '**/*.class' + tree.each( + { File file -> + final byte[] enhancedBytecode; + InputStream is = null; + CtClass clas = null; + try { + is = new FileInputStream(file.toString()) + clas =ext.pool.makeClass(is) + if (!clas.hasAnnotation(Entity.class)){ + logger.debug("Class $file not an annotated Entity class. skipping...") + } else { + enhancedBytecode = ext.enhancer.enhance( clas.getName(), clas.toBytecode() ); + } + } + catch (Exception e) { + logger.error( "Unable to enhance class [${file.toString()}]", e ) + return + } finally { try { - is = new FileInputStream(file.toString()) - clas =ext.pool.makeClass(is) - if (!clas.hasAnnotation(Entity.class)){ - logger.debug("Class $file not an annotated Entity class. skipping...") - } else { - enhancedBytecode = ext.enhancer.enhance( clas.getName(), clas.toBytecode() ); + if (null != is) is.close(); + } finally{} + } + if (null != enhancedBytecode){ + if ( file.delete() ) { + if ( ! file.createNewFile() ) { + logger.error( "Unable to recreate class file [" + clas.getName() + "]") } } - catch (Exception e) { - logger.error( "Unable to enhance class [${file.toString()}]", e ) - return - } finally { - try { - if (null != is) is.close(); - } finally{} + else { + logger.error( "Unable to delete class file [" + clas.getName() + "]") } - if (null != enhancedBytecode){ - if ( file.delete() ) { - if ( ! file.createNewFile() ) { - logger.error( "Unable to recreate class file [" + clas.getName() + "]") - } - } - else { - logger.error( "Unable to delete class file [" + clas.getName() + "]") - } - FileOutputStream outputStream = new FileOutputStream( file, false ) - try { - outputStream.write( enhancedBytecode ) - outputStream.flush() - } - finally { - try { - if (outputStream != null) outputStream.close() - clas.detach()//release memory - } - catch ( IOException ignore) { - } - } - } - }) + FileOutputStream outputStream = new FileOutputStream( file, false ) + try { + outputStream.write( enhancedBytecode ) + outputStream.flush() + } + finally { + try { + if (outputStream != null) outputStream.close() + clas.detach()//release memory + } + catch ( IOException ignore) { + } + } + } }) logger.info( 'enhance task finished') } + + public ClassLoader getLoadingClassLoader() { + if ( null == this.overridden ) { + return getClass().getClassLoader(); + } + else { + return this.overridden; + } + } + + public void setClassLoader(ClassLoader loader) { + this.overridden = loader; + } + + public boolean isEntityClass(CtClass classDescriptor) { + return true; + } + + public boolean hasLazyLoadableAttributes(CtClass classDescriptor) { + return true; + } + + public boolean isLazyLoadable(CtField field) { + return true; + } + + public boolean isCompositeClass(CtClass classDescriptor) { + return false; + } + public boolean doDirtyCheckingInline(CtClass classDescriptor) { + return false; + } + + public CtField[] order(CtField[] fields) { + // TODO: load ordering from configuration. + return fields; + } + + public boolean isPersistentField(CtField ctField) { + return !ctField.hasAnnotation( Transient.class ); + } } diff --git a/hibernate-gradle-plugin/src/main/java/org/hibernate/bytecode/enhance/contexts/AssociationReference.java b/hibernate-gradle-plugin/src/main/java/org/hibernate/bytecode/enhance/contexts/AssociationReference.java deleted file mode 100644 index 2668145c30..0000000000 --- a/hibernate-gradle-plugin/src/main/java/org/hibernate/bytecode/enhance/contexts/AssociationReference.java +++ /dev/null @@ -1,57 +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.contexts; - -import javassist.CtClass; -import javassist.CtField; - -public class AssociationReference extends BaseContext { - - private ClassLoader overridden; - - public ClassLoader getLoadingClassLoader() { - if ( null == this.overridden ) { - return getClass().getClassLoader(); - } - else { - return this.overridden; - } - } - - public void setClassLoader(ClassLoader loader) { - this.overridden = loader; - } - - public boolean isEntityClass(CtClass classDescriptor) { - return true; - } - - public boolean hasLazyLoadableAttributes(CtClass classDescriptor) { - return true; - } - - public boolean isLazyLoadable(CtField field) { - return true; - } -} diff --git a/hibernate-gradle-plugin/src/main/java/org/hibernate/bytecode/enhance/contexts/BaseContext.java b/hibernate-gradle-plugin/src/main/java/org/hibernate/bytecode/enhance/contexts/BaseContext.java deleted file mode 100644 index 8252fb8af8..0000000000 --- a/hibernate-gradle-plugin/src/main/java/org/hibernate/bytecode/enhance/contexts/BaseContext.java +++ /dev/null @@ -1,78 +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.contexts; - -import java.beans.Transient; - -import javassist.CtClass; -import javassist.CtField; - -import org.hibernate.bytecode.enhance.spi.EnhancementContext; - -abstract public class BaseContext implements EnhancementContext { - - private ClassLoader overridden; - - public ClassLoader getLoadingClassLoader() { - if ( null == this.overridden ) { - return getClass().getClassLoader(); - } - else { - return this.overridden; - } - } - - public void setClassLoader(ClassLoader loader) { - this.overridden = loader; - } - - public boolean isEntityClass(CtClass classDescriptor) { - return false; - } - - public boolean isCompositeClass(CtClass classDescriptor) { - return false; - } - - public boolean doDirtyCheckingInline(CtClass classDescriptor) { - return false; - } - - public boolean hasLazyLoadableAttributes(CtClass classDescriptor) { - return false; - } - - public boolean isLazyLoadable(CtField field) { - return false; - } - - public CtField[] order(CtField[] fields) { - // TODO: load ordering from configuration. - return fields; - } - - public boolean isPersistentField(CtField ctField) { - return !ctField.hasAnnotation( Transient.class ); - } -} diff --git a/settings.gradle b/settings.gradle index c6fb9085db..f1b3776792 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,6 +10,7 @@ include 'hibernate-proxool' include 'hibernate-ehcache' include 'hibernate-infinispan' +include 'hibernate-gradle-plugin' include 'documentation' include 'release'