/*******************************************************************************
 * Copyright (c) 2005 Oracle Corporation.
 * 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:
 *    Ian Trimble - initial API and implementation
 *******************************************************************************/ 
package org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional;

import java.util.Iterator;

import org.eclipse.emf.common.util.EList;
import org.eclipse.jst.jsf.common.metadata.internal.IClassLoaderProvider;
import org.eclipse.jst.jsf.common.metadata.internal.provisional.Trait;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AppendChildElementOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AppendChildTextFromXPathOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AppendChildTextOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.ConvertAttributeToTextOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyAllAttributesOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyAttributeOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CopyChildrenOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateAttributeFromXPathOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateAttributeOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.CreateElementOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.IfNotOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.IfOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.IterateOverElementsOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.MakeParentElementCurrentOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.RemoveAttributeOperation;
import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.RenameAttributeOperation;
import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation;
import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Parameter;
import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.TagConvertInfo;
import org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.DTManager;
import org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo;
import org.w3c.dom.Element;

/**
 * Design-time metadata-driven HTML IOutputRenderer implementation.
 * 
 * @author Ian Trimble - Oracle
 * API: as we have discussed I really think this should be done through a factory.
 * Even if we don't go full blown extension point right away, we should split out
 * the transform construction responsibility to a separate factory.
 */
public class DTHTMLOutputRenderer implements IOutputRenderer {

	private static final String OP_AppendChildElementOperation = "AppendChildElementOperation";
	private static final String OP_AppendChildTextOperation = "AppendChildTextOperation";
	private static final String OP_ConvertAttributeToTextOperation = "ConvertAttributeToTextOperation";
	private static final String OP_CopyAllAttributesOperation = "CopyAllAttributesOperation";
	private static final String OP_CopyAttributeOperation = "CopyAttributeOperation";
	private static final String OP_CopyChildrenOperation = "CopyChildrenOperation";
	private static final String OP_CreateAttributeOperation = "CreateAttributeOperation";
	private static final String OP_CreateElementOperation = "CreateElementOperation";
	private static final String OP_MakeParentElementCurrentOperation = "MakeParentElementCurrentOperation";
	private static final String OP_RemoveAttributeOperation = "RemoveAttributeOperation";
	private static final String OP_RenameAttributeOperation = "RenameAttributeOperation";
	private static final String OP_CustomTransformOperation = "CustomTransformOperation";
	private static final String OP_IfOperation = "IfOperation";
	private static final String OP_IfNotOperation = "IfNotOperation";
	private static final String OP_IterateOverElementsOperation = "IterateOverElementsOperation";
	private static final String OP_CreateAttributeFromXPathOperation = "CreateAttributeFromXPathOperation";
	private static final String OP_AppendChildTextFromXPathOperation = "AppendChildTextFromXPathOperation";

	private ITagConverterContext tagConverterContext;

	private Logger log = PDPlugin.getLogger(DTHTMLOutputRenderer.class);

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.IOutputRenderer#render(org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITagConverterContext)
	 */
	public Element render(ITagConverterContext tagConverterContext) {
		this.tagConverterContext = tagConverterContext;
		Element srcElement = tagConverterContext.getHostElement();
		Element resultElement = null;
		if (srcElement != null) {
			ITransformer transformer = createTransformerFromDTInfo(srcElement);
			if (transformer != null) {
				resultElement = transformer.transform(srcElement);
			}
		}
		return resultElement;
	}

	/**
	 * Configures and returns an ITransformer instance for the specified source
	 * Element.
	 * 
	 * @param element Element for which to configure and return an ITransformer
	 * instance.
	 * @return Configured ITransformer instance for the specified Element.
	 */
	protected ITransformer createTransformerFromDTInfo(Element element) {
		ITransformer transformer = null;
		DTManager dtManager = DTManager.getInstance();
		IDTInfo dtInfo = dtManager.getDTInfo(element);
		if (dtInfo != null) {
			TagConvertInfo tcInfo = dtInfo.getTagConvertInfo();
			if (tcInfo != null) {
				transformer = new DefaultTransformer();
				transformer.setTagConverterContext(tagConverterContext);
				EList operations = tcInfo.getOperations();
				if (!appendOperationsToTransformer(transformer, operations, dtInfo)) {
					transformer = null;
				}
			}
		}
		return transformer;
	}

