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