blob: 973c75b87dceb6239997479e8c62442da6903d72 [file] [log] [blame]
// Copyright Mar 18, 2006 The Apache Software Foundation
//
// Licensed 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.tapestry.services.impl;
import org.apache.hivemind.Resource;
import org.apache.hivemind.util.Defense;
import org.apache.tapestry.*;
import org.apache.tapestry.asset.AssetFactory;
import org.apache.tapestry.engine.NullWriter;
import org.apache.tapestry.markup.MarkupWriterSource;
import org.apache.tapestry.services.RequestLocaleManager;
import org.apache.tapestry.services.ResponseBuilder;
import org.apache.tapestry.util.ContentType;
import org.apache.tapestry.util.PageRenderSupportImpl;
import org.apache.tapestry.web.WebResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Manages normal html responses for tapestry request/response cycles.
*
* @author jkuhnert
*/
public class DefaultResponseBuilder implements ResponseBuilder
{
private final AssetFactory _assetFactory;
private final String _namespace;
private PageRenderSupportImpl _prs;
private RequestLocaleManager _localeManager;
private MarkupWriterSource _markupWriterSource;
private WebResponse _webResponse;
/** Default writer for rendering html output. */
private IMarkupWriter _writer;
private boolean _closeWriter = true;
/**
* Portlet constructor.
*
* @param writer
*/
public DefaultResponseBuilder(IMarkupWriter writer,
AssetFactory assetFactory, String namespace, boolean closeWriter)
{
_writer = writer;
_assetFactory = assetFactory;
_namespace = namespace;
_closeWriter = closeWriter;
}
/**
* Used in testing only.
* @param writer
*/
public DefaultResponseBuilder(IMarkupWriter writer)
{
_writer = writer;
_assetFactory = null;
_namespace = null;
}
/**
* Creates a new response builder with the required services it needs
* to render the response when {@link #renderResponse(IRequestCycle)} is called.
*
* @param localeManager
* Used to set the locale on the response.
* @param markupWriterSource
* Creates IMarkupWriter instance to be used.
* @param webResponse
* Web response for output stream.
*/
public DefaultResponseBuilder(RequestLocaleManager localeManager,
MarkupWriterSource markupWriterSource, WebResponse webResponse,
AssetFactory assetFactory, String namespace)
{
Defense.notNull(assetFactory, "assetService");
_localeManager = localeManager;
_markupWriterSource = markupWriterSource;
_webResponse = webResponse;
// Used by PageRenderSupport
_assetFactory = assetFactory;
_namespace = namespace;
}
/**
*
* {@inheritDoc}
*/
public boolean isDynamic()
{
return false;
}
/**
*
* {@inheritDoc}
*/
public void renderResponse(IRequestCycle cycle)
throws IOException
{
if (_writer == null)
{
_localeManager.persistLocale();
IPage page = cycle.getPage();
ContentType contentType = page.getResponseContentType();
String encoding = contentType.getParameter(ENCODING_KEY);
if (encoding == null)
{
encoding = cycle.getEngine().getOutputEncoding();
contentType.setParameter(ENCODING_KEY, encoding);
}
PrintWriter printWriter = _webResponse.getPrintWriter(contentType);
_writer = _markupWriterSource.newMarkupWriter(printWriter, contentType);
}
// render response
_prs = new PageRenderSupportImpl(_assetFactory, _namespace, cycle.getPage().getLocation(), this);
TapestryUtils.storePageRenderSupport(cycle, _prs);
cycle.renderPage(this);
TapestryUtils.removePageRenderSupport(cycle);
flush();
if (_closeWriter)
_writer.close();
}
public void flush()
throws IOException
{
// Important - causes any cookies stored to properly be written out before the
// rest of the response starts being written - see TAPESTRY-825
_writer.flush();
}
/**
*
* {@inheritDoc}
*/
public void render(IMarkupWriter writer, IRender render, IRequestCycle cycle)
{
if (writer == null)
render.render(_writer, cycle);
else
render.render(writer, cycle);
}
/**
* {@inheritDoc}
*/
public void updateComponent(String id)
{
}
/**
* {@inheritDoc}
*/
public boolean contains(IComponent target)
{
return false;
}
/**
* {@inheritDoc}
*/
public boolean explicitlyContains(IComponent target)
{
return false;
}
/**
* {@inheritDoc}
*/
public IMarkupWriter getWriter()
{
if (_writer == null)
return NullWriter.getSharedInstance();
return _writer;
}
/**
* {@inheritDoc}
*/
public IMarkupWriter getWriter(String id, String type)
{
if (_writer == null)
return NullWriter.getSharedInstance();
return _writer;
}
/**
* {@inheritDoc}
*/
public boolean isBodyScriptAllowed(IComponent target)
{
return true;
}
/**
* {@inheritDoc}
*/
public boolean isExternalScriptAllowed(IComponent target)
{
return true;
}
/**
* {@inheritDoc}
*/
public boolean isInitializationScriptAllowed(IComponent target)
{
return true;
}
/**
* {@inheritDoc}
*/
public boolean isImageInitializationAllowed(IComponent target)
{
return true;
}
/**
* {@inheritDoc}
*/
public String getPreloadedImageReference(IComponent target, IAsset source)
{
return _prs.getPreloadedImageReference(target, source);
}
/**
* {@inheritDoc}
*/
public String getPreloadedImageReference(IComponent target, String url)
{
return _prs.getPreloadedImageReference(target, url);
}
/**
* {@inheritDoc}
*/
public String getPreloadedImageReference(String url)
{
return _prs.getPreloadedImageReference(url);
}
/**
* {@inheritDoc}
*/
public void addBodyScript(IComponent target, String script)
{
_prs.addBodyScript(target, script);
}
/**
* {@inheritDoc}
*/
public void addBodyScript(String script)
{
_prs.addBodyScript(script);
}
/**
* {@inheritDoc}
*/
public void addExternalScript(IComponent target, Resource resource)
{
_prs.addExternalScript(target, resource);
}
/**
* {@inheritDoc}
*/
public void addExternalScript(Resource resource)
{
_prs.addExternalScript(resource);
}
/**
* {@inheritDoc}
*/
public void addInitializationScript(IComponent target, String script)
{
_prs.addInitializationScript(target, script);
}
/**
* {@inheritDoc}
*/
public void addInitializationScript(String script)
{
_prs.addInitializationScript(script);
}
public void addScriptAfterInitialization(IComponent target, String script)
{
_prs.addScriptAfterInitialization(target, script);
}
/**
* {@inheritDoc}
*/
public String getUniqueString(String baseValue)
{
return _prs.getUniqueString(baseValue);
}
/**
* {@inheritDoc}
*/
public void writeBodyScript(IMarkupWriter writer, IRequestCycle cycle)
{
_prs.writeBodyScript(writer, cycle);
}
/**
* {@inheritDoc}
*/
public void writeInitializationScript(IMarkupWriter writer)
{
_prs.writeInitializationScript(writer);
}
/**
* {@inheritDoc}
*/
public void beginBodyScript(IMarkupWriter writer, IRequestCycle cycle)
{
writer.begin("script");
writer.attribute("type", "text/javascript");
writer.printRaw("<!--");
writer.println();
}
/**
* {@inheritDoc}
*/
public void endBodyScript(IMarkupWriter writer, IRequestCycle cycle)
{
writer.println();
writer.printRaw("// -->");
writer.end();
}
/**
* {@inheritDoc}
*/
public void writeBodyScript(IMarkupWriter writer, String script, IRequestCycle cycle)
{
writer.printRaw(script);
}
/**
* {@inheritDoc}
*/
public void writeExternalScript(IMarkupWriter writer, String url, IRequestCycle cycle)
{
writer.begin("script");
writer.attribute("type", "text/javascript");
writer.attribute("src", url);
writer.end();
writer.println();
}
/**
* {@inheritDoc}
*/
public void writeImageInitializations(IMarkupWriter writer, String script, String preloadName, IRequestCycle cycle)
{
writer.println();
writer.printRaw("dojo.addOnLoad(function(e) {\n");
writer.printRaw(preloadName + " = [];\n");
writer.printRaw("if (document.images)\n");
writer.printRaw("{\n");
writer.printRaw(script);
writer.printRaw("}\n");
writer.printRaw("});");
}
/**
* {@inheritDoc}
*/
public void writeInitializationScript(IMarkupWriter writer, String script)
{
writer.begin("script");
writer.attribute("type", "text/javascript");
writer.printRaw("<!--\n");
writer.printRaw("dojo.addOnLoad(function(e) {\n");
writer.printRaw(script);
writer.printRaw("});");
writer.printRaw("\n// -->");
writer.end();
}
/**
* This implementation does nothing.
* {@inheritDoc}
*/
public void addStatusMessage(IMarkupWriter normalWriter, String category, String text)
{
}
}