You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shale.apache.org by ra...@apache.org on 2006/10/31 02:14:30 UTC

svn commit: r469332 - in /shale/framework/trunk/shale-dialog-scxml/src/main: java/org/apache/shale/dialog/scxml/ java/org/apache/shale/dialog/scxml/impl/ resources/META-INF/

Author: rahul
Date: Mon Oct 30 17:14:30 2006
New Revision: 469332

URL: http://svn.apache.org/viewvc?view=rev&rev=469332
Log:
Introduce the notion of a DialogStateMapper which maps dialog state IDs to JSF view IDs.
 * The current FacesContext is available to this mapping, so it is possible to support multiple sets of views over user agents, modalities, locales, user roles etc. (ofcourse, the latter two on rare occassions) and share the same dialog "controller".
 * The default behavior is an identity transform, the state ID is used as-is as the view ID (a leading slash is added, if needed)
 * That behavior can be changed by replacing the application scope bean (which implements DialogStateMapper) at key "org$apache$shale$dialog$scxml$STATE_MAPPER"
Removed related TODOs from code, added new one as a reminder to document this bit.
SHALE-263

Added:
    shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/DialogStateMapper.java   (with props)
    shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/
    shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/DefaultDialogStateMapper.java   (with props)
    shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/package.html   (with props)
Modified:
    shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/Globals.java
    shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/SCXMLDialogContext.java
    shale/framework/trunk/shale-dialog-scxml/src/main/resources/META-INF/faces-config.xml

Added: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/DialogStateMapper.java
URL: http://svn.apache.org/viewvc/shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/DialogStateMapper.java?view=auto&rev=469332
==============================================================================
--- shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/DialogStateMapper.java (added)
+++ shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/DialogStateMapper.java Mon Oct 30 17:14:30 2006
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shale.dialog.scxml;
+
+import javax.faces.context.FacesContext;
+
+/**
+ * <p>{@link DialogStateMapper} is an interface describing a pluggable
+ * mechanism to map between the state ID within a SCXML dialog definition
+ * and the corresponding JavaServer Faces <em>view identifier</em>
+ * that should be rendered when the dialog state machine comes to rest in
+ * that state.</p>
+ *
+ * <p>By default, an identity transform is applied i.e. the
+ * JavaServer Faces <code>view identifier</code> used is the same as
+ * the dialog state identifier.</p>
+ *
+ * TODO: Add mention in website docs.
+ *
+ * @since 1.0.4
+ *
+ * $Id$
+ */
+public interface DialogStateMapper {
+
+    /**
+     * <p>Return the JavaServer Faces <code>view identifier</code> that
+     * corresponds to current dialog state. The current {@link FacesContext}
+     * instance is also available so developers can consult pertinent
+     * information such as user role, current locale, user agent making
+     * the request etc. to map the state identifier to the view
+     * identifier, if needed.</p>
+     *
+     * @param dialogName The logical name of the dialog this state belongs to
+     * @param stateId The state identifier for the current dialog state
+     * @param context The current {@link FacesContext}
+     * @return The JavaServer Faces <code>view identifier</code> that should
+     *         be rendered
+     */
+    public String mapStateId(String dialogName, String stateId,
+                            FacesContext context);
+
+}
+

Propchange: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/DialogStateMapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/DialogStateMapper.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/Globals.java
URL: http://svn.apache.org/viewvc/shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/Globals.java?view=diff&rev=469332&r1=469331&r2=469332
==============================================================================
--- shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/Globals.java (original)
+++ shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/Globals.java Mon Oct 30 17:14:30 2006
@@ -17,6 +17,8 @@
 
 package org.apache.shale.dialog.scxml;
 
+import org.apache.shale.dialog.scxml.impl.DefaultDialogStateMapper;
+
 /**
  * <p>Manifest constants and well known event names for the
  * Jakarta Commons SCXML driven Shale dialog implementation.</p>
@@ -42,6 +44,15 @@
      */
     public static final String DIALOGS =
             "org.apache.shale.dialog.scxml.DIALOGS";
