/*******************************************************************************
* Copyright (c) 2010 protos software gmbh (http://www.protos.de).
* 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:
* Thomas Schuetz and Henrik Rentz-Reichert (initial contribution)
*
*******************************************************************************/
package org.eclipse.etrice.generator.workflow;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.mwe2.runtime.workflow.IWorkflowContext;
import org.eclipse.etrice.core.room.RoomModel;
import org.eclipse.etrice.generator.builder.InstanceModelBuilder;
import org.eclipse.etrice.generator.builder.ValidationException;
import org.eclipse.etrice.generator.etricegen.Root;
import org.eclipse.etrice.generator.etricegen.util.ETriceGenResourceImpl;
public class InstanceModelCreator extends WorkflowComponentWithTwoSlots {
private XtendStdlibLogger logger;
private InstanceModelBuilder builder;
private boolean debug = false;
private boolean save = false;
private String uri = "tmp.rim";
private WorkflowDiagnostician diagnostician;
public boolean isSave() {
return save;
}
public void setSave(boolean save) {
this.save = save;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
}
@Override
public void invoke(IWorkflowContext ctx) {
logger = new XtendStdlibLogger();
diagnostician = new WorkflowDiagnostician(logger);
if (debug)
logger.setVerbose(true);
builder = new InstanceModelBuilder(logger, diagnostician);
List<RoomModel> models = getRoomModels(ctx);
if (models.size()>0) {
Root root = builder.createInstanceModel(models);
List<Root> result = new LinkedList<Root>();
result.add(root);
ctx.put(getOutSlot(), result);
if (save)
saveResult(root);
}
else {
logger.logError("InstanceModelCreator: Could not find a RoomModel in input slot "+getInSlot()+".", null);
}
if (logger.getErrorCount()>0)
throw new ValidationException("Erros detected.");
}
private List<RoomModel> getRoomModels(IWorkflowContext ctx) {
Object object = ctx.get(getInSlot());
@SuppressWarnings("unchecked")
List<RoomModel> models = (List<RoomModel>) object;
return models;
}
private void saveResult(Root root) {
URI uri = URI.createFileURI(this.uri);
Resource resource = new ETriceGenResourceImpl(uri);
resource.getContents().add(root);
try {
resource.save(null);
} catch (IOException e) {
throw new WrappedException(e);
}
}
}