001    // Copyright 2007, 2008 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry5.internal.structure;
016    
017    import org.apache.tapestry5.Block;
018    import org.apache.tapestry5.MarkupWriter;
019    import org.apache.tapestry5.ioc.BaseLocatable;
020    import org.apache.tapestry5.ioc.Location;
021    import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
022    import org.apache.tapestry5.runtime.RenderCommand;
023    import org.apache.tapestry5.runtime.RenderQueue;
024    
025    import java.util.List;
026    
027    public class BlockImpl extends BaseLocatable implements Block, BodyPageElement, RenderCommand
028    {
029        // We could lazily create this, but for (parameter) block elements the case
030        // for an empty block is extremely rare.
031    
032        private final List<RenderCommand> elements = CollectionFactory.newList();
033    
034        private final String description;
035    
036        public BlockImpl(Location location, String description)
037        {
038            super(location);
039    
040            this.description = description;
041        }
042    
043        public void addToBody(RenderCommand element)
044        {
045            elements.add(element);
046        }
047    
048        /**
049         * Pushes all the elements of the body of this block onto the queue in appropriate order.
050         */
051        public void render(MarkupWriter writer, RenderQueue queue)
052        {
053            int count = elements.size();
054            for (int i = count - 1; i >= 0; i--)
055                queue.push(elements.get(i));
056        }
057    
058        @Override
059        public String toString()
060        {
061            return String.format("Block[%s, at %s]", description, getLocation());
062        }
063    }