    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
    015package org.apache.tapestry5.internal.parser;
    016
    017import org.apache.tapestry5.commons.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 */
    024public 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}