	private boolean appendOperationsToTransformer(ITransformer transformer, EList operations, IDTInfo dtInfo) {
		Iterator itOperations = operations.iterator();
		while (itOperations.hasNext()) {
			Operation operation = (Operation)itOperations.next();
			ITransformOperation currentTransformOperation = null;
			String opID = operation.getId();
			if (opID != null) {
				if (opID.equals(OP_AppendChildElementOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					if (parameters.size() < 2) {
						String elementName = ((Parameter)parameters.get(0)).getValue();
						currentTransformOperation = new AppendChildElementOperation(elementName);
						transformer.appendTransformOperation(currentTransformOperation);
					} else {
						String elementName = ((Parameter)parameters.get(0)).getValue();
						boolean makeChildCurrent = Boolean.valueOf(((Parameter)parameters.get(1)).getValue()).booleanValue();
						currentTransformOperation = new AppendChildElementOperation(elementName, makeChildCurrent);
						transformer.appendTransformOperation(currentTransformOperation);
					}
				} else if (opID.equals(OP_AppendChildTextOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String content = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new AppendChildTextOperation(content);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_ConvertAttributeToTextOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					if (parameters.size() < 2) {
						String attributeName = ((Parameter)parameters.get(0)).getValue();
						currentTransformOperation = new ConvertAttributeToTextOperation(attributeName);
						transformer.appendTransformOperation(currentTransformOperation);
					} else {
						String attributeName = ((Parameter)parameters.get(0)).getValue();
						boolean removeAttribute = Boolean.valueOf(((Parameter)parameters.get(1)).getValue()).booleanValue();
						currentTransformOperation = new ConvertAttributeToTextOperation(attributeName, removeAttribute);
						transformer.appendTransformOperation(currentTransformOperation);
					}
				} else if (opID.equals(OP_CopyAllAttributesOperation)) {
					transformer.appendTransformOperation(new CopyAllAttributesOperation());
				} else if (opID.equals(OP_CopyAttributeOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					if (parameters.size() < 3) {
						String attributeName = ((Parameter)parameters.get(0)).getValue();
						currentTransformOperation = new CopyAttributeOperation(attributeName);
						transformer.appendTransformOperation(currentTransformOperation);
					} else {
						String attributeName = ((Parameter)parameters.get(0)).getValue();
						boolean create = Boolean.valueOf(((Parameter)parameters.get(1)).getValue()).booleanValue();
						String newAttributeValue = ((Parameter)parameters.get(2)).getValue();
						currentTransformOperation = new CopyAttributeOperation(attributeName, create, newAttributeValue);
						transformer.appendTransformOperation(currentTransformOperation);
					}
				} else if (opID.equals(OP_CopyChildrenOperation)) {
					currentTransformOperation = new CopyChildrenOperation();
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_CreateAttributeOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 2) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String attributeName = ((Parameter)parameters.get(0)).getValue();
					String attributeValue = ((Parameter)parameters.get(1)).getValue();
					currentTransformOperation = new CreateAttributeOperation(attributeName, attributeValue);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_CreateElementOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String elementName = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new CreateElementOperation(elementName);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_MakeParentElementCurrentOperation)) {
					currentTransformOperation = new MakeParentElementCurrentOperation();
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_RemoveAttributeOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String attributeName = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new RemoveAttributeOperation(attributeName);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_RenameAttributeOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 2) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String oldAttributeName = ((Parameter)parameters.get(0)).getValue();
					String newAttributeName = ((Parameter)parameters.get(1)).getValue();
					currentTransformOperation = new RenameAttributeOperation(oldAttributeName, newAttributeName);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_CustomTransformOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
					}
					String className = ((Parameter)parameters.get(0)).getValue();
					try {
						Trait trait = dtInfo.getTrait();
						IClassLoaderProvider classLoaderProvider = (IClassLoaderProvider)trait.getSourceModelProvider().getAdapter(IClassLoaderProvider.class);
						if (classLoaderProvider != null) {
							Class opClass = classLoaderProvider.loadClass(className);
							if (opClass != null) {
								Object opObject = opClass.newInstance();
								if (opObject instanceof ITransformOperation) {
									currentTransformOperation = (ITransformOperation)opObject;
									transformer.appendTransformOperation(currentTransformOperation);
								} else {
									log.error("Warning.DTHTMLOutputRenderer.NotITransformOperation", className);
									return false;
								}
							} else {
								log.error("Warning.DTHTMLOutputRenderer.ClassNotFound", className);
								return false;
							}
						}
					} catch(IllegalAccessException iae) {
						log.error("Warning.DTHTMLOutputRenderer.IllegalAccess", className, iae);
						return false;
					} catch(InstantiationException ie) {
						log.error("Warning.DTHTMLOutputRenderer.Instantiation", className, ie);
						return false;
					}
				} else if (opID.equals(OP_IfOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String xPathExpression = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new IfOperation(xPathExpression);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_IfNotOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String xPathExpression = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new IfNotOperation(xPathExpression);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_IterateOverElementsOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String xPathExpression = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new IterateOverElementsOperation(xPathExpression);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_CreateAttributeFromXPathOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 2) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String attributeName = ((Parameter)parameters.get(0)).getValue();
					String xPathExpression = ((Parameter)parameters.get(1)).getValue();
					currentTransformOperation = new CreateAttributeFromXPathOperation(attributeName, xPathExpression);
					transformer.appendTransformOperation(currentTransformOperation);
				} else if (opID.equals(OP_AppendChildTextFromXPathOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String xPathExpression = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new AppendChildTextFromXPathOperation(xPathExpression);
					transformer.appendTransformOperation(currentTransformOperation);
				} else {
					log.error("Warning.DTHTMLOutputRenderer.UnknownOperationID", opID);
					return false;
				}
				
				EList childOperations = operation.getOperations();
				if (childOperations != null && childOperations.size() > 0) {
					if (!appendChildOperations(currentTransformOperation, childOperations, dtInfo)) {
						return false;
					}
				}
			}
		}
		return true;
	}

