beehive-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From r...@apache.org
Subject svn commit: r124028 - in incubator/beehive/trunk/netui: src/compiler/org/apache/beehive/netui/compiler src/compiler/org/apache/beehive/netui/compiler/genmodel src/compiler/org/apache/beehive/netui/compiler/grammar src/compiler/org/apache/beehive/netui/compiler/model src/pageflow/org/apache/beehive/netui/pageflow src/pageflow/org/apache/beehive/netui/pageflow/annotations src/pageflow/org/apache/beehive/netui/pageflow/config src/tags-html/org/apache/beehive/netui/tags/html src/tags-html/org/apache/beehive/netui/tags/internal src/util/org/apache/beehive/netui/util test/webapps/drt/coreWeb/WEB-INF test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit
Date Mon, 03 Jan 2005 21:42:55 GMT
Author: rich
Date: Mon Jan  3 13:42:54 2005
New Revision: 124028

URL: http://svn.apache.org/viewcvs?view=rev&rev=124028
Log:
First cut at annotation/tag support for double-submit prevention.  Currently, the feature
is simply this: 

    @Jpf.Action(preventDoubleSubmit=true,…) 
              -or- 
    @Jpf.SimpleAction(preventDoubleSubmit=true,…) 

If you use netui:form, netui:button (with an 'action'), netui:anchor, or netui:imageAnchor
in conjunction with a 'preventDoubleSubmit=true' action, you will get a DoubleSubmitException
if you click two or more times on the same link/button.

DRT: netui (WinXP)
BB: self (linux)


Added:
   incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleSubmitException.java
      - copied, changed from r124020, incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/Controller.jpf
  (contents, props changed)
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/caughtit.jsp
  (contents, props changed)
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/index.jsp
  (contents, props changed)
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/submitted.jsp
  (contents, props changed)
Removed:
   incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java
Modified:
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/genmodel/GenActionModel.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ActionGrammar.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/SimpleActionGrammar.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/model/ActionModel.java
   incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
   incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.java
   incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowActionMapping.java
   incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/AnchorBase.java
   incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Button.java
   incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Form.java
   incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTagUtils.java
   incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java&r1=124027&p2=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java
