Author: mfortun Date: 2011-08-26 17:09:10 +0200 (Fri, 26 Aug 2011) New Revision: 1188 Url: http://nuiton.org/repositories/revision/wikitty/1188 Log: * allow dev to add new filters to transform for exemple text/html.javascript to text/javascript * add filters/support for html gui inside java as text/html.java Added: trunk/wikitty-publication/src/main/resources/filters-properties/ trunk/wikitty-publication/src/main/resources/filters-properties/README.txt trunk/wikitty-publication/src/main/resources/filters-properties/filters-default.properties trunk/wikitty-publication/src/main/resources/filters-properties/filters-java.properties 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/CodeDecorator.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/FilterOption.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java trunk/wikitty-publication/src/main/resources/mimetype.properties 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-26 09:15:04 UTC (rev 1187) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java 2011-08-26 15:09:10 UTC (rev 1188) @@ -1,10 +1,16 @@ package org.nuiton.wikitty.publication; +import java.io.File; +import java.io.FileFilter; import java.io.IOException; +import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; +import java.net.URL; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Properties; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; @@ -13,57 +19,131 @@ import org.nuiton.processor.Processor; import org.nuiton.processor.filters.GeneratorTemplatesFilter; import org.nuiton.processor.filters.GeneratorTemplatesFilterIn; +import org.nuiton.util.Resource; import org.nuiton.util.StringUtil; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.publication.entities.WikittyPubText; import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper; import org.nuiton.wikitty.search.operators.Element; +import temp.Mainer; + public class CodeDecorator { static private Log log = LogFactory.getLog(CodeDecorator.class); - + /* * Après le script engine le ui Code décorateur * * décorer à l'inverse en fait transformer du html en js qui contient du * html par exemple * - * regex for html end token need to add /n at the end - * "</[\\w\\d]*>" + * regex for html end token need to add /n at the end "</[\\w\\d]*>" */ - protected String DEFAULT_MIME_TYPE_RETURN = "text/html; charset=UTF-8"; - protected String MIME_SEP = "/"; + static protected String MIME_SEP = "/"; + static protected String filtersOptionDirName = "filters-properties/"; + static protected String filtersOptionDefault = "filters-default.properties"; + protected Map<String, FilterOption> filtersOptions; - static protected FilterOption defaultFilterOption; static { + + InputStream input = CodeDecorator.class.getResourceAsStream("/"+filtersOptionDirName + filtersOptionDefault); + + Properties mimeProps = new Properties(); + + try { + mimeProps.load(input); + + } catch (IOException e) { + // TODO mfortun-2011-08-16 Exception not really handled + if (log.isErrorEnabled()) { + log.error( + "Error while reading properties Fie that containt filters option mapping ", + e); + } + } + defaultFilterOption = new FilterOption(); - defaultFilterOption.setOpeningTemplate("var wp_result=\""); - defaultFilterOption.setWriteString("wp_result"); - defaultFilterOption.setStringDelim("\""); - defaultFilterOption.setConcatChar("+"); - defaultFilterOption.setEndingCar(";"); - defaultFilterOption.setClosingWriterChar(""); - defaultFilterOption.setOpeningWriterChar("+="); - defaultFilterOption.setClosingTemplate("\";"); - defaultFilterOption.setMimeType("application/javascript"); - - - + defaultFilterOption.setOpeningTemplate(mimeProps + .getProperty(FilterOption.OpeningTemplate)); + defaultFilterOption.setWriteString(mimeProps + .getProperty(FilterOption.WriteString)); + defaultFilterOption.setStringDelim(mimeProps + .getProperty(FilterOption.StringDelim)); + defaultFilterOption.setConcatChar(mimeProps + .getProperty(FilterOption.ConcatChar)); + defaultFilterOption.setEndingCar(mimeProps + .getProperty(FilterOption.EndingCar)); + defaultFilterOption.setClosingWriterChar(mimeProps + .getProperty(FilterOption.ClosingWriterChar)); + defaultFilterOption.setOpeningWriterChar(mimeProps + .getProperty(FilterOption.OpeningWriterChar)); + defaultFilterOption.setClosingTemplate(mimeProps + .getProperty(FilterOption.ClosingTemplate)); + defaultFilterOption.setMimeType(mimeProps + .getProperty(FilterOption.MimeType)); + defaultFilterOption.setKey(mimeProps.getProperty(FilterOption.Key)); + defaultFilterOption.setContentType(mimeProps + .getProperty(FilterOption.ContentType)); + } public CodeDecorator() { filtersOptions = new HashMap<String, FilterOption>(); - - // add basic value js and htmlp - filtersOptions.put("html.javascript", defaultFilterOption); + // add basic value js and htmlp + filtersOptions.put(defaultFilterOption.getKey(), defaultFilterOption); + try { + List<URL> urlsRessourceFilters = Resource.getResources( filtersOptionDirName +"filters-\\w*\\.properties", + Thread.currentThread().getContextClassLoader() + ); + ///"+filtersOptionDirName+"/filters-\\w*\\.properties" + + System.out.println(urlsRessourceFilters); + for (URL propFil : urlsRessourceFilters) { + + Properties props = new Properties(); + InputStream propsstrem = propFil.openStream(); + props.load(propsstrem); + + // parse properties + FilterOption option = new FilterOption(); + option.setOpeningTemplate(props + .getProperty(FilterOption.OpeningTemplate)); + option.setWriteString(props + .getProperty(FilterOption.WriteString)); + option.setStringDelim(props + .getProperty(FilterOption.StringDelim)); + option.setConcatChar(props.getProperty(FilterOption.ConcatChar)); + option.setEndingCar(props.getProperty(FilterOption.EndingCar)); + option.setClosingWriterChar(props + .getProperty(FilterOption.ClosingWriterChar)); + option.setOpeningWriterChar(props + .getProperty(FilterOption.OpeningWriterChar)); + option.setClosingTemplate(props + .getProperty(FilterOption.ClosingTemplate)); + option.setMimeType(props.getProperty(FilterOption.MimeType)); + option.setKey(props.getProperty(FilterOption.Key)); + option.setContentType(props + .getProperty(FilterOption.ContentType)); + + // addfilters options + filtersOptions.put(option.getKey(), option); + } + + } catch (IOException e) { + if (log.isErrorEnabled()) { + // TODO mfortun-2011-08-26 Exception simply handled + log.error("Error While reading filters option properties file", + e); + } + } } public Wikitty transformPubUIToPubText(Wikitty wikitty) throws IOException { @@ -106,7 +186,7 @@ // set default content result (override if wikitty content define it) decoredContent += WikittyPublicationConstant.CONTEXT_VAR - + ".setContentType(\"" + DEFAULT_MIME_TYPE_RETURN + "\")" + + ".setContentType(\"" + foption.getContentType() + "\")" + foption.getEndingCar(); Processor proc = new Processor(); @@ -142,28 +222,28 @@ return isMimeTypeUi(mime); } - public boolean isTransformationNeeded(WikittyPubText wikitty) { String mime = wikitty.getMimeType(); return isMimeTypeUi(mime); } - - public boolean isMimeTypeUi(String mime){ + public boolean isMimeTypeUi(String mime) { MimeTypePubHelper helper = new MimeTypePubHelper(); String mimeKeyOption = helper.pubUiMimeToConverterOption(mime); return filtersOptions.containsKey(mimeKeyOption); } + public boolean isDecorated(String string) { return filtersOptions.containsKey(string); - + } - - + /** * Use to transform wikittyPubText.content into compilable Java - * @param wikitty the wikitty pub text + * + * @param wikitty + * the wikitty pub text * @return the java code */ public String getCode(Wikitty wikitty) { @@ -200,7 +280,7 @@ classContent += "public Object eval(Map<String, Object> bindings ) throws Exception {"; - if (mimeType.equals(MimeTypePubHelper.JAVA_TYPE)){ + if (mimeType.equals(MimeTypePubHelper.JAVA_TYPE)) { /* * Iterate on element that must be in the context and write @@ -211,16 +291,17 @@ */ // contruct variables that can be used inside the java code. - - classContent += PublicationContext.class.getSimpleName()+" " - + WikittyPublicationConstant.CONTEXT_VAR - + " = (" +PublicationContext.class.getSimpleName()+ ") bindings.get(\"" + classContent += PublicationContext.class.getSimpleName() + " " + + WikittyPublicationConstant.CONTEXT_VAR + " = (" + + PublicationContext.class.getSimpleName() + + ") bindings.get(\"" + WikittyPublicationConstant.CONTEXT_VAR + "\");"; - classContent += EvalInterface.class.getSimpleName() +" " - + WikittyPublicationConstant.EVAL_VAR - + " = (" +EvalInterface.class.getSimpleName() + ") bindings.get(\"" + classContent += EvalInterface.class.getSimpleName() + " " + + WikittyPublicationConstant.EVAL_VAR + " = (" + + EvalInterface.class.getSimpleName() + ") bindings.get(\"" + WikittyPublicationConstant.EVAL_VAR + "\");"; - classContent += "String " + WikittyPublicationConstant.PAGE_NAME_VAR + classContent += "String " + + WikittyPublicationConstant.PAGE_NAME_VAR + " = (String) bindings.get(\"" + WikittyPublicationConstant.PAGE_NAME_VAR + "\");"; classContent += "List<String> " @@ -234,7 +315,8 @@ classContent += content; } else { - // TODO mfortun-2011-07-08 write a better "filter" must isolate specific + // 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 = \"" @@ -251,5 +333,13 @@ return classContent; } - + + public Map<String, FilterOption> getFiltersOptions() { + return filtersOptions; + } + + public void setFiltersOptions(Map<String, FilterOption> filtersOptions) { + this.filtersOptions = filtersOptions; + } + } Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/FilterOption.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/FilterOption.java 2011-08-26 09:15:04 UTC (rev 1187) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/FilterOption.java 2011-08-26 15:09:10 UTC (rev 1188) @@ -2,6 +2,22 @@ public class FilterOption { + + public static String OpeningTemplate = "OpeningTemplate"; + public static String WriteString = "WriteString"; + public static String StringDelim = "StringDelim"; + public static String ConcatChar = "ConcatChar"; + public static String EndingCar = "EndingCar"; + public static String ClosingWriterChar = "ClosingWriterChar"; + public static String OpeningWriterChar = "OpeningWriterChar"; + public static String ClosingTemplate = "ClosingTemplate"; + public static String MimeType = "MimeType"; + public static String Key = "Key"; + public static String ContentType = "ContentType"; + + + + protected String writeString; protected String stringDelim; protected String concatChar; @@ -10,7 +26,21 @@ protected String closingWriterChar; protected String closingTemplate; protected String mimeType; + protected String contentType; + protected String key; + public String getContentType() { + return contentType; + } + public void setContentType(String contentType) { + this.contentType = contentType; + } + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } public String getMimeType() { return mimeType; } 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-26 09:15:04 UTC (rev 1187) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java 2011-08-26 15:09:10 UTC (rev 1188) @@ -50,7 +50,7 @@ public class MimeTypePubHelper { static private Log log = LogFactory.getLog(MimeTypePubHelper.class); - + public static final String JAVA_TYPE = "text/java"; public static final String JAR_TYPE = "application/jar"; /** @@ -59,24 +59,21 @@ protected BidiMap bidiMap; // TODO mfortun-2011-08-05 change this, this is a hack // change this to a handler to have specific langage compiler as jython etc - protected List<String> compilable; + protected ScriptEngineManager manager; protected CodeDecorator decorator; - - static public String COMMON_MIME_SEP ="/"; - static public String PUBLICATION_MIME_SEP="."; - - static public String PREFIX_MIME_PUB_TEXT= "text"; - static public String MIME_PROPERTIE="mimetype.properties"; + + static public String COMMON_MIME_SEP = "/"; + static public String PUBLICATION_MIME_SEP = "."; + + static public String PREFIX_MIME_PUB_TEXT = "text"; + static public String MIME_PROPERTIE = "mimetype.properties"; /** - * match pub text that must be converted via ui decorateur - * text/\w*\.\w* - * as + * match pub text that must be converted via ui decorateur text/\w*\.\w* as * text/html.javascript */ static public String REGEX_PUB_TEXT_TRANSFORM = "text/\\w*\\.\\w*"; - /** * The default mime type */ @@ -84,44 +81,37 @@ public MimeTypePubHelper() { decorator = new CodeDecorator(); - compilable = new LinkedList<String>(); bidiMap = new DualHashBidiMap(); manager = ScriptEvaluator.getScriptEnginManager(null); - compilable.add(JAVA_TYPE); - - InputStream input = MimeTypePubHelper.class.getResourceAsStream("/mimetype.properties"); - + + InputStream input = MimeTypePubHelper.class + .getResourceAsStream("/mimetype.properties"); + Properties mimeProps = new Properties(); try { mimeProps.load(input); - + } catch (IOException e) { // TODO mfortun-2011-08-16 Exception not really handled - if (log.isErrorEnabled()){ - log.error("Error while reading properties Fie that containt mimetype mapping ", e ); + if (log.isErrorEnabled()) { + log.error( + "Error while reading properties Fie that containt mimetype mapping ", + e); } } - - - for ( Map.Entry<Object, Object> en : mimeProps.entrySet()){ + + for (Map.Entry<Object, Object> en : mimeProps.entrySet()) { bidiMap.put(en.getValue(), en.getKey()); } - + /* * - * si type commence par text alors -> pubtext - * si text/machin.truc ça veut dire qu'on doit le préprosesser - * avec le bon truc - * - * + * si type commence par text alors -> pubtext si text/machin.truc ça + * veut dire qu'on doit le préprosesser avec le bon truc */ - - + } - - - /** * Return the corresponding mime Type for an extension, default if not * recognized @@ -133,14 +123,11 @@ */ public String getExtensionForMime(String mime) { bidiMap = bidiMap.inverseBidiMap(); - String result = (String) bidiMap.get(mime); + String result = (String) bidiMap.get(mime); bidiMap = bidiMap.inverseBidiMap(); return result; } - - - /** * Return the corresponding mime Type for an extension, default if not * recognized @@ -169,60 +156,64 @@ */ public boolean isPubTextMime(String mimeType) { // will check if there is an engine for the mimetype - + boolean result; - + // check if mimetype startwith the PUbtext prefix result = mimeType.startsWith(PREFIX_MIME_PUB_TEXT); - + // if mimetype match the regex for wikitty pub text that must be // decorate by uidecorator, - if (mimeType.matches(REGEX_PUB_TEXT_TRANSFORM)){ + if (mimeType.matches(REGEX_PUB_TEXT_TRANSFORM)) { String[] mimeTab = StringUtil.split(mimeType, COMMON_MIME_SEP); // construct final mime of the script after transformation String originalMime = mimeTab[0]; - originalMime+=COMMON_MIME_SEP+StringUtil.split(mimeType,PUBLICATION_MIME_SEP)[1]; - - //check if there is an engine to execute final script - result = manager.getEngineByMimeType(originalMime)!=null; + originalMime += COMMON_MIME_SEP + + StringUtil.split(mimeType, PUBLICATION_MIME_SEP)[1]; + + // check if there is an engine to execute final script + result = manager.getEngineByMimeType(originalMime) != null + || originalMime.equals(JAVA_TYPE); // check if there rules to transform the script result = result && decorator.isDecorated(mimeTab[1]); } - + return result; } - - - public String pubUiMimeToConverterOption (String mime){ + + public String pubUiMimeToConverterOption(String mime) { String result = mime; - if (mime.matches(REGEX_PUB_TEXT_TRANSFORM)){ + if (mime.matches(REGEX_PUB_TEXT_TRANSFORM)) { result = StringUtil.split(mime, COMMON_MIME_SEP)[1]; } return result; } - - public String pubUiMimeToTargetMime (String mime){ + + public String pubUiMimeToTargetMime(String mime) { String result = mime; - if (mime.matches(REGEX_PUB_TEXT_TRANSFORM)){ + if (mime.matches(REGEX_PUB_TEXT_TRANSFORM)) { String[] mimeTab = StringUtil.split(mime, COMMON_MIME_SEP); // construct final mime of the script after transformation result = mimeTab[0]; - result += COMMON_MIME_SEP+StringUtil.split(mime,PUBLICATION_MIME_SEP)[1]; + result += COMMON_MIME_SEP + + StringUtil.split(mime, PUBLICATION_MIME_SEP)[1]; } return result; } - + /** - * used to check if a file have to be converted as a wikittyPubText - * with his extension similar to : - * <br>isPubTextMime(getMimeForExtension(extension))</br> - * @param extension the file extension + * used to check if a file have to be converted as a wikittyPubText with his + * extension similar to : <br> + * isPubTextMime(getMimeForExtension(extension))</br> + * + * @param extension + * the file extension * @return if the extension correspond to a wikittyPubText */ public boolean isPubTextExtension(String extension) { return isPubTextMime(getMimeForExtension(extension)); } - + /** * Add an entry in the map that store mapping between extension and * mimeType. @@ -233,7 +224,7 @@ public void addExtensionMime(String extension, String mime) { bidiMap.put(extension, mime); } - + public ScriptEngineManager getManager() { return manager; } @@ -242,11 +233,4 @@ this.manager = manager; } - - public boolean isReallyCompilable(String mimeType){ - return compilable.contains(mimeType); - } - - - } Added: trunk/wikitty-publication/src/main/resources/filters-properties/README.txt =================================================================== --- trunk/wikitty-publication/src/main/resources/filters-properties/README.txt (rev 0) +++ trunk/wikitty-publication/src/main/resources/filters-properties/README.txt 2011-08-26 15:09:10 UTC (rev 1188) @@ -0,0 +1,11 @@ +OpeningTemplate +WriteString +StringDelim +ConcatChar +EndingCar +ClosingWriterChar +OpeningWriterChar +ClosingTemplate +MimeType +Key +ContentType \ No newline at end of file Added: trunk/wikitty-publication/src/main/resources/filters-properties/filters-default.properties =================================================================== --- trunk/wikitty-publication/src/main/resources/filters-properties/filters-default.properties (rev 0) +++ trunk/wikitty-publication/src/main/resources/filters-properties/filters-default.properties 2011-08-26 15:09:10 UTC (rev 1188) @@ -0,0 +1,11 @@ +WriteString=wp_result +OpeningTemplate=var wp_result=" +StringDelim=" +ConcatChar=+ +EndingCar=; +ClosingWriterChar= +OpeningWriterChar=+= +ClosingTemplate="; +MimeType=application\/javascript +Key=html.javascript +ContentType=text\/html; charset=UTF-8 \ No newline at end of file Added: trunk/wikitty-publication/src/main/resources/filters-properties/filters-java.properties =================================================================== --- trunk/wikitty-publication/src/main/resources/filters-properties/filters-java.properties (rev 0) +++ trunk/wikitty-publication/src/main/resources/filters-properties/filters-java.properties 2011-08-26 15:09:10 UTC (rev 1188) @@ -0,0 +1,11 @@ +WriteString=wp_result +OpeningTemplate=String wp_result=" +StringDelim=" +ConcatChar=+ +EndingCar=; +ClosingWriterChar= +OpeningWriterChar=+= +ClosingTemplate="; return wp_result; +MimeType=text\/java +Key=html.java +ContentType=text\/html; charset=UTF-8 \ No newline at end of file Modified: trunk/wikitty-publication/src/main/resources/mimetype.properties =================================================================== --- trunk/wikitty-publication/src/main/resources/mimetype.properties 2011-08-26 09:15:04 UTC (rev 1187) +++ trunk/wikitty-publication/src/main/resources/mimetype.properties 2011-08-26 15:09:10 UTC (rev 1188) @@ -11,6 +11,7 @@ # for this mime type) text/javascript=wp text/html.javascript=htmljs +text/html.java=htmlja image/jpeg=jpg image/png=png text/java=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/PublicationActionEval.java 2011-08-26 09:15:04 UTC (rev 1187) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java 2011-08-26 15:09:10 UTC (rev 1188) @@ -161,7 +161,7 @@ classloader = new WikittyPublicationClassLoader(urls); // REALLY IMPORTANT put the classloader with the jarloaded - + Thread.currentThread().setContextClassLoader(classloader); doAction(this, getMandatoryArguments()); @@ -211,109 +211,8 @@ || WikittyPubTextHelper.getMimeType(w).equals( MimeTypePubHelper.JAVA_TYPE)) { - if (WikittyPubTextHelper.getMimeType(w).equals( - MimeTypePubHelper.JAVA_TYPE)) { - String name = WikittyPubTextHelper.getName(w); - if (!FileUtils.getTempDirectory().exists()) { - FileUtils.getTempDirectory().mkdir(); - } + result = evalJava(context, subContext, decorator, criteria, w); - File javaWikittyFile = new File(FileUtils - .getTempDirectory().getAbsolutePath() - + File.separator + JAVA_TEMP_DIR_NAME); - if (!javaWikittyFile.exists()) { - javaWikittyFile.mkdir(); - } - - String javaContent = decorator.getCode(w); - - String content = null; - try { - 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)) - || !clazzFile.exists()) { - javaFile.createNewFile(); - FileUtil.writeString(javaFile, javaContent); - - PrintWriter writer = new PrintWriter(System.out); - // compile - CompileHelper.compile(classPathSup, - javaWikittyFile, javaFile, javaWikittyFile, - writer); - } - - File classFile = new File( - javaWikittyFile.getAbsolutePath() - + File.separator + name + ".class"); - - byte[] wikittyByte = FileUtil.fileToByte(classFile); - - w.addExtension(WikittyPubTextCompiledImpl.extensionWikittyPubTextCompiled); - WikittyPubTextCompiledHelper - .setByteCode(w, wikittyByte); - } catch (Exception e) { - // TODO mfortun-2011-08-16 really handle exception - 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); - } 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(WikittyPublicationConstant.PAGE_NAME_VAR, - criteria.getName()); - bindings.put(WikittyPublicationConstant.CONTEXT_VAR, - context); - bindings.put(WikittyPublicationConstant.SUBCONTEXT_VAR, - subContext); - bindings.put(WikittyPublicationConstant.WIKITTY_VAR, w); - bindings.put(WikittyPublicationConstant.EVAL_VAR, this); - - 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 { log.debug("Check if transformed needed"); @@ -333,30 +232,41 @@ if (content == null) { result = getError(context); + } else { String mimetype = WikittyPubTextHelper.getMimeType(w); + // check if after decoration this is java + if (mimetype.equals(MimeTypePubHelper.JAVA_TYPE)) { + result = evalJava(context, subContext, decorator, + criteria, w); - // supprime de subcontext ce qui a ete utilise dans cette - // methode - subContext = new ArrayList<String>(subContext.subList(1, - subContext.size())); + } else { + // 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(WikittyPublicationConstant.PAGE_NAME_VAR, - criteria.getName()); - bindings.put(WikittyPublicationConstant.CONTEXT_VAR, - context); - bindings.put(WikittyPublicationConstant.SUBCONTEXT_VAR, - subContext); - bindings.put(WikittyPublicationConstant.WIKITTY_VAR, w); - bindings.put(WikittyPublicationConstant.EVAL_VAR, this); + Map<String, Object> bindings = new HashMap<String, Object>(); + bindings.put(WikittyPublicationConstant.PAGE_NAME_VAR, + criteria.getName()); + bindings.put(WikittyPublicationConstant.CONTEXT_VAR, + context); + bindings.put(WikittyPublicationConstant.SUBCONTEXT_VAR, + subContext); + bindings.put(WikittyPublicationConstant.WIKITTY_VAR, w); + bindings.put(WikittyPublicationConstant.EVAL_VAR, this); - // 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); + // 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); + } + } } } @@ -365,6 +275,117 @@ return result; } + /** + * Method to evaluate java kind of wikittyPubText + * @param context the context + * @param subContext the subcontex + * @param decorator instance codeDecorator + * @param criteria the criteria + * @param w the wikitty + * @return the result of wikittyPubText content evaluation + */ + protected Object evalJava(PublicationContext context, + List<String> subContext, CodeDecorator decorator, + Criteria criteria, Wikitty w) { + + Object result; + + if (WikittyPubTextHelper.getMimeType(w).equals( + MimeTypePubHelper.JAVA_TYPE)) { + String name = WikittyPubTextHelper.getName(w); + if (!FileUtils.getTempDirectory().exists()) { + FileUtils.getTempDirectory().mkdir(); + } + + File javaWikittyFile = new File(FileUtils.getTempDirectory() + .getAbsolutePath() + File.separator + JAVA_TEMP_DIR_NAME); + if (!javaWikittyFile.exists()) { + javaWikittyFile.mkdir(); + } + + String javaContent = decorator.getCode(w); + + String content = null; + try { + 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)) + || !clazzFile.exists()) { + javaFile.createNewFile(); + FileUtil.writeString(javaFile, javaContent); + + PrintWriter writer = new PrintWriter(System.out); + // compile + CompileHelper.compile(classPathSup, javaWikittyFile, + javaFile, javaWikittyFile, writer); + } + + File classFile = new File(javaWikittyFile.getAbsolutePath() + + File.separator + name + ".class"); + + byte[] wikittyByte = FileUtil.fileToByte(classFile); + + w.addExtension(WikittyPubTextCompiledImpl.extensionWikittyPubTextCompiled); + WikittyPubTextCompiledHelper.setByteCode(w, wikittyByte); + } catch (Exception e) { + // TODO mfortun-2011-08-16 really handle exception + 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); + } 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(WikittyPublicationConstant.PAGE_NAME_VAR, + criteria.getName()); + bindings.put(WikittyPublicationConstant.CONTEXT_VAR, context); + bindings.put(WikittyPublicationConstant.SUBCONTEXT_VAR, subContext); + bindings.put(WikittyPublicationConstant.WIKITTY_VAR, w); + bindings.put(WikittyPublicationConstant.EVAL_VAR, this); + + 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); + } + } + return result; + } + /* * (non-Javadoc) * @@ -497,7 +518,7 @@ @Override public String getArgument(String name) { - return getArgument(name, StringUtils.EMPTY); + return getArgument(name, StringUtils.EMPTY); } }
participants (1)
-
mfortun@users.nuiton.org