Author: mfortun Date: 2011-05-09 16:07:29 +0200 (Mon, 09 May 2011) New Revision: 871 Url: http://nuiton.org/repositories/revision/wikitty/871 Log: * correct action raw * add action eval Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionEval.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationContext.java Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionRaw.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionView.java trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationBaseAction.java trunk/wikitty-publication/src/main/resources/struts.xml Added: 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 (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionEval.java 2011-05-09 14:07:29 UTC (rev 871) @@ -0,0 +1,277 @@ +package org.nuiton.wikitty.publication.action; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.ObjectOutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.struts2.interceptor.ServletRequestAware; +import org.apache.struts2.interceptor.ServletResponseAware; +import org.nuiton.util.ApplicationConfig; +import org.nuiton.util.ObjectUtil; +import org.nuiton.util.StringUtil; +import org.nuiton.wikitty.ScriptEvaluator; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.WikittyService; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyExtension; +import org.nuiton.wikitty.publication.AbstractActionOnWikitty; +import org.nuiton.wikitty.publication.WikittyPublicationAction; +import org.nuiton.wikitty.publication.WikittyPublicationConfig; +import org.nuiton.wikitty.publication.WikittyPublicationProxy; +import org.nuiton.wikitty.publication.entities.WikittyPubText; +import org.nuiton.wikitty.publication.entities.WikittyPubTextHelper; +import org.nuiton.wikitty.search.Criteria; + +import com.opensymphony.xwork2.ActionContext; + +public class PublicationActionEval extends PublicationBaseAction implements + ServletResponseAware, ServletRequestAware, PublicationContext { + + /** + * + */ + private static final long serialVersionUID = -7649132751822833474L; + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(PublicationActionEval.class); + + protected String contentType; + protected HttpServletResponse response; + protected HttpServletRequest request; + protected InputStream inputStream; + + /** 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"; + + @Override + public void setServletResponse(HttpServletResponse arg0) { + this.response = arg0; + } + + @Override + public void setServletRequest(HttpServletRequest arg0) { + this.request = arg0; + + } + + @Override + public String execute() throws Exception { + List<String> argsString = new ArrayList<String>(); + String args = ActionContext.getContext().getParameters().get(ARGS_KEY) + .toString(); + String[] argsTab = StringUtil.split(args, SEPARATOR); + + for (String arg : argsTab) { + argsString.add(arg); + } + + inputStream = new ByteArrayInputStream(doAction(this, argsString) + .toString().getBytes()); + + return SUCCESS; + } + + public Object doAction(PublicationContext 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 || !w.hasExtension(WikittyPubText.EXT_WIKITTYPUBTEXT)) { + context.setContentType("text/plain"); + result = String.format("no data found for criteria '%s'", + criteria); + } else { + String content = WikittyPubTextHelper.getContent(w); + + if (content == null) { + result = getError(context); + } else { + + String mimetype = WikittyPubTextHelper.getMimeType(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); + + result = ScriptEvaluator.eval(null, criteria.getName(), + content, mimetype, bindings); + } + } + } + + return result; + } + + public Object doAction(PublicationContext context, String subContextAsText) { + Object result; + if (subContextAsText == null || "".equals(subContextAsText)) { + result = getError(context); + } else { + if (subContextAsText.startsWith("/")) { + subContextAsText = subContextAsText.substring(1); + } + String[] subContextArray = StringUtil.split(subContextAsText, "/"); + List<String> subContext = Arrays.asList(subContextArray); + result = doAction(context, subContext); + } + return result; + } + + public Object doAction(PublicationContext context) { + Object result; + if (context.getMandatoryArguments().size() <= 0) { + result = getError(context); + } else { + result = doAction(context, context.getMandatoryArguments()); + } + return result; + } + + public String getMimeType() { + return contentType; + } + + public void setMimeType(String mimeType) { + this.contentType = mimeType; + } + + public HttpServletResponse getResponse() { + return response; + } + + public void setResponse(HttpServletResponse response) { + this.response = response; + } + + public InputStream getInputStream() { + return inputStream; + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } + + + @Override + public HttpServletRequest getRequest() { + return request; + } + + @Override + public ApplicationConfig getAppConfig() { + return WikittyPublicationConfig.getConfig(); + } + + @Override + public String getActionName() { + // TODO mfortun + 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"; + if (log.isInfoEnabled()) { + log.info(String.format("transforme url from '%s' to '%s'", url, + finalUrl)); + } + return finalUrl; + } + + @Override + public WikittyService getWikittyService() { + return getWikittyPublicationProxy().getWikittyService(); + + } + + @Override + public List<String> getMandatoryArguments() { + // TODO mfortun + throw new UnsupportedOperationException("not yet implemented"); + // return null; + + } + + @Override + public Map<String, String> getArguments() { + // TODO mfortun + throw new UnsupportedOperationException("not yet implemented"); + // return null; + + } + + @Override + public Map<String, byte[]> getArgumentFiles() { + // TODO mfortun + throw new UnsupportedOperationException("not yet implemented"); + // return null; + + } + + + + + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + @Override + public WikittyProxy getWikittyProxy() { + return getWikittyPublicationProxy(); + } + +} Property changes on: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionEval.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionRaw.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionRaw.java 2011-05-09 14:05:52 UTC (rev 870) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionRaw.java 2011-05-09 14:07:29 UTC (rev 871) @@ -1,24 +1,13 @@ package org.nuiton.wikitty.publication.action; -import java.io.BufferedInputStream; -import java.io.BufferedWriter; + import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; import java.io.InputStream; -import java.io.StringReader; import java.util.ArrayList; import java.util.List; - import javax.servlet.http.HttpServletResponse; - import org.apache.struts2.interceptor.ServletResponseAware; -import org.jivesoftware.smackx.packet.Bytestream; -import org.nuiton.util.FileUtil; import org.nuiton.util.StringUtil; -import org.nuiton.wikitty.WikittyProxy; -import org.nuiton.wikitty.WikittyUtil; import org.nuiton.wikitty.entities.Wikitty; import org.nuiton.wikitty.publication.WikittyPublicationProxy; import org.nuiton.wikitty.publication.entities.WikittyPubData; @@ -36,7 +25,6 @@ * */ private static final long serialVersionUID = -2570662656931216123L; - protected Object pageObject; protected String mimeType; protected HttpServletResponse response; protected InputStream inputStream; Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionView.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionView.java 2011-05-09 14:05:52 UTC (rev 870) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationActionView.java 2011-05-09 14:07:29 UTC (rev 871) @@ -55,10 +55,6 @@ } - public String getArgument(String key, String defaultValue){ - - - return defaultValue; - } + } Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationBaseAction.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationBaseAction.java 2011-05-09 14:05:52 UTC (rev 870) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationBaseAction.java 2011-05-09 14:07:29 UTC (rev 871) @@ -17,6 +17,7 @@ import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.Search; +import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** @@ -26,7 +27,8 @@ * @author mfortun * */ -public class PublicationBaseAction extends ActionSupport implements SessionAware { +public class PublicationBaseAction extends ActionSupport implements + SessionAware { /** * @@ -38,7 +40,7 @@ static final public String ARG_CONTENT_FIELD = "contentField"; static final public String SEARCH_SEPARATOR = ":"; final static protected String CONTEXT_ACTION_KEY = "action"; - + static public String SEPARATOR = "/"; static public String CONTEXT_KEY = "context"; static public String ARGS_KEY = "args"; @@ -62,55 +64,44 @@ this.session = sess; } - /** - * 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 - * + * 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 + * @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( - 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; - } -*/ + * + * protected String getMimeType( 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 - * + * 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 */ @@ -123,52 +114,65 @@ 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); + 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); + 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 - * + * 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 + * @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); + * + * 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(PublicationContext context) { + context.setContentType("text/html"); + String result = String.format("<h1>bad query %s</h1>"); + return result; + } + + public String getArgument(String key, String defaultValue) { + String result = ActionContext.getContext().getParameters().get(key) + .toString(); + + if (result == null) { + result = defaultValue; } - 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; + return result; } -*/ - } Added: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationContext.java =================================================================== --- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationContext.java (rev 0) +++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationContext.java 2011-05-09 14:07:29 UTC (rev 871) @@ -0,0 +1,67 @@ +package org.nuiton.wikitty.publication.action; + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.nuiton.util.ApplicationConfig; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.WikittyService; +import org.nuiton.wikitty.publication.WikittyPublicationAction; + +public interface PublicationContext { + + + /** + * set attributes: + * <li> req + * <li> wsContext + * <li> actionName + * <li> mandatoryArguments + * <li> arguments + * + * @param req + */ + + + public abstract HttpServletRequest getRequest(); + + public abstract HttpServletResponse getResponse(); + + public abstract ApplicationConfig getAppConfig(); + + /** + * le nom de l'action a faire + * @return + */ + public abstract String getActionName(); + + + public abstract WikittyProxy getWikittyProxy(); + + /** + * add context to the url and parameter if necessary + * @param url + * @return + */ + public abstract String makeUrl(String url); + + public abstract WikittyService getWikittyService(); + + public abstract List<String> getMandatoryArguments(); + + public abstract Map<String, String> getArguments(); + + public abstract Map<String, byte[]> getArgumentFiles(); + + public abstract String getArgument(String name, String defaultValue); + + public abstract String getContentType(); + + public abstract void setContentType(String contentType); + + public abstract String toString(); + +} \ No newline at end of file Property changes on: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/action/PublicationContext.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/wikitty-publication/src/main/resources/struts.xml =================================================================== --- trunk/wikitty-publication/src/main/resources/struts.xml 2011-05-09 14:05:52 UTC (rev 870) +++ trunk/wikitty-publication/src/main/resources/struts.xml 2011-05-09 14:07:29 UTC (rev 871) @@ -35,6 +35,17 @@ </result> </action> + + + <action name="*/eval/*" + class="org.nuiton.wikitty.publication.action.PublicationActionEval"> + <param name="context">{1}</param> + <param name="args">{2}</param> + <result type="stream"> + <param name="contentType">mimeType</param> + <param name="inputName">inputStream</param> + </result> + </action> </package>