/*******************************************************************************
 * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.xalan.debugger;

import java.util.Map;
import java.util.TooManyListenersException;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xalan.processor.TransformerFactoryImpl;
import org.apache.xalan.trace.TraceManager;
import org.apache.xalan.transformer.TransformerImpl;
import org.eclipse.wst.xsl.debugger.AbstractDebugger;
import org.eclipse.wst.xsl.debugger.Variable;

public class XalanDebugger extends AbstractDebugger
{
	private static final Log log = LogFactory.getLog(XalanDebugger.class);
	private XalanTraceListener currentTraceListener;
	
	public void setTransformerFactory(TransformerFactory factory)
	{
		TransformerFactoryImpl tfi = (TransformerFactoryImpl) factory;
		tfi.setAttribute(TransformerFactoryImpl.FEATURE_SOURCE_LOCATION, Boolean.TRUE);
		tfi.setAttribute(TransformerFactoryImpl.FEATURE_OPTIMIZE, Boolean.FALSE);
	}

	public void addTransformer(Transformer transformer, Map locations)
	{
		TransformerImpl transformerImpl = (TransformerImpl) transformer;
		TraceManager trMgr = transformerImpl.getTraceManager();
		try
		{
//			XalanPrintTraceListener printer = new XalanPrintTraceListener(new PrintWriter(System.err));
//			printer.m_traceElements = true;
//			printer.m_traceSelection = true;
//			printer.m_traceTemplates = true;
//			trMgr.addTraceListener(printer);
			
			XalanTraceListener traceListener = new XalanTraceListener(this);
			trMgr.addTraceListener(traceListener);
		}
		catch (TooManyListenersException e)
		{
			// ignore
		}
	}

	public Variable getVariable(int id)
	{
		return currentTraceListener.getVariable(id);
	}

	void setCurrentTraceListener(XalanTraceListener currentTraceListener)
	{
		log.debug("Setting new XalanTraceListener");
		this.currentTraceListener = currentTraceListener;
	}
}
