/*******************************************************************************
* Copyright (c) 2007, 2008 Symbian Software Limited and others.
* 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:
* Bala Torati (Symbian) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.templateengine.process;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.cdt.core.templateengine.TemplateCore;
import org.eclipse.cdt.core.templateengine.TemplateDescriptor;
import org.eclipse.cdt.core.templateengine.TemplateEngine;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.w3c.dom.Element;
/**
* Class handles the Template processes
*/
public class TemplateProcessHandler {
private TemplateCore template;
private List<ConditionalProcessGroup> conditionalProcessGroupList;
public TemplateProcessHandler(TemplateCore template) {
this.template = template;
initialize();
}
/**
* Initialises the template descriptor and Root Elements.
*/
private void initialize() {
TemplateDescriptor desc = template.getTemplateDescriptor();
Element root = desc.getRootElement();
conditionalProcessGroupList = new ArrayList<ConditionalProcessGroup>();
List<Element> nodeList = TemplateEngine.getChildrenOfElementByTag(root, TemplateDescriptor.IF);
for (int j = 0, l = nodeList.size(); j < l; j++) {
conditionalProcessGroupList.add(new ConditionalProcessGroup(template, nodeList.get(j), j + 1));
}
//Collect all free-hanging processes in one ConditionalProcessGroup object with condition true.
nodeList = TemplateEngine.getChildrenOfElementByTag(root, TemplateDescriptor.PROCESS);
conditionalProcessGroupList.add(new ConditionalProcessGroup(template, nodeList.toArray(new Element[nodeList.size()])));
}
/**
*
* @param monitor
* @return IStatus, as an array of status info
* @throws ProcessFailureException
*/
public IStatus[] processAll(IProgressMonitor monitor) throws ProcessFailureException {
List<IStatus> allStatuses = new ArrayList<IStatus>();
for(ConditionalProcessGroup cpg : conditionalProcessGroupList) {
try {
allStatuses.addAll(cpg.process(monitor));
} catch (ProcessFailureException e) {
throw new ProcessFailureException(e.getMessage(), e, allStatuses);
}
}
return allStatuses.toArray(new IStatus[allStatuses.size()]);
}
/**
* @return the union of all macros used in this template's process groups
*/
public Set<String> getAllMacros() {
Set<String> set = new HashSet<String>();
for(ConditionalProcessGroup cpg : conditionalProcessGroupList) {
Set<String> subSet = cpg.getAllMacros();
if (subSet != null) {
set.addAll(subSet);
}
}
return set;
}
}