r1263 - in trunk: wikitty-publication/src/main/java/org/nuiton/wikitty/publication wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor wikitty-publication-ui/src/main/webapp/WEB-INF
Author: bpoussin Date: 2011-12-29 15:22:36 +0100 (Thu, 29 Dec 2011) New Revision: 1263 Url: http://nuiton.org/repositories/revision/wikitty/1263 Log: commit de wikitty publication avant de le retirer du build global. Car il faut le repenser/reecrire. Il n'utilise pas la reecriture de Storage et Indexer mais directement le WikittyService. Du coup on ne peut pas profiter du travail fait sur le InMemory (il faudrait faire un heritage et surcharge) Ce dernier commit contient les essaies (pas propre du tout) fait pour rendre generic les actions struts2 (fichier de mapping unique pour toutes les applications wikittyPublication) Added: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationResult.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/EvalInterceptor.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionCodeDecorator.java Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java trunk/wikitty-publication-ui/src/main/webapp/WEB-INF/decorators.xml trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java Copied: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionCodeDecorator.java (from rev 1227, trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java) =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionCodeDecorator.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionCodeDecorator.java 2011-12-29 14:22:36 UTC (rev 1263) @@ -0,0 +1,50 @@ +/* + * #%L + * Wikitty :: publication + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2010 - 2011 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ +package org.nuiton.wikitty.publication; + +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper; + + +/** + * This class is used to decorate wikitty pub text content with mime type + * text/java.action + * + * This content is java class code without need to add some other code + * + * + * @author mfortun + * + */ +public class ActionCodeDecorator extends CodeDecorator { + + @Override + public String getCode(Wikitty wikitty) { + String result = WikittyPubTextHelper.getContent(wikitty); + return result; + } + + +} 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-12-29 12:06:50 UTC (rev 1262) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/CodeDecorator.java 2011-12-29 14:22:36 UTC (rev 1263) @@ -273,7 +273,7 @@ /** * Use to transform wikittyPubText.content into compilable Java - * + * * @param wikitty * the wikitty pub text * @return the java code 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-12-29 12:06:50 UTC (rev 1262) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/MimeTypePubHelper.java 2011-12-29 14:22:36 UTC (rev 1263) @@ -52,6 +52,7 @@ static private Log log = LogFactory.getLog(MimeTypePubHelper.class); + public static final String ACTION_TYPE = "text/java.action"; public static final String JAVA_TYPE = "text/java"; public static final String JAR_TYPE = "application/jar"; /** Added: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationResult.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationResult.java (rev 0) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationResult.java 2011-12-29 14:22:36 UTC (rev 1263) @@ -0,0 +1,50 @@ +package org.nuiton.wikitty.publication.ui; + +import com.opensymphony.xwork2.ActionInvocation; +import java.io.File; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.struts2.ServletActionContext; +import org.apache.struts2.dispatcher.ServletDispatcherResult; +import org.nuiton.util.FileUtil; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class WikittyPublicationResult extends ServletDispatcherResult { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(WikittyPublicationResult.class); + private static final long serialVersionUID = 1L; + + private static final String JSP_DIR = "/WEB-INF/dynamic-jsp/"; + + @Override + public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { + // FIXME poussin 20110907 ecrire la jsp sur le disque au bonne endroit + // modifier finalLocation en fonction de cet endroit + HttpServletRequest request = ServletActionContext.getRequest(); + String path = request.getSession().getServletContext().getRealPath(JSP_DIR); + File jspdir = new File(path); + jspdir.mkdirs(); + File jsp = new File(jspdir, finalLocation + ".jsp"); + + String content = "<%@taglib prefix='s' uri='/struts-tags'%><html><body>Hello<form><s:textfield label='First' key='first' name='first' /></form></body></html>"; + + FileUtil.writeString(jsp, content); + + log.fatal(String.format("jsp file %s writed ", jsp)); + + finalLocation = JSP_DIR + finalLocation + ".jsp"; + + super.doExecute(finalLocation, invocation); + } + + +} 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-12-29 12:06:50 UTC (rev 1262) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java 2011-12-29 14:22:36 UTC (rev 1263) @@ -75,6 +75,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.nuiton.wikitty.publication.ActionCodeDecorator; /** * Java class @@ -86,6 +87,8 @@ ServletResponseAware, ServletRequestAware, PublicationContext, EvalInterface { + public static final String RESULT_ACTION = "action"; + /** * */ @@ -103,6 +106,8 @@ protected InputStream inputStream; protected WikittyPublicationClassLoader classloader; protected List<File> classPathSup; + /** nom de l'action utilisateur a executer */ + protected String nextAction; @Override public void setServletResponse(HttpServletResponse arg0) { @@ -115,8 +120,18 @@ } + public String getNextAction() { + return nextAction; + } + + public void setNextAction(String nextAction) { + this.nextAction = nextAction; + } + @Override public String execute() throws Exception { + String result = SUCCESS; + // extract jars from wikitty service URL[] urls = getJarsDependency(); @@ -130,12 +145,17 @@ // change class loader for action Thread.currentThread().setContextClassLoader(classloader); - doAction(this, getMandatoryArguments()); + Object resultObject = doAction(this, getMandatoryArguments()); + if (RESULT_ACTION.equals(resultObject)) { + result = RESULT_ACTION; + } + // restore class loader - Thread.currentThread().setContextClassLoader(oldClassLoader); +// Thread.currentThread().setContextClassLoader(oldClassLoader); - return SUCCESS; + log.fatal("Result eval is " + result); + return result; } /** @@ -271,6 +291,24 @@ context.setContentType("text/plain"); result = String.format("no data found for criteria '%s'", criteria); + } else if (WikittyPubTextHelper.getMimeType(w).equals( + MimeTypePubHelper.ACTION_TYPE)) { + + decorator = new ActionCodeDecorator(); + String name = WikittyPubTextHelper.getName(w); + byte[] content; + try { + content = compile(decorator, classPathSup, w); + classloader.addClass(name, content); + setNextAction(name); + result = RESULT_ACTION; + log.fatal(String.format("%s added in cl", name)); + } catch (IOException eee) { + log.debug("Error when processing the wikitty content"); + // TODO Mfortun-2011-07-28 really handle exception + eee.printStackTrace(); + result = getError(context); + } } else if (w .hasExtension(WikittyPubTextCompiled.EXT_WIKITTYPUBTEXTCOMPILED) || WikittyPubTextHelper.getMimeType(w).equals( @@ -339,6 +377,74 @@ } /** + * Compile wikitty.content if needed and add it in + * WikittyPubTextCompiled.byteCode in wikitty + * + * @param w + * @return + */ + protected byte[] compile(List<File> classPathSup, String name, String javaContent) throws IOException { + if (!FileUtils.getTempDirectory().exists()) { + FileUtils.getTempDirectory().mkdir(); + } + + File javaWikittyDir = new File(FileUtils.getTempDirectory() + .getAbsolutePath() + File.separator + JAVA_TEMP_DIR_NAME); + if (!javaWikittyDir.exists()) { + javaWikittyDir.mkdir(); + } + + // compile + File javaFile = new File(javaWikittyDir.getAbsolutePath() + + File.separator + name + ".java"); + File classFile = new File(javaWikittyDir.getAbsolutePath() + + File.separator + name + ".class"); + + String content = null; + if (javaFile.exists()) { + content = FileUtil.readAsString(javaFile); + } + // compile only if the content has change if java already on the + // FS + if (content == null + || !classFile.exists() + || !StringUtil.encodeMD5(javaContent).equals( + StringUtil.encodeMD5(content)) + ) { + javaFile.createNewFile(); + FileUtil.writeString(javaFile, javaContent); + + PrintWriter writer = new PrintWriter(System.out); + // compile + CompileHelper.compile(classPathSup, javaWikittyDir, + javaFile, javaWikittyDir, writer); + } + + byte[] wikittyByte = FileUtil.fileToByte(classFile); + return wikittyByte; + } + + /** + * Compile wikitty.content if needed and add it in + * WikittyPubTextCompiled.byteCode in wikitty + * + * @param w + * @return + */ + protected byte[] compile(CodeDecorator decorator, List<File> classPathSup, Wikitty w) throws IOException { + String name = WikittyPubTextHelper.getName(w); + // the java and the class are store insiede tmp directory + // add extension and attribut + + String content = decorator.getCode(w); + byte[] wikittyByte = compile(classPathSup, name, content); + + w.addExtension(WikittyPubTextCompiledImpl.extensionWikittyPubTextCompiled); + WikittyPubTextCompiledHelper.setByteCode(w, wikittyByte); + return wikittyByte; + } + + /** * Method to evaluate java kind of wikittyPubText * * @param context @@ -361,56 +467,11 @@ // if wikitty pub text with java, need to transform it as // wikitty pub text compiled with java class bytecode if (WikittyPubTextHelper.getMimeType(w).equals( - MimeTypePubHelper.JAVA_TYPE)) { - - String name = WikittyPubTextHelper.getName(w); - // the java and the class are store insiede tmp directory - 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(); - } - - // encapsulate java inside a class - String javaContent = decorator.getCode(w); - - String content = null; + MimeTypePubHelper.JAVA_TYPE) || + WikittyPubTextHelper.getMimeType(w).equals( + MimeTypePubHelper.ACTION_TYPE)) { try { - // compile - 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); - } - // compile only if the content has change if java already on the - // FS - 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); - // add extension and attribut - w.addExtension(WikittyPubTextCompiledImpl.extensionWikittyPubTextCompiled); - WikittyPubTextCompiledHelper.setByteCode(w, wikittyByte); + compile(decorator, classPathSup, w); } catch (Exception e) { // TODO mfortun-2011-08-16 really handle exception if (log.isErrorEnabled()) { Added: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/EvalInterceptor.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/EvalInterceptor.java (rev 0) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/EvalInterceptor.java 2011-12-29 14:22:36 UTC (rev 1263) @@ -0,0 +1,18 @@ +package org.nuiton.wikitty.publication.ui.interceptor; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class EvalInterceptor { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(EvalInterceptor.class); +} Modified: trunk/wikitty-publication-ui/src/main/webapp/WEB-INF/decorators.xml =================================================================== --- trunk/wikitty-publication-ui/src/main/webapp/WEB-INF/decorators.xml 2011-12-29 12:06:50 UTC (rev 1262) +++ trunk/wikitty-publication-ui/src/main/webapp/WEB-INF/decorators.xml 2011-12-29 14:22:36 UTC (rev 1263) @@ -31,7 +31,9 @@ <!-- Any urls that are excluded will never be decorated by Sitemesh --> <excludes> <pattern>/nodecorate/*</pattern> + <pattern>/fragment/*</pattern> <pattern>*/eval/*</pattern> + <pattern>/action/*</pattern> </excludes>
participants (1)
-
bpoussin@users.nuiton.org