blob: faaedd30fe13695b493f8c6e49743f65c50e8bbb [file] [log] [blame]
// Copyright 2004 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.engine;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.ApplicationRuntimeException;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.html.HTMLWriter;
import org.apache.tapestry.request.RequestContext;
import org.apache.tapestry.request.ResponseOutputStream;
/**
* A very specialized service used by JSPs to access Tapestry URLs.
* This is used by the Tapestry JSP tags, such as
* {@link org.apache.tapestry.jsp.PageTag}.
*
* @author Howard Lewis Ship
* @version $Id$
* @since 3.0
* @see org.apache.tapestry.jsp.URLRetriever
*
**/
public class TagSupportService implements IEngineService
{
private static final Log LOG = LogFactory.getLog(TagSupportService.class);
/**
* Not to be invoked; this service is different than the others.
*
* @throws ApplicationRuntimeException always
*
**/
public ILink getLink(IRequestCycle cycle, IComponent component, Object[] parameters)
{
throw new ApplicationRuntimeException(
Tapestry.getMessage("TagSupportService.service-only"));
}
public void service(
IEngineServiceView engine,
IRequestCycle cycle,
ResponseOutputStream output)
throws ServletException, IOException
{
RequestContext context = cycle.getRequestContext();
HttpServletRequest request = context.getRequest();
String serviceName = getAttribute(request, Tapestry.TAG_SUPPORT_SERVICE_ATTRIBUTE);
Object raw = request.getAttribute(Tapestry.TAG_SUPPORT_PARAMETERS_ATTRIBUTE);
Object[] parameters = null;
try
{
parameters = (Object[]) raw;
}
catch (ClassCastException ex)
{
throw new ServletException(
Tapestry.format(
"TagSupportService.attribute-not-array",
Tapestry.TAG_SUPPORT_PARAMETERS_ATTRIBUTE,
Tapestry.getClassName(raw.getClass())));
}
IEngineService service = cycle.getEngine().getService(serviceName);
ILink link = service.getLink(cycle, null, parameters);
String URI = link.getURL();
if (LOG.isDebugEnabled())
{
LOG.debug("Request servlet path = " + request.getServletPath());
Enumeration e = request.getParameterNames();
while (e.hasMoreElements())
{
String name = (String) e.nextElement();
LOG.debug("Request parameter " + name + " = " + request.getParameter(name));
}
e = request.getAttributeNames();
while (e.hasMoreElements())
{
String name = (String) e.nextElement();
LOG.debug("Request attribute " + name + " = " + request.getAttribute(name));
}
LOG.debug("Result URI: " + URI);
}
HttpServletResponse response = context.getResponse();
PrintWriter servletWriter = response.getWriter();
IMarkupWriter writer = new HTMLWriter(servletWriter);
writer.print(URI);
writer.flush();
}
private String getAttribute(HttpServletRequest request, String name) throws ServletException
{
Object result = request.getAttribute(name);
if (result == null)
throw new ServletException(Tapestry.format("TagSupportService.null-attribute", name));
try
{
return (String) result;
}
catch (ClassCastException ex)
{
throw new ServletException(
Tapestry.format(
"TagSupportService.attribute-not-string",
name,
Tapestry.getClassName(result.getClass())));
}
}
/**
* @return {@link org.apache.tapestry.Tapestry#TAGSUPPORT_SERVICE}.
*
**/
public String getName()
{
return Tapestry.TAGSUPPORT_SERVICE;
}
}