Author: bpoussin Date: 2010-12-10 05:50:09 +0100 (Fri, 10 Dec 2010) New Revision: 592 Url: http://nuiton.org/repositories/revision/wikitty/592 Log: Evolution #1134: new wikitty-publication module - add upload file for binary type - simplified url - add more object in eval script context Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/AbstractActionOnWikitty.java Modified: trunk/pom.xml trunk/wikitty-publication/ trunk/wikitty-publication/pom.xml trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/AbstractAction.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEdit.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEval.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionRaw.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionView.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublicationContext.java trunk/wikitty-publication/src/main/resources/wikitty-publication-ws-default.properties trunk/wikitty-publication/src/main/webapp/WEB-INF/jsp/edit.jsp trunk/wikitty-publication/src/main/webapp/WEB-INF/jsp/view.jsp trunk/wikitty-publication/src/main/webapp/css/wikitty-publication.css trunk/wikitty-publication/src/main/xmi/wikitty-publication.zargo trunk/wikitty-publication/src/site/rst/wp-analyse.rst Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/pom.xml 2010-12-10 04:50:09 UTC (rev 592) @@ -44,6 +44,13 @@ <version>2.3.8</version> </dependency> + <!-- html form fileupload used in wikitty-publication --> + <dependency> + <groupId>commons-fileupload</groupId> + <artifactId>commons-fileupload</artifactId> + <version>1.2.1</version> + </dependency> + <!-- jetty servlet container used for hessian server --> <dependency> <groupId>org.eclipse.jetty</groupId> Property changes on: trunk/wikitty-publication ___________________________________________________________________ Added: svn:ignore + target Modified: trunk/wikitty-publication/pom.xml =================================================================== --- trunk/wikitty-publication/pom.xml 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/pom.xml 2010-12-10 04:50:09 UTC (rev 592) @@ -67,6 +67,11 @@ <artifactId>commons-lang</artifactId> </dependency> + <dependency> + <groupId>commons-fileupload</groupId> + <artifactId>commons-fileupload</artifactId> + </dependency> + </dependencies> <!-- ************************************************************* --> Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/AbstractAction.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/AbstractAction.java 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/AbstractAction.java 2010-12-10 04:50:09 UTC (rev 592) @@ -29,5 +29,4 @@ this.mapping = mapping; } - } Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/AbstractActionOnWikitty.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/AbstractActionOnWikitty.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/AbstractActionOnWikitty.java 2010-12-10 04:50:09 UTC (rev 592) @@ -0,0 +1,152 @@ +package org.nuiton.wikitty.publication; + + +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.wikitty.WikittyUtil; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyExtension; +import org.nuiton.wikitty.publication.entities.WikittyPubData; +import org.nuiton.wikitty.publication.entities.WikittyPubDataHelper; +import org.nuiton.wikitty.publication.entities.WikittyPubText; +import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper; +import org.nuiton.wikitty.search.Criteria; +import org.nuiton.wikitty.search.Search; + +/** + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public abstract class AbstractActionOnWikitty extends AbstractAction { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(AbstractActionOnWikitty.class); + + static final public int ARG_QUERY = 0; + static final public String ARG_MIMETYPE = "mimetype"; + static final public String ARG_CONTENT_FIELD = "contentField"; + static final public String SEARCH_SEPARATOR = ":"; + + abstract protected String getExampleUsage(); + + /** + * Recherche le type mime dont on a besoin. + * Par defaut recherche dans les arguments si on a dans l'ordre de preference + * <li> ARG_MIMETYPE + SEARCH_SEPARATOR + name + * (ex: mimetype:MyCommand.name:df=text/plain) + * <li> ARG_MIMETYPE + * (ex: mimetype=MyCommand.mimetype) + * <li> si w a l'extension WikittyPubText alors on prend la valeur du champs mimetype + * <li> si w a l'extension WikittyPubData alors on prend la valeur du champs mimetype + * <li> on retourne null + * + * @param context + * @param name la chaine utilise pour faire la recherche du wikitty + * @param w le wikitty trouve grace a name + * @return le mimetype ou null + */ + protected String getMimeType(WikittyPublicationContext context, + String name, Wikitty w) { + // looking for mimetype field + String mimetype = context.getArgument( + ARG_MIMETYPE + SEARCH_SEPARATOR + name, null); + if (mimetype == null) { + mimetype = context.getArgument(ARG_MIMETYPE, null); + } + if (mimetype != null) { + int i = mimetype.indexOf(WikittyUtil.FQ_FIELD_NAME_SEPARATOR); + if (i > 0) { // perhaps fully qualified field + String extName = WikittyExtension.extractExtensionName(mimetype); + String fieldName = WikittyExtension.extractFieldName(mimetype); + if (w.hasField(extName, fieldName)) { + // mimetype target field in wikitty + // replace with field value + mimetype = w.getFieldAsString(extName, fieldName); + } + } + } else if (w.hasExtension(WikittyPubText.EXT_WIKITTYPUBTEXT)) { + mimetype = WikittyPubTextHelper.getMimeType(w); + } else if (w.hasExtension(WikittyPubData.EXT_WIKITTYPUBDATA)) { + mimetype = WikittyPubDataHelper.getMimeType(w); + } + return mimetype; + } + + /** + * Retourne le critere pour recherche l'objet sur lequel faire l'action. + * Le nom du critere doit etre convenablement positionné avec la chaine + * qui a permit la recherche + * + * @param context + * @return + */ + protected Criteria searchCriteria(List<String> subContext) { + Criteria result; + if (subContext.size() <= 0) { + result = null; + } else { + String searchString = subContext.get(ARG_QUERY); + if (searchString.contains(SEARCH_SEPARATOR)) { + // on a un field=value + String[] arg = searchString.split(SEARCH_SEPARATOR); + result = Search.query().eq(arg[0], arg[1]).criteria(searchString); + } else { + // on a pas le champs, alors par defaut on recherche dans + // WikittyPubText.name et WikittyPubData.name + result = Search.query().or() + .eq(WikittyPubText.FQ_FIELD_WIKITTYPUBTEXT_NAME, searchString) + .eq(WikittyPubData.FQ_FIELD_WIKITTYPUBDATA_NAME, searchString) + .criteria(searchString); + } + } + return result; + } + + /** + * Recherche le champs contenant le content dont on a besoin. + * Par defaut recherche dans les arguments si on a dans l'ordre de preference + * <li> ARG_CONTENT_FIELD + SEARCH_SEPARATOR + name + * (ex: contentField:MyCommand.name:df=MyCommand.script) + * <li> ARG_CONTENT_FIELD + * (ex: contentField=MyCommand.script) + * <li> si w a l'extension WikittyPubText alors on prend le champs content + * <li> si w a l'extension WikittyPubData alors on prend le champs content + * <li> on retourne null + * + * @param context + * @param name la chaine utilise pour faire la recherche du wikitty + * @param w le wikitty trouve grace a name + * @return le champs contenant le content ou null + */ + protected String getContentFieldName(WikittyPublicationContext context, + String name, Wikitty w) { + String contentField = context.getArgument( + ARG_CONTENT_FIELD + SEARCH_SEPARATOR + name, null); + if (contentField == null) { + contentField = context.getArgument(ARG_CONTENT_FIELD, null); + } + if (contentField == null) { + if (w.hasExtension(WikittyPubText.EXT_WIKITTYPUBTEXT)) { + contentField = WikittyPubText.FQ_FIELD_WIKITTYPUBTEXT_CONTENT; + } else if (w.hasExtension(WikittyPubData.EXT_WIKITTYPUBDATA)) { + contentField = WikittyPubData.FQ_FIELD_WIKITTYPUBDATA_CONTENT; + } + } + return contentField; + } + + protected String getError(WikittyPublicationContext context) { + context.setContentType("text/html"); + String result = String.format( + "<h1>bad query %s</h1>" + + "Usage example" + + "<pre>%s</pre>", context.getRequest().getPathInfo(), getExampleUsage()); + return result; + } + +} Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEdit.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEdit.java 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEdit.java 2010-12-10 04:50:09 UTC (rev 592) @@ -1,15 +1,21 @@ package org.nuiton.wikitty.publication; +import java.util.HashMap; +import java.util.List; import java.util.Map; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.util.ApplicationConfig; import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyExtension; import org.nuiton.wikitty.entities.WikittyImpl; import org.nuiton.wikitty.search.Criteria; -import org.nuiton.wikitty.search.Search; import org.nuiton.wikitty.search.operators.Element; /** @@ -20,11 +26,17 @@ * Last update: $Date$ * by : $Author$ */ -public class ActionEdit extends AbstractAction { +public class ActionEdit extends AbstractActionOnWikitty { /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(ActionError.class); + static final protected String exampleUsage = + "edit/WikittyPubText.name=Wiki\n" + + "edit/Tuto\n" + + "edit/WikittyPubText.name=Tuto\n" + + "edit/Command.id=df\n"; + protected ApplicationConfig appConfig; public ActionEdit(ApplicationConfig appConfig) { @@ -33,33 +45,29 @@ @Override public Object doAction(WikittyPublicationContext context) { + String result; + Wikitty w; + WikittyProxy proxy = context.getWikittyProxy(); - String result = "no query"; - if (context.getMandatoryArguments().size() > 0) { - log.info("args " + context.getMandatoryArguments()); - String [] arg = context.getMandatoryArguments().get(0).split("="); - - Wikitty w; - switch (arg.length) { - case 0: - // new wikitty without extension and edit - w = new WikittyImpl(); - break; - case 1: - // new wikitty with one extension and edit - w = new WikittyImpl(); - WikittyExtension ext = proxy.restoreExtensionLastVersion(arg[0]); - if (ext != null) { - w.addExtension(ext); - } - break; - default: - // find and edit - Criteria criteria = Search.query().eq(arg[0], arg[1]).criteria(); - w = proxy.findByCriteria(criteria); + if (context.getArguments().containsKey("delete")) { + // on nous demande supprimer le wikitty, on l'efface et on + // affichera un wikitty vide + String id = context.getArguments().get("id"); + proxy.delete(id); + // apres un effacement on reprend l'edition d'un tout nouveau wikitty + w = new WikittyImpl(); + } else { + // recherche du Wikitty a editer ou creation d'un nouveau si necessaire + Criteria criteria = searchCriteria(context.getMandatoryArguments()); + if (criteria == null) { + w = new WikittyImpl(); + } else { + w = proxy.findByCriteria(criteria); } + // si on ne retrouve pas le wikitty, mais qu'il vient d'etre cree + // pour l'edition, on recree un wikitty avec ce meme identifiant if (w == null && "0.0".equals(context.getArguments().get("version"))) { // c'est un nouvel objet, il n'a pas encore ete sauve, mais on veut le faire String id = context.getArguments().get("id"); @@ -67,51 +75,106 @@ } if (w == null) { - context.setContentType("text/plain"); - result = String.format( - "no data found for %s with value %s", arg[0], arg[1]); + // si le wikitty est null, et qu'on etait pas en edition + // cela signifie qu'on ne retrouve pas le wikitty a editer + // on creer un nouveau wikitty vide que l'on editera + w = new WikittyImpl(); } else { - if (context.getArguments().containsKey("delete")) { - String id = context.getArguments().get("id"); - context.getWikittyProxy().delete(id); - } else if (context.getArguments().containsKey("store")) { - // change and store wikitty + // on met a jour le wikitty avec les infos trouvees dans les + // arguments - // ajout des extensions si necessaire - String [] extNames = context.getRequest().getParameterValues("extensions"); - if (extNames != null) { - for (String extName : extNames) { - WikittyExtension ext = proxy.restoreExtensionLastVersion(extName); - if (ext != null) { - w.addExtension(ext); - } - } +// // ajout des extensions si necessaire +// String[] extNames = context.getRequest().getParameterValues("extensions"); +// if (extNames != null) { +// for (String extName : extNames) { +// WikittyExtension ext = proxy.restoreExtensionLastVersion(extName); +// if (ext != null) { +// w.addExtension(ext); +// } +// } +// } + + // ajout des extensions si necessaire + String extName = context.getArgument("extensions", null); + if (extName != null) { + WikittyExtension ext = proxy.restoreExtensionLastVersion(extName); + if (ext != null) { + w.addExtension(ext); } + } - // modifie tous les champs presents dans le formulaire - for (Map.Entry<String, String> field : context.getArguments().entrySet()) { - if (field.getKey().contains(".")) { - String extName = WikittyExtension.extractExtensionName(field.getKey()); - String fieldName = WikittyExtension.extractFieldName(field.getKey()); +// boolean isMultipart = ServletFileUpload.isMultipartContent(context.getRequest()); +// if (isMultipart == true) { +// // Create a factory for disk-based file items +// DiskFileItemFactory factory = new DiskFileItemFactory(); +// // Create a new file upload handler +// ServletFileUpload upload = new ServletFileUpload(factory); +// // Process the uploaded items +// // Parse the request +// try { +// List<FileItem> items = upload.parseRequest(context.getRequest()); +// for (FileItem item : items) { +// String key = item.getFieldName(); +// if (key.contains(WikittyUtil.FQ_FIELD_NAME_SEPARATOR)) { +// String extName = WikittyExtension.extractExtensionName(key); +// String fieldName = WikittyExtension.extractFieldName(key); +// +// if (w.hasField(extName, fieldName)) { +// Object value = null; +// if (!"true".equals(context.getArgument("isNull-" + key, "false"))) { +// if (item.isFormField()) { +// value = item.getString(); +// } else { +// String filename = item.getName(); +// String mime = item.getContentType(); +// value = item.get(); +// log.info(String.format( +// "Set content with file '%s' of type '%s'", +// filename, mime)); +// } +// } +// w.setField(extName, fieldName, value); +// } +// } +// } +// } catch (FileUploadException eee) { +// log.error("Can't get uploaded file", eee); +// } +// } - if (w.hasField(extName, fieldName)) { - w.setField(extName, fieldName, field.getValue()); + + Map<String, Object> args = new HashMap<String, Object>(); + args.putAll(context.getArguments()); + args.putAll(context.getArgumentFiles()); + for (Map.Entry<String, Object> field : args.entrySet()) { + String key = field.getKey(); + Object value = null; + if (key.contains(WikittyUtil.FQ_FIELD_NAME_SEPARATOR)) { + String ext = WikittyExtension.extractExtensionName(key); + String fieldName = WikittyExtension.extractFieldName(key); + + if (w.hasField(ext, fieldName)) { + if (!"true".equals(context.getArgument("isNull-" + key, "false"))) { + value = field.getValue(); } + w.setField(ext, fieldName, value); } } + } - // sauve le wikitty modifie - context.getWikittyProxy().store(w); + if (context.getArguments().containsKey("store")) { + // on nous demande la sauvegarde + proxy.store(w); } - - // forward l'affichage de la page vers la jsp d'edition - context.setContentType("forward/jsp"); - context.getRequest().setAttribute( - WikittyPublicationContext.CONTEXT_VAR, context); - context.getRequest().setAttribute("wikitty", w); - result = "/WEB-INF/jsp/edit.jsp"; } } + + // forward l'affichage de la page vers la jsp d'edition + context.setContentType("forward/jsp"); + context.getRequest().setAttribute( + ActionEval.CONTEXT_VAR, context); + context.getRequest().setAttribute(ActionEval.WIKITTY_VAR, w); + result = "/WEB-INF/jsp/edit.jsp"; return result; } @@ -126,9 +189,14 @@ */ public String makeUrl(WikittyPublicationContext context, Wikitty w) { String url = getMapping() + "/" - + Element.ELT_ID + "=" + w.getId(); + + Element.ELT_ID + SEARCH_SEPARATOR + w.getId(); url = context.makeUrl(url); return url; } + @Override + protected String getExampleUsage() { + return exampleUsage; + } + } Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEval.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEval.java 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEval.java 2010-12-10 04:50:09 UTC (rev 592) @@ -1,6 +1,9 @@ package org.nuiton.wikitty.publication; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; @@ -11,9 +14,10 @@ import org.nuiton.util.ApplicationConfig; import org.nuiton.wikitty.WikittyException; import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyExtension; import org.nuiton.wikitty.publication.entities.WikittyPubText; import org.nuiton.wikitty.search.Criteria; -import org.nuiton.wikitty.search.Search; /** * Permet d'evaluer un WikittyPubText et de retourner la valeur de l'evaluation. @@ -34,11 +38,35 @@ * Last update: $Date$ * by : $Author$ */ -public class ActionEval extends AbstractAction { +public class ActionEval extends AbstractActionOnWikitty { /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(ActionError.class); + /** variable contenant l'instance de la classe ActionEval */ + static final public String EVAL_VAR = "wpEval"; + /** variable name use to put context in script and jsp */ + static final public String CONTEXT_VAR = "wpContext"; + /** contient la liste des arguments mandatory non encore utilise */ + static final public String SUBCONTEXT_VAR = "wpSubContext"; + /** + * contient le nom de la page WikittyPubText (ex: Wiki) ou la requete ayant + * permis de trouver la page (ex: MyScript.name=df) + */ + static final public String PAGE_NAME_VAR = "wpPage"; + /** + * contient le wikitty utilise comme script + */ + static final public String WIKITTY_VAR = "wpWikitty"; + + static final protected String exampleUsage = + "eval/WikittyPubText.name=Wiki/WikittyPubText.content?mimetype=WikittyPubText.mimetype\n" + + "eval/Tuto\n" + + "eval/Tuto/WikittyPubText.content\n" + + "eval/WikittyPubText.name=Tuto/WikittyPubText.content\n" + + "eval/WikittyPubText.name=Tuto/WikittyPubText.content?mimetype=WikittyPubText.mimetype\n" + + "eval/Command.id=df/Command.script?mimetype=Command.mimetype\n"; + protected ApplicationConfig appConfig; protected ScriptEngineManager scriptEnginManager; @@ -48,52 +76,99 @@ scriptEnginManager = new ScriptEngineManager(); } - @Override - public Object doAction(WikittyPublicationContext context) { - WikittyProxy proxy = context.getWikittyProxy(); + protected Object eval(String name, String script, String mimetype, + Map<String, Object> bindings) { + ScriptEngine scriptEngin = scriptEnginManager.getEngineByMimeType(mimetype); + if (scriptEngin == null) { + List<ScriptEngineFactory> factories = + scriptEnginManager.getEngineFactories(); + String msgFactories = ""; + for (ScriptEngineFactory f : factories) { + msgFactories += String.format( + "\n%s extensions: %s mimetypes: %s", + f.getEngineName(), f.getExtensions(), f.getMimeTypes()); + } + throw new WikittyException(String.format( + "Can't find engine for %s(%s). Available engines: %s", + name, mimetype, msgFactories)); + } else { + Bindings b = scriptEngin.createBindings(); + b.putAll(bindings); + try { + Object result = scriptEngin.eval(script, b); + return result; + } catch (ScriptException eee) { + throw new WikittyException(String.format( + "Can't evaluated script %s(%s=>%s) script was\n%s", + name, mimetype, + scriptEngin.getFactory().getEngineName(), script), eee); + } + } - Object result = "no query"; - if (context.getMandatoryArguments().size() > 0) { - log.info("args " + context.getMandatoryArguments()); - String [] arg = context.getMandatoryArguments().get(0).split("="); + } - Criteria criteria = Search.query().eq(arg[0], arg[1]).criteria(); - WikittyPubText w = proxy.findByCriteria(WikittyPubText.class, criteria); + public Object doAction(WikittyPublicationContext context, List<String> subContext) { + log.info("path " + subContext); + + Object result; + + Criteria criteria = searchCriteria(subContext); + + if (criteria == null) { + // rien a evaluer, on retourne une chaine vide + result = ""; + } else { + WikittyProxy proxy = context.getWikittyProxy(); + Wikitty w = proxy.findByCriteria(criteria); + if (w == null) { + context.setContentType("text/plain"); result = String.format( - "no data found for %s with value %s", arg[0], arg[1]); + "no data found for criteria %s", criteria); } else { - String mimetype = w.getMimeType(); - ScriptEngine scriptEngin = scriptEnginManager.getEngineByMimeType(mimetype); - if (scriptEngin == null) { - List<ScriptEngineFactory> factories = - scriptEnginManager.getEngineFactories(); - String msgFactories = ""; - for (ScriptEngineFactory f : factories) { - msgFactories += String.format( - "\n%s extensions: %s mimetypes: %s", - f.getEngineName(), f.getExtensions(), f.getMimeTypes()); - } - throw new WikittyException(String.format( - "Can't find engine for %s(%s). Available engines: %s", - w.getName(), w.getMimeType(), msgFactories)); + String contentField = getContentFieldName(context, criteria.getName(), w); + + if (contentField == null) { + result = getError(context); } else { - Bindings bindings = scriptEngin.createBindings(); - bindings.put(WikittyPublicationContext.CONTEXT_VAR, context); - String script = w.getContent(); - try { - result = scriptEngin.eval(script, bindings); - } catch (ScriptException eee) { - throw new WikittyException(String.format( - "Can't evaluated script %s(%s=>%s) script was\n%s", - w.getName(), w.getMimeType(), - scriptEngin.getFactory().getEngineName(), script), eee); - } + String extName = WikittyExtension.extractExtensionName(contentField); + String fieldName = WikittyExtension.extractFieldName(contentField); + + String mimetype = getMimeType(context, criteria.getName(), w); + String content = w.getFieldAsString(extName, fieldName); + + // 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); + + result = eval(criteria.getName(), content, mimetype, bindings); } } } + return result; + } + + @Override + public Object doAction(WikittyPublicationContext context) { + Object result; + if (context.getMandatoryArguments().size() <= 0) { + result = getError(context); + } else { + result = doAction(context, context.getMandatoryArguments()); + } return result; } + @Override + protected String getExampleUsage() { + return exampleUsage; + } + } Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionRaw.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionRaw.java 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionRaw.java 2010-12-10 04:50:09 UTC (rev 592) @@ -6,12 +6,7 @@ import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.entities.WikittyExtension; -import org.nuiton.wikitty.publication.entities.WikittyPubData; -import org.nuiton.wikitty.publication.entities.WikittyPubDataHelper; -import org.nuiton.wikitty.publication.entities.WikittyPubText; -import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper; import org.nuiton.wikitty.search.Criteria; -import org.nuiton.wikitty.search.Search; /** * Action permettant de retourner la valeur d'un champs d'un object. @@ -41,17 +36,16 @@ * Last update: $Date$ * by : $Author$ */ -public class ActionRaw extends AbstractAction { +public class ActionRaw extends AbstractActionOnWikitty { /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(ActionError.class); - static final public int ARG_QUERY = 0; - static final public int ARG_CONTENT_FIELD = 1; - static final public String ARG_MIMETYPE = "mimetype"; - static final protected String exampleUsage = "ram/WikittyPubData.name=MonImage.jpg/WikittyPubData.content?mimetype=WikittyPubData.mimetype\n" + + "ram/Tuto\n" + + "ram/Tuto/WikittyPubText.content\n" + + "ram/WikittyPubText.name=Tuto/WikittyPubText.content\n" + "ram/WikittyPubText.name=Tuto/WikittyPubText.content?mimetype=WikittyPubText.mimetype\n" + "ram/WikittyUser.login=admin/WikittyUser.password?mimetype=text/plain\n"; @@ -61,61 +55,41 @@ this.appConfig = appConfig; } + protected String getExampleUsage() { + return exampleUsage; + } + @Override public Object doAction(WikittyPublicationContext context) { - WikittyProxy proxy = context.getWikittyProxy(); - Object result = "no query"; - if (context.getMandatoryArguments().size() < 1 || - (context.getMandatoryArguments().size() < 2 - && !context.getMandatoryArguments().get(ARG_QUERY).startsWith("WikittyPub")) ) { - context.setContentType("text/html"); - result = String.format("<html><head></head><body>" - + "<h1>bad query</h1>" - + "Usage example" - + "<pre>%s</pre>" - + "</body></html>\n", exampleUsage); - } else { - log.info("args " + context.getMandatoryArguments()); - String [] arg = context.getMandatoryArguments().get(ARG_QUERY).split("="); + log.info("args " + context.getMandatoryArguments()); - Criteria criteria = Search.query().eq(arg[0], arg[1]).criteria(); + Object result; + Criteria criteria = searchCriteria(context.getMandatoryArguments()); + + if (criteria == null) { + result = getError(context); + } else { + WikittyProxy proxy = context.getWikittyProxy(); Wikitty w = proxy.findByCriteria(criteria); + if (w == null) { + context.setContentType("text/plain"); result = String.format( - "no data found for %s with value %s", arg[0], arg[1]); + "no data found for criteria %s", criteria); } else { - // looking for mimetype field - String mimetype = context.getArguments().get(ARG_MIMETYPE); - if (mimetype != null) { - int i = mimetype.indexOf('.'); - if (i > 0) { // perhaps fully qualified field - String extName = WikittyExtension.extractExtensionName(mimetype); - String fieldName = WikittyExtension.extractFieldName(mimetype); - if (w.hasField(extName, fieldName)) { - // mimetype target field in wikitty - // replace with field value - mimetype = w.getFieldAsString(extName, fieldName); - } - } + String contentField = getContentFieldName(context, criteria.getName(), w); + + if (contentField == null) { + result = getError(context); + } else { + String extName = WikittyExtension.extractExtensionName(contentField); + String fieldName = WikittyExtension.extractFieldName(contentField); + + String mimetype = getMimeType(context, criteria.getName(), w); context.setContentType(mimetype); - } else if (w.hasExtension(WikittyPubText.EXT_WIKITTYPUBTEXT)) { - mimetype = WikittyPubTextHelper.getMimeType(w); - } else if (w.hasExtension(WikittyPubData.EXT_WIKITTYPUBDATA)) { - mimetype = WikittyPubDataHelper.getMimeType(w); + result = w.getFieldAsObject(extName, fieldName); } - String contentField = null; - if (context.getMandatoryArguments().size() >= 2) { - contentField = context.getMandatoryArguments().get(ARG_CONTENT_FIELD); - } else if (w.hasExtension(WikittyPubText.EXT_WIKITTYPUBTEXT)) { - contentField = WikittyPubText.FQ_FIELD_WIKITTYPUBTEXT_CONTENT; - } else if (w.hasExtension(WikittyPubData.EXT_WIKITTYPUBDATA)) { - contentField = WikittyPubData.FQ_FIELD_WIKITTYPUBDATA_CONTENT; - } - String extName = WikittyExtension.extractExtensionName(contentField); - String fieldName = WikittyExtension.extractFieldName(contentField); - - result = w.getFieldAsObject(extName, fieldName); } } Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionView.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionView.java 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionView.java 2010-12-10 04:50:09 UTC (rev 592) @@ -1,14 +1,11 @@ package org.nuiton.wikitty.publication; -import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.util.ApplicationConfig; import org.nuiton.util.StringUtil; import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.entities.Wikitty; -import org.nuiton.wikitty.entities.WikittyExtension; -import org.nuiton.wikitty.entities.WikittyImpl; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.search.Search; @@ -57,12 +54,8 @@ // forward l'affichage de la page vers la jsp d'edition context.setContentType("forward/jsp"); - context.getRequest().setAttribute( - WikittyPublicationContext.CONTEXT_VAR, context); - context.getRequest().setAttribute("r", r); - context.getRequest().setAttribute("first", first); - context.getRequest().setAttribute("end", end); - context.getRequest().setAttribute("wikitty", w); + context.getRequest().setAttribute(ActionEval.CONTEXT_VAR, context); + context.getRequest().setAttribute(ActionEval.WIKITTY_VAR, w); context.getRequest().setAttribute("pagedResult", pagedResult); String result = "/WEB-INF/jsp/view.jsp"; Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublicationContext.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublicationContext.java 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/WikittyPublicationContext.java 2010-12-10 04:50:09 UTC (rev 592) @@ -10,6 +10,10 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.util.ApplicationConfig; @@ -21,6 +25,7 @@ import org.nuiton.wikitty.WikittyProxy; import org.nuiton.wikitty.WikittyService; import org.nuiton.wikitty.WikittyServiceFactory; +import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.entities.WikittyExtension; import org.nuiton.wikitty.entities.WikittyLabelAbstract; import org.nuiton.wikitty.entities.WikittyTreeNodeAbstract; @@ -41,9 +46,6 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyPublicationContext.class); - /** variable name use to put context in script and jsp */ - static final public String CONTEXT_VAR = "WPContext"; - /** configuration option name FIXME poussin 20101206 use OptionDef */ static final public String CONFIG_FILE = "wikitty.publication.config.pattern"; static final public String ACTION_PREFIX = "wikitty.publication.action"; @@ -58,8 +60,10 @@ protected HttpServletResponse resp; protected String wsContext = null; protected String actionName = null; + protected String path = ""; protected List<String> mandatoryArguments = new ArrayList<String>(); protected Map<String, String> arguments = new HashMap<String, String>(); + protected Map<String, byte[]> argumentFiles = new HashMap<String, byte[]>(); protected WikittyProxy proxy = null; protected String contentType = "text/html"; @@ -115,14 +119,48 @@ if (comps.length > 1) { actionName = comps[2]; } - + + for (int i = 3; i < comps.length; i++) { mandatoryArguments.add(comps[i]); + path += "/" + comps[i]; } - for (Enumeration<String> e=req.getParameterNames(); e.hasMoreElements();) { - String name = e.nextElement(); - String value = req.getParameter(name); - arguments.put(name, value); + + + boolean isMultipart = ServletFileUpload.isMultipartContent(getRequest()); + if (isMultipart == true) { + // Create a factory for disk-based file items + DiskFileItemFactory factory = new DiskFileItemFactory(); + // Create a new file upload handler + ServletFileUpload upload = new ServletFileUpload(factory); + // Process the uploaded items + // Parse the request + try { + List<FileItem> items = upload.parseRequest(getRequest()); + for (FileItem item : items) { + String name = item.getFieldName(); + if (item.isFormField()) { + String value = item.getString(); + arguments.put(name, value); + } else { + String filename = item.getName(); + String mime = item.getContentType(); + byte[] value = item.get(); + log.info(String.format( + "Argument file '%s' of type '%s'", + filename, mime)); + argumentFiles.put(name, value); + } + } + } catch (FileUploadException eee) { + log.error("Can't get uploaded file", eee); + } + } else { + for (Enumeration<String> e = req.getParameterNames(); e.hasMoreElements();) { + String name = e.nextElement(); + String value = req.getParameter(name); + arguments.put(name, value); + } } log.info(String.format( "path %s => ws: %s action: %s mandatoryArguments: %s arguments: %s", @@ -141,10 +179,23 @@ return appConfig; } + /** + * le nom de l'action a faire + * @return + */ public String getActionName() { return actionName; } + /** + * le reste de l'url apres l'action + * @return + */ + public String getPath() { + return path; + } + + public WikittyProxy getWikittyProxy() { if (proxy == null) { proxy = new WikittyProxy(getAppConfig(), getWikittyService()); @@ -223,6 +274,10 @@ return arguments; } + public Map<String, byte[]> getArgumentFiles() { + return argumentFiles; + } + public String getArgument(String name, String defaultValue) { String result = defaultValue; if (getArguments().containsKey(name)) { Modified: trunk/wikitty-publication/src/main/resources/wikitty-publication-ws-default.properties =================================================================== --- trunk/wikitty-publication/src/main/resources/wikitty-publication-ws-default.properties 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/resources/wikitty-publication-ws-default.properties 2010-12-10 04:50:09 UTC (rev 592) @@ -37,7 +37,8 @@ wikitty.WikittyService.components=org.nuiton.wikitty.services.WikittyServiceStorage,\ org.nuiton.wikitty.services.WikittyServiceNotifier,\ org.nuiton.wikitty.services.WikittyServiceCached,\ -org.nuiton.wikitty.services.WikittyServiceSecurity +org.nuiton.wikitty.services.WikittyServiceSecurity,\ +org.nuiton.wikitty.services.WikittyServiceAccessStat wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\ org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\ org.nuiton.wikitty.solr.WikittySearchEngineSolr @@ -45,6 +46,7 @@ wikitty.service.cache.allwaysRestoreCopies=false wikitty.service.event.propagate=false wikitty.service.event.listen=false +wikitty.service.accessstat.extensions=WikittyPubText,WikittyPubData wikitty.addon.export.threadnumber=1 wikitty.addon.export.directory=${wikitty.data.directory}/export wikitty.addon.export.publicurl=file://${wikitty.data.directory}/export/ Modified: trunk/wikitty-publication/src/main/webapp/WEB-INF/jsp/edit.jsp =================================================================== --- trunk/wikitty-publication/src/main/webapp/WEB-INF/jsp/edit.jsp 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/webapp/WEB-INF/jsp/edit.jsp 2010-12-10 04:50:09 UTC (rev 592) @@ -4,6 +4,7 @@ Author : poussin --%> +<%@page import="org.nuiton.wikitty.publication.ActionEval"%> <%@page import="org.apache.commons.lang.StringEscapeUtils"%> <%@page import="org.nuiton.wikitty.entities.FieldType"%> <%@page import="java.util.Collection"%> @@ -14,21 +15,22 @@ <%@page import="org.nuiton.wikitty.entities.Wikitty"%> <%@page import="org.nuiton.wikitty.publication.WikittyPublicationContext"%> -<h1>Edit ${wikitty.id}</h1> - -<pre>${wikitty}</pre> - <% WikittyPublicationContext context = (WikittyPublicationContext) - request.getAttribute(WikittyPublicationContext.CONTEXT_VAR); -Wikitty wikitty = (Wikitty)request.getAttribute("wikitty"); + request.getAttribute(ActionEval.CONTEXT_VAR); +Wikitty wikitty = (Wikitty)request.getAttribute(ActionEval.WIKITTY_VAR); ActionEdit action = context.getAction(ActionEdit.class); String url = action.makeUrl(context, wikitty); %> -<form action='<%=url%>' method="post"> - <input type="hidden" name="id" value="${wikitty.id}" /> - <input type="hidden" name="version" value="${wikitty.version}" /> +<h1>Edit <%=wikitty.getId()%></h1> + +<pre><%=wikitty%></pre> + +<form class="edit" action='<%=url%>' method="post" enctype="multipart/form-data"> + <input type="hidden" name="MAX_FILE_SIZE" value="104857600" /> <!-- 100Mo --> + <input type="hidden" name="id" value="<%=wikitty.getId()%>" /> + <input type="hidden" name="version" value="<%=wikitty.getVersion()%>" /> <fieldset> <legend><span class="legend">Extensions</span></legend> <% @@ -50,6 +52,7 @@ <% } %> + <input type="submit" name="addExtension" value="Add" /> </fieldset> <% @@ -67,6 +70,11 @@ <label for="<%=extName%>.<%=fieldName%>" tabindex="<%=++index%>"><span class="label"><%=fieldName%></span></label> <% switch(fieldType.getType()) { + case BINARY: + %> + <input type="file" name="<%=extName%>.<%=fieldName%>"/> + <% + break; case BOOLEAN: boolean valueBool = wikitty.getFieldAsBoolean(ext.getName(), fieldName); String checked = valueBool?"checked='true'":""; @@ -77,8 +85,11 @@ default: Object valueObject = wikitty.getFieldAsObject(ext.getName(), fieldName); String valueString = ""; + String checkedNull = ""; if (valueObject != null) { valueString = String.valueOf(valueObject); + } else { + checkedNull = "checked='true'"; } valueString = StringEscapeUtils.escapeHtml(valueString); @@ -91,6 +102,9 @@ <input type="text" name="<%=extName%>.<%=fieldName%>" value="<%=valueString%>" /> <% } + %> + <input type="checkbox" name="isNull-<%=extName%>.<%=fieldName%>" value="true" <%=checkedNull%>/>(null) + <% } %> <%=fieldType.toDefinition("")%> Modified: trunk/wikitty-publication/src/main/webapp/WEB-INF/jsp/view.jsp =================================================================== --- trunk/wikitty-publication/src/main/webapp/WEB-INF/jsp/view.jsp 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/webapp/WEB-INF/jsp/view.jsp 2010-12-10 04:50:09 UTC (rev 592) @@ -4,6 +4,7 @@ Author : poussin --%> +<%@page import="org.nuiton.wikitty.publication.ActionEval"%> <%@page import="org.nuiton.wikitty.publication.ActionEdit"%> <%@page import="org.nuiton.wikitty.publication.WikittyPublicationContext"%> <%@page import="org.nuiton.wikitty.search.PagedResult"%> @@ -13,23 +14,23 @@ <% WikittyPublicationContext context = (WikittyPublicationContext) - request.getAttribute(WikittyPublicationContext.CONTEXT_VAR); + request.getAttribute(ActionEval.CONTEXT_VAR); PagedResult<Wikitty> pagedResult = (PagedResult<Wikitty>)request.getAttribute("pagedResult"); -Wikitty wikitty = (Wikitty)request.getAttribute("wikitty"); +Wikitty wikitty = (Wikitty)request.getAttribute(ActionEval.WIKITTY_VAR); ActionEdit actionEdit = context.getAction(ActionEdit.class); %> <form action="" method="post"> <div> - <textarea name="r" rows="4" cols="20"><%=request.getAttribute("r")%></textarea> + <textarea name="r" rows="4" cols="20"><%=context.getArgument("r", "*")%></textarea> </div> <label for="first">First</label> <input type="text" name="first" value="<%=context.getArgument("first", "0")%>" /> <label for="first">First</label> <input type="text" name="end" value="<%=context.getArgument("end", "100")%>" /> <input type="submit" name="id" value="Search"/> <pre> -${wikitty} +<%=wikitty%> </pre> <%=pagedResult.getFirstIndice()%>-<%=pagedResult.getFirstIndice() + pagedResult.size()%>/${pagedResult.numFound} Modified: trunk/wikitty-publication/src/main/webapp/css/wikitty-publication.css =================================================================== --- trunk/wikitty-publication/src/main/webapp/css/wikitty-publication.css 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/main/webapp/css/wikitty-publication.css 2010-12-10 04:50:09 UTC (rev 592) @@ -1,4 +1,4 @@ -label { +.edit label { float : left; width : 200px; text-align: right; Modified: trunk/wikitty-publication/src/main/xmi/wikitty-publication.zargo =================================================================== (Binary files differ) Modified: trunk/wikitty-publication/src/site/rst/wp-analyse.rst =================================================================== --- trunk/wikitty-publication/src/site/rst/wp-analyse.rst 2010-12-10 04:45:01 UTC (rev 591) +++ trunk/wikitty-publication/src/site/rst/wp-analyse.rst 2010-12-10 04:50:09 UTC (rev 592) @@ -125,10 +125,10 @@ Par exemple les URLs suivantes sont équivalentes:: - /eval/WikittyPubText.name=Wiki + /eval/WikittyPubText.name:Wiki /eval/Wiki - /raw/WikittyPubText.name=WikiLogo + /raw/WikittyPubText.name:WikiLogo /raw/WikiLogo Action eval @@ -311,9 +311,9 @@ <html> ... - <div id="bandeau"><img src="<%=context.makeUrl("/raw/WikiLogo")%>"/></div> - <div id="menu"><%=eval.doAction(context, "/WikiMenu")%></div> - <div id="content"><%=eval.doAction(context, nextUrl!=null?nextUrl:"/WikiHello")%></div> + <div id="bandeau"><img src="<%=wpContext.makeUrl("/raw/WikiLogo")%>"/></div> + <div id="menu"><%=eval.doAction(wpContext, "/WikiMenu")%></div> + <div id="content"><%=eval.doAction(wpContext, wpSubContext")%></div> ... </html>