[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("&")) {
+ paramString = "&" + 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()
+ + "   ";
+
+ 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