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 <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    }