You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mu...@apache.org on 2007/04/28 18:59:03 UTC

svn commit: r533389 [1/3] - in /struts/struts2/trunk/plugins/dojo/src: main/java/org/apache/struts2/dojo/components/ main/java/org/apache/struts2/dojo/views/ main/java/org/apache/struts2/dojo/views/freemarker/tags/ main/java/org/apache/struts2/dojo/vie...

Author: musachy
Date: Sat Apr 28 09:59:01 2007
New Revision: 533389

URL: http://svn.apache.org/viewvc?view=rev&rev=533389
Log:
WW-1897 Create JSONValidationInterceptor
 * Add 'validate' attribute to submit,anchor and bind tags for ajax validation
 * Add 'ajaxAfterValidation' attribute to submit,anchor and bind tags to make an ajax request if validation succeeds (false by default)

WW-1900 Clean up Dojo plugin
 * Rename AbstractRemoteCallUIBean
 * Drop 'form' tag

Added:
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java
      - copied, changed from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java
      - copied, changed from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java
      - copied, changed from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java
Removed:
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Form.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/FormModel.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/FormTag.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/velocity/components/FormDirective.java
    struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/form-close.ftl
    struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/form.ftl
    struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/validation.js
Modified:
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java
    struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java
    struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js
    struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js
    struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js.uncompressed.js
    struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/a.ftl
    struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/bind.ftl
    struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/head.ftl
    struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/submit.ftl
    struts/struts2/trunk/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTest.java
    struts/struts2/trunk/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/BindTest.java
    struts/struts2/trunk/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/SubmitAjaxTest.java
    struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/Bind-1.txt
    struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/HeadTagTest-1.txt
    struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/HeadTagTest-2.txt
    struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/href-1.txt
    struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/submit-ajax-1.txt
    struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/submit-ajax-3.txt

Copied: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java (from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java)
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java?view=diff&rev=533389&p1=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java&r1=531046&p2=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java Sat Apr 28 09:59:01 2007
@@ -30,7 +30,7 @@
  * AbstractRemoteCallUIBean is superclass for all components dealing with remote
  * calls.
  */
