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.tapestry.internal.parser;
016:
017: import org.apache.tapestry.ioc.Location;
018:
019: /**
020: * The start element of a component within the template. Will be followed by a series of
021: * {@link org.apache.tapestry.internal.parser.AttributeToken}s for any attributes (outside of id
022: * and type), and eventually will be balanced by an
023: * {@link org.apache.tapestry.internal.parser.EndElementToken}.
024: */
025: public class StartComponentToken extends TemplateToken {
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
036: * the name of the element from which this component was parsed, or null if the
037: * element was the t:comp placeholder
038: * @param id
039: * the id of the component (may be null for anonymous components)
040: * @param type
041: * the type of component (may be null if the component type is specified outside the
042: * template)
043: * @param mixins
044: * a comma-separated list of mixins (possibly null)
045: * @param location
046: * the location within the template at which the element was parsed
047: */
048: public StartComponentToken(String elementName, String id,
049: String type, String mixins, Location location) {
050: super (TokenType.START_COMPONENT, location);
051:
052: // TODO: id or type may be null, but not both!
053:
054: _elementName = elementName;
055: _id = id;
056: _componentType = type;
057: _mixins = mixins;
058: }
059:
060: /**
061: * Returns the element for this component. When using the <t:comp> placeholder, this value
062: * will be null. When using "invisible instrumentation", where t:id or t:type attributes are
063: * added to existing elements, this is the local name of the element so attached.
064: *
065: * @return the element name or null
066: */
067: public String getElementName() {
068: return _elementName;
069: }
070:
071: /**
072: * Returns a non-blank id if one was provided in the template. If the id attribute was missing
073: * (or the value was blank), returns null.
074: */
075: public String getId() {
076: return _id;
077: }
078:
079: /**
080: * Returns a non-blank component type if one was provided in the template. If the type attribute
081: * was missing (or the value was blank), returns null.
082: */
083: public String getComponentType() {
084: return _componentType;
085: }
086:
087: @Override
088: public String toString() {
089: StringBuilder builder = new StringBuilder();
090:
091: add(builder, "element", _elementName);
092: add(builder, "id", _id);
093: add(builder, "type", _componentType);
094: add(builder, "mixins", _mixins);
095:
096: builder.insert(0, "StartComponentToken[");
097: builder.append("]");
098:
099: return builder.toString();
100: }
101:
102: private void add(StringBuilder builder, String label, String value) {
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: return _mixins;
119: }
120:
121: }
|