(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java
Mon Jan  3 13:42:54 2005
@@ -161,6 +161,7 @@
     public static final String RAISE_ACTIONS_ATTR = "raiseActions";
     public static final String MULTIPART_HANDLER_ATTR = "multipartHandler";
     public static final String SHARED_FLOW_REFS_ATTR = "sharedFlowRefs";
+    public static final String PREVENT_DOUBLE_SUBMIT_ATTR = "preventDoubleSubmit";
     
     public static final String MIN_INT_ATTR = "minInt";
     public static final String MAX_INT_ATTR = "maxInt";

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/genmodel/GenActionModel.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/genmodel/GenActionModel.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/genmodel/GenActionModel.java&r1=124027&p2=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/genmodel/GenActionModel.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/genmodel/GenActionModel.java
(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/genmodel/GenActionModel.java
Mon Jan  3 13:42:54 2005
@@ -72,6 +72,12 @@
         setLoginRequired( loginRequired );
         
         //
+        // prevent-double-submit
+        //
+        Boolean preventDoubleSubmit = CompilerUtils.getBoolean( annotation, PREVENT_DOUBLE_SUBMIT_ATTR,
false );
+        setPreventDoubleSubmit( preventDoubleSubmit );
+        
+        //
         // readOnly
         //
         Boolean readOnly = CompilerUtils.getBoolean( annotation, READONLY_ATTR, true );

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ActionGrammar.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ActionGrammar.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ActionGrammar.java&r1=124027&p2=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ActionGrammar.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ActionGrammar.java
(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ActionGrammar.java
Mon Jan  3 13:42:54 2005
@@ -17,7 +17,6 @@
  */
 package org.apache.beehive.netui.compiler.grammar;
 
-import org.apache.beehive.netui.compiler.AnnotationGrammar;
 import org.apache.beehive.netui.compiler.RuntimeVersionChecker;
 import org.apache.beehive.netui.compiler.AnnotationMemberType;
 import org.apache.beehive.netui.compiler.FlowControllerInfo;
@@ -40,6 +39,7 @@
         addMemberType( READONLY_ATTR, new AnnotationMemberType( VERSION_8_SP2_STRING, this
) );
         addMemberType( USE_FORM_BEAN_ATTR,
                        new WritableFieldType( OBJECT_CLASS_NAME, USE_FORM_BEAN_ATTR, VERSION_8_SP2_STRING,
this ) );
+        addMemberType( PREVENT_DOUBLE_SUBMIT_ATTR, new AnnotationMemberType( null, this )
);
         
         addMemberArrayGrammar( FORWARDS_ATTR, new ForwardGrammar( env, diags, null, rvc,
fcInfo ) );
         addMemberArrayGrammar( CATCHES_ATTR, new CatchGrammar( env, diags, null, rvc, ACTION_TAG_NAME,
fcInfo ) );

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/SimpleActionGrammar.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/SimpleActionGrammar.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/SimpleActionGrammar.java&r1=124027&p2=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/SimpleActionGrammar.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/SimpleActionGrammar.java
(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/SimpleActionGrammar.java
Mon Jan  3 13:42:54 2005
@@ -58,6 +58,7 @@
         addMemberType( TILES_DEFINITION_ATTR, new AnnotationMemberType( null, this ) );
         addMemberType( REDIRECT_ATTR, new AnnotationMemberType( null , this ) );
         addMemberType( EXTERNAL_REDIRECT_ATTR, new AbsolutePathType( null , this ) );
+        addMemberType( PREVENT_DOUBLE_SUBMIT_ATTR, new AnnotationMemberType( null, this )
);
         
         addMemberArrayGrammar( CONDITIONAL_FORWARDS_ATTR,
                                new SimpleActionForwardGrammar( env, diags, null, rvc, fcInfo
) );

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/model/ActionModel.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/model/ActionModel.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/model/ActionModel.java&r1=124027&p2=incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/model/ActionModel.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/model/ActionModel.java
(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/model/ActionModel.java
Mon Jan  3 13:42:54 2005
@@ -67,6 +67,7 @@
     private boolean _isOverloaded;
     private boolean _readonly;
     private boolean _isSimpleAction = false;
+    private boolean _preventDoubleSubmit = false;
     private String _formMember;     // pageflow-scoped form
     private String _formClass;      // applicable for non-ActionForm-derived types
     private Map< String, String > _conditionalForwards;
@@ -115,6 +116,7 @@
         _formClass = src._formClass;
         _roles = src._roles;
         _loginRequired = src._loginRequired;
+        _preventDoubleSubmit = src._preventDoubleSubmit;
         _isSimpleAction = src._isSimpleAction;
         _isOverloaded = src._isOverloaded;
         _readonly = src._readonly;
@@ -222,6 +224,7 @@
         if ( _formMember != null ) addSetProperty( xb, "formMember", _formMember );
         if ( _formClass != null ) addSetProperty( xb, "formClass", _formClass );
         if ( _loginRequired ) addSetProperty( xb, "loginRequired", _loginRequired );
+        if ( _preventDoubleSubmit ) addSetProperty( xb, "preventDoubleSubmit", _preventDoubleSubmit
);
         if ( _isOverloaded ) addSetProperty( xb, "overloaded", _isOverloaded );
         if ( _readonly ) addSetProperty( xb, "readonly", _readonly );
         if ( _isSimpleAction ) addSetProperty( xb, "simpleAction", _isSimpleAction );
@@ -464,14 +467,14 @@
         _roles = roles;
     }
 
-    public boolean isLoginRequired()
-    {
-        return _loginRequired;
-    }
-
     public void setLoginRequired( boolean loginRequired )
     {
         _loginRequired = loginRequired;
+    }
+    
+    public void setPreventDoubleSubmit( boolean preventDoubleSubmit )
+    {
+        _preventDoubleSubmit = preventDoubleSubmit;
     }
 
     public boolean isSimpleAction()

Deleted: /incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java?view=auto&rev=124027
==============================================================================

Copied: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleSubmitException.java
(from r124020, incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java)
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleSubmitException.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java&r1=124020&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleSubmitException.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java
(original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleSubmitException.java
Mon Jan  3 13:42:54 2005
@@ -20,11 +20,11 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
-public class DoubleFormPostException
+public class DoubleSubmitException
         extends PageFlowException
         implements ResponseErrorCodeSender
 {
-    DoubleFormPostException( String actionName, FlowController fc )
+    DoubleSubmitException( String actionName, FlowController fc )
     {
         super( actionName, fc );
     }
@@ -36,7 +36,7 @@
 
     protected String[] getMessageParts()
     {
-        return new String[]{ "A double-post occurred for action ", " in page flow ", "."
};
+        return new String[]{ "A double-submit occurred for action ", " in page flow ", "."
};
     }
     
     public void sendResponseErrorCode( HttpServletResponse response ) throws IOException

Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java&r1=124027&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
(original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
Mon Jan  3 13:42:54 2005
@@ -930,16 +930,13 @@
                                             ActionMapping mapping, String actionPath )
         throws IOException
     {
-        //
-        // TODO: We haven't yet hooked up the support for marking an action as preventDoublePost=true.
-        //
-        if ( false )
+        if ( mapping instanceof PageFlowActionMapping && ( ( PageFlowActionMapping
) mapping ).isPreventDoubleSubmit() )
         {
             if ( ! TokenProcessor.getInstance().isTokenValid( request, true ) )
             {
                 FlowController currentFC = RequestValues.getCurrentFlowController( request
);
                 String actionName = InternalUtils.getActionName( mapping );
-                DoubleFormPostException ex = new DoubleFormPostException( actionName, currentFC
);
+                DoubleSubmitException ex = new DoubleSubmitException( actionName, currentFC
);
                 
                 if ( currentFC != null )
                 {

Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.java&r1=124027&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.java
(original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/annotations/Jpf.java
Mon Jan  3 13:42:54 2005
@@ -186,7 +186,7 @@
      * was jpf:action
      */
     @Target( METHOD )
-            @Retention( RUNTIME )
+    @Retention( RUNTIME )
     public @interface Action
     {
         /**
@@ -228,6 +228,12 @@
          * forward used when validation fails
          */
         Forward validationErrorForward() default @Jpf.Forward( name="" );
+        
+        /**
+         * Prevent multiple submits to this action.  If multiple submits occur, a
+         * {@link org.apache.beehive.netui.pageflow.DoubleSubmitException} is thrown.
+         */ 
+        boolean preventDoubleSubmit() default false;
     }
     
     @Target( ANNOTATION_TYPE )
@@ -314,6 +320,12 @@
         String outputFormBean() default "";
         boolean redirect() default false; // optional
         boolean externalRedirect() default false; // optional
+        
+        /**
+         * Prevent multiple submits to this action.  If multiple submits occur, a
+         * {@link org.apache.beehive.netui.pageflow.DoubleSubmitException} is thrown.
+         */ 
+        boolean preventDoubleSubmit() default false;
     }
 
     /**

Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowActionMapping.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowActionMapping.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowActionMapping.java&r1=124027&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowActionMapping.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowActionMapping.java
(original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowActionMapping.java
Mon Jan  3 13:42:54 2005
@@ -31,6 +31,7 @@
 {
     private String _unqualifiedActionPath;
     private boolean _loginRequired = false;
+    private boolean _preventDoubleSubmit = false;
     private boolean _simpleAction = false;
     private boolean _isOverloaded = false;
     private String _formMember;
@@ -70,6 +71,16 @@
     public void setLoginRequired( boolean loginRequired )
     {
         _loginRequired = loginRequired;
+    }
+
+    public boolean isPreventDoubleSubmit()
+    {
+        return _preventDoubleSubmit;
+    }
+
+    public void setPreventDoubleSubmit( boolean preventDoubleSubmit )
+    {
+        _preventDoubleSubmit = preventDoubleSubmit;
     }
 
     public boolean isSimpleAction()

Modified: incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/AnchorBase.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/AnchorBase.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/AnchorBase.java&r1=124027&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/AnchorBase.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/AnchorBase.java
(original)
+++ incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/AnchorBase.java
Mon Jan  3 13:42:54 2005
@@ -10,6 +10,7 @@
 import org.apache.beehive.netui.util.Bundle;
 import org.apache.beehive.netui.util.ParamHelper;
 import org.apache.beehive.netui.util.logging.Logger;
+import org.apache.struts.taglib.html.Constants;
 
 import javax.servlet.ServletContext;
 import javax.servlet.ServletRequest;
@@ -327,18 +328,33 @@
             return createPageAnchor(request, trb);
         }
 
-        // report that action is not an action
-        if ((_action != null) && (!PageFlowTagUtils.isAction(request, _action)))
{
-            String s = null;
-            if (_action.equals("")) {
-                s = Bundle.getString("Tags_NullBadAction", null);
+        if (_action != null) {
+            // report that action is not an action
+            if (!PageFlowTagUtils.isAction(request, _action)) {
+                String s = null;
+                if (_action.equals("")) {
+                    s = Bundle.getString("Tags_NullBadAction", null);
+                }
+                else {
+                    s = Bundle.getString("Tags_BadAction", _action);
+                }
+                registerTagError(s, null);
             }
             else {
-                s = Bundle.getString("Tags_BadAction", _action);
+                //
+                // If the action we're submitting to is checking for double-submits, save
a token in the session.
+                // This will be written out as a param (below), and will be checked in PageFlowRequestProcessor.
+                //
+                String token = PageFlowTagUtils.getToken(request, _action);
+                if (token != null) {
+                    if (_params == null) {
+                        _params = new HashMap();
+                    }
+                    _params.put(Constants.TOKEN_KEY, token);
+                }
             }
-            registerTagError(s, null);
         }
-
+        
         // we assume that tagId will over have override id if both
         // are defined.
         if (tagId != null) {

Modified: incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Button.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Button.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Button.java&r1=124027&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Button.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Button.java
(original)
+++ incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Button.java
Mon Jan  3 13:42:54 2005
@@ -28,6 +28,7 @@
 import org.apache.beehive.netui.tags.rendering.WriteRenderAppender;
 import org.apache.beehive.netui.util.Bundle;
 import org.apache.beehive.netui.util.ParamHelper;
+import org.apache.struts.taglib.html.Constants;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -233,6 +234,18 @@
         if (_action != null) {
             boolean isAction = PageFlowTagUtils.isAction(request, _action);
             if (isAction) {
+                //
+                // If the action we're submitting to is checking for double-submits, save
a token in the session.
+                // This will be written out as a param (below), and will be checked in PageFlowRequestProcessor.
+                //
+                String token = PageFlowTagUtils.getToken(request, _action);
+                if (token != null) {
+                    if (_params == null) {
+                        _params = new HashMap();
+                    }
+                    _params.put(Constants.TOKEN_KEY, token);
+                }
+                
                 String overrideAction = ACTION_OVERRIDE + _action;
                 overrideAction = HtmlUtils.addParams(overrideAction, _params, response.getCharacterEncoding());
                 String buttonOutput = URLRewriterService.rewriteName(pageContext.getServletContext(),

Modified: incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Form.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Form.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Form.java&r1=124027&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Form.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Form.java
(original)
+++ incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/html/Form.java
Mon Jan  3 13:42:54 2005
@@ -20,6 +20,7 @@
 import org.apache.beehive.netui.core.urls.MutableURI;
 import org.apache.beehive.netui.core.urls.URLRewriterService;
 import org.apache.beehive.netui.pageflow.*;
+import org.apache.beehive.netui.pageflow.config.PageFlowActionMapping;
 import org.apache.beehive.netui.pageflow.internal.ContextCache;
 import org.apache.beehive.netui.pageflow.internal.InternalUtils;
 import org.apache.beehive.netui.pageflow.internal.InternalConstants;
@@ -30,6 +31,7 @@
 import org.apache.beehive.netui.util.ParamHelper;
 import org.apache.beehive.netui.util.logging.Logger;
 import org.apache.struts.Globals;
+import org.apache.struts.util.TokenProcessor;
 import org.apache.struts.action.ActionForm;
 import org.apache.struts.action.ActionMapping;
 import org.apache.struts.action.ActionServlet;
@@ -723,11 +725,18 @@
         TagRenderingBase br = TagRenderingBase.Factory.getRendering(TagRenderingBase.FORM_TAG,
request);
         br.doStartTag(writer, _state);
 
+        //
+        // If the action we're submitting to is checking for double-submits, save a token
in the session.
+        // This will be written out as a hidden param (below), and will be checked in PageFlowRequestProcessor.
+        //
+        String token = PageFlowTagUtils.getToken(request, _mapping);
+        
         // Add a transaction token (if present in our session)
         HttpSession session = pageContext.getSession();
         if (session != null) {
-            String token =
-                    (String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);
+            if (token != null) {
+                token = (String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);
+            }
             if (token != null) {
                 writeHiddenParam(Constants.TOKEN_KEY, token, writer, request, true);
             }

Modified: incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTagUtils.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTagUtils.java?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTagUtils.java&r1=124027&p2=incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTagUtils.java&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTagUtils.java
(original)
+++ incubator/beehive/trunk/netui/src/tags-html/org/apache/beehive/netui/tags/internal/PageFlowTagUtils.java
Mon Jan  3 13:42:54 2005
@@ -26,10 +26,13 @@
 import org.apache.beehive.netui.pageflow.PageFlowUtils;
 import org.apache.beehive.netui.pageflow.SecurityProtocol;
 import org.apache.beehive.netui.pageflow.SharedFlowController;
+import org.apache.beehive.netui.pageflow.config.PageFlowActionMapping;
 import org.apache.beehive.netui.pageflow.internal.InternalUtils;
 import org.apache.beehive.netui.pageflow.internal.InternalConstants;
 import org.apache.struts.action.ActionMapping;
 import org.apache.struts.config.ActionConfig;
+import org.apache.struts.util.TokenProcessor;
+import org.apache.struts.Globals;
 
 import java.net.URISyntaxException;
 import java.util.Map;
@@ -38,6 +41,7 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 
 /**
  * This is a utility class for the beehive tags with routines for helping with URL rewriting.
@@ -178,6 +182,44 @@
         return true;
     }
 
+    /**
+     * Get or generate a token used to prevent double submits to an action.  The token is
stored in the session,
+     * and checked (and removed) when processing an action with the <code>preventDoubleSubmit</code>
attribute
+     * set to <code>true</code>.
+     */ 
+    public static String getToken( HttpServletRequest request, String action )
+    {
+        FlowController flowController = InternalUtils.getCurrentPageFlow( request, false
);
+        
+        if ( flowController != null )
+        {
+            MappingAndController mac = getActionMapping( request, flowController, action
);
+            if ( mac != null ) return getToken( request, mac.mapping );
+        }
+        
+        return null;
+    }
+    
+    /**
+     * Get or generate a token used to prevent double submits to an action.  The token is
stored in the session,
+     * and checked (and removed) when processing an action with the <code>preventDoubleSubmit</code>
attribute
+     * set to <code>true</code>.
+     */ 
+    public static String getToken( HttpServletRequest request, ActionMapping mapping )
+    {
+        if ( mapping instanceof PageFlowActionMapping && ( ( PageFlowActionMapping
) mapping ).isPreventDoubleSubmit() )
+        {
+            HttpSession session = request.getSession();
+            String token = ( String ) session.getAttribute( Globals.TRANSACTION_TOKEN_KEY
);
+            if ( token != null ) return token;
+            token = TokenProcessor.getInstance().generateToken( request );
+            request.getSession().setAttribute( Globals.TRANSACTION_TOKEN_KEY, token );
+            return token;
+        }
+        
+        return null;
+    }
+    
     public static class MappingAndController
     {
         public ActionMapping mapping;
@@ -198,12 +240,32 @@
             
             if ( dot == -1 )
             {
+                //
+                // It's an action in the current page flow, or in the (deprecated) Global.app.
+                //
                 if ( action.charAt( 0 ) != '/' ) action = '/' + action;
                 mapping = flowController.getModuleConfig().findActionConfig( action );
                 fc = flowController;
+                
+                //
+                // If we don't find it in the current page flow, look in Global.app.
+                //
+                if ( mapping == null )
+                {
+                    FlowController globalApp =
+                            PageFlowUtils.getSharedFlow( InternalConstants.GLOBALAPP_CLASSNAME,
request );
+                    if ( globalApp != null )
+                    {
+                        mapping = globalApp.getModuleConfig().findActionConfig( action );
+                        fc = globalApp;
+                    }
+                }
             }
             else if ( dot < action.length() - 1 )
             {
+                //
+                // It's an action in a shared flow.
+                //
                 String sharedFlowName = action.substring( 0, dot );
                 if ( sharedFlowName.length() > 0 && sharedFlowName.charAt( 0 )
== '/' )
                 {

Modified: incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties&r1=124027&p2=incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
(original)
+++ incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
Mon Jan  3 13:42:54 2005
@@ -452,19 +452,19 @@
 PageFlow_ActionNotFoundException_Message= \
 Unable to find matching action {0} in page flow {1}.
 
-PageFlow_DoubleFormPostException_Page= \
-<html><head><title>Page Flow Error - Double Form Post</title></head>\n
\
+PageFlow_DoubleSubmitException_Page= \
+<html><head><title>Page Flow Error - Double Submit</title></head>\n
\
 <body>\n \
-<h1>Page Flow Error - Double Form Post</h1>\n \
+<h1>Page Flow Error - Submit</h1>\n \
 <table border="1" cellspacing="0">\n \
 <tr><td><b>Page Flow:</b></td><td>{1}</td></tr>\n
\
 <tr><td><b>Action:</b></td><td>{0}</td></tr>\n
\
 </table><br />\n \
-<span style="color:red">A double-post occurred for action <b>{0}</b>.</span>\n
\
+<span style="color:red">A double-submit occurred for action <b>{0}</b>.</span>\n
\
 </body></html>\n
 
-PageFlow_DoubleFormPostException_Message= \
-A double-post occurred for action <b>{0}</b> in page flow {1}.
+PageFlow_DoubleSubmitException_Message= \
+A double-submit occurred for action <b>{0}</b> in page flow {1}.
 
 PageFlow_UnhandledException_Page = \
 <html><head><title>Page Flow Unhandled Exception</title></head>\n
\

Modified: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml?view=diff&rev=124028&p1=incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml&r1=124027&p2=incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml&r2=124028
==============================================================================
--- incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml	(original)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/tiles-defs.xml	Mon Jan
 3 13:42:54 2005
@@ -2,7 +2,7 @@
 
  <!DOCTYPE tiles-definitions PUBLIC
        "-//Apache Software Foundation//DTD Tiles Configuration//EN"
-       "http://jakarta.apache.org/struts/dtds/tiles-config.dtd">
+       "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
 
 
 <!--

Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/Controller.jpf
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/Controller.jpf?view=auto&rev=124028
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/Controller.jpf
Mon Jan  3 13:42:54 2005
@@ -0,0 +1,27 @@
+package miniTests.preventDoubleSubmit;
+
+import org.apache.beehive.netui.pageflow.*;
+import org.apache.beehive.netui.pageflow.annotations.*;
+
+@Jpf.Controller(
+    simpleActions={
+        @Jpf.SimpleAction(name="begin", path="index.jsp"),
+        @Jpf.SimpleAction(name="anchorSubmit", preventDoubleSubmit=true, path="submitted.jsp")
+    },
+    catches={
+        @Jpf.Catch(type=DoubleSubmitException.class, path="caughtit.jsp")
+    }
+)
+public class Controller extends PageFlowController
+{
+    @Jpf.Action(
+        preventDoubleSubmit=true,
+        forwards={
+            @Jpf.Forward(name="submitted", path="submitted.jsp")
+        }
+    )
+    public Forward formSubmit()
+    {
+        return new Forward("submitted");
+    }
+}

Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/caughtit.jsp
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/caughtit.jsp?view=auto&rev=124028
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/caughtit.jsp
Mon Jan  3 13:42:54 2005
@@ -0,0 +1,19 @@
+<%@ page language="java" contentType="text/html;charset=UTF-8"%>
+<%@ taglib prefix="netui" uri="http://beehive.apache.org/netui/tags-html-1.0"%>
+<%@ taglib prefix="netui-data" uri="http://beehive.apache.org/netui/tags-databinding-1.0"%>
+<%@ taglib prefix="netui-template" uri="http://beehive.apache.org/netui/tags-template-1.0"%>
+
+
+<netui:html>
+    <head>
+        <netui:base/>
+    </head>
+    <netui:body>
+        OK -- caught DoubleSubmitException
+        <br/>
+        <netui:anchor action="begin">start over</netui:anchor>
+    </netui:body>
+</netui:html>
+
+  
+

Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/index.jsp
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/index.jsp?view=auto&rev=124028
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/index.jsp
Mon Jan  3 13:42:54 2005
@@ -0,0 +1,27 @@
+<%@ page language="java" contentType="text/html;charset=UTF-8"%>
+<%@ taglib prefix="netui" uri="http://beehive.apache.org/netui/tags-html-1.0"%>
+<%@ taglib prefix="netui-data" uri="http://beehive.apache.org/netui/tags-databinding-1.0"%>
+<%@ taglib prefix="netui-template" uri="http://beehive.apache.org/netui/tags-template-1.0"%>
+
+
+<netui:html>
+    <head>
+        <netui:base/>
+    </head>
+    <netui:body>
+        <netui:form action="formSubmit">
+            <netui:button value="netui:form (prevent double post)"/>
+        </netui:form>
+        <netui:form action="begin">
+            <netui:button action="formSubmit" value="netui:button (prevent double post)"/>
+        </netui:form>
+        <netui:anchor action="anchorSubmit">netui:anchor (prevent double post)</netui:anchor>
+        <br/>
+        <br/>
+        <netui:imageAnchor action="anchorSubmit" src="../../resources/images/goButton.jpg">netui:imageAnchor
(prevent double post)</netui:imageAnchor>
+        <br/>
+    </netui:body>
+</netui:html>
+
+  
+

Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/submitted.jsp
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/submitted.jsp?view=auto&rev=124028
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/miniTests/preventDoubleSubmit/submitted.jsp
Mon Jan  3 13:42:54 2005
@@ -0,0 +1,17 @@
+<%@ page language="java" contentType="text/html;charset=UTF-8"%>
+<%@ taglib prefix="netui" uri="http://beehive.apache.org/netui/tags-html-1.0"%>
+<%@ taglib prefix="netui-data" uri="http://beehive.apache.org/netui/tags-databinding-1.0"%>
+<%@ taglib prefix="netui-template" uri="http://beehive.apache.org/netui/tags-template-1.0"%>
+
+
+<netui:html>
+    <head>
+        <netui:base/>
+    </head>
+    <netui:body>
+        OK -- submitted once.  Use the back button and submit again.
+    </netui:body>
+</netui:html>
+
+  
+

Mime
View raw message