+
+
+    /**
+     * <p>Application scope attribute under which the current
+     * {@link DialogStateMapper} implementation resides. Defaults to
+     * {@link DefaultDialogStateMapper}.</p>
+     */
+    public static final String STATE_MAPPER =
+            "org$apache$shale$dialog$scxml$STATE_MAPPER";
 
 
     /**

Modified: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/SCXMLDialogContext.java
URL: http://svn.apache.org/viewvc/shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/SCXMLDialogContext.java?view=diff&rev=469332&r1=469331&r2=469332
==============================================================================
--- shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/SCXMLDialogContext.java (original)
+++ shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/SCXMLDialogContext.java Mon Oct 30 17:14:30 2006
@@ -22,6 +22,7 @@
 import javax.faces.application.ViewHandler;
 import javax.faces.component.UIViewRoot;
 import javax.faces.context.FacesContext;
+import javax.faces.el.ValueBinding;
 
 import org.apache.commons.scxml.SCXMLExecutor;
 import org.apache.commons.scxml.SCXMLListener;
@@ -226,19 +227,15 @@
             fireOnException(me);
         }
 
-        // TODO - Re-evaluate before leaving sandbox
-        // Using C/C, "View" state ID is JSF viewId, which is an acceptable
-        // approach with Commons SCXML v0.5
         Iterator iterator = dialogExecutor.getCurrentStatus().getStates().iterator();
         this.stateId = ((State) iterator.next()).getId();
-        String viewId = stateId; // to illustrate there could be some other transform here
 
         // If done, stop context
         if (dialogExecutor.getCurrentStatus().isFinal()) {
             stop(context);
         }
 
-        navigateTo(viewId, context);
+        navigateTo(stateId, context);
 
     }
 
@@ -277,18 +274,15 @@
             fireOnException(me);
         }
 
-        // Using C/C, "View" state ID is JSF viewId, which is an acceptable
-        // approach with Commons SCXML v0.5 since it accepts spaces etc.
         Iterator iterator = dialogExecutor.getCurrentStatus().getStates().iterator();
         this.stateId = ((State) iterator.next()).getId();
-        String viewId = stateId; // to illustrate there could be some other transform here
 
         // Might be done at the beginning itself, if so, stop context
         if (dialogExecutor.getCurrentStatus().isFinal()) {
             stop(context);
         }
 
-        navigateTo(viewId, context);
+        navigateTo(stateId, context);
 
     }
 
@@ -323,13 +317,17 @@
 
 
     /**
-     * <p>Convention over configuration approach.</p>
+     * <p>Navigate to the JavaServer Faces <code>view identifier</code>
+     * that is mapped to by the current state identifier for this dialog.</p>
      *
-     * @param viewId The identifier of the view to navigate to.
+     * @param stateId The current state identifier for this dialog.
      * @param context The current <code>FacesContext</code>
      */
-    private void navigateTo(String viewId, FacesContext context) {
-        // TODO: Convention needs to be configurable ;-)
+    private void navigateTo(String stateId, FacesContext context) {
+        ValueBinding vb = context.getApplication().createValueBinding
+            ("#{" + Globals.STATE_MAPPER + "}");
+        DialogStateMapper dsm = (DialogStateMapper) vb.getValue(context);
+        String viewId = dsm.mapStateId(name, stateId, context);
         // Navigate to the requested view identifier (if any)
         if (viewId == null) {
             return;

Added: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/DefaultDialogStateMapper.java
URL: http://svn.apache.org/viewvc/shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/DefaultDialogStateMapper.java?view=auto&rev=469332
==============================================================================
--- shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/DefaultDialogStateMapper.java (added)
+++ shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/DefaultDialogStateMapper.java Mon Oct 30 17:14:30 2006
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shale.dialog.scxml.impl;
+
+import javax.faces.context.FacesContext;
+
+import org.apache.shale.dialog.scxml.DialogStateMapper;
+
+/**
+ * <p>Default {@link DialogStateMapper} implementation. The dialog state
+ * identifier itself is used as the JavaServer Faces
+ * <code>view identifier</code>.</p>
+ *
+ * @since 1.0.4
+ *
+ * $Id$
+ */
+public class DefaultDialogStateMapper implements DialogStateMapper {
+
+    /**
+     * <p>The default implementation is an identity transform i.e. it
+     * returns the dialog state ID as the next JavaServer Faces
+     * <code>view identifier</code>.</p>
+     */
+    public String mapStateId(String dialogName, String stateId,
+            FacesContext context) {
+
+        // the identity transform
+        return stateId;
+
+    }
+
+}
+

Propchange: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/DefaultDialogStateMapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/DefaultDialogStateMapper.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/package.html
URL: http://svn.apache.org/viewvc/shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/package.html?view=auto&rev=469332
==============================================================================
--- shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/package.html (added)
+++ shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/package.html Mon Oct 30 17:14:30 2006
@@ -0,0 +1,27 @@
+<html>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to you under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<head>
+</head>
+<body>
+
+  <p>Default implementations of interfaces in this module.</p>
+
+</body>
+</html>

Propchange: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/package.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: shale/framework/trunk/shale-dialog-scxml/src/main/java/org/apache/shale/dialog/scxml/impl/package.html
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: shale/framework/trunk/shale-dialog-scxml/src/main/resources/META-INF/faces-config.xml
URL: http://svn.apache.org/viewvc/shale/framework/trunk/shale-dialog-scxml/src/main/resources/META-INF/faces-config.xml?view=diff&rev=469332&r1=469331&r2=469332
==============================================================================
--- shale/framework/trunk/shale-dialog-scxml/src/main/resources/META-INF/faces-config.xml (original)
+++ shale/framework/trunk/shale-dialog-scxml/src/main/resources/META-INF/faces-config.xml Mon Oct 30 17:14:30 2006
@@ -34,4 +34,10 @@
         <managed-bean-scope>session</managed-bean-scope>
     </managed-bean>
 
+    <managed-bean>
+        <managed-bean-name>org$apache$shale$dialog$scxml$STATE_MAPPER</managed-bean-name>
+        <managed-bean-class>org.apache.shale.dialog.scxml.impl.DefaultDialogStateMapper</managed-bean-class>
+        <managed-bean-scope>application</managed-bean-scope>
+    </managed-bean>
+
 </faces-config>