blob: e70db951d9c47e0cab4c23852d8d7be226b81f09 [file] [log] [blame]
/*
* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tiles.velocity.template;
import java.io.IOException;
import java.io.Writer;
import javax.servlet.ServletContext;
import org.apache.tiles.Attribute;
import org.apache.tiles.AttributeContext;
import org.apache.tiles.TilesContainer;
import org.apache.tiles.access.TilesAccess;
import org.apache.tiles.request.Request;
import org.apache.tiles.request.servlet.ServletUtil;
import org.apache.tiles.request.velocity.VelocityRequest;
import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.runtime.Renderable;
/**
* Tiles Tool to be used "the classic way".
*
* @version $Rev$ $Date$
* @since 2.2.0
*/
public class VelocityStyleTilesTool extends ContextHolder {
/**
* Returns an attribute.
*
* @param key The name of the attribute to get.
* @return The Attribute.
* @since 2.2.0
*/
public Attribute get(String key) {
Request velocityRequest = createVelocityRequest(getServletContext(),
null);
TilesContainer container = TilesAccess.getCurrentContainer(velocityRequest);
AttributeContext attributeContext = container
.getAttributeContext(velocityRequest);
Attribute attribute = attributeContext.getAttribute(key);
return attribute;
}
/**
* Creates a new empty attribute.
*
* @return The created attribute.
* @since 2.2.0
*/
public Attribute createAttribute() {
return new Attribute();
}
/**
* Creates an attribute that is a copy of the one passed as a parameter.
*
* @param attribute The attribute to copy.
* @return The copied attribute.
* @since 2.2.0
*/
public Attribute clone(Attribute attribute) {
return new Attribute(attribute);
}
/**
* Creates an attribute that represents a template.
*
* @param template The template.
* @return The attribute.
* @since 2.2.0
*/
public Attribute createTemplateAttribute(String template) {
return Attribute.createTemplateAttribute(template);
}
/**
* Renders an attribute.
*
* @param attribute The attribute to render.
* @return The renderable object, ready to be rendered.
* @since 2.2.0
*/
public Renderable render(final Attribute attribute) {
return new AbstractDefaultToStringRenderable(getVelocityContext(),
null, getResponse(), getRequest()) {
public boolean render(InternalContextAdapter context, Writer writer)
throws IOException {
Request velocityRequest = createVelocityRequest(
getServletContext(), writer);
TilesContainer container = TilesAccess
.getCurrentContainer(velocityRequest);
container.render(attribute, velocityRequest);
return true;
}
};
}
/**
* Renders a definition. It can be used in conjunction with
* {@link #startAttributeContext()} and {@link #endAttributeContext()} to
* customize appearance.
*
* @param definitionName The name of the definition to render.
* @return The renderable that renders the definition.
* @since 2.2.0
*/
public Renderable renderDefinition(final String definitionName) {
return new AbstractDefaultToStringRenderable(getVelocityContext(),
null, getResponse(), getRequest()) {
public boolean render(InternalContextAdapter context, Writer writer) {
Request velocityRequest = createVelocityRequest(
getServletContext(), writer);
TilesContainer container = TilesAccess
.getCurrentContainer(velocityRequest);
container.render(definitionName, velocityRequest);
return true;
}
};
}
/**
* Renders the current attribute context. It can be used in conjunction with
* {@link #startAttributeContext()} and {@link #endAttributeContext()} to
* customize appearance.
*
* @return The renderable that renders the current attribute context.
* @since 2.2.0
*/
public Renderable renderAttributeContext() {
return new AbstractDefaultToStringRenderable(getVelocityContext(),
null, getResponse(), getRequest()) {
public boolean render(InternalContextAdapter context, Writer writer) {
Request velocityRequest = createVelocityRequest(
getServletContext(), writer);
TilesContainer container = TilesAccess
.getCurrentContainer(velocityRequest);
container.renderContext(velocityRequest);
return true;
}
};
}
/**
* Starts the attribute context. Remember to call
* {@link #endAttributeContext()} when finished!
*
* @return The started attribute context, ready to be customized.
* @since 2.2.0
*/
public AttributeContext startAttributeContext() {
Request velocityRequest = createVelocityRequest(
getServletContext(), null);
TilesContainer container = TilesAccess
.getCurrentContainer(velocityRequest);
return container.startContext(velocityRequest);
}
/**
* Ends the current attribute context. To be called after
* {@link #startAttributeContext()}.
*
* @return The tool itself.
* @since 2.2.0
*/
public VelocityStyleTilesTool endAttributeContext() {
Request velocityRequest = createVelocityRequest(getServletContext(),
null);
TilesContainer container = TilesAccess
.getCurrentContainer(velocityRequest);
container.endContext(velocityRequest);
return this;
}
/**
* Returns the current attribute context.
*
* @return The current attribute context.
* @since 2.2.0
*/
public AttributeContext getAttributeContext() {
Request velocityRequest = createVelocityRequest(
getServletContext(), null);
TilesContainer container = TilesAccess
.getCurrentContainer(velocityRequest);
return container.getAttributeContext(velocityRequest);
}
/**
* Sets the current container for the current request.
*
* @param containerKey The key of the container to set as "current" for the current request.
* @return The tool itself.
* @since 2.2.0
*/
public VelocityStyleTilesTool setCurrentContainer(String containerKey) {
Request velocityRequest = createVelocityRequest(
getServletContext(), null);
TilesAccess.setCurrentContainer(velocityRequest, containerKey);
return this;
}
/** {@inheritDoc} */
@Override
public String toString() {
return "";
}
/**
* Creates a Velocity request.
*
* @param servletContext The servlet context.
* @param writer The writer.
* @return The created request.
*/
protected Request createVelocityRequest(
ServletContext servletContext, Writer writer) {
return VelocityRequest.createVelocityRequest(ServletUtil
.getApplicationContext(servletContext), getRequest(),
getResponse(), getVelocityContext(), writer);
}
}