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.services;
016:
017: import org.apache.tapestry.Binding;
018: import org.apache.tapestry.ComponentResources;
019: import org.apache.tapestry.annotations.Component;
020: import org.apache.tapestry.internal.parser.AttributeToken;
021: import org.apache.tapestry.internal.parser.CommentToken;
022: import org.apache.tapestry.internal.parser.DTDToken;
023: import org.apache.tapestry.internal.parser.ExpansionToken;
024: import org.apache.tapestry.internal.parser.StartElementToken;
025: import org.apache.tapestry.internal.parser.TextToken;
026: import org.apache.tapestry.internal.structure.ComponentPageElement;
027: import org.apache.tapestry.internal.structure.Page;
028: import org.apache.tapestry.internal.structure.PageElement;
029: import org.apache.tapestry.ioc.Location;
030: import org.apache.tapestry.services.BindingSource;
031:
032: /**
033: * Used by the {@link org.apache.tapestry.internal.services.PageLoader} to create page elements
034: */
035: public interface PageElementFactory {
036: PageElement newTextElement(TextToken token);
037:
038: PageElement newStartElement(StartElementToken token);
039:
040: PageElement newAttributeElement(
041: ComponentResources componentResources, AttributeToken token);
042:
043: PageElement newEndElement();
044:
045: PageElement newExpansionElement(
046: ComponentResources componentResources, ExpansionToken token);
047:
048: /**
049: * Creates a new binding as with
050: * {@link BindingSource#newBinding(String, ComponentResources, ComponentResources, String, String, Location)}.
051: * However, if the binding contains an expansion (i.e., <code>${...}</code>), then a binding
052: * that returns the fully expanded expression will be returned.
053: */
054: Binding newBinding(String parameterName,
055: ComponentResources loadingComponentResources,
056: ComponentResources embeddedComponentResources,
057: String defaultBindingPrefix, String expression,
058: Location location);
059:
060: /**
061: * Creates a new component and adds it to the page and to its container.
062: * <p>
063: * Note: doesn't add the component as a child of the container.
064: *
065: * @param page
066: * the page that will ultimately contain the new component
067: * @param container
068: * the existing component that contains the new component
069: * @param id
070: * the id, unique within the container, of the new component
071: * @param componentType
072: * the type of the component (as defined in the template or the {@link Component}
073: * annotation)
074: * @param componentClassName
075: * the fully qualfied class name used when the componentType is blank (null or the
076: * empty string)
077: * @param elementName
078: * TODO
079: * @param location
080: * location of the component's element within its container's template
081: * @return the newly created comopnent, after adding it to the page and container
082: */
083: ComponentPageElement newComponentElement(Page page,
084: ComponentPageElement container, String id,
085: String componentType, String componentClassName,
086: String elementName, Location location);
087:
088: /**
089: * Creates a new root component for a page. Adds any mixins defined by the components model.
090: *
091: * @param page
092: * the page that will contain the root component
093: * @param className
094: * the fully qualified class name of the root component
095: * @return the root page element
096: */
097: ComponentPageElement newRootComponentElement(Page page,
098: String className);
099:
100: PageElement newRenderBodyElement(ComponentPageElement component);
101:
102: /**
103: * Adds a mixin to the element, resolving the mixin type to a mixin class.
104: * <p>
105: * Sure, this isn't quite a <em>factory</em> method, but PEF has all the tools to accomplish
106: * this handy, as opposed to PageLoaderImpl.
107: *
108: * @param component
109: * the component to which a mixin will be added
110: * @param mixinType
111: * used to resolve the mixin class name
112: */
113: void addMixinByTypeName(ComponentPageElement component,
114: String mixinType);
115:
116: /**
117: * Adds a mixin to the element.
118: * <p>
119: * Sure, this isn't quite a <em>factory</em> method, but PEF has all the tools to accomplish
120: * this handy, as opposed to PageLoaderImpl.
121: *
122: * @param component
123: * the component to which a mixin will be added
124: * @param mixinClassName
125: * fully qualified class name of the mixin
126: */
127: void addMixinByClassName(ComponentPageElement component,
128: String mixinClassName);
129:
130: /** Creates a new element from the token. */
131: PageElement newCommentElement(CommentToken token);
132:
133: PageElement newDTDElement(DTDToken token);
134: }
|