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