blob: 8c5bf3c47b9e5d9ea1c1e30ff015e7119501cb29 [file] [log] [blame]
/**
********************************************************************************
* 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.Collections;
import java.util.List;
import org.eclipse.app4mc.amalthea.model.Amalthea;
import org.eclipse.app4mc.amalthea.model.AmaltheaFactory;
import org.eclipse.app4mc.amalthea.model.AmaltheaMerger;
import org.eclipse.app4mc.amalthea.model.CommonElements;
import org.eclipse.app4mc.amalthea.model.ComponentsModel;
import org.eclipse.app4mc.amalthea.model.ConfigModel;
import org.eclipse.app4mc.amalthea.model.ConstraintsModel;
import org.eclipse.app4mc.amalthea.model.EventModel;
import org.eclipse.app4mc.amalthea.model.HWModel;
import org.eclipse.app4mc.amalthea.model.MappingModel;
import org.eclipse.app4mc.amalthea.model.OSModel;
import org.eclipse.app4mc.amalthea.model.PropertyConstraintsModel;
import org.eclipse.app4mc.amalthea.model.SWModel;
import org.eclipse.app4mc.amalthea.model.StimuliModel;
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.emf.ecore.util.EcoreUtil.Copier;
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 one
* submodel of the central {@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 ModelReader extends WorkflowComponent {
private final List<String> fileNames = new ArrayList<String>();
public ModelReader() {
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 Copier copier = new Copier(true, true);
for (final String filename : getFileNames()) {
try {
this.log.info("Reading file: " + filename);
final Resource res = resSet.createResource(URI.createURI(filename));
res.load(null);
final Collection<EObject> tmp = copier.copyAll(res.getContents());
for (final EObject content : tmp) {
addModelContent(content, ctx);
}
}
catch (final IOException e) {
throw new WorkflowException("Error at loading files!", e);
}
}
copier.copyReferences();
}
private void addModelContent(final EObject content, final Context ctx) {
if (content instanceof Amalthea) {
final Amalthea tmpContent = (Amalthea) content;
if (tmpContent.getCustomProperties() != null && tmpContent.getCustomProperties().size() > 0) {
/*- Merging of CustomPropeties at the root level (central:Amalthea) from various models can lead to overwriting the contents (if same key's are defined)*/
getAmaltheaModel(ctx).getCustomProperties().addAll(tmpContent.getCustomProperties());
}
if (tmpContent.getCommonElements() != null) {
final Amalthea tmpModel = AmaltheaFactory.eINSTANCE.createAmalthea();
tmpModel.setCommonElements(tmpContent.getCommonElements());
AmaltheaMerger.addElements(getAmaltheaModel(ctx), Collections.singletonList(tmpModel));
}
if (tmpContent.getComponentsModel() != null) {
getAmaltheaModel(ctx).setComponentsModel(tmpContent.getComponentsModel());
}
if (tmpContent.getConfigModel() != null) {
getAmaltheaModel(ctx).setConfigModel(tmpContent.getConfigModel());
}
if (tmpContent.getConstraintsModel() != null) {
getAmaltheaModel(ctx).setConstraintsModel(tmpContent.getConstraintsModel());
}
if (tmpContent.getEventModel() != null) {
getAmaltheaModel(ctx).setEventModel(tmpContent.getEventModel());
}
if (tmpContent.getHwModel() != null) {
getAmaltheaModel(ctx).setHwModel(tmpContent.getHwModel());
}
if (tmpContent.getMappingModel() != null) {
getAmaltheaModel(ctx).setMappingModel(tmpContent.getMappingModel());
}
if (tmpContent.getOsModel() != null) {
getAmaltheaModel(ctx).setOsModel(tmpContent.getOsModel());
}
if (tmpContent.getPropertyConstraintsModel() != null) {
getAmaltheaModel(ctx).setPropertyConstraintsModel(tmpContent.getPropertyConstraintsModel());
}
if (tmpContent.getStimuliModel() != null) {
getAmaltheaModel(ctx).setStimuliModel(tmpContent.getStimuliModel());
}
if (tmpContent.getSwModel() != null) {
getAmaltheaModel(ctx).setSwModel(tmpContent.getSwModel());
}
}
else if (content instanceof CommonElements) {
getAmaltheaModel(ctx).setCommonElements((CommonElements) content);
}
else if (content instanceof ComponentsModel) {
getAmaltheaModel(ctx).setComponentsModel((ComponentsModel) content);
}
else if (content instanceof ConfigModel) {
getAmaltheaModel(ctx).setConfigModel((ConfigModel) content);
}
else if (content instanceof ConstraintsModel) {
getAmaltheaModel(ctx).setConstraintsModel((ConstraintsModel) content);
}
else if (content instanceof EventModel) {
getAmaltheaModel(ctx).setEventModel((EventModel) content);
}
else if (content instanceof HWModel) {
getAmaltheaModel(ctx).setHwModel((HWModel) content);
}
else if (content instanceof MappingModel) {
getAmaltheaModel(ctx).setMappingModel((MappingModel) content);
}
else if (content instanceof OSModel) {
getAmaltheaModel(ctx).setOsModel((OSModel) content);
}
else if (content instanceof PropertyConstraintsModel) {
getAmaltheaModel(ctx).setPropertyConstraintsModel((PropertyConstraintsModel) content);
}
else if (content instanceof StimuliModel) {
getAmaltheaModel(ctx).setStimuliModel((StimuliModel) content);
}
else if (content instanceof SWModel) {
getAmaltheaModel(ctx).setSwModel((SWModel) content);
}
}
/**
* 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);
}
}