Author: mfortun Date: 2011-08-16 16:26:22 +0200 (Tue, 16 Aug 2011) New Revision: 1158 Url: http://nuiton.org/repositories/revision/wikitty/1158 Log: *correct java handling for wikittyPubText *add classLoader handling: search for wikittyPubData that containt jar to add them inside classPath *correct code decoration for java pubText *relocate class Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/EvalInterface.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PublicationContext.java Removed: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationContext.java 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/PublicationBaseAction.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.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/CodeDecorator.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java 2011-08-16 10:17:42 UTC (rev 1157) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java 2011-08-16 14:26:22 UTC (rev 1158) @@ -192,7 +192,7 @@ classContent += "import " + AbstractDecoredClass.class.getName() + ";"; classContent += "import org.nuiton.wikitty.entities.*;"; classContent += "import org.nuiton.wikitty.publication.entities.*;"; - classContent += "import org.nuiton.wikitty.publication.action.*;"; + classContent += "import org.nuiton.wikitty.publication.*;"; classContent += "import java.util.*;"; classContent += "public class " + className + " extends " @@ -200,18 +200,6 @@ classContent += "public Object eval(Map<String, Object> bindings ) throws Exception {"; - // TODO mfortun-2011-07-08 write a better "filter" must isolate specific - // mime type that correspond to precompilable langague - classContent += "Object result = null;"; - classContent += "String content = \"" - + StringEscapeUtils.escapeJava(content) + "\";"; - classContent += "String mimeType = \"" - + StringEscapeUtils.escapeJava(mimeType) + "\";"; - classContent += "String criteriaName= \"" + Element.ELT_ID + ":" - + wikitty.getId() + "\";"; - classContent += " result = ScriptEvaluator.eval(null, criteriaName, content, mimeType, bindings);"; - classContent += "return result;"; - if (mimeType.equals(MimeTypePubHelper.JAVA_TYPE)){ /* @@ -222,27 +210,41 @@ * ? */ // contruct variables that can be used inside the java code. - classContent = "PublicationContext " + + + classContent += PublicationContext.class.getSimpleName()+" " + WikittyPublicationConstant.CONTEXT_VAR - + " = bindings.get(\"" + + " = (" +PublicationContext.class.getSimpleName()+ ") bindings.get(\"" + WikittyPublicationConstant.CONTEXT_VAR + "\");"; - classContent = "WikittyPublicationConstant " + classContent += EvalInterface.class.getSimpleName() +" " + WikittyPublicationConstant.EVAL_VAR - + " = bindings.get(\"" + + " = (" +EvalInterface.class.getSimpleName() + ") bindings.get(\"" + WikittyPublicationConstant.EVAL_VAR + "\");"; - classContent = "String " + WikittyPublicationConstant.PAGE_NAME_VAR - + " = bindings.get(\"" + classContent += "String " + WikittyPublicationConstant.PAGE_NAME_VAR + + " = (String) bindings.get(\"" + WikittyPublicationConstant.PAGE_NAME_VAR + "\");"; - classContent = "List<String> " + classContent += "List<String> " + WikittyPublicationConstant.SUBCONTEXT_VAR - + " = bindings.get(\"" + + " = (List<String>) bindings.get(\"" + WikittyPublicationConstant.SUBCONTEXT_VAR + "\");"; - classContent = "Wikitty " + WikittyPublicationConstant.WIKITTY_VAR - + " = bindings.get(\"" + classContent += "Wikitty " + WikittyPublicationConstant.WIKITTY_VAR + + " = (Wikitty) bindings.get(\"" + WikittyPublicationConstant.WIKITTY_VAR + "\");"; classContent += content; + } else { + // TODO mfortun-2011-07-08 write a better "filter" must isolate specific + // mime type that correspond to precompilable langague + classContent += "Object result = null;"; + classContent += "String content = \"" + + StringEscapeUtils.escapeJava(content) + "\";"; + classContent += "String mimeType = \"" + + StringEscapeUtils.escapeJava(mimeType) + "\";"; + classContent += "String criteriaName= \"" + Element.ELT_ID + ":" + + wikitty.getId() + "\";"; + classContent += " result = ScriptEvaluator.eval(null, criteriaName, content, mimeType, bindings);"; + classContent += "return result;"; } classContent += "\n}\n}\n"; Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/EvalInterface.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/EvalInterface.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/EvalInterface.java 2011-08-16 14:26:22 UTC (rev 1158) @@ -0,0 +1,14 @@ +package org.nuiton.wikitty.publication; + +import java.util.List; + + +public interface EvalInterface { + + public Object doAction(PublicationContext context, List<String> subContext); + + public Object doAction(PublicationContext context, String subContextAsText); + + public Object doAction(PublicationContext context); + +} \ No newline at end of file Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java 2011-08-16 10:17:42 UTC (rev 1157) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java 2011-08-16 14:26:22 UTC (rev 1158) @@ -52,6 +52,7 @@ static private Log log = LogFactory.getLog(MimeTypePubHelper.class); public static final String JAVA_TYPE = "text/java"; + public static final String JAR_TYPE = "application/jar"; /** * Mapping between extention and mime type, key: extension, value: mimeType */ Copied: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PublicationContext.java (from rev 1151, trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationContext.java) =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PublicationContext.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/PublicationContext.java 2011-08-16 14:26:22 UTC (rev 1158) @@ -0,0 +1,46 @@ +package org.nuiton.wikitty.publication; + +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.WikittyService; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * Interface for eval action. + * + * @author mfortun + * + */ +public interface PublicationContext { + + HttpServletRequest getRequest(); + + HttpServletResponse getResponse(); + + WikittyProxy getWikittyProxy(); + + /** + * add context to the url and parameter if necessary + * @param url + * @return + */ + String makeUrl(String url); + + WikittyService getWikittyService(); + + List<String> getMandatoryArguments(); + + String getArgument(String name, String defaultValue); + + String getContentType(); + + void setContentType(String contentType); + + String toString(); + + Map<String,String> getArguments(); + +} \ No newline at end of file Modified: 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 2011-08-16 10:17:42 UTC (rev 1157) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationClassLoader.java 2011-08-16 14:26:22 UTC (rev 1158) @@ -1,15 +1,20 @@ package org.nuiton.wikitty.publication.externalize; +import java.net.URL; +import java.net.URLClassLoader; + /** * A simple classloader extension to allow adding java class with bytecode * @author mfortun * */ -public class WikittyPublicationClassLoader extends ClassLoader { +public class WikittyPublicationClassLoader extends URLClassLoader { - public WikittyPublicationClassLoader() { - super(WikittyPublicationClassLoader.class.getClassLoader()); + public WikittyPublicationClassLoader(URL[] urls) { + super(urls,WikittyPublicationClassLoader.class.getClassLoader()); + + } @@ -27,6 +32,7 @@ } + /* * Réutiliser cette classe pour la création du class loader pour wikitty publication * 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-16 10:17:42 UTC (rev 1157) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java 2011-08-16 14:26:22 UTC (rev 1158) @@ -3,6 +3,7 @@ import com.opensymphony.xwork2.ActionContext; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.interceptor.ServletRequestAware; @@ -13,9 +14,12 @@ import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.WikittyService; import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyLabel; import org.nuiton.wikitty.publication.AbstractDecoredClass; import org.nuiton.wikitty.publication.CodeDecorator; +import org.nuiton.wikitty.publication.EvalInterface; import org.nuiton.wikitty.publication.MimeTypePubHelper; +import org.nuiton.wikitty.publication.PublicationContext; import org.nuiton.wikitty.publication.WikittyPublicationConstant; import org.nuiton.wikitty.publication.entities.WikittyPubData; import org.nuiton.wikitty.publication.entities.WikittyPubDataHelper; @@ -27,6 +31,8 @@ import org.nuiton.wikitty.publication.externalize.CompileHelper; import org.nuiton.wikitty.publication.externalize.WikittyPublicationClassLoader; import org.nuiton.wikitty.search.Criteria; +import org.nuiton.wikitty.search.PagedResult; +import org.nuiton.wikitty.search.Search; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -35,6 +41,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; +import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -43,7 +50,8 @@ import java.util.Map; public class PublicationActionEval extends PublicationBaseAction implements - ServletResponseAware, ServletRequestAware, PublicationContext { + ServletResponseAware, ServletRequestAware, PublicationContext, + EvalInterface { /** * @@ -53,13 +61,14 @@ static private Log log = LogFactory.getLog(PublicationActionEval.class); static protected String JAVA_TEMP_DIR_NAME = "PublicationJavaEvalDir"; - static protected String JAR_TEMP_DIR_NAME= "PublicationJarRepository"; + static protected String JAR_TEMP_DIR_NAME = "PublicationJarRepository"; static protected String MD5_FILE = "JarMD5"; - + protected String contentType; protected HttpServletResponse response; protected HttpServletRequest request; protected InputStream inputStream; + protected WikittyPublicationClassLoader classloader; @Override public void setServletResponse(HttpServletResponse arg0) { @@ -74,17 +83,85 @@ @Override public String execute() throws Exception { - doAction(this,getMandatoryArguments()); + // check for temporaryn dir + if (!FileUtils.getTempDirectory().exists()) { + FileUtils.getTempDirectory().mkdir(); + } + File jarRepo; + File md5File; + Search wikittyPubDataJarCrit = Search + .query() + .eq(WikittyPubData.FQ_FIELD_WIKITTYPUBDATA_MIMETYPE, + MimeTypePubHelper.JAR_TYPE); + String jarRepoPath = FileUtils.getTempDirectory().getAbsolutePath() + + File.separator + JAR_TEMP_DIR_NAME; + System.out.println(contextApps==null); + // initialiser directory etc if context set + if (contextApps != null) { + // if application context is set sub dir + jarRepoPath = jarRepoPath + File.separator + contextApps; + // and complete criteria + wikittyPubDataJarCrit.exteq(WikittyLabel.EXT_WIKITTYLABEL).sw( + WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, contextApps); + + } + jarRepo = new File(jarRepoPath + File.separator); + md5File = new File(jarRepo.getAbsolutePath() + File.separator + + MD5_FILE); + + if (!jarRepo.exists()) { + jarRepo.mkdir(); + } + md5File.createNewFile(); + + String md5ref = FileUtil.readAsString(md5File); + + PagedResult<Wikitty> jardatas = getWikittyProxy().findAllByCriteria( + wikittyPubDataJarCrit.criteria()); + String sumMd5 = StringUtils.EMPTY; + for (Wikitty w : jardatas) { + sumMd5 += w.getId(); + sumMd5 += w.getVersion(); + } + sumMd5 = StringUtil.encodeMD5(sumMd5); + + if (sumMd5.equals(md5ref)) { + FileUtil.writeString(md5File, sumMd5); + for (Wikitty w : jardatas) { + String name = WikittyPubDataHelper.getName(w); + byte[] content = WikittyPubDataHelper.getContent(w); + File tempJar = new File(jarRepo.getAbsolutePath() + + File.separator + name + ".jar"); + FileUtils.writeByteArrayToFile(tempJar, content); + } + + } + + // initialize classLoader + URL[] urls = new URL[1]; + urls[0] = jarRepo.toURI().toURL(); + classloader = new WikittyPublicationClassLoader(urls); + + doAction(this, getMandatoryArguments()); + return SUCCESS; } + /* + * (non-Javadoc) + * + * @see + * org.nuiton.wikitty.publication.ui.action.EvalInterface#doAction(org.nuiton + * .wikitty.publication.PublicationContext, java.util.List) + */ + @Override public Object doAction(PublicationContext context, List<String> subContext) { log.info("path " + subContext); Object result; CodeDecorator decorator = new CodeDecorator(); - + Criteria criteria = searchCriteria(subContext); if (criteria == null) { @@ -95,39 +172,40 @@ Wikitty w = proxy.findByCriteria(criteria); if (w == null || !w.hasExtension(WikittyPubText.EXT_WIKITTYPUBTEXT)) { - - if (w.hasExtension(WikittyPubData.EXT_WIKITTYPUBDATA)){ - + + if (w.hasExtension(WikittyPubData.EXT_WIKITTYPUBDATA)) { + contentType = WikittyPubDataHelper.getMimeType(w); - System.out.println(contentType); - - - - inputStream = new ByteArrayInputStream(WikittyPubDataHelper - .getContent(w)); + + inputStream = new ByteArrayInputStream( + WikittyPubDataHelper.getContent(w)); return WikittyPubDataHelper.getContent(w); } - + context.setContentType("text/plain"); result = String.format("no data found for criteria '%s'", criteria); } else if (w - .hasExtension(WikittyPubTextCompiled.EXT_WIKITTYPUBTEXTCOMPILED)|| WikittyPubTextHelper.getMimeType(w).equals(MimeTypePubHelper.JAVA_TYPE)) { + .hasExtension(WikittyPubTextCompiled.EXT_WIKITTYPUBTEXTCOMPILED) + || WikittyPubTextHelper.getMimeType(w).equals( + MimeTypePubHelper.JAVA_TYPE)) { - if (WikittyPubTextHelper.getMimeType(w).equals(MimeTypePubHelper.JAVA_TYPE)){ + if (WikittyPubTextHelper.getMimeType(w).equals( + MimeTypePubHelper.JAVA_TYPE)) { String name = WikittyPubTextHelper.getName(w); - if (! FileUtils.getTempDirectory().exists()){ + if (!FileUtils.getTempDirectory().exists()) { FileUtils.getTempDirectory().mkdir(); } - + File javaWikittyFile = new File(FileUtils .getTempDirectory().getAbsolutePath() + File.separator + JAVA_TEMP_DIR_NAME); - if ( !javaWikittyFile.exists()){ + if (!javaWikittyFile.exists()) { javaWikittyFile.mkdir(); } - + String javaContent = decorator.getCode(w); + String content = null; try { File javaFile = new File( @@ -136,7 +214,7 @@ if (javaFile.exists()) { content = FileUtil.readAsString(javaFile); - } + } if (content == null || !StringUtil.encodeMD5(javaContent).equals( StringUtil.encodeMD5(content))) { @@ -148,10 +226,11 @@ CompileHelper.compile(javaWikittyFile, javaFile, javaWikittyFile, writer); } - - - File classFile = new File (javaWikittyFile.getAbsolutePath()+File.separator+name+".class"); - + + File classFile = new File( + javaWikittyFile.getAbsolutePath() + + File.separator + name + ".class"); + byte[] wikittyByte = FileUtil.fileToByte(classFile); w.addExtension(WikittyPubTextCompiledImpl.extensionWikittyPubTextCompiled); @@ -159,23 +238,17 @@ .setByteCode(w, wikittyByte); } catch (Exception e) { // TODO mfortun-2011-08-16 really handle exception - if (log.isErrorEnabled()){ + if (log.isErrorEnabled()) { log.error( "Error while transforming wikittyPubText to wikittyPubTextCompiled wikitty:" + w, e); } - + result = getError(context); } } - - - - - - byte[] content = WikittyPubTextCompiledHelper.getByteCode(w); if (content == null) { result = getError(context); @@ -203,8 +276,6 @@ bindings.put(WikittyPublicationConstant.WIKITTY_VAR, w); bindings.put(WikittyPublicationConstant.EVAL_VAR, this); - WikittyPublicationClassLoader classloader = new WikittyPublicationClassLoader(); - Class<? extends AbstractDecoredClass> clazz = (Class<? extends AbstractDecoredClass>) classloader .addClass(name, content); @@ -257,8 +328,8 @@ // TODO mfortun-2011-08-08 construire un class path avec // des jar et les classes contenu dans wikitty publication - result = ScriptEvaluator.eval(null, criteria.getName(), - content, mimetype, bindings); + result = ScriptEvaluator.eval(classloader, + criteria.getName(), content, mimetype, bindings); } } } @@ -267,6 +338,14 @@ return result; } + /* + * (non-Javadoc) + * + * @see + * org.nuiton.wikitty.publication.ui.action.EvalInterface#doAction(org.nuiton + * .wikitty.publication.PublicationContext, java.lang.String) + */ + @Override public Object doAction(PublicationContext context, String subContextAsText) { Object result; if (subContextAsText == null || "".equals(subContextAsText)) { @@ -282,6 +361,14 @@ return result; } + /* + * (non-Javadoc) + * + * @see + * org.nuiton.wikitty.publication.ui.action.EvalInterface#doAction(org.nuiton + * .wikitty.publication.PublicationContext) + */ + @Override public Object doAction(PublicationContext context) { Object result; if (context.getMandatoryArguments().size() <= 0) { @@ -321,7 +408,6 @@ return request; } - @Override public String makeUrl(String url) { String finalUrl = url; Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationBaseAction.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationBaseAction.java 2011-08-16 10:17:42 UTC (rev 1157) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationBaseAction.java 2011-08-16 14:26:22 UTC (rev 1158) @@ -4,6 +4,7 @@ import org.apache.struts2.interceptor.SessionAware; import org.nuiton.web.struts2.BaseAction; import org.nuiton.wikitty.entities.WikittyLabel; +import org.nuiton.wikitty.publication.PublicationContext; import org.nuiton.wikitty.publication.entities.WikittyPubData; import org.nuiton.wikitty.publication.entities.WikittyPubText; import org.nuiton.wikitty.publication.ui.WikittyPublicationProxy; Deleted: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationContext.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationContext.java 2011-08-16 10:17:42 UTC (rev 1157) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationContext.java 2011-08-16 14:26:22 UTC (rev 1158) @@ -1,46 +0,0 @@ -package org.nuiton.wikitty.publication.ui.action; - -import org.nuiton.wikitty.WikittyProxy; -import org.nuiton.wikitty.WikittyService; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.List; -import java.util.Map; - -/** - * Interface for eval action. - * - * @author mfortun - * - */ -public interface PublicationContext { - - HttpServletRequest getRequest(); - - HttpServletResponse getResponse(); - - WikittyProxy getWikittyProxy(); - - /** - * add context to the url and parameter if necessary - * @param url - * @return - */ - String makeUrl(String url); - - WikittyService getWikittyService(); - - List<String> getMandatoryArguments(); - - String getArgument(String name, String defaultValue); - - String getContentType(); - - void setContentType(String contentType); - - String toString(); - - Map<String,String> getArguments(); - -} \ No newline at end of file