Coverage Report - org.apache.tapestry5.corelib.internal.HiddenFieldPositioner
 
Classes in this File Line Coverage Branch Coverage Complexity
HiddenFieldPositioner
92%
12/13
50%
1/2
2
HiddenFieldPositioner$1
100%
9/9
75%
3/4
2
 
 1  
 package org.apache.tapestry5.corelib.internal;
 2  
 
 3  
 import org.apache.tapestry5.MarkupWriter;
 4  
 import org.apache.tapestry5.MarkupWriterListener;
 5  
 import org.apache.tapestry5.dom.Element;
 6  
 import org.apache.tapestry5.ioc.internal.util.OneShotLock;
 7  
 import org.apache.tapestry5.services.HiddenFieldLocationRules;
 8  
 
 9  
 /**
 10  
  * Used to position a hidden field (as part of a form-related component).  Hidden fields are not allowed to go just
 11  
  * anywhere, there are rules, dicatated by the (X)HTML schema, about where they are allowed. We use the {@link
 12  
  * org.apache.tapestry5.MarkupWriterListener} interface to monitor elements as they are started and ended to find a
 13  
  * place to put content.
 14  
  */
 15  62
 public class HiddenFieldPositioner
 16  
 {
 17  
     /**
 18  
      * The type of element to create.
 19  
      */
 20  
     private static final String ELEMENT = "input";
 21  
 
 22  
     private final MarkupWriter writer;
 23  
 
 24  
     private final HiddenFieldLocationRules rules;
 25  
 
 26  20
     private final OneShotLock lock = new OneShotLock();
 27  
 
 28  
     private Element hiddenFieldElement;
 29  
 
 30  20
     private final MarkupWriterListener listener = new MarkupWriterListener()
 31  
     {
 32  
         public void elementDidStart(Element element)
 33  
         {
 34  20
             if (rules.placeHiddenFieldInside(element))
 35  
             {
 36  18
                 hiddenFieldElement = element.element(ELEMENT);
 37  18
                 writer.removeListener(this);
 38  
             }
 39  20
         }
 40  
 
 41  20
         public void elementDidEnd(Element element)
 42  
         {
 43  2
             if (rules.placeHiddenFieldAfter(element))
 44  
             {
 45  2
                 hiddenFieldElement = element.getParent().element(ELEMENT);
 46  2
                 writer.removeListener(this);
 47  
             }
 48  2
         }
 49  
     };
 50  
 
 51  
     public HiddenFieldPositioner(MarkupWriter writer, HiddenFieldLocationRules rules)
 52  20
     {
 53  20
         this.writer = writer;
 54  20
         this.rules = rules;
 55  
 
 56  20
         this.writer.addListener(listener);
 57  20
     }
 58  
 
 59  
     /**
 60  
      * Returns the hidden field element, which can have its attributes filled in.
 61  
      *
 62  
      * @return the element
 63  
      * @throws IllegalStateException if the element was not placed.
 64  
      */
 65  
     public Element getElement()
 66  
     {
 67  20
         lock.lock();
 68  
 
 69  
         // Remove the listener if it hasn't been removed already.
 70  
 
 71  20
         writer.removeListener(listener);
 72  
 
 73  20
         if (hiddenFieldElement == null)
 74  0
             throw new IllegalStateException(
 75  
                     "The rendered content did not include any elements that allow for the positioning of the hidden form field's element.");
 76  
 
 77  
 
 78  20
         return hiddenFieldElement;
 79  
     }
 80  
 
 81  
 }