    001    // Copyright 2006, 2007 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.parser;
    016
    017    import org.apache.tapestry5.ioc.Location;
    018
    019    /**
    020     * The start element of a component within the template. Will be followed by a series of {@link
    021     * org.apache.tapestry5.internal.parser.AttributeToken}s for any attributes (outside of id and type), and eventually
    022     * will be balanced by an {@link org.apache.tapestry5.internal.parser.EndElementToken}.
    023     */
    024    public class StartComponentToken extends TemplateToken
    025    {
    026        private final String elementName;
    027
    028        private final String id;
    029
    030        private final String componentType;
    031
    032        private final String mixins;
    033
    034        /**
    035         * @param elementName the name of the element from which this component was parsed, or null if the element was the
    036         *                    t:comp placeholder
    037         * @param id          the id of the component (may be null for anonymous components)
    038         * @param type        the type of component (may be null if the component type is specified outside the template)
    039         * @param mixins      a comma-separated list of mixins (possibly null)
    040         * @param location    the location within the template at which the element was parsed
    041         */
    042        public StartComponentToken(String elementName, String id, String type, String mixins,
    043                                   Location location)
    044        {
    045            super(TokenType.START_COMPONENT, location);
    046
    047            // TODO: id or type may be null, but not both!
    048
    049            this.elementName = elementName;
    050            this.id = id;
    051            componentType = type;
    052            this.mixins = mixins;
    053        }
    054
    055        /**
    056         * Returns the element for this component. When using the &lt;t:comp&gt; placeholder, this value will be null. When
    057         * using "invisible instrumentation", where t:id or t:type attributes are added to existing elements, this is the
    058         * local name of the element so attached.
    059         *
    060         * @return the element name or null
    061         */
    062        public String getElementName()
    063        {
    064            return elementName;
    065        }
    066
    067        /**
    068         * Returns a non-blank id if one was provided in the template. If the id attribute was missing (or the value was
    069         * blank), returns null.
    070         */
    071        public String getId()
    072        {
    073            return id;
    074        }
    075
    076        /**
    077         * Returns a non-blank component type if one was provided in the template. If the type attribute was missing (or the
    078         * value was blank), returns null.
    079         */
    080        public String getComponentType()
    081        {
    082            return componentType;
    083        }
    084
    085        @Override
    086        public String toString()
    087        {
    088            StringBuilder builder = new StringBuilder();
    089
    090            add(builder, "element", elementName);
    091            add(builder, "id", id);
    092            add(builder, "type", componentType);
    093            add(builder, "mixins", mixins);
    094
    095            builder.insert(0, "StartComponentToken[");
    096            builder.append("]");
    097
    098            return builder.toString();
    099        }
    100
    101        private void add(StringBuilder builder, String label, String value)
    102        {
    103            if (value == null)
    104                return;
    105
    106            if (builder.length() > 0)
    107                builder.append(" ");
    108
    109            builder.append(label);
    110            builder.append("=");
    111            builder.append(value);
    112        }
    113
    114        /**
    115         * Returns the list of mixins for this component instance, or null for no mixins.
    116         */
    117        public String getMixins()
    118        {
    119            return mixins;
    120        }
    121
    122    }