Author: mfortun Date: 2011-07-08 18:07:38 +0200 (Fri, 08 Jul 2011) New Revision: 1072 Url: http://nuiton.org/repositories/revision/wikitty/1072 Log: * Complete eval mechanism in eval action to handler compiled * Complete classloader Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionEval.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationClassLoader.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationExternalize.java Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionEval.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionEval.java 2011-07-08 14:47:15 UTC (rev 1071) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionEval.java 2011-07-08 16:07:38 UTC (rev 1072) @@ -21,7 +21,11 @@ import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.publication.WikittyPublicationConfig; import org.nuiton.wikitty.publication.entities.WikittyPubText; +import org.nuiton.wikitty.publication.entities.WikittyPubTextCompiled; +import org.nuiton.wikitty.publication.entities.WikittyPubTextCompiledHelper; import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper; +import org.nuiton.wikitty.publication.externalize.AbstractDecoredClass; +import org.nuiton.wikitty.publication.externalize.WikittyPublicationClassLoader; import org.nuiton.wikitty.search.Criteria; import com.opensymphony.xwork2.ActionContext; @@ -102,6 +106,46 @@ context.setContentType("text/plain"); result = String.format("no data found for criteria '%s'", criteria); + } else if (w + .hasExtension(WikittyPubTextCompiled.EXT_WIKITTYPUBTEXTCOMPILED)) { + + byte[] content = WikittyPubTextCompiledHelper.getByteCode(w); + if (content == null) { + result = getError(context); + } else { + + /* + * if wikitty pub text compiled we load the class corresponding + * to the byte code contained. + * And then invoke the eval method on it + */ + String name= WikittyPubTextHelper.getName(w); + + // supprime de subcontext ce qui a ete utilise dans cette + // methode + subContext = new ArrayList<String>(subContext.subList(1, + subContext.size())); + + Map<String, Object> bindings = new HashMap<String, Object>(); + bindings.put(PAGE_NAME_VAR, criteria.getName()); + bindings.put(CONTEXT_VAR, context); + bindings.put(SUBCONTEXT_VAR, subContext); + bindings.put(WIKITTY_VAR, w); + bindings.put(EVAL_VAR, this); + + WikittyPublicationClassLoader classloader = new WikittyPublicationClassLoader(); + + Class<? extends AbstractDecoredClass> clazz = (Class<? extends AbstractDecoredClass>) classloader.addClass(name, content); + + try { + result = clazz.newInstance().eval(bindings); + } catch (Exception e) { + // TODO Mfortun-2011-07-08 really handle exception + e.printStackTrace(); + result = getError(context); + } + } + } else { String content = WikittyPubTextHelper.getContent(w); @@ -181,7 +225,6 @@ this.inputStream = inputStream; } - @Override public HttpServletRequest getRequest() { return request; @@ -194,24 +237,23 @@ @Override public String getActionName() { - // TODO mfortun-2011-05-09 really needed ? + // TODO mfortun-2011-05-09 really needed ? throw new UnsupportedOperationException("not yet implemented"); // return null; } - - @Override public String makeUrl(String url) { String finalUrl = url; if (!finalUrl.startsWith("/")) { finalUrl = "/" + finalUrl; } - //TODO mforun-2011-05-09 rework on this method - - finalUrl = getRequest().getContextPath() + "/" + getArgument(CONTEXT_KEY, "") + finalUrl; - finalUrl = getResponse().encodeURL(finalUrl)+".action"; + // TODO mforun-2011-05-09 rework on this method + + finalUrl = getRequest().getContextPath() + "/" + + getArgument(CONTEXT_KEY, "") + finalUrl; + finalUrl = getResponse().encodeURL(finalUrl) + ".action"; if (log.isInfoEnabled()) { log.info(String.format("transforme url from '%s' to '%s'", url, finalUrl)); @@ -227,7 +269,7 @@ @Override public List<String> getMandatoryArguments() { - // TODO mfortun-2011-05-09 really needed ? + // TODO mfortun-2011-05-09 really needed ? throw new UnsupportedOperationException("not yet implemented"); // return null; @@ -235,7 +277,7 @@ @Override public Map<String, String> getArguments() { - // TODO mfortun-2011-05-09 really needed ? + // TODO mfortun-2011-05-09 really needed ? throw new UnsupportedOperationException("not yet implemented"); // return null; @@ -243,15 +285,12 @@ @Override public Map<String, byte[]> getArgumentFiles() { - // TODO mfortun-2011-05-09 really needed ? + // TODO mfortun-2011-05-09 really needed ? throw new UnsupportedOperationException("not yet implemented"); // return null; } - - - public String getContentType() { return contentType; } 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-07-08 14:47:15 UTC (rev 1071) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationClassLoader.java 2011-07-08 16:07:38 UTC (rev 1072) @@ -1,15 +1,16 @@ package org.nuiton.wikitty.publication.externalize; - public class WikittyPublicationClassLoader extends ClassLoader { - - public Class<?> addClass(String name, byte[] b ){ + public WikittyPublicationClassLoader() { + super(WikittyPublicationClassLoader.class.getClassLoader()); + } + + public Class<?> addClass(String name, byte[] b) { int off = 0; int len = b.length; + return super.defineClass(name, b, off, len); } - - - + } 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 14:47:15 UTC (rev 1071) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/externalize/WikittyPublicationExternalize.java 2011-07-08 16:07:38 UTC (rev 1072) @@ -1,24 +1,13 @@ package org.nuiton.wikitty.publication.externalize; 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; -import java.util.jar.JarFile; -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; @@ -273,7 +262,8 @@ - + // TODO mfortun-2011-07-08 write a better "filter" must isolate specific + // mime type that correspond to precompilable langague if (mimeType!="java"){ classContent += "Object result = null;"; classContent += "String content = \""+StringEscapeUtils.escapeJava(content) +"\";"; @@ -283,6 +273,16 @@ classContent += "return result;"; } else { + /* + * Iterate on element that must be in the context and write + * + * classContent = "+type+" "+name+" = bindings.get(\""+name+"\");"; + * + * ? + * + */ + classContent += content; + }
participants (1)
-
mfortun@users.nuiton.org