	private boolean appendChildOperations(ITransformOperation parentOperation, EList operations, IDTInfo dtInfo) {
		Iterator itOperations = operations.iterator();
		while (itOperations.hasNext()) {
			Operation operation = (Operation)itOperations.next();
			ITransformOperation currentTransformOperation = null;
			String opID = operation.getId();
			if (opID != null) {
				if (opID.equals(OP_AppendChildElementOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					if (parameters.size() < 2) {
						String elementName = ((Parameter)parameters.get(0)).getValue();
						currentTransformOperation = new AppendChildElementOperation(elementName);
						parentOperation.appendChildOperation(currentTransformOperation);
					} else {
						String elementName = ((Parameter)parameters.get(0)).getValue();
						boolean makeChildCurrent = Boolean.valueOf(((Parameter)parameters.get(1)).getValue()).booleanValue();
						currentTransformOperation = new AppendChildElementOperation(elementName, makeChildCurrent);
						parentOperation.appendChildOperation(currentTransformOperation);
					}
				} else if (opID.equals(OP_AppendChildTextOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String content = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new AppendChildTextOperation(content);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_ConvertAttributeToTextOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					if (parameters.size() < 2) {
						String attributeName = ((Parameter)parameters.get(0)).getValue();
						currentTransformOperation = new ConvertAttributeToTextOperation(attributeName);
						parentOperation.appendChildOperation(currentTransformOperation);
					} else {
						String attributeName = ((Parameter)parameters.get(0)).getValue();
						boolean removeAttribute = Boolean.valueOf(((Parameter)parameters.get(1)).getValue()).booleanValue();
						currentTransformOperation = new ConvertAttributeToTextOperation(attributeName, removeAttribute);
						parentOperation.appendChildOperation(currentTransformOperation);
					}
				} else if (opID.equals(OP_CopyAllAttributesOperation)) {
					parentOperation.appendChildOperation(new CopyAllAttributesOperation());
				} else if (opID.equals(OP_CopyAttributeOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					if (parameters.size() < 3) {
						String attributeName = ((Parameter)parameters.get(0)).getValue();
						currentTransformOperation = new CopyAttributeOperation(attributeName);
						parentOperation.appendChildOperation(currentTransformOperation);
					} else {
						String attributeName = ((Parameter)parameters.get(0)).getValue();
						boolean create = Boolean.valueOf(((Parameter)parameters.get(1)).getValue()).booleanValue();
						String newAttributeValue = ((Parameter)parameters.get(2)).getValue();
						currentTransformOperation = new CopyAttributeOperation(attributeName, create, newAttributeValue);
						parentOperation.appendChildOperation(currentTransformOperation);
					}
				} else if (opID.equals(OP_CopyChildrenOperation)) {
					currentTransformOperation = new CopyChildrenOperation();
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_CreateAttributeOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 2) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String attributeName = ((Parameter)parameters.get(0)).getValue();
					String attributeValue = ((Parameter)parameters.get(1)).getValue();
					currentTransformOperation = new CreateAttributeOperation(attributeName, attributeValue);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_CreateElementOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String elementName = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new CreateElementOperation(elementName);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_MakeParentElementCurrentOperation)) {
					currentTransformOperation = new MakeParentElementCurrentOperation();
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_RemoveAttributeOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String attributeName = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new RemoveAttributeOperation(attributeName);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_RenameAttributeOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 2) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String oldAttributeName = ((Parameter)parameters.get(0)).getValue();
					String newAttributeName = ((Parameter)parameters.get(1)).getValue();
					currentTransformOperation = new RenameAttributeOperation(oldAttributeName, newAttributeName);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_CustomTransformOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
					}
					String className = ((Parameter)parameters.get(0)).getValue();
					try {
						Trait trait = dtInfo.getTrait();
						IClassLoaderProvider classLoaderProvider = (IClassLoaderProvider)trait.getSourceModelProvider().getAdapter(IClassLoaderProvider.class);
						if (classLoaderProvider != null) {
							Class opClass = classLoaderProvider.loadClass(className);
							if (opClass != null) {
								Object opObject = opClass.newInstance();
								if (opObject instanceof ITransformOperation) {
									currentTransformOperation = (ITransformOperation)opObject;
									parentOperation.appendChildOperation(currentTransformOperation);
								} else {
									log.error("Warning.DTHTMLOutputRenderer.NotITransformOperation", className);
									return false;
								}
							} else {
								log.error("Warning.DTHTMLOutputRenderer.ClassNotFound", className);
								return false;
							}
						}
					} catch(IllegalAccessException iae) {
						log.error("Warning.DTHTMLOutputRenderer.IllegalAccess", className, iae);
						return false;
					} catch(InstantiationException ie) {
						log.error("Warning.DTHTMLOutputRenderer.Instantiation", className, ie);
						return false;
					}
				} else if (opID.equals(OP_IfOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String xPathExpression = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new IfOperation(xPathExpression);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_IfNotOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String xPathExpression = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new IfNotOperation(xPathExpression);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_IterateOverElementsOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String xPathExpression = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new IterateOverElementsOperation(xPathExpression);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_CreateAttributeFromXPathOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 2) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String attributeName = ((Parameter)parameters.get(0)).getValue();
					String xPathExpression = ((Parameter)parameters.get(1)).getValue();
					currentTransformOperation = new CreateAttributeFromXPathOperation(attributeName, xPathExpression);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else if (opID.equals(OP_AppendChildTextFromXPathOperation)) {
					EList parameters = operation.getParameters();
					if (parameters.size() < 1) {
						log.error("Warning.DTHTMLOutputRenderer.TooFewParameters", opID);
						return false;
					}
					String xPathExpression = ((Parameter)parameters.get(0)).getValue();
					currentTransformOperation = new AppendChildTextFromXPathOperation(xPathExpression);
					parentOperation.appendChildOperation(currentTransformOperation);
				} else {
					log.error("Warning.DTHTMLOutputRenderer.UnknownOperationID", opID);
					return false;
				}
				
				EList childOperations = operation.getOperations();
				if (childOperations != null && childOperations.size() > 0) {
					if (!appendChildOperations(currentTransformOperation, childOperations, dtInfo)) {
						return false;
					}
				}
			}
		}
		return true;
	}

}
