/**
 ********************************************************************************
 * Copyright (c) 2015-2018 Robert Bosch GmbH and others.
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 ********************************************************************************
 */

package org.eclipse.app4mc.amalthea.workflow.component;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.app4mc.amalthea.model.Amalthea;
import org.eclipse.app4mc.amalthea.model.AmaltheaMerger;
import org.eclipse.app4mc.amalthea.sphinx.AmaltheaResourceFactory;
import org.eclipse.app4mc.amalthea.workflow.core.Context;
import org.eclipse.app4mc.amalthea.workflow.core.WorkflowComponent;
import org.eclipse.app4mc.amalthea.workflow.core.exception.ConfigurationException;
import org.eclipse.app4mc.amalthea.workflow.core.exception.WorkflowException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.sphinx.emf.resource.ExtendedResourceSet;
import org.eclipse.sphinx.emf.resource.ExtendedResourceSetImpl;

/**
 * Basic workflow component to read a model file and set it to a given context.
 * The model can also be split to several files, each file containing an {@link Amalthea} model.
 * Several file locations can be added using the {@link #addFileName(String)} method.
 * The given files are read, the content is copied and at the end resolved.
 * At the end the loaded model is available in the configured model slot.
 */
public class ModelReader2 extends WorkflowComponent {

	private final List<String> fileNames = new ArrayList<String>();

	public ModelReader2() {
		super();
	}

	/**
	 * 
	 * @see org.eclipse.app4mc.amalthea.workflow.core.WorkflowComponent#runInternal(org.eclipse.app4mc.amalthea.workflow.core.Context)
	 */
	@Override
	protected void runInternal(final Context ctx) throws WorkflowException {
		final ExtendedResourceSet resSet = new ExtendedResourceSetImpl();
		resSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("amxmi", new AmaltheaResourceFactory(true));
		final Collection<Amalthea> models = new ArrayList<Amalthea>();
		for (final String filename : getFileNames()) {
			try {
				this.log.info("Reading file: " + filename);
				final Resource res = resSet.createResource(URI.createURI(filename));
				res.load(null);
				for (final EObject content : res.getContents()) {
					if (content instanceof Amalthea) {
						models.add( (Amalthea) content);
					}
				}
			}
			catch (final IOException e) {
				throw new WorkflowException("Error at loading files!", e);
			}
		}
		 
		AmaltheaMerger.addElements(getAmaltheaModel(ctx), models);
	}

	/**
	 * Checks for given file locations to load.
	 * 
	 * @throws ConfigurationException
	 *             in case no file location is configured.
	 */
	@Override
	protected void checkInternal() throws ConfigurationException {
		if (this.fileNames.isEmpty()) {
			throw new ConfigurationException("No filenames configured to read!");
		}
	}

	/**
	 * @return the fileNames as {@link List} of {@link String}
	 */
	public List<String> getFileNames() {
		return this.fileNames;
	}

	/**
	 * Adds a file location holding an {@link Amalthea} model. Eclipse URIs like <code> platform:/resource/... </code> can
	 * be used to specify the location if running inside of an Eclipse environment.
	 * 
	 * @param fileName
	 *            the fileName to set
	 */
	public void addFileName(final String fileName) {
		this.fileNames.add(fileName);
	}

}
