/**
 * <copyright>
 * 
 * Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 * Thales Corporate Services S.A.S - initial API and implementation
 * 
 * </copyright>
 */

package org.eclipse.egf.pattern.templates;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.egf.core.pattern.PatternFolders;
import org.eclipse.egf.pattern.utils.TemplateFileHelper;

/**
 * This is a quick 'template engine' used for initialization of the contents of
 * new pattern methods.
 * 
 * @author Guiu
 * 
 */
public class SimpleEngine extends TemplateEngine {

    public SimpleEngine(String pluginId, IProject project, String templateFileExtension) {
        super(pluginId, project, templateFileExtension);
    }

    @Override
    public String process(Templates template, Map<String, String> context) throws CoreException, IOException {
        IPath path = new Path(PatternFolders.getTemplatesFolderName()).append(template.getTemplateName()).addFileExtension(getExtension());
        String content = TemplateFileHelper.getContent(getPluginId(), getProject(), path);
        if (content == null)
            return null;
        for (Iterator<Entry<String, String>> it = context.entrySet().iterator(); it.hasNext();) {
            Entry<String, String> entry = it.next();
            content = content.replaceAll(entry.getKey(), entry.getValue());
        }
        return content;
    }

}
