S4-66 Check that appClass extends App Patch by Aimee Cheng Project: http://git-wip-us.apache.org/repos/asf/incubator-s4/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-s4/commit/dd1da04c Tree: http://git-wip-us.apache.org/repos/asf/incubator-s4/tree/dd1da04c Diff: http://git-wip-us.apache.org/repos/asf/incubator-s4/diff/dd1da04c Branch: refs/heads/master Commit: dd1da04c7f52eb0181c5af804a3defe7b4a7400d Parents: 60a75a0 Author: Daniel Gómez Ferro Authored: Thu Mar 7 17:24:21 2013 +0100 Committer: Daniel Gómez Ferro Committed: Thu Mar 7 18:19:56 2013 +0100 ---------------------------------------------------------------------- .../src/main/java/org/apache/s4/tools/Deploy.java | 2 +- .../src/main/resources/templates/build.gradle | 46 +++++++------- 2 files changed, 24 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/dd1da04c/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java ---------------------------------------------------------------------- diff --git a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java index 9f9310c..1070e1c 100644 --- a/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java +++ b/subprojects/s4-tools/src/main/java/org/apache/s4/tools/Deploy.java @@ -79,7 +79,7 @@ public class Deploy extends S4ArgsBase { // it and won't use an S4R logger.info("No S4R path specified, nor build file specified: this assumes the app is in the classpath"); } else { - logger.error("You must specify an S4R file, a build file to create an S4R from, or an appClass that will be in the classpath"); + logger.error("You must specify an S4R file or an appClass that will be in the classpath"); System.exit(1); } http://git-wip-us.apache.org/repos/asf/incubator-s4/blob/dd1da04c/subprojects/s4-tools/src/main/resources/templates/build.gradle ---------------------------------------------------------------------- diff --git a/subprojects/s4-tools/src/main/resources/templates/build.gradle b/subprojects/s4-tools/src/main/resources/templates/build.gradle index 3a59f05..2651642 100644 --- a/subprojects/s4-tools/src/main/resources/templates/build.gradle +++ b/subprojects/s4-tools/src/main/resources/templates/build.gradle @@ -58,8 +58,8 @@ project.ext["libraries"] = [ // you always need the s4 libraries for building your app s4_base: 'org.apache.s4:s4-base:'+ s4Version, - s4_comm: 'org.apache.s4:s4-comm:'+s4Version, - s4_core: 'org.apache.s4:s4-core:'+s4Version + s4_comm: 'org.apache.s4:s4-comm:'+ s4Version, + s4_core: 'org.apache.s4:s4-core:'+ s4Version ] @@ -122,6 +122,7 @@ s4r << { appDependencies.each { File file -> println 'Adding to s4 archive: ' + file.name } configurations.archives.allArtifacts.files.each { println 'Adding to s4 archive: ' + it.name } + checkAppClass() } task cp << { @@ -136,27 +137,26 @@ task installS4R (type: Copy) { into s4AppInstallDir } -/* Parse source file to get the app classname so we can use it in the manifest. -* TODO: Use a real Java parser. (This is not skipping comments for example.) -*/ -def getAppClassname(file) { - def classname = "UNKNOWN" - def lines= file.readLines() - def packageName = "" - for(line in lines) { - - def pn = line =~ /.*package\s+([\w\.]+)\s*;.*/ - if(pn) { - packageName = pn[0][1] + "." - } - def an = line =~ /.*public\s+class\s+(\w+)\s+extends.+App.*\{/ - - if (an) { - classname = packageName + an[0][1] - println "Found app class name: " + classname - break - } +/*Check whether the defined appClass exists and extends App*/ +void checkAppClass() { + def loader = this.getClass().getClassLoader() + + def jardir = new File( project.libsDir.path,'lib' ) + def jars = jardir.listFiles().findAll { it.name.endsWith('.jar') } + jars.each { + loader.addURL(it.toURI().toURL()) } - classname + + def appJar = project.libsDir.path+"/app/"+"$project.name"+".jar" + loader.addURL(new URL("file://"+appJar)) + + def instance = Class.forName(appClassName, true, this.getClass().getClassLoader()).newInstance() + + if (!(instance.getClass().getSuperclass().getName() == 'org.apache.s4.core.App') ){ + println "App class " + appClassName + " does not extend org.apache.s4.core.App!" + System.exit(1) + } + } +