Author: mfortun Date: 2011-08-24 18:40:25 +0200 (Wed, 24 Aug 2011) New Revision: 1183 Url: http://nuiton.org/repositories/revision/wikitty/1183 Log: *important correction for eval action, now overide the classloader to add jars extract from the service (in the case of evaluate script langage) *add jars extract from the service to the compile classpath (in externalization and java evaluation Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.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/JarUtil.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationExternalize.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyServiceJarLoader.java Modified: 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 2011-08-24 14:21:09 UTC (rev 1182) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/CompileHelper.java 2011-08-24 16:40:25 UTC (rev 1183) @@ -76,11 +76,17 @@ * 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); + public static int compile(List<File> addToClassPath, File rootSrc, File src, File dest, PrintWriter out) { + int result = compile(addToClassPath, rootSrc, Collections.singletonList(src), dest, out); return result; } + public static int compile( File rootSrc, File src, File dest, PrintWriter out) { + int result = compile(null, rootSrc, Collections.singletonList(src), dest, out); + return result; + } + + /** * Methode permettant de compiler un ensemble de fichiers Java. * @@ -99,11 +105,14 @@ * 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, + public static int compile(List<File> addToClassPath, File rootSrc, Collection<File> src, File dest, PrintWriter out) { int result = -10000; try { List<File> classpath = new ArrayList<File>(); + if (addToClassPath!=null){ + classpath.addAll(addToClassPath); + } classpath.add(rootSrc.getAbsoluteFile()); result = compile(classpath, src, dest, out); Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/JarUtil.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/JarUtil.java 2011-08-24 14:21:09 UTC (rev 1182) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/JarUtil.java 2011-08-24 16:40:25 UTC (rev 1183) @@ -38,6 +38,15 @@ */ public class JarUtil { + public static FileFilter jarFilter = new FileFilter() { + @Override + public boolean accept(File pathname) { + return (!pathname.isDirectory())&&pathname.getName().endsWith(".jar"); + + } + }; + + /** Class logger. */ private static Log log = LogFactory.getLog(JarUtil.class); 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-08-24 14:21:09 UTC (rev 1182) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationExternalize.java 2011-08-24 16:40:25 UTC (rev 1183) @@ -3,9 +3,12 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.util.LinkedList; +import java.util.List; import java.util.Set; import java.util.jar.JarFile; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -45,6 +48,9 @@ static private Log log = LogFactory .getLog(WikittyPublicationExternalize.class); + + static public String JAR_CLASSPATH_DIR="jars"; + static public String TEMPORARY_FILE_NAME = "tempBeforeJar"; static public String DEFAULT_JAR_NAME = "pub-externalized"; @@ -159,6 +165,9 @@ * * metadata 18114-1811-181-18.version=1.0 18114-1811-181-18.exention=js */ + + List<File> classPathAdds = extractJarFromServiceForCompil(proxy); + for (Wikitty wikit : allWikittyOnFS) { if (!wikit.hasExtension(WikittyLabel.EXT_WIKITTYLABEL)) { // non usable wikitty @@ -216,7 +225,7 @@ PrintWriter writer = new PrintWriter(System.out); // compile - CompileHelper.compile(tempDirectory, javaFile, classDirectory, + CompileHelper.compile(classPathAdds,tempDirectory, javaFile, classDirectory, writer); // write properties @@ -281,6 +290,49 @@ * en jar et on va supprimer le dossier tempJar */ + + static protected List<File> extractJarFromServiceForCompil(WikittyProxy prox){ + List<File> result = new LinkedList<File>(); + + // check for temporaryn dir + if (!FileUtils.getTempDirectory().exists()) { + FileUtils.getTempDirectory().mkdir(); + } + + Search wikittyPubDataJarCrit = Search.query().eq( + WikittyPubData.FQ_FIELD_WIKITTYPUBDATA_MIMETYPE, + MimeTypePubHelper.JAR_TYPE); + + String jarRepoPath = FileUtils.getTempDirectory().getAbsolutePath() + + File.separator + JAR_CLASSPATH_DIR+"_"+WikittyPublicationSynchronize.class.getSimpleName(); + + File jarRepo = new File(jarRepoPath); + if (!jarRepo.exists()){ + jarRepo.mkdir(); + } + + result.add(jarRepo); + PagedResult<Wikitty> jardatas = prox.findAllByCriteria( + wikittyPubDataJarCrit.criteria()); + + for (Wikitty w : jardatas) { + String name = WikittyPubDataHelper.getName(w); + byte[] content = WikittyPubDataHelper.getContent(w); + File tempJar = new File(jarRepo.getAbsolutePath() + + File.separator + name + ".jar"); + try { + FileUtils.writeByteArrayToFile(tempJar, content); + result.add(tempJar); + } catch (IOException e) { + log.error("Error while writing jars for compile classpath",e); + // TODO Mfortun-2011-08-24- not really handled + } + } + + + + return result; + } } Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyServiceJarLoader.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyServiceJarLoader.java 2011-08-24 14:21:09 UTC (rev 1182) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyServiceJarLoader.java 2011-08-24 16:40:25 UTC (rev 1183) @@ -59,15 +59,6 @@ protected String dirLocation; protected String MD5; - protected FileFilter jarFilter = new FileFilter() { - @Override - public boolean accept(File pathname) { - return (!pathname.isDirectory())&&pathname.getName().endsWith(".jar"); - - } - }; - - protected Map<JarFile, WikittyPropertieIndex> index; protected MimeTypePubHelper mimeHelper; @@ -94,7 +85,7 @@ // initialise location File jarLocation = new File(dirLocation); //found jar - File[] jarFiles = jarLocation.listFiles(jarFilter); + File[] jarFiles = jarLocation.listFiles(JarUtil.jarFilter); // TODO mfortun-2011-08-18 BAD solution: need a notifier system // to allow service to rebuild his index Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java 2011-08-24 14:21:09 UTC (rev 1182) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java 2011-08-24 16:40:25 UTC (rev 1183) @@ -29,6 +29,7 @@ import org.nuiton.wikitty.publication.entities.WikittyPubTextCompiledImpl; import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper; import org.nuiton.wikitty.publication.externalize.CompileHelper; +import org.nuiton.wikitty.publication.externalize.JarUtil; import org.nuiton.wikitty.publication.externalize.WikittyPublicationClassLoader; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.PagedResult; @@ -46,6 +47,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -69,6 +71,7 @@ protected HttpServletRequest request; protected InputStream inputStream; protected WikittyPublicationClassLoader classloader; + protected List<File> classPathSup; @Override public void setServletResponse(HttpServletResponse arg0) { @@ -90,13 +93,12 @@ File jarRepo; File md5File; - Search wikittyPubDataJarCrit = Search - .query() - .eq(WikittyPubData.FQ_FIELD_WIKITTYPUBDATA_MIMETYPE, + Search wikittyPubDataJarCrit = Search.query().eq( + WikittyPubData.FQ_FIELD_WIKITTYPUBDATA_MIMETYPE, MimeTypePubHelper.JAR_TYPE); String jarRepoPath = FileUtils.getTempDirectory().getAbsolutePath() + File.separator + JAR_TEMP_DIR_NAME; - + // initialiser directory etc if context set if (contextApps != null) { // if application context is set sub dir @@ -114,7 +116,7 @@ jarRepo.mkdir(); } md5File.createNewFile(); - + String md5ref = FileUtil.readAsString(md5File); PagedResult<Wikitty> jardatas = getWikittyProxy().findAllByCriteria( @@ -138,10 +140,29 @@ } - // initialize classLoader + File[] jarFiles = jarRepo.listFiles(JarUtil.jarFilter); URL[] urls = new URL[1]; + classPathSup = new LinkedList<File>(); + classPathSup.add(jarRepo); urls[0] = jarRepo.toURI().toURL(); + if (jarFiles != null) { + urls = new URL[jarFiles.length + 1]; + int i = 0; + urls[i] = jarRepo.toURI().toURL(); + i++; + for (File fj : jarFiles) { + classPathSup.add(fj); + urls[i] = fj.toURI().toURL(); + i++; + } + } + + // initialize classLoader + classloader = new WikittyPublicationClassLoader(urls); + // REALLY IMPORTANT put the classloader with the jarloaded + + Thread.currentThread().setContextClassLoader(classloader); doAction(this, getMandatoryArguments()); @@ -211,20 +232,25 @@ File javaFile = new File( javaWikittyFile.getAbsolutePath() + File.separator + name + ".java"); + File clazzFile = new File( + javaWikittyFile.getAbsolutePath() + + File.separator + name + ".class"); if (javaFile.exists()) { content = FileUtil.readAsString(javaFile); } if (content == null || !StringUtil.encodeMD5(javaContent).equals( - StringUtil.encodeMD5(content))) { + StringUtil.encodeMD5(content)) + || !clazzFile.exists()) { javaFile.createNewFile(); FileUtil.writeString(javaFile, javaContent); PrintWriter writer = new PrintWriter(System.out); // compile - CompileHelper.compile(javaWikittyFile, javaFile, - javaWikittyFile, writer); + CompileHelper.compile(classPathSup, + javaWikittyFile, javaFile, javaWikittyFile, + writer); } File classFile = new File( @@ -328,6 +354,7 @@ // TODO mfortun-2011-08-08 construire un class path avec // des jar et les classes contenu dans wikitty publication + result = ScriptEvaluator.eval(classloader, criteria.getName(), content, mimetype, bindings); }