diff --git a/ccm-core/src/com/arsdigita/bebop/form/Date.java b/ccm-core/src/com/arsdigita/bebop/form/Date.java index d11e4e4bb..4fcd9ad94 100755 --- a/ccm-core/src/com/arsdigita/bebop/form/Date.java +++ b/ccm-core/src/com/arsdigita/bebop/form/Date.java @@ -33,6 +33,7 @@ import com.arsdigita.bebop.util.BebopConstants; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.Form; import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.parameters.NotNullValidationListener; import com.arsdigita.kernel.Kernel; // This interface contains the XML element name of this class // in a constant which is used when generating XML @@ -229,6 +230,10 @@ public class Date extends Widget implements BebopConstants { m_month.generateXML(ps, date); m_day .generateXML(ps, date); m_year .generateXML(ps, date); + + if (!hasValidationListener(new NotNullValidationListener())) { + date.newChildElement("NoDate"); + } } public void setDisabled() { @@ -279,4 +284,7 @@ public class Date extends Widget implements BebopConstants { m_day.setClassAttr(at); super.setClassAttr(at); } + + // Don't lock + public void lock() {} } diff --git a/ccm-core/src/com/arsdigita/bebop/form/Widget.java b/ccm-core/src/com/arsdigita/bebop/form/Widget.java index 479b81df8..283ee579f 100755 --- a/ccm-core/src/com/arsdigita/bebop/form/Widget.java +++ b/ccm-core/src/com/arsdigita/bebop/form/Widget.java @@ -179,6 +179,19 @@ public abstract class Widget extends BlockStylable implements Cloneable, BebopCo m_listeners.remove(ParameterListener.class, listener); } + /** + * Test for existens of a particular type of ValidationListener + * + * @param listener Subtype of ParameterListern which is tested for + * @return true if subtype is in the list + */ + public boolean hasValidationListener(ParameterListener listener) { + Assert.assertNotNull(listener, "ParameterListener"); + return this.getParameterModel().hasParameterListener(listener); + +// return (m_listeners.getListenerCount(listener.getClass()) > 0); + } + /** * Adds a print listener for this widget. Only one print listener can be * set for a widget, since the PrintListener is expected to diff --git a/ccm-core/src/com/arsdigita/bebop/parameters/ParameterModel.java b/ccm-core/src/com/arsdigita/bebop/parameters/ParameterModel.java index d1a64ca64..8af80cc32 100755 --- a/ccm-core/src/com/arsdigita/bebop/parameters/ParameterModel.java +++ b/ccm-core/src/com/arsdigita/bebop/parameters/ParameterModel.java @@ -46,26 +46,21 @@ public abstract class ParameterModel implements Lockable { * exception if the specified name is null */ protected String m_name; - /** * The default value of this ParameterModel. This value is used when * the request is not a submission, and the transformValue returns * null. */ protected Object m_defaultValue; - /** * A List of Listeners to validate this parameter. */ protected List m_parameterListeners; - /** * A boolean indicating if this ParameterModel is locked, as per the * Lockable interface */ protected boolean m_locked; - - /** * true if the parameter value in a request should be set * to the default value when it would ordinarily be set @@ -77,11 +72,9 @@ public abstract class ParameterModel implements Lockable { * This defaults to true. */ private boolean m_defaultOverridesNull = false; - private boolean m_passIn = true; - private static final Logger s_log = - Logger.getLogger(ParameterModel.class.getName()); + Logger.getLogger(ParameterModel.class.getName()); /** * Construct an unlocked ParameterModel @@ -160,7 +153,7 @@ public abstract class ParameterModel implements Lockable { * @see #isPassIn() * @param v true if this parameter is a pass in parameter. */ - public void setPassIn(boolean v) { + public void setPassIn(boolean v) { Assert.assertNotLocked(this); m_passIn = v; } @@ -196,7 +189,7 @@ public abstract class ParameterModel implements Lockable { */ public void setName(String name) { Assert.assertNotLocked(this); - m_name=name; + m_name = name; } /** @@ -250,8 +243,7 @@ public abstract class ParameterModel implements Lockable { * error transforming form/URL variables to an object. */ public abstract Object transformValue(HttpServletRequest request) - throws IllegalArgumentException; - + throws IllegalArgumentException; /** * Helper method for implementing {@link #transformValue @@ -274,10 +266,9 @@ public abstract class ParameterModel implements Lockable { } public ParameterData createParameterData(HttpServletRequest request) { - return createParameterData(request,null,false); + return createParameterData(request, null, false); } - /** * Create a ParameterData for this ParameterModel with the supplied * request If this tranformation throws an exception, mark the @@ -295,7 +286,7 @@ public abstract class ParameterModel implements Lockable { * null values from the submission. */ public ParameterData createParameterData(HttpServletRequest request, - boolean isSubmission) { + boolean isSubmission) { return createParameterData(request, null, isSubmission); } @@ -320,8 +311,8 @@ public abstract class ParameterModel implements Lockable { * null values from the submission. */ public ParameterData createParameterData(HttpServletRequest request, - Object defaultValue, - boolean isSubmission) { + Object defaultValue, + boolean isSubmission) { // This method can work in one of two modes, which influences how // default values are used. // (0) if transformValue() returns null, we *always* try @@ -342,18 +333,17 @@ public abstract class ParameterModel implements Lockable { // logic, to make defaults work right. //isSubmission = isSubmission || isPassIn(); - if ( isSubmission ) { + if (isSubmission) { try { result.setValue(transformValue(request)); if (result.getValue() == null && defaultValue != null) { result.setValue(defaultValue); } - if ( getDefaultOverridesNull() - && result.getValue() == null ) { + if (getDefaultOverridesNull() && result.getValue() == null) { result.setValue(getDefaultValue()); } } catch (IllegalArgumentException e) { - if ( getDefaultOverridesNull() ) { + if (getDefaultOverridesNull()) { result.setValue(getDefaultValue()); } else { result.setValue(null); @@ -370,7 +360,7 @@ public abstract class ParameterModel implements Lockable { if (result.getValue() == null && defaultValue != null) { result.setValue(defaultValue); } - if ( result.getValue() == null ) { + if (result.getValue() == null) { result.setValue(getDefaultValue()); } } catch (IllegalArgumentException e) { @@ -410,13 +400,13 @@ public abstract class ParameterModel implements Lockable { * the value and errors of this parameter */ public void validate(ParameterData data) - throws FormProcessException { + throws FormProcessException { Assert.assertLocked(this); ParameterEvent e = null; - for (Iterator i = m_parameterListeners.iterator(); i.hasNext(); ) { - if ( e == null ) { + for (Iterator i = m_parameterListeners.iterator(); i.hasNext();) { + if (e == null) { e = new ParameterEvent(this, data); } ((ParameterListener) i.next()).validate(e); @@ -433,7 +423,7 @@ public abstract class ParameterModel implements Lockable { * @return the value as a readable string, may be null */ public String marshal(Object value) { - return ( value == null ) ? null : value.toString(); + return (value == null) ? null : value.toString(); } /** @@ -452,8 +442,7 @@ public abstract class ParameterModel implements Lockable { * @pre encoded != null */ public Object unmarshal(String encoded) { - throw new UnsupportedOperationException("Not implemented. " - + "This method needs to be implemented by the specific subclasses."); + throw new UnsupportedOperationException("Not implemented. " + "This method needs to be implemented by the specific subclasses."); } /** @@ -476,4 +465,22 @@ public abstract class ParameterModel implements Lockable { public boolean isLocked() { return m_locked; } + + /** + * Test m_parameterKisteners for member of a given subtype + * + * @param listener Subtype of the ParameterListener + * @return true if a ParameterListener of given type is in the list + */ + public boolean hasParameterListener(ParameterListener listener) { + Iterator lListIter = m_parameterListeners.iterator(); + + while (lListIter.hasNext()) { + ParameterListener pl = (ParameterListener) lListIter.next(); + if (pl.getClass().equals(listener.getClass())) { + return true; + } + } + return false; + } }