Clover coverage report - Code Coverage for tapestry release 4.0-beta-8
Coverage timestamp: Sat Sep 24 2005 11:50:34 EDT
file stats: LOC: 167   Methods: 8
NCLOC: 79   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
AbstractFormComponent.java 100% 96.2% 87.5% 95.8%
coverage coverage
 1    // Copyright 2004, 2005 The Apache Software Foundation
 2    //
 3    // Licensed under the Apache License, Version 2.0 (the "License");
 4    // you may not use this file except in compliance with the License.
 5    // You may obtain a copy of the License at
 6    //
 7    // http://www.apache.org/licenses/LICENSE-2.0
 8    //
 9    // Unless required by applicable law or agreed to in writing, software
 10    // distributed under the License is distributed on an "AS IS" BASIS,
 11    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 12    // See the License for the specific language governing permissions and
 13    // limitations under the License.
 14   
 15    package org.apache.tapestry.form;
 16   
 17    import org.apache.tapestry.AbstractComponent;
 18    import org.apache.tapestry.IForm;
 19    import org.apache.tapestry.IMarkupWriter;
 20    import org.apache.tapestry.IRequestCycle;
 21    import org.apache.tapestry.TapestryUtils;
 22    import org.apache.tapestry.valid.IValidationDelegate;
 23    import org.apache.tapestry.valid.ValidationConstants;
 24   
 25    /**
 26    * A base class for building components that correspond to HTML form elements. All such components
 27    * must be wrapped (directly or indirectly) by a {@link Form} component.
 28    *
 29    * @author Howard Lewis Ship
 30    * @author Paul Ferraro
 31    * @since 1.0.3
 32    */
 33    public abstract class AbstractFormComponent extends AbstractComponent implements IFormComponent
 34    {
 35    public abstract IForm getForm();
 36   
 37    public abstract void setForm(IForm form);
 38   
 39    public abstract String getName();
 40   
 41    public abstract void setName(String name);
 42   
 43    /**
 44    * Returns true if the corresponding field, on the client side, can accept user focus (i.e.,
 45    * implements the focus() method). Most components can take focus, but a few ({@link Hidden})
 46    * override this method to return false.
 47    */
 48   
 49  38 protected boolean getCanTakeFocus()
 50    {
 51  38 return true;
 52    }
 53   
 54    /**
 55    * Should be connected to a parameter named "id" (annotations would be helpful here!). For
 56    * components w/o such a parameter, this will simply return null.
 57    */
 58   
 59    public abstract String getIdParameter();
 60   
 61    /**
 62    * Stores the actual id allocated (or null if the component doesn't support this).
 63    */
 64   
 65    public abstract void setClientId(String id);
 66   
 67    /**
 68    * Invoked from {@link #renderFormComponent(IMarkupWriter, IRequestCycle)} (that is, an
 69    * implementation in a subclass), to obtain an id and render an id attribute. Reads
 70    * {@link #getIdParameter()}.
 71    */
 72   
 73  40 protected void renderIdAttribute(IMarkupWriter writer, IRequestCycle cycle)
 74    {
 75    // If the user explicitly sets the id parameter to null, then
 76    // we honor that!
 77   
 78  40 String rawId = getIdParameter();
 79   
 80  40 if (rawId == null)
 81  25 return;
 82   
 83  15 String id = cycle.getUniqueId(TapestryUtils.convertTapestryIdToNMToken(rawId));
 84   
 85    // Store for later access by the FieldLabel (or JavaScript).
 86   
 87  15 setClientId(id);
 88   
 89  15 writer.attribute("id", id);
 90    }
 91   
 92    /**
 93    * @see org.apache.tapestry.AbstractComponent#renderComponent(org.apache.tapestry.IMarkupWriter,
 94    * org.apache.tapestry.IRequestCycle)
 95    */
 96  121 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
 97    {
 98  121 IForm form = TapestryUtils.getForm(cycle, this);
 99   
 100  120 setForm(form);
 101   
 102  120 if (form.wasPrerendered(writer, this))
 103  5 return;
 104   
 105  115 IValidationDelegate delegate = form.getDelegate();
 106   
 107  115 delegate.setFormComponent(this);
 108   
 109  115 setName(form);
 110   
 111  114 if (form.isRewinding())
 112    {
 113  48 if (!isDisabled())
 114    {
 115  41 rewindFormComponent(writer, cycle);
 116    }
 117    }
 118  66 else if (!cycle.isRewinding())
 119    {
 120  59 renderFormComponent(writer, cycle);
 121   
 122  57 if (getCanTakeFocus() && !isDisabled())
 123    {
 124  31 delegate.registerForFocus(
 125    this,
 126  31 delegate.isInError() ? ValidationConstants.ERROR_FIELD
 127    : ValidationConstants.NORMAL_FIELD);
 128    }
 129   
 130    }
 131    }
 132   
 133  22 protected void renderDelegatePrefix(IMarkupWriter writer, IRequestCycle cycle)
 134    {
 135  22 getForm().getDelegate().writePrefix(writer, cycle, this, null);
 136    }
 137   
 138  22 protected void renderDelegateAttributes(IMarkupWriter writer, IRequestCycle cycle)
 139    {
 140  22 getForm().getDelegate().writeAttributes(writer, cycle, this, null);
 141    }
 142   
 143  21 protected void renderDelegateSuffix(IMarkupWriter writer, IRequestCycle cycle)
 144    {
 145  21 getForm().getDelegate().writeSuffix(writer, cycle, this, null);
 146    }
 147   
 148  107 protected void setName(IForm form)
 149    {
 150  107 form.getElementId(this);
 151    }
 152   
 153    /**
 154    * Returns false. Subclasses that might be required must override this method. Typically, this
 155    * involves checking against the component's validators.
 156    *
 157    * @since 4.0
 158    */
 159  0 public boolean isRequired()
 160    {
 161  0 return false;
 162    }
 163   
 164    protected abstract void renderFormComponent(IMarkupWriter writer, IRequestCycle cycle);
 165   
 166    protected abstract void rewindFormComponent(IMarkupWriter writer, IRequestCycle cycle);
 167    }