/*
 * Created on Nov 1, 2005
 */
package wiki.services;

import org.apache.log4j.Logger;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.TapestryUtils;
import org.apache.tapestry.engine.ServiceEncoder;
import org.apache.tapestry.engine.ServiceEncoding;
import org.apache.tapestry.services.ServiceConstants;

public class ViewPageEncoder
		implements
		ServiceEncoder {
	private static final Logger log = Logger.getLogger(ViewPageEncoder.class);

	private String _pageName;
	private String _url;

	public void encode(ServiceEncoding encoding) {
		if (!isExternalService(encoding))
			return;

		String pageName = encoding.getParameterValue(ServiceConstants.PAGE);

		if (!pageName.equals(_pageName))
			return;

		StringBuilder builder = new StringBuilder(_url);
		String[] params = encoding.getParameterValues(ServiceConstants.PARAMETER);

		// params should contain one element: the wiki page name
		for (String param : params) {
			builder.append("/");
			builder.append(param);
		}

		encoding.setServletPath(builder.toString());

		encoding.setParameterValue(ServiceConstants.SERVICE, null);
		encoding.setParameterValue(ServiceConstants.PAGE, null);
		encoding.setParameterValue(ServiceConstants.PARAMETER, null);
	}

	private boolean isExternalService(ServiceEncoding encoding) {
		String service = encoding.getParameterValue(ServiceConstants.SERVICE);
		return service.equals(Tapestry.EXTERNAL_SERVICE);
	}

	public void decode(ServiceEncoding encoding) {
		String servletPath = encoding.getServletPath();

		if (!servletPath.equals(_url))
			return;

		String pathInfo = encoding.getPathInfo();

		String[] params = TapestryUtils.split(pathInfo.substring(1), '/');

		encoding.setParameterValue(ServiceConstants.SERVICE, Tapestry.EXTERNAL_SERVICE);
		encoding.setParameterValue(ServiceConstants.PAGE, _pageName);
		encoding.setParameterValues(ServiceConstants.PARAMETER, params);
	}

	public void setPageName(String name) {
		_pageName = name;
	}

	public void setUrl(String url) {
		_url = url;
	}

}

