Author: mfortun Date: 2011-08-29 14:47:01 +0200 (Mon, 29 Aug 2011) New Revision: 1196 Url: http://nuiton.org/repositories/revision/wikitty/1196 Log: code documentation for ui part Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/ApplicationListener.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationConfig.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationProxy.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationSession.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEdit.java 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/PublicationActionRaw.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionRestoreWikitty.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionView.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/LoginInterceptor.java trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/LogoutInterceptor.java Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/ApplicationListener.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/ApplicationListener.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/ApplicationListener.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -12,6 +12,12 @@ import org.nuiton.i18n.init.I18nInitializer; import org.nuiton.util.FileUtil; +/** + * Class use to set general properties and initialize needed component + * for the wikitty publication web application + * @author mfortun + * + */ public class ApplicationListener implements ServletContextListener { private static final Log log = LogFactory.getLog(ApplicationListener.class); Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationConfig.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationConfig.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationConfig.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -14,6 +14,13 @@ import static org.nuiton.i18n.I18n._; +/** + * Specific configurations for wikitty publication web apps. Used to get + * application for named contextData. + * + * @author mfortun + * + */ public class WikittyPublicationConfig { /** to use log facility, just put in your code: log.info(\"...\"); */ @@ -21,16 +28,41 @@ static final public String CONFIG_FILE_KEY = "wikitty.publication.config.pattern"; static final public String DEFAULT_FILE_COMPLEMENT = "default"; + /** + * Used to store already instanciate application config, with contextData as + * key + */ static protected Map<String, ApplicationConfig> instanceMap = new HashMap<String, ApplicationConfig>(); private WikittyPublicationConfig() { } + /** + * return a new instance of application config for contextData if any + * + * @param Context + * contextData + * @return application config for contextData + */ static public ApplicationConfig getConfig(String Context) { return getConfig(null, null, Context); } + /** + * return the application config requested corresponding with the + * configfileName loading default properties, and load properties for + * contextData if any. + * + * @param props + * properties + * @param configFilename + * @param wsContext + * the contextData + * @param args + * passed threw main + * @return application config requested + */ static public ApplicationConfig getConfig(Properties props, String configFilename, String wsContext, String... args) { @@ -77,12 +109,20 @@ return wsConfig; } - public static ApplicationConfig getInstance(String context) { + + /** + * return application config for contextData if any or new + * instance of application config if not created + * + * @param Context + * contextData + * @return application config for contextData + */ + static public ApplicationConfig getInstance(String context) { if (!instanceMap.containsKey(context)) { synchronized (WikittyPublicationConfig.class) { if (!instanceMap.containsKey(context)) { - instanceMap.put(context, - getConfig(context)); + instanceMap.put(context, getConfig(context)); } } } Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationProxy.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationProxy.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationProxy.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -21,14 +21,26 @@ * */ private static final long serialVersionUID = -568462410130999972L; - + + /** + * Map to store instance of service, with contextData as key. + * Used to avoid multiple instantiation of the same service. + */ static protected Map<String, WikittyService> mapService = new HashMap<String, WikittyService>(); + private WikittyPublicationProxy(ApplicationConfig config, WikittyService ws) { super(config, ws); - } + /** + * return an instance of proxy service for a specific context with + * application config. + * + * @param config the application config to instantiate service + * @param context contextData for service + * @return the instance of wikitty service + */ static public WikittyPublicationProxy getInstance(String token, String context) { ApplicationConfig config = WikittyPublicationConfig @@ -40,6 +52,14 @@ return result; } + /** + * return an instance of wikitty service for a specific context with + * application config. If already instanciate return else create a new + * instance + * @param config the application config to instantiate service + * @param context contextData for service + * @return the instance of wikitty service + */ static protected WikittyService getWikittyService(ApplicationConfig config, String context) { if (!mapService.containsKey(context)) { Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationSession.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationSession.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/WikittyPublicationSession.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -9,6 +9,13 @@ import java.io.Serializable; import java.util.Map; +/** + * Object store inside session to store information relative to the current + * user, proxy etc. + * + * @author mfortun + * + */ public class WikittyPublicationSession implements Serializable { /** @@ -19,10 +26,10 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyPublicationSession.class); - static final private String WIKITTY_PUBLICATION_SESSION_KEY = WikittyPublicationSession.class + static final protected String WIKITTY_PUBLICATION_SESSION_KEY = WikittyPublicationSession.class .getSimpleName(); - static final private String WIKITTY_PUBLICATION_SESSION_SEP = "_"; + static final protected String WIKITTY_PUBLICATION_SESSION_SEP = "_"; protected String securityToken = null; transient protected WikittyUser user; @@ -45,6 +52,15 @@ + WIKITTY_PUBLICATION_SESSION_SEP + contextData); } + /** + * return the wikittySession store in the http request for the context + * + * @param request + * the current request + * @param context + * the current contextData + * @return the wikittyserssion + */ static public WikittyPublicationSession getWikittyPublicationSession( HttpServletRequest request, String context) { HttpSession session = request.getSession(); @@ -53,8 +69,22 @@ return result; } + /** + * return the wikittySession store in the http sessions for the context + * + * @param httpSession + * the current sessions + * @param context + * the current contextData + * @return the wikittyserssion + */ static public WikittyPublicationSession getWikittyPublicationSession( HttpSession httpSession, String contextData) { + + /* + * The session is store with a key that containt context Data name the + * ensure to not erase a session + */ WikittyPublicationSession result = (WikittyPublicationSession) httpSession .getAttribute(WIKITTY_PUBLICATION_SESSION_KEY + WIKITTY_PUBLICATION_SESSION_SEP + contextData); @@ -66,8 +96,23 @@ return result; } + /** + * return the wikittySession store in sessions Map for the context + * + * @param session + * the current sessions Map + * @param context + * the current contextData + * @return the wikittyserssion + */ static public WikittyPublicationSession getWikittyPublicationSession( Map<String, Object> session, String contextData) { + + /* + * The session is store with a key that containt context Data name the + * ensure to not erase a session + */ + WikittyPublicationSession result = (WikittyPublicationSession) session .get(WIKITTY_PUBLICATION_SESSION_KEY + WIKITTY_PUBLICATION_SESSION_SEP + contextData); Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEdit.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEdit.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEdit.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -30,6 +30,15 @@ import java.util.Map; import java.util.Map.Entry; + +/** + * + * Java class for the edit action that allow to create and edit + * wikitty. + * + * @author mfortun + * + */ public class PublicationActionEdit extends PublicationBaseAction { /** 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-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionEval.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -42,6 +42,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; +import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; @@ -51,6 +52,12 @@ import java.util.List; import java.util.Map; +/** + * Java class + * + * @author mfortun + * + */ public class PublicationActionEval extends PublicationBaseAction implements ServletResponseAware, ServletRequestAware, PublicationContext, EvalInterface { @@ -86,6 +93,31 @@ @Override public String execute() throws Exception { + // extract jars from wikitty service + URL[] urls = getJarsDependency(); + + // initialize classLoader + // add jars to our custom classLoader + classloader = new WikittyPublicationClassLoader(urls); + // REALLY IMPORTANT put the classloader with the jarloaded + + Thread.currentThread().setContextClassLoader(classloader); + + doAction(this, getMandatoryArguments()); + + return SUCCESS; + } + + /** + * extract jars from wikitty service, and return urls to thoses extracted + * jars + * + * @return urls to jars that must be add to classpath + * @throws IOException + * @throws MalformedURLException + */ + protected URL[] getJarsDependency() throws IOException, + MalformedURLException { // check for temporaryn dir if (!FileUtils.getTempDirectory().exists()) { FileUtils.getTempDirectory().mkdir(); @@ -93,13 +125,15 @@ File jarRepo; File md5File; + // base criteria to found jars Search wikittyPubDataJarCrit = Search.query().eq( WikittyPubData.FQ_FIELD_WIKITTYPUBDATA_MIMETYPE, MimeTypePubHelper.JAR_TYPE); + String jarRepoPath = FileUtils.getTempDirectory().getAbsolutePath() + File.separator + JAR_TEMP_DIR_NAME; - // initialiser directory etc if context set + // if contextApps set, update criteria if (contextApps != null) { // if application context is set sub dir jarRepoPath = jarRepoPath + File.separator + contextApps; @@ -108,6 +142,7 @@ WikittyLabel.FQ_FIELD_WIKITTYLABEL_LABELS, contextApps); } + // dir that containt jars jarRepo = new File(jarRepoPath + File.separator); md5File = new File(jarRepo.getAbsolutePath() + File.separator + MD5_FILE); @@ -119,8 +154,11 @@ String md5ref = FileUtil.readAsString(md5File); + // find jars PagedResult<Wikitty> jardatas = getWikittyProxy().findAllByCriteria( wikittyPubDataJarCrit.criteria()); + + // construct md5 of the wikitty jars String sumMd5 = StringUtils.EMPTY; for (Wikitty w : jardatas) { sumMd5 += w.getId(); @@ -128,6 +166,7 @@ } sumMd5 = StringUtil.encodeMD5(sumMd5); + // if md5 not the same that mean that jars must be write on disk if (!sumMd5.equals(md5ref)) { FileUtil.writeString(md5File, sumMd5); for (Wikitty w : jardatas) { @@ -140,11 +179,13 @@ } + // collect urls of the jars loaded File[] jarFiles = jarRepo.listFiles(JarUtil.jarFilter); URL[] urls = new URL[1]; classPathSup = new LinkedList<File>(); classPathSup.add(jarRepo); urls[0] = jarRepo.toURI().toURL(); + if (jarFiles != null) { urls = new URL[jarFiles.length + 1]; int i = 0; @@ -156,17 +197,7 @@ i++; } } - - // initialize classLoader - - classloader = new WikittyPublicationClassLoader(urls); - // REALLY IMPORTANT put the classloader with the jarloaded - - Thread.currentThread().setContextClassLoader(classloader); - - doAction(this, getMandatoryArguments()); - - return SUCCESS; + return urls; } /* @@ -191,9 +222,13 @@ } else { WikittyProxy proxy = context.getWikittyProxy(); Wikitty w = proxy.findByCriteria(criteria); - if (w == null || !w.hasExtension(WikittyPubText.EXT_WIKITTYPUBTEXT)) { + /* + * If wikitty is not a wikitty pub text just return an error if + * wikitty is wikitty pub data do the same as raw action + */ + if (w.hasExtension(WikittyPubData.EXT_WIKITTYPUBDATA)) { contentType = WikittyPubDataHelper.getMimeType(w); @@ -211,10 +246,12 @@ || WikittyPubTextHelper.getMimeType(w).equals( MimeTypePubHelper.JAVA_TYPE)) { + // if java type deleguate result = evalJava(context, subContext, decorator, criteria, w); } else { + // check if wikitty is the kind that contain ui log.debug("Check if transformed needed"); if (decorator.isTransformationNeeded(w)) { log.debug("transformeneed"); @@ -232,7 +269,7 @@ if (content == null) { result = getError(context); - + } else { String mimetype = WikittyPubTextHelper.getMimeType(w); @@ -258,10 +295,6 @@ 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); @@ -277,11 +310,17 @@ /** * 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 + * + * @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, @@ -289,10 +328,13 @@ Criteria criteria, Wikitty w) { Object result; - + // 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(); } @@ -303,10 +345,12 @@ javaWikittyFile.mkdir(); } + // encapsulate java inside a class String javaContent = decorator.getCode(w); String content = null; try { + // compile File javaFile = new File(javaWikittyFile.getAbsolutePath() + File.separator + name + ".java"); File clazzFile = new File(javaWikittyFile.getAbsolutePath() @@ -315,6 +359,8 @@ 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)) @@ -332,7 +378,7 @@ + File.separator + name + ".class"); byte[] wikittyByte = FileUtil.fileToByte(classFile); - + // add extension and attribut w.addExtension(WikittyPubTextCompiledImpl.extensionWikittyPubTextCompiled); WikittyPubTextCompiledHelper.setByteCode(w, wikittyByte); } catch (Exception e) { @@ -347,7 +393,8 @@ } } - + // evaluate the content of the wikittyPubTextCompiled, + // the byte code of a class that inherit of a specific abstract class byte[] content = WikittyPubTextCompiledHelper.getByteCode(w); if (content == null) { result = getError(context); Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionRaw.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionRaw.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionRaw.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -18,6 +18,13 @@ import java.util.Collections; import java.util.List; +/** + * Java class for the raw action that return wikittyPub simply with their + * Mime Type. + * + * @author mfortun + * + */ public class PublicationActionRaw extends PublicationBaseAction implements ServletResponseAware { @@ -50,6 +57,7 @@ Wikitty w = proxy.findByCriteria(criteria); + // return wikittyPubWith their mime type if (w.hasExtension(WikittyPubData.EXT_WIKITTYPUBDATA)) { mimeType = WikittyPubDataHelper.getMimeType(w); inputStream = new ByteArrayInputStream( Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionRestoreWikitty.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionRestoreWikitty.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionRestoreWikitty.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -4,6 +4,11 @@ import com.opensymphony.xwork2.ActionContext; +/** + * Class for fragment action used to show a wikitty in the view page + * @author mfortun + * + */ public class PublicationActionRestoreWikitty extends PublicationBaseAction { /** Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionView.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionView.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/action/PublicationActionView.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -13,6 +13,12 @@ import java.util.Collections; import java.util.List; +/** + * class for the view action to list wikitty and search + * + * @author mfortun + * + */ public class PublicationActionView extends PublicationBaseAction { protected PagedResult<Wikitty> pagedResult; Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/LoginInterceptor.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/LoginInterceptor.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/LoginInterceptor.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -63,16 +63,13 @@ String context = StringUtil.split( invocation.getProxy().getActionName(), "/")[0]; - + // get the session relative to the context WikittyPublicationSession pubSession = WikittyPublicationSession .getWikittyPublicationSession(session,context); WikittyUser user = pubSession.getUser(); - - HttpServletRequest request = ServletActionContext.getRequest(); - - // Construct redirect url. + HttpServletRequest request = ServletActionContext.getRequest(); String redirect = "/"+ context+request.getContextPath() + error ; redirect += "?success="+request.getServletPath(); Modified: trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/LogoutInterceptor.java =================================================================== --- trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/LogoutInterceptor.java 2011-08-29 09:45:10 UTC (rev 1195) +++ trunk/wikitty-publication-ui/src/main/java/org/nuiton/wikitty/publication/ui/interceptor/LogoutInterceptor.java 2011-08-29 12:47:01 UTC (rev 1196) @@ -48,7 +48,9 @@ // get wikittypublication context String contextData = StringUtil.split(invocation.getProxy() .getActionName(), "/")[0]; + // invalidate session for the context WikittyPublicationSession.invalidate(session, contextData); + // next. String result = invocation.invoke(); return result; }