You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2006/07/06 16:48:34 UTC

svn commit: r419565 - /cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/event/impl/RequiredControl.java

Author: cziegeler
Date: Thu Jul  6 07:48:34 2006
New Revision: 419565

URL: http://svn.apache.org/viewvc?rev=419565&view=rev
Log:
New listener to dynamically set required fields in a widget

Added:
    cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/event/impl/RequiredControl.java   (with props)

Added: cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/event/impl/RequiredControl.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/event/impl/RequiredControl.java?rev=419565&view=auto
==============================================================================
--- cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/event/impl/RequiredControl.java (added)
+++ cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/event/impl/RequiredControl.java Thu Jul  6 07:48:34 2006
@@ -0,0 +1,132 @@
+/*
+ * 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.cocoon.forms.event.impl;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.cocoon.forms.event.ProcessingPhase;
+import org.apache.cocoon.forms.event.ProcessingPhaseEvent;
+import org.apache.cocoon.forms.event.ProcessingPhaseListener;
+import org.apache.cocoon.forms.formmodel.Field;
+import org.apache.cocoon.forms.formmodel.Widget;
+
+/**
+ * This processing phase listener can be used to dynamically change the
+ * required fields in a form.
+ * A field can be required depending on the value of another field or
+ * depending on the pressed submit button.
+ *
+ * @version $Id$
+ */
+public class RequiredControl
+    implements ProcessingPhaseListener, Configurable {
+
+    protected final List descriptions = new ArrayList();
+
+    /**
+     * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
+     */
+    public void configure(Configuration config) throws ConfigurationException {
+        final Configuration[] children = config.getChildren("required");
+        for(int i=0; i<children.length; i++) {
+            final Configuration current = children[i];
+            RequiredDescription desc;
+            final String refId = current.getAttribute("widget-id");
+            if ( current.getAttribute("submit-id", null) != null ) {
+                desc = new RequiredDescription(refId, current.getAttribute("submit-id"));
+            } else {
+                final String path = current.getAttribute("widget-path");
+                final String value = current.getAttribute("widget-value");
+                desc = new RequiredDescription(refId, path, value);
+            }
+            this.descriptions.add(desc);
+        }
+    }
+
+    /**
+     * @see org.apache.cocoon.forms.event.ProcessingPhaseListener#phaseEnded(org.apache.cocoon.forms.event.ProcessingPhaseEvent)
+     */
+    public void phaseEnded(ProcessingPhaseEvent event) {
+        if ( event.getPhase().getValue() == ProcessingPhase.READ_FROM_REQUEST_VALUE 
+             || event.getPhase().getValue() == ProcessingPhase.LOAD_MODEL_VALUE) {
+            final Iterator i = this.descriptions.iterator();
+            while ( i.hasNext() ) {
+                final RequiredDescription desc = (RequiredDescription)i.next();
+                desc.process(event.getSourceWidget());
+            }
+        }
+    }
+
+    protected static final class RequiredDescription {
+
+        final static int DEPENDS_REQUIRED_MODE = 1;
+        final static int SUBMIT_REQUIRED_MODE = 2;
+
+        protected final int mode;
+        protected final String referenceId;
+        protected String widgetName;
+        protected String widgetValue;
+
+        public RequiredDescription(String referenceId, String submitId) {
+            this.mode = SUBMIT_REQUIRED_MODE;
+            this.referenceId = referenceId;
+            this.widgetName = submitId;
+        }
+
+        public RequiredDescription(String referenceId, String widget, String value) {
+            this.mode = DEPENDS_REQUIRED_MODE;
+            this.referenceId = referenceId;
+            this.widgetName = widget;
+            this.widgetValue = value;
+        }
+
+        /**
+         * @see org.apache.cocoon.forms.validation.WidgetValidator#validate(org.apache.cocoon.forms.formmodel.Widget)
+         */
+        public void process(Widget form) {
+            final Widget widget = form.lookupWidget(this.referenceId);
+            if ( widget == null ) {
+                throw new IllegalArgumentException("Widget '" + this.referenceId + "' not found in form.");
+            }
+            if (! (widget instanceof Field)) {
+                // Invalid widget type
+                throw new IllegalArgumentException("Widget '" + widget.getRequestParameterName() + "' is not a Field");
+            }
+
+            boolean required = false;
+            if ( mode == DEPENDS_REQUIRED_MODE ) {
+                final Widget w = form.lookupWidget(this.widgetName);
+                if ( w != null ) {
+                    if ( w.getValue() != null && w.getValue().equals(this.widgetValue)) {
+                        required = true;
+                    }
+                }
+            } else if ( mode == SUBMIT_REQUIRED_MODE ) {
+                if ( widget.getForm().getSubmitWidget() != null) {
+                    if ( this.widgetName.equals(widget.getForm().getSubmitWidget().getId())) {
+                        required = true;
+                    }
+                }
+            }
+            ((Field)widget).setRequired(required);
+        }
+    }
+}

Propchange: cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/event/impl/RequiredControl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/blocks/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/event/impl/RequiredControl.java
------------------------------------------------------------------------------
    svn:keywords = Id