[Yanel-commits] rev 40949 - in public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu: . impl

michi at wyona.com michi at wyona.com
Wed Jan 14 16:20:20 CET 2009


Author: michi
Date: 2009-01-14 16:20:19 +0100 (Wed, 14 Jan 2009)
New Revision: 40949

Added:
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/AnchorElement.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/ITransitionMenuContent.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionInformationMenuContent.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionTransitions.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionTransitionsMenuContent.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/TransitionMenuContentImpl.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/URLBuilder.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/impl/RevisionInformationMenuItem.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/impl/WorkflowMenu.java
Log:
thanks to Gary also the workflow is attached to the revisions

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/AnchorElement.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/AnchorElement.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/AnchorElement.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,24 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu;
+
+/**
+ * @author gary
+ *
+ */
+public class AnchorElement {
+    
+    private String label;
+    private String url;
+    
+    public AnchorElement(final String label, final String url) {
+        this.label = label;
+        this.url = url;
+    }
+    
+    public String toString() {
+        return "<a href='" + url + "'>" + label + "</a>";
+    }
+
+}

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/ITransitionMenuContent.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/ITransitionMenuContent.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/ITransitionMenuContent.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,22 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu;
+
+import org.wyona.yanel.core.workflow.Transition;
+
+/**
+ * @author gary
+ *
+ */
+public interface ITransitionMenuContent {
+
+    /**
+     * Returns a LI element, containing either a link to activate the desired action,
+     * or plain text if it is not allowed to take the action based on the revision state.
+     * @param t
+     * @return
+     */
+    public abstract String getTransitionElement(final Transition t);
+
+}

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionInformationMenuContent.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionInformationMenuContent.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionInformationMenuContent.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,23 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu;
+
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.attributes.versionable.RevisionInformation;
+
+/**
+ * @author gary
+ *
+ */
+public interface RevisionInformationMenuContent {
+
+    public abstract String toHTML();
+    
+    public abstract String getMenuLanguageCode();
+    
+    public abstract Resource getResource();
+    
+    public abstract RevisionInformation getRevisionInfo();
+
+}
\ No newline at end of file

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionTransitions.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionTransitions.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionTransitions.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,89 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu;
+
+import org.apache.log4j.Logger;
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.api.attributes.WorkflowableV1;
+import org.wyona.yanel.core.attributes.versionable.RevisionInformation;
+import org.wyona.yanel.core.workflow.Transition;
+import org.wyona.yanel.core.workflow.Workflow;
+import org.wyona.yanel.core.workflow.WorkflowException;
+import org.wyona.yanel.core.workflow.WorkflowHelper;
+
+
+/**
+ * @author gary
+ *
+ */
+public class RevisionTransitions implements RevisionTransitionsMenuContent {
+    
+    private static Logger log = Logger.getLogger(RevisionTransitions.class);
+    
+    private Resource resource;
+    private String revision;
+    private String language;
+    private ITransitionMenuContent menuItems;
+
+    
+    public RevisionTransitions(Resource resource, String revn, String lang, ITransitionMenuContent menuItems) {
+        this.resource = resource;
+        this.revision = revn;
+        this.language = lang;
+        this.menuItems = menuItems;
+    }
+
+    private String getContent() {
+        String content = "";
+
+        try {
+            Workflow workflow = WorkflowHelper.getWorkflow(this.resource);
+            
+            if (workflow != null) {
+                content = "<ul>";
+
+                WorkflowableV1 workflowable = (WorkflowableV1) this.resource;
+                String state = workflowable.getWorkflowState(revision);
+
+                Transition[] transitions = workflow.getTransitions();
+//                ITransitionMenuContent menuItems =
+//                    new TransitionMenuContentImpl(getResource(), state, getRevisionInfo().getName(), getMenuLanguageCode());
+
+                for (int i = 0; i < transitions.length; i++) {
+                    content += menuItems.getTransitionElement(transitions[i]);
+                }
+
+                content += "</ul>";
+            }
+            
+        } catch (WorkflowException e) {
+            content = "";
+            log.error("Could not get workflow.", e);
+        }
+
+        return content;
+    }
+
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.RevisionTransitionsMenuContent#getMenuLanguageCode()
+     */
+    public String getMenuLanguageCode() {
+        return this.language;
+    }
+
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.RevisionTransitionsMenuContent#getResource()
+     */
+    public Resource getResource() {
+        return this.resource;
+    }
+
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.RevisionTransitionsMenuContent#toHTML()
+     */
+    public String toHTML() {
+        return getContent();
+    }
+
+}

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionTransitionsMenuContent.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionTransitionsMenuContent.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/RevisionTransitionsMenuContent.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,23 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu;
+
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.attributes.versionable.RevisionInformation;
+
+/**
+ * @author gary
+ *
+ */
+public interface RevisionTransitionsMenuContent {
+    
+    public abstract String toHTML();
+    
+    public abstract String getMenuLanguageCode();
+    
+    public abstract Resource getResource();
+    
+    //public abstract RevisionInformation getRevisionInfo();
+
+}
\ No newline at end of file

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/TransitionMenuContentImpl.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/TransitionMenuContentImpl.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/TransitionMenuContentImpl.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,131 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu;
+
+import org.apache.log4j.Logger;
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.workflow.Transition;
+import org.wyona.yanel.core.workflow.Workflow;
+import org.wyona.yanel.core.workflow.WorkflowException;
+import org.wyona.yanel.core.workflow.WorkflowHelper;
+
+
+/**
+ * Creates an html element wrapping the transition of a resource from a given state.
+ * The element contains an appropriately formatted URL (i.e. GET request) as an
+ * anchor if the transition is valid.
+ * @author gary
+ *
+ */
+public class TransitionMenuContentImpl implements ITransitionMenuContent {
+    private static Logger log = Logger.getLogger(TransitionMenuContentImpl.class);
+    
+    private static final String RESOURCE_REVN_ARG = "yanel.resource.revision=";
+    private static final String RESOURCE_TRANSITION_ARG = "yanel.resource.workflow.transition=";
+    private static final String RESOURCE_TRANSITION_OUTPUT = "yanel.resource.workflow.transition.output";
+    
+    private static final String STYLE_INACTIVE = "inactive";
+
+    
+    private Resource resource;
+    private String state;
+    private String revision;
+    private String isoMenuLang;
+    private Transition[] transitions;
+    
+    public TransitionMenuContentImpl(final Resource resource, final String status, final String revision, final String langCode) {
+        this.resource = resource;
+        this.state = status;
+        this.revision = revision;
+        this.isoMenuLang = langCode.toLowerCase();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.impl.ITransitionMenuContent#getTransitionElement(org.wyona.yanel.core.workflow.Transition)
+     */
+    public String getTransitionElement(final Transition t) {
+        String result = null;
+
+        try {
+            if (this.transitions == null) {
+                Workflow workflow = WorkflowHelper.getWorkflow(this.resource);
+                this.transitions = workflow.getLeavingTransitions(this.state);
+            }
+
+            String label = t.getDescription(t.getDescriptionLanguages()[getDescriptionLanguageIndex(t)]);
+
+            for (int i = 0; i < this.transitions.length; i++) {
+                if (transitionsMatch(this.transitions[i], t)) {
+                    try {
+                        String url = getTransitionURL(this.transitions[i].getID());
+                        String anchor = new AnchorElement(label, url).toString();
+                        result = "<li>" + anchor + "</li>";
+                    } catch (Exception e) {
+                        log.error("Could not get resource URL.", e);
+                    }
+                }
+            }
+
+            if (result == null) {
+                result = "<li class='" + STYLE_INACTIVE + "'>" + label + "</li>";
+            }
+
+        } catch (WorkflowException e) {
+            log.error("Could not get workflow.", e);
+        }
+        
+        return result;
+    }
+        
+    private boolean transitionsMatch(final Transition t1, final Transition t2) {
+        return t1.getDescription(t1.getDescriptionLanguages()[getDescriptionLanguageIndex(t1)]).
+            equals(t2.getDescription(t2.getDescriptionLanguages()[getDescriptionLanguageIndex(t2)]));
+    }
+    
+    private String getTransitionURL(final String transitionId) throws Exception {
+        String url = getResourceURL();
+        String submit = RESOURCE_TRANSITION_ARG + transitionId;
+        URLBuilder builder = new URLBuilder();
+        
+        builder.createURL(url, submit);
+        builder.addParameter(RESOURCE_REVN_ARG, this.revision);
+        builder.addParameter(RESOURCE_TRANSITION_OUTPUT, "xhtml");
+
+        return builder.getURL();
+    }
+    
+    private String getResourceURL() throws Exception {
+        String backToRealm = org.wyona.yanel.core.util.PathUtil.backToRealm(this.resource.getPath());
+        String url = backToRealm + this.resource.getPath();
+
+        url = url.replaceAll("//", "/");
+
+        return url;
+    }
+    
+    private int getDescriptionLanguageIndex(Transition t) {
+        int langIdx = -1;
+        String[] availableLanguages = t.getDescriptionLanguages();
+        
+        for (int i = 0; i < availableLanguages.length; i++) {
+            if (availableLanguages[i].toLowerCase().equals(this.isoMenuLang)) {
+                langIdx = i;
+                break;
+            }
+        }
+        
+        if (langIdx < 0) {
+            String defaultLang = this.resource.getRealm().getDefaultLanguage().toLowerCase();
+
+            for (int i = 0; i < availableLanguages.length; i++) {
+                if (availableLanguages[i].toLowerCase().equals(defaultLang)) {
+                    langIdx = i;
+                    break;
+                }
+            }
+        }
+        
+        return langIdx;
+    }
+}

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/URLBuilder.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/URLBuilder.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/URLBuilder.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,48 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu;
+
+/**
+ * @author gary
+ *
+ */
+public class URLBuilder {
+    
+    private String url;
+    
+    public void createURL(final String baseURL, final String arg) {
+        this.url = baseURL;
+
+        if (arg != null && arg.length() > 0) {
+            url = url + makeArgumentString(arg);
+        }
+    }
+    
+    public void addParameter(final String paramName, final String paramValue) {
+        String paramString = paramName;
+        if (! paramName.substring(0, 4).equals("&amp;")) {
+            paramString = "&amp;" + paramString;
+        }
+        if (paramValue != null && paramValue.length() > 0) {
+            if (paramName.charAt(paramName.length()-1) != '=') {
+                paramString += "=";
+            }
+            paramString += paramValue;
+        }
+        
+        this.url += paramString; 
+    }
+    
+    public String getURL() {
+        return this.url;
+    }
+    
+    private String makeArgumentString(final String arg) {
+        String argString = arg;
+        if (arg.charAt(0) != '?') {
+            argString = "?" + argString;
+        }
+        return argString;
+    }
+}

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/impl/RevisionInformationMenuItem.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/impl/RevisionInformationMenuItem.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/impl/RevisionInformationMenuItem.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,86 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu.impl;
+
+import org.apache.log4j.Logger;
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.api.attributes.WorkflowableV1;
+import org.wyona.yanel.core.attributes.versionable.RevisionInformation;
+import org.wyona.yanel.core.workflow.WorkflowException;
+import org.wyona.yanel.servlet.menu.ITransitionMenuContent;
+import org.wyona.yanel.servlet.menu.RevisionInformationMenuContent;
+import org.wyona.yanel.servlet.menu.RevisionTransitions;
+import org.wyona.yanel.servlet.menu.RevisionTransitionsMenuContent;
+import org.wyona.yanel.servlet.menu.TransitionMenuContentImpl;
+
+/**
+ * @author gary
+ *
+ */
+public class RevisionInformationMenuItem implements RevisionInformationMenuContent {
+    
+    private static Logger log = Logger.getLogger(RevisionInformationMenuItem.class);
+    
+    private Resource resource;
+    private RevisionInformation revision;
+    private String language;
+    
+    RevisionInformationMenuItem(Resource resource, RevisionInformation revn, String lang) {
+        this.resource = resource;
+        this.revision = revn;
+        this.language = lang;
+    }
+
+    private String getContent() {
+        String value = "";
+        
+        try {
+            value = "<li class=\"haschild\">"
+                  + this.revision.getName()
+                  + "&#160;&#160;&#160;";
+            
+            WorkflowableV1 workflowable = (WorkflowableV1) this.resource;
+            String state = workflowable.getWorkflowState(revision.getName());
+            ITransitionMenuContent x =
+                new TransitionMenuContentImpl(getResource(), state, getRevisionInfo().getName(), getMenuLanguageCode());
+            RevisionTransitionsMenuContent rt = new RevisionTransitions(getResource(), getRevisionInfo().getName(), getMenuLanguageCode(), x);
+            value += rt.toHTML();
+            value += "</li>";
+        } catch (WorkflowException e) {
+            value = "";
+            log.error("Could not get workflow.", e);
+        }
+
+        return value;
+    }
+
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.impl.RevisionInformationMenuContent#toHTML()
+     */
+    public String toHTML() {
+        return getContent();
+    }
+
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.impl.RevisionInformationMenuContent#getMenuLanguageCode()
+     */
+    public String getMenuLanguageCode() {
+        return this.language;
+    }
+
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.impl.RevisionInformationMenuContent#getResource()
+     */
+    public Resource getResource() {
+        return this.resource;
+    }
+
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.impl.RevisionInformationMenuContent#getRevisionInfo()
+     */
+    public RevisionInformation getRevisionInfo() {
+        return this.revision;
+    }
+    
+}

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/impl/WorkflowMenu.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/impl/WorkflowMenu.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/menu/impl/WorkflowMenu.java	2009-01-14 15:20:19 UTC (rev 40949)
@@ -0,0 +1,32 @@
+/**
+ * 
+ */
+package org.wyona.yanel.servlet.menu.impl;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.map.Map;
+import org.wyona.yanel.servlet.menu.Menu;
+
+/**
+ * @author gary
+ *
+ */
+public class WorkflowMenu extends Menu {
+
+    /* (non-Javadoc)
+     * @see org.wyona.yanel.servlet.menu.Menu#getMenus(org.wyona.yanel.core.Resource, javax.servlet.http.HttpServletRequest, org.wyona.yanel.core.map.Map, java.lang.String)
+     */
+    @Override
+    public String getMenus(Resource resource, HttpServletRequest request,
+            Map map, String reservedPrefix) throws ServletException,
+            IOException, Exception {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}



More information about the Yanel-commits mailing list