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 }