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.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 */
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 <t:comp> 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}