Author: mfortun Date: 2011-07-08 16:47:15 +0200 (Fri, 08 Jul 2011) New Revision: 1071 Url: http://nuiton.org/repositories/revision/wikitty/1071 Log: * Abstract class for decoratedClass usefull for pubtext compiled * compile helper used from isisfish * base for custome class loader * scripted pub text handle Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/AbstractDecoredClass.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/CompileHelper.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationClassLoader.java Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationExternalize.java Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/AbstractDecoredClass.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/AbstractDecoredClass.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/AbstractDecoredClass.java 2011-07-08 14:47:15 UTC (rev 1071) @@ -0,0 +1,11 @@ +package org.nuiton.wikitty.publication.externalize; + +import java.util.Map; + +public abstract class AbstractDecoredClass { + + + public abstract Object eval(Map<String, Object> bindings) throws Exception ; + + +} Property changes on: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/AbstractDecoredClass.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/CompileHelper.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/CompileHelper.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/CompileHelper.java 2011-07-08 14:47:15 UTC (rev 1071) @@ -0,0 +1,241 @@ +package org.nuiton.wikitty.publication.externalize; + + + +import static org.nuiton.i18n.I18n._; + + +import java.io.File; +import java.io.PrintWriter; + +import java.net.URL; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.FileUtil; + +import com.sun.tools.javac.api.JavacTool; + + +/** + * Class reuse from the isis fish project. + * + * + * Compile helper used to compile Java code. + * + * JDK must be installed to use compilation. + * (JRE won't work). + * + * Created: 12 janv. 2006 15:29:53 + * + * @author poussin + * @version $Revision: 3124 $ + * + * Last update: $Date: 2010-11-29 19:14:09 +0100 (lun. 29 nov. 2010) $ + * by : $Author: chatellier $ + */ +public class CompileHelper { + + /** Logger for this class. */ + private static final Log log = LogFactory.getLog(CompileHelper.class); + + + /** + * Recherche tous les fichiers qui un source plus recent que la version compilé. + * + * @param srcDir + * @param destDir + * @return File list + */ + public static List<File> searchSrcToCompile(File srcDir, File destDir) { + List<File> result = new ArrayList<File>(); + for (File src : srcDir.listFiles()) { + File dest = new File(FileUtil.basename(src, ".java"), ".class"); + if (src.getName().endsWith(".java") && FileUtil.isNewer(src, dest)) { + result.add(src); + } + } + return result; + } + + + + + + + /** + * Methode permettant de compiler un fichier Java. + * + * @param rootSrc le répertoire ou se trouve les sources + * @param src Le fichier source a compiler, il doit etre dans un sous + * répertoire de rootSrc en fonction du package + * @param dest le repertoire destination de la compilation + * @param out l'objet sur lequel on ecrit la sortie (erreur) de la + * compilation + * @return un nombre different de 0 s'il y a une erreur + * <li> -1000 si l'exception vient de la recherche du compilateur par + * introspection + * <li> -10000 si une autre exception + * <li> sinon les valeurs retourné par le compilateur java + */ + public static int compile(File rootSrc, File src, File dest, PrintWriter out) { + int result = compile(rootSrc, Collections.singletonList(src), dest, out); + return result; + } + + /** + * Methode permettant de compiler un ensemble de fichiers Java. + * + * @param rootSrc le répertoire ou se trouve les sources + * @param src Le fichier source a compiler, il doit etre dans un sous + * répertoire de rootSrc en fonction du package + * @param dest le repertoire destination de la compilation + * @param out l'objet sur lequel on ecrit la sortie (erreur) de la + * compilation + * @return un nombre different de 0 s'il y a une erreur + * <li> -1000 si l'exception vient de la recherche du compilateur par + * introspection + * <li> -10000 si une autre exception + * <li> sinon les valeurs retourné par le compilateur java + */ + public static int compile(File rootSrc, Collection<File> src, File dest, + PrintWriter out) { + int result = -10000; + try { + List<File> classpath = new ArrayList<File>(); + classpath.add(rootSrc.getAbsoluteFile()); + + result = compile(classpath, src, dest, out); + } catch (Exception eee) { + if (log.isWarnEnabled()) { + log.warn("Compilation failed", eee); + } + } + return result; + } + + /** + * Compile un fichier java. + * + * @param src les fichiers java source + * @param dest le repertoire destination + */ + protected static int compile(List<File> classpath, Collection<File> src, + File dest, PrintWriter out) { + dest.mkdirs(); + + int result = -1000; + try { + JavaCompiler compiler = JavacTool.create(); + // Use system compiler + // JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + StandardJavaFileManager fileManager = compiler + .getStandardFileManager(null, null, null); + Iterable<? extends JavaFileObject> compilationUnits = fileManager + .getJavaFileObjectsFromFiles(src); + + // Options de compilations + String classpathAsString = getClassPathAsString(classpath); + List<String> args = new ArrayList<String>(); + args.add("-g"); + // Show a description of each use or override of a deprecated member or class. + args.add("-deprecation"); + args.add("-classpath"); + args.add(classpathAsString); + args.add("-d"); + args.add(dest.getAbsolutePath()); + + // Compilation + boolean b = compiler.getTask(out, fileManager, null, args, null, + compilationUnits).call(); + // on retourne 0 si tout s'est bien déroulé et -1 sinon + result = b ? 0 : -1; + + fileManager.close(); + } catch (Exception eee) { + if (log.isWarnEnabled()) { + log.warn("Can't get compiler", eee); + } + } + return result; + } + + /** + * Return full classpath (for compilation or javadoc) as string. + * Separated by {@link File#pathSeparator}. + * + * Add : + * <ul> + * <li>System.getProperty("java.class.path") + * <li>All first jar dependency (META-INF/MANIFEST.MF) + * </ul> + * @param classpath initial classpath + * @return classpath as string + * @throws Exception + */ + public static String getClassPathAsString(List<File> classpath) + throws Exception { + String result = StringUtils.join(classpath.iterator(), + File.pathSeparator); + + // chatellier : since 20090512 java.class.path in not added to + // classpath. + // result in duplicated entry or non normalised entry + // en compilation fail some times + //+ File.pathSeparator + System.getProperty("java.class.path"); + + // Ajout des jars + for (Enumeration<?> e = CompileHelper.class.getClassLoader() + .getResources("META-INF/MANIFEST.MF"); e.hasMoreElements();) { + URL url = (URL) e.nextElement(); + if (log.isDebugEnabled()) { + log.debug("Found manifest : " + url); + } + if ((url != null) && url.getFile().startsWith("file:/")) { + String jarName = url.getPath().substring(5, + url.getPath().indexOf("!")); + if (!result.contains(jarName)) { + result += File.pathSeparator + jarName; + } + } + } + + // chatellier : mais sous eclipse par exemple, on a besoin du classpath + // on test que le class path n'est pas un jar et qu'il n'apparait + // pas deja : + String systemClassPath = System.getProperty("java.class.path"); + String[] systemClassPathes = systemClassPath.split(File.pathSeparator); + for (String path : systemClassPathes) { + String absolutePath = new File(path).getCanonicalPath(); + if (!result.contains(absolutePath)) { + result += File.pathSeparator + absolutePath; + } + } + + if (log.isDebugEnabled()) { + log.debug("CLASSPATH : " + result); + } + + return result; + } + + + + + + + + + +} Property changes on: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/CompileHelper.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationClassLoader.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationClassLoader.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationClassLoader.java 2011-07-08 14:47:15 UTC (rev 1071) @@ -0,0 +1,15 @@ +package org.nuiton.wikitty.publication.externalize; + + +public class WikittyPublicationClassLoader extends ClassLoader { + + + public Class<?> addClass(String name, byte[] b ){ + int off = 0; + int len = b.length; + return super.defineClass(name, b, off, len); + } + + + +} Property changes on: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationClassLoader.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationExternalize.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationExternalize.java 2011-07-08 10:26:15 UTC (rev 1070) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationExternalize.java 2011-07-08 14:47:15 UTC (rev 1071) @@ -3,6 +3,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.PrintWriter; import java.util.List; import java.util.Set; import java.util.jar.JarEntry; @@ -10,10 +11,14 @@ import java.util.jar.JarOutputStream; import java.util.jar.Manifest; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; import org.nuiton.util.ApplicationConfig; import org.nuiton.util.ArgumentsParserException; import org.nuiton.util.FileUtil; +import org.nuiton.util.StringUtil; import org.nuiton.util.ZipUtil; +import org.nuiton.wikitty.ScriptEvaluator; import org.nuiton.wikitty.WikittyConfigOption; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.WikittyServiceFactory; @@ -24,12 +29,14 @@ import org.nuiton.wikitty.publication.entities.WikittyPubDataHelper; import org.nuiton.wikitty.publication.entities.WikittyPubText; import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper; +import org.nuiton.wikitty.publication.entities.WikittyPubTextImpl; import org.nuiton.wikitty.publication.synchro.PropertiesExtended; import org.nuiton.wikitty.publication.synchro.WikittyFileUtil; import org.nuiton.wikitty.publication.synchro.WikittyPublicationFileSystem; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.search.Search; +import org.nuiton.wikitty.search.operators.Element; /** * Entry point for the main externalize functionnality @@ -44,6 +51,9 @@ public static String VERSION_SUFFIX = ".version"; public static String EXTENSION_SUFFIX = ".extension"; + + public static String SOURCE_EXTENSION = ".java"; + public static String COMPILED_EXTENSION = ".class"; /* * Class don't have to be instantiate @@ -145,14 +155,35 @@ String content = WikittyPubTextHelper.getContent(wikit); + // TODO 2011-07-08 change this later or not, java source will be + // erase by the second file. + // Write original file wikittyFile = new File( tempDirectory.getAbsolutePath()+File.separator+ labelPath + name + "." + extension); wikittyFile.createNewFile(); FileUtil.writeString(wikittyFile,content ); + + WikittyPubText currentPubText= new WikittyPubTextImpl(wikit); + + File javaFile = new File(tempDirectory.getAbsolutePath()+File.separator+ + labelPath + name + SOURCE_EXTENSION); + javaFile.createNewFile(); + String codeClass = getCode(currentPubText); + FileUtil.writeString(javaFile, codeClass); + + File classDirectory = new File(tempDirectory.getAbsolutePath()+File.separator+ + labelPath );//+ name + COMPILED_EXTENSION); + //classFile.createNewFile(); + + PrintWriter writer = new PrintWriter(System.out); + // compile + CompileHelper.compile(tempDirectory, javaFile, classDirectory,writer ); + + // write properties idProperties.put(id, labelPath + name); metaProperties.put(id + EXTENSION_SUFFIX, @@ -218,4 +249,54 @@ + public static String getCode(WikittyPubText wikitty){ + String content =wikitty.getContent(); + String mimeType = wikitty.getMimeType(); + String className=wikitty.getName();//+"PublicationClass"; + String script=""; + String classContent = ""; + + //Set<String> labels = (Set<String>) wikitty.getField(WikittyLabel.EXT_WIKITTYLABEL, WikittyLabel.FIELD_WIKITTYLABEL_LABELS); + //classContent += "package org.nuiton.wikitty.publication;" ; + //classContent += "package "+ labels.toArray()[0].toString() +";"; + classContent += "import org.apache.commons.logging.Log;"; + classContent += "import org.apache.commons.logging.LogFactory;"; + classContent += "import org.nuiton.wikitty.ScriptEvaluator;"; + classContent += "import "+ AbstractDecoredClass.class.getName() + ";"; + classContent += "import java.util.*;"; + + classContent += "public class " + className + " extends " + AbstractDecoredClass.class.getSimpleName() + " {"; + + + classContent += "public Object eval(Map<String, Object> bindings ) throws Exception {"; + + + + + + if (mimeType!="java"){ + classContent += "Object result = null;"; + classContent += "String content = \""+StringEscapeUtils.escapeJava(content) +"\";"; + classContent += "String mimeType = \""+StringEscapeUtils.escapeJava(mimeType) +"\";"; + classContent += "String criteriaName= \""+ Element.ELT_ID+":"+wikitty.getWikittyId()+"\";"; + classContent +=" result = ScriptEvaluator.eval(null, criteriaName, content, mimeType, bindings);"; + classContent += "return result;"; + } else { + + } + + + + + classContent += "\n}\n}\n"; + + + + + return classContent; + } + + + + }