-public abstract class AbstractRemoteCallUIBean extends ClosingUIBean implements RemoteUICallBean {
+public abstract class AbstractRemoteBean extends ClosingUIBean implements RemoteBean {
 
     protected String href;
     protected String errorText;
@@ -50,7 +50,7 @@
     protected String highlightColor;
     protected String highlightDuration;
     
-    public AbstractRemoteCallUIBean(ValueStack stack, HttpServletRequest request,
+    public AbstractRemoteBean(ValueStack stack, HttpServletRequest request,
             HttpServletResponse response) {
         super(stack, request, response);
     }

Added: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java?view=auto&rev=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java (added)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java Sat Apr 28 09:59:01 2007
@@ -0,0 +1,63 @@
+/*
+ * $Id$
+ *
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.struts2.dojo.components;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.struts2.components.Form;
+import org.apache.struts2.views.annotations.StrutsTagAttribute;
+
+import com.opensymphony.xwork2.util.ValueStack;
+
+/**
+ * Base class for tags that perform AJAX validation
+ */
+public abstract class AbstractValidateBean extends AbstractRemoteBean {
+    protected String validate;
+    protected String ajaxAfterValidation;
+    
+    public AbstractValidateBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
+        super(stack, request, response);
+    }
+    
+    public void evaluateExtraParams() {
+        super.evaluateExtraParams();
+
+        if (validate != null) 
+            addParameter("validate", findValue(validate, Boolean.class));
+        if (ajaxAfterValidation != null)
+            addParameter("ajaxAfterValidation", findValue(ajaxAfterValidation, Boolean.class));
+        
+        Form form = (Form) findAncestor(Form.class);
+        if (form != null) 
+            addParameter("parentTheme", form.getTheme());
+    }
+    
+    @StrutsTagAttribute(description = "Perform Ajax calidation. 'ajaxValidation' interceptor must be applied to action", type="Boolean", 
+        defaultValue = "false")
+    public void setValidate(String validate) {
+        this.validate = validate;
+    }
+    
+    @StrutsTagAttribute(description = "Make an asynchronous request if validation succeeds. Only valid is 'validate' is 'true'", type="Boolean", 
+        defaultValue = "false")
+    public void setAjaxAfterValidation(String ajaxAfterValidation) {
+        this.ajaxAfterValidation = ajaxAfterValidation;
+    }
+}
\ No newline at end of file

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java Sat Apr 28 09:59:01 2007
@@ -23,6 +23,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.struts2.components.Form;
 import org.apache.struts2.views.annotations.StrutsTag;
 import org.apache.struts2.views.annotations.StrutsTagAttribute;
 import org.apache.struts2.views.annotations.StrutsTagSkipInheritance;
@@ -90,7 +91,7 @@
  */
 @StrutsTag(name="a", tldTagClass="org.apache.struts2.dojo.views.jsp.ui.AnchorTag", description="Renders an HTML anchor element that when clicked calls a URL via remote XMLHttpRequest and updates " +
                 "its targets content")
-public class Anchor extends AbstractRemoteCallUIBean {
+public class Anchor extends AbstractValidateBean {
     public static final String OPEN_TEMPLATE = "a";
     public static final String TEMPLATE = "a-close";
     public static final String COMPONENT_NAME = Anchor.class.getName();
@@ -112,7 +113,7 @@
     public void evaluateExtraParams() {
         super.evaluateExtraParams();
 
-        if(targets != null)
+        if (targets != null)
             addParameter("targets", findString(targets));
     }
     

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java Sat Apr 28 09:59:01 2007
@@ -55,7 +55,7 @@
  */
 @StrutsTag(name="bind", tldTagClass="org.apache.struts2.dojo.views.jsp.ui.BindTag", description="Attach event listeners to elements to make AJAX calls")
 @StrutsTagSkipInheritance
-public class Bind extends AbstractRemoteCallUIBean {
+public class Bind extends AbstractValidateBean {
     public static final String TEMPLATE = "bind-close";
     public static final String OPEN_TEMPLATE = "bind";
 
@@ -78,11 +78,11 @@
     public void evaluateExtraParams() {
         super.evaluateExtraParams();
 
-        if(targets != null)
+        if (targets != null)
             addParameter("targets", findString(targets));
-        if(sources != null)
+        if (sources != null)
             addParameter("sources", findString(sources));
-        if(events != null)
+        if (events != null)
             addParameter("events", findString(events));
     }
     
@@ -112,6 +112,8 @@
         return "ajax";
     }
 
+    //these attributes are overwritten here just for the TLD generation
+    
     @StrutsTagAttribute(description="Topic that will trigger the remote call")
     public void setListenTopics(String listenTopics) {
         this.listenTopics = listenTopics;
@@ -220,5 +222,17 @@
         defaultValue = "2000", type="Integer")
     public void setHighlightDuration(String highlightDuration) {
         this.highlightDuration = highlightDuration;
+    }
+    
+    @StrutsTagAttribute(description = "Perform Ajax calidation. 'ajaxValidation' interceptor must be applied to action", type="Boolean", 
+        defaultValue = "false")
+    public void setValidate(String validate) {
+        this.validate = validate;
+    }
+    
+    @StrutsTagAttribute(description = "Make an asynchronous request if validation succeeds. Only valid is 'validate' is 'true'", type="Boolean", 
+        defaultValue = "false")
+    public void setAjaxAfterValidation(String ajaxAfterValidation) {
+        this.ajaxAfterValidation = ajaxAfterValidation;
     }
 }

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java Sat Apr 28 09:59:01 2007
@@ -59,7 +59,7 @@
  *
  */
 @StrutsTag(name="div", tldTagClass="org.apache.struts2.dojo.views.jsp.ui.DivTag", description="Render HTML div providing content from remote call via AJAX")
-public class Div extends AbstractRemoteCallUIBean {
+public class Div extends AbstractRemoteBean {
 
     public static final String TEMPLATE = "div";
     public static final String TEMPLATE_CLOSE = "div-close";

Copied: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java (from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java)
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java?view=diff&rev=533389&p1=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java&r1=531046&p2=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java Sat Apr 28 09:59:01 2007
@@ -21,7 +21,7 @@
 package org.apache.struts2.dojo.components;
 
 
-public interface RemoteUICallBean {
+public interface RemoteBean {
 
     void setListenTopics(String topics);
 

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java Sat Apr 28 09:59:01 2007
@@ -27,6 +27,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.struts2.components.Form;
 import org.apache.struts2.components.FormButton;
 import org.apache.struts2.views.annotations.StrutsTag;
 import org.apache.struts2.views.annotations.StrutsTagAttribute;
@@ -93,7 +94,7 @@
  *
  */
 @StrutsTag(name="submit", tldTagClass="org.apache.struts2.dojo.views.jsp.ui.SubmitTag", description="Render a submit button")
-public class Submit extends FormButton implements RemoteUICallBean {
+public class Submit extends FormButton implements RemoteBean {
     
     private static final Log LOG = LogFactory.getLog(Submit.class);
     
@@ -118,7 +119,9 @@
     protected String errorNotifyTopics;
     protected String highlightColor;
     protected String highlightDuration;
-
+    protected String validate;
+    protected String ajaxAfterValidation;
+    
     public Submit(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
         super(stack, request, response);
     }
@@ -180,6 +183,19 @@
             addParameter("highlightColor", findString(highlightColor));
         if (highlightDuration != null)
             addParameter("highlightDuration", findString(highlightDuration));
+        
+        Boolean validateValue = false;
+        if (validate != null) {
+            validateValue = (Boolean) findValue(validate, Boolean.class);
+            addParameter("validate", validateValue);
+        } 
+        
+        Form form = (Form) findAncestor(Form.class);
+        if (form != null) 
+            addParameter("parentTheme", form.getTheme());
+        
+        if (ajaxAfterValidation != null)
+            addParameter("ajaxAfterValidation", findValue(ajaxAfterValidation, Boolean.class));
     }
 
     @Override
@@ -352,5 +368,17 @@
         defaultValue = "1000")
     public void setHighlightDuration(String highlightDuration) {
         this.highlightDuration = highlightDuration;
+    }
+
+    @StrutsTagAttribute(description = "Perform Ajax calidation. 'ajaxValidation' interceptor must be applied to action", type="Boolean", 
+        defaultValue = "false")
+    public void setValidate(String validate) {
+        this.validate = validate;
+    }
+
+    @StrutsTagAttribute(description = "Make an asynchronous request if validation succeeds. Only valid is 'validate' is 'true'", type="Boolean", 
+        defaultValue = "false")
+    public void setAjaxAfterValidation(String ajaxAfterValidation) {
+        this.ajaxAfterValidation = ajaxAfterValidation;
     }
 }

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java Sat Apr 28 09:59:01 2007
@@ -12,7 +12,6 @@
 import org.apache.struts2.dojo.views.velocity.components.BindDirective;
 import org.apache.struts2.dojo.views.velocity.components.DateTimePickerDirective;
 import org.apache.struts2.dojo.views.velocity.components.DivDirective;
-import org.apache.struts2.dojo.views.velocity.components.FormDirective;
 import org.apache.struts2.dojo.views.velocity.components.HeadDirective;
 import org.apache.struts2.dojo.views.velocity.components.SubmitDirective;
 import org.apache.struts2.dojo.views.velocity.components.TabbedPanelDirective;
@@ -40,7 +39,6 @@
             TabbedPanelDirective.class,
             TreeDirective.class,
             TreeNodeDirective.class,
-            FormDirective.class,
             HeadDirective.class,
             BindDirective.class
         };

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java Sat Apr 28 09:59:01 2007
@@ -18,7 +18,6 @@
     protected DivModel div;
     protected AnchorModel a;
     protected SubmitModel submit;
-    protected FormModel form;
     protected BindModel bind;
     
     private ValueStack stack;
@@ -47,14 +46,6 @@
         return dateTimePicker;
     }
     
-    public FormModel getForm() {
-        if (form == null) {
-            form = new FormModel(stack, req, res);
-        }
-
-        return form;
-    }
-    
     public AutocompleterModel getAutocompleter() {
         if (autocompleter == null) {
             autocompleter = new AutocompleterModel(stack, req, res);
@@ -63,7 +54,7 @@
         return autocompleter;
     }
     
-    public TabbedPanelModel getTabbedpanelModel() {
+    public TabbedPanelModel getTabbedpanel() {
         if (tabbedPanel == null) {
             tabbedPanel = new TabbedPanelModel(stack, req, res);
         }

Copied: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java (from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java)
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java?view=diff&rev=533389&p1=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java&r1=531046&p2=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java Sat Apr 28 09:59:01 2007
@@ -17,10 +17,10 @@
  */
 package org.apache.struts2.dojo.views.jsp.ui;
 
-import org.apache.struts2.dojo.components.RemoteUICallBean;
+import org.apache.struts2.dojo.components.RemoteBean;
 import org.apache.struts2.views.jsp.ui.AbstractClosingTag;
 
-public abstract class AbstractRemoteCallUITag extends AbstractClosingTag {
+public abstract class AbstractRemoteTag extends AbstractClosingTag {
 
     protected String href;
     protected String listenTopics;
@@ -43,7 +43,7 @@
     protected void populateParams() {
         super.populateParams();
 
-        RemoteUICallBean remote = (RemoteUICallBean) component;
+        RemoteBean remote = (RemoteBean) component;
         remote.setHref(href);
         remote.setListenTopics(listenTopics);
         remote.setLoadingText(loadingText);

Added: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java?view=auto&rev=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java (added)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java Sat Apr 28 09:59:01 2007
@@ -0,0 +1,45 @@
+/*
+ * $Id$
+ *
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.struts2.dojo.views.jsp.ui;
+
+import org.apache.struts2.dojo.components.AbstractValidateBean;
+
+/**
+ * @see AbstractValidateTag
+ */
+public abstract class AbstractValidateTag extends AbstractRemoteTag {
+    protected String validate;
+    protected String ajaxAfterValidation;
+
+    protected void populateParams() {
+        super.populateParams();
+
+        AbstractValidateBean validateBean = (AbstractValidateBean) component;
+        validateBean.setValidate(validate);
+        validateBean.setAjaxAfterValidation(ajaxAfterValidation);
+    }
+    
+    public void setAjaxAfterValidation(String ajaxAfterValidation) {
+        this.ajaxAfterValidation = ajaxAfterValidation;
+    }
+
+    public void setValidate(String validate) {
+        this.validate = validate;
+    }
+
+}

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java Sat Apr 28 09:59:01 2007
@@ -31,13 +31,12 @@
 /**
  * @see Anchor
  */
-public class AnchorTag extends AbstractRemoteCallUITag {
+public class AnchorTag extends AbstractValidateTag {
 
     private static final long serialVersionUID = -1034616578492431113L;
 
     protected String targets;
-    protected String preInvokeJS;
-
+    
     public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
         return new Anchor(stack, req, res);
     }
@@ -47,6 +46,7 @@
 
         Anchor link = (Anchor) component;
         link.setTargets(targets);
+        link.setValidate(validate);
     }
 
     public void setTargets(String targets) {

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java Sat Apr 28 09:59:01 2007
@@ -28,11 +28,11 @@
 
 import com.opensymphony.xwork2.util.ValueStack;
 
-public class BindTag extends AbstractRemoteCallUITag {
+public class BindTag extends AbstractValidateTag {
     protected String targets;
     protected String sources;
     protected String events;
-
+    
     public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
         return new Bind(stack, req, res);
     }

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java Sat Apr 28 09:59:01 2007
@@ -28,7 +28,7 @@
 
 import com.opensymphony.xwork2.util.ValueStack;
 
-public class DivTag extends AbstractRemoteCallUITag {
+public class DivTag extends AbstractRemoteTag {
 
     private static final long serialVersionUID = 5309231035916461758L;
 

Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java Sat Apr 28 09:59:01 2007
@@ -59,7 +59,9 @@
     protected String errorNotifyTopics;
     protected String highlightColor;
     protected String highlightDuration;
-
+    protected String validate;
+    protected String ajaxAfterValidation;
+    
     public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
         return new Submit(stack, req, res);
     }
@@ -91,6 +93,8 @@
         submit.setErrorNotifyTopics(errorNotifyTopics);
         submit.setHighlightColor(highlightColor);
         submit.setHighlightDuration(highlightDuration);
+        submit.setValidate(validate);
+        submit.setAjaxAfterValidation(ajaxAfterValidation);
     }
 
     public void setAction(String action) {
@@ -187,5 +191,13 @@
 
     public void setHighlightDuration(String highlightDuration) {
         this.highlightDuration = highlightDuration;
+    }
+
+    public void setValidate(String validate) {
+        this.validate = validate;
+    }
+
+    public void setAjaxAfterValidation(String ajaxAfterValidation) {
+        this.ajaxAfterValidation = ajaxAfterValidation;
     }
 }

Modified: struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js?view=diff&rev=533389&r1=533388&r2=533389
==============================================================================
--- struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js (original)
+++ struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js Sat Apr 28 09:59:01 2007
@@ -42,7 +42,10 @@
   
   highlightColor : "",
   highlightDuration : 2000,
-
+  
+  validate : false,
+  ajaxAfterValidation : false,
+  
   postCreate : function() {
     var self = this;
 
@@ -149,38 +152,57 @@
       });
     }
   },
-
+  
   bindHandler : function(type, data, e) {
-     //hide indicator
-     dojo.html.hide(this.indicator);
-
-     //publish topics
-     this.notify(data, type, e);
-
-     if(type == "load") {
-       if(this.executeScripts) {
-         //update targets content
-         var parsed = this.parse(data);
-         //eval scripts
-         if(parsed.scripts && parsed.scripts.length > 0) {
-           var scripts = "";
-           for(var i = 0; i < parsed.scripts.length; i++){
-             scripts += parsed.scripts[i];
-           }
-           (new Function('_container_', scripts+'; return this;'))(this);
-         }
-         this.setContent(parsed.text);
-       }
-       else {
-         this.setContent(data);
-       }
-       this.highlight();
-     } else {
-       if(this.showError) {
-         var message = dojo.string.isBlank(this.errorText) ? e.message : this.errorText;
-         this.setContent(message);
-       }
-     }
+    //hide indicator
+    dojo.html.hide(this.indicator);
+    
+    //publish topics
+    this.notify(data, type, e);
+    
+    if(type == "load") {
+      if(this.validate) {
+        StrutsUtils.clearValidationErrors(this.formNode);
+        //validation is active for this action
+        var errors = StrutsUtils.getValidationErrors(data);
+        if(errors && errors.fieldErrors) {
+          //validation failed
+          StrutsUtils.showValidationErrors(this.formNode, errors);
+          return;
+        } else {
+          //validation passed
+          if(!this.ajaxAfterValidation && this.formNode) {
+            //regular submit
+            this.formNode.submit();
+            return;
+          }
+        }
+      } 
+      
+      // no validation or validation passed
+      if(this.executeScripts) {
+        //update targets content
+        var parsed = this.parse(data);
+        //eval scripts
+        if(parsed.scripts && parsed.scripts.length > 0) {
+          var scripts = "";
+          for(var i = 0; i < parsed.scripts.length; i++){
+            scripts += parsed.scripts[i];
+          }
+          (new Function('_container_', scripts+'; return this;'))(this);
+        }
+        this.setContent(parsed.text);
+      }
+      else {
+        this.setContent(data);
+      }
+      this.highlight();
+    } else {
+      if(this.showError) {
+        var message = dojo.string.isBlank(this.errorText) ? e.message : this.errorText;
+        this.setContent(message);
+      }
+    }
   },
 
   notify : function(data, type, e) {
@@ -254,8 +276,9 @@
           }
 
           //if there is a parent form, and it has a "onsubmit"
-          //execute it, validation is usually there
-          if(this.formNode && this.formNode.onsubmit != null) {
+          //execute it, validation is usually there, except is validation == true
+          //on which case it is ajax validation, instead of client side
+          if(!this.validate && this.formNode && this.formNode.onsubmit != null) {
             var makeRequest = this.formNode.onsubmit.call(evt);
             if(makeRequest != null && !makeRequest) {
               this.log("Request canceled by 'onsubmit' of the form");
@@ -268,9 +291,14 @@
 		  if(this.showLoading) {
             this.setContent(this.loadingText);
           }
+          
+          var tmpHref = this.href;
+          if(!this.ajaxAfterValidation) {
+            tmpHref = tmpHref + (tmpHref.indexOf("?") > -1 ? "&" : "?") + "validateOnly=true";
+          }  
 
           dojo.io.bind({
-            url: this.href,
+            url: tmpHref,
             useCache: false,
             preventCache: true,
             formNode: self.formNode,