/*******************************************************************************
* Copyright (c) 2011 itemis AG (http://www.itemis.eu) 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
*******************************************************************************/
package org.eclipse.xtend.backend;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.emf.mwe.core.WorkflowContext;
import org.eclipse.emf.mwe.core.issues.Issues;
import org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent2;
import org.eclipse.emf.mwe.core.monitor.ProgressMonitor;
import org.eclipse.xtend.backend.common.BackendTypesystem;
import org.eclipse.xtend.backend.common.ExecutionContext;
import org.eclipse.xtend.backend.common.QualifiedName;
import org.eclipse.xtend.backend.syslib.FileIoOperations;
import org.eclipse.xtend.backend.syslib.FileOutlet;
import org.eclipse.xtend.backend.syslib.SysLibNames;
import org.eclipse.xtend.backend.syslib.UriBasedPostprocessor;
import org.eclipse.xtend.backend.types.CompositeTypesystemFactory;
import org.eclipse.xtend.middleend.LanguageContributor;
import org.eclipse.xtend.middleend.MiddleEnd;
import org.eclipse.xtend.middleend.MiddleEndFactory;
import org.eclipse.xtend.middleend.plugins.LanguageSpecificMiddleEnd;
/**
* @author aarnold - Initial contribution and API
*/
public class BackendComponent extends AbstractWorkflowComponent2 {
protected final Log log = LogFactory.getLog(getClass());
protected String _invoke;
protected List<String> _parameters;
protected final List<String> _advice = new ArrayList<String>();
protected String _middleEndClass;
protected Set<String> _typeSystemClasses;
protected Collection<Outlet> _outlets;
@Override
protected void invokeInternal(WorkflowContext workflowCtx, ProgressMonitor monitor, Issues issues) {
// TODO Auto-generated method stub
BackendTypesystem ts = createTypesystem();
MiddleEnd me = MiddleEndFactory.create(ts, createMiddleEnds());
ExecutionContext execCtx = BackendFacade.createExecutionContext(me.createEmptyFdc(), ts, false);
final Map<String, Object> variables = new HashMap<String, Object> ();
for (String name: workflowCtx.getSlotNames())
execCtx.getLocalVarContext().getLocalVars().put (name, workflowCtx.get (name));
List<Object> params = retrieveParams (execCtx);
registerOutlets(execCtx, _outlets);
BackendFacade.invoke (execCtx, new QualifiedName (_invoke), params);
}
public String getInvoke() {
return _invoke;
}
public void setInvoke(String invoke) {
this._invoke = invoke;
}
public List<String> getParameters() {
return _parameters;
}
public void addParameters(String parameter) {
this._parameters.add (parameter);
}
public Collection<Outlet> getOutlets() {
return _outlets;
}
public void addOutlets(Outlet outlet) {
_outlets.add (outlet);
}
public List<String> get_advice() {
return _advice;
}
protected BackendTypesystem createTypesystem () {
return CompositeTypesystemFactory.INSTANCE.createTypesystemFromClassNames(_typeSystemClasses);
}
protected List<LanguageSpecificMiddleEnd> createMiddleEnds () {
List<LanguageSpecificMiddleEnd> me = null;
try {
Class<? extends LanguageSpecificMiddleEnd> middleEndClass = (Class<? extends LanguageSpecificMiddleEnd>)Class.forName(_middleEndClass);
me = LanguageContributor.INSTANCE.getFreshMiddleEnds (createSpecificParams());
} catch (Exception e) {
// TODO: handle exception
}
return me;
}
protected Map<Class<?>, Object> createSpecificParams () {
return null;
}
protected List<Object> retrieveParams (ExecutionContext execCtx) {
List<Object> params = new ArrayList<Object>();
Map<String, Object> localVars = execCtx.getLocalVarContext().getLocalVars();
for (String paramExpr : _parameters) {
params.add(localVars.get (paramExpr));
}
return params;
}
private void registerOutlets (ExecutionContext ctx, Collection<Outlet> outlets) {
for (Outlet oldOutlet: outlets) {
final FileOutlet newOutlet = new FileOutlet ();
newOutlet.setAppend (oldOutlet.isAppend());
newOutlet.setBaseDir (new File (oldOutlet.getPath()));
if (oldOutlet.getFileEncoding() != null)
newOutlet.setFileEncoding (oldOutlet.getFileEncoding());
newOutlet.setOverwrite (oldOutlet.isOverwrite());
final String outletName = (oldOutlet.getName() != null) ? oldOutlet.getName() : FileIoOperations.DEFAULT_OUTLET_NAME;
ctx.getFunctionDefContext ().invoke (ctx, new QualifiedName (SysLibNames.REGISTER_OUTLET), Arrays.asList (outletName, newOutlet));
}
}
public class Outlet {
private String _name;
private String _path;
private String _fileEncoding;
private boolean _append;
private boolean _overwrite;
private List<UriBasedPostprocessor> _postProcessor;
public String getName () {
return _name;
}
public void setName (String name) {
_name = name;
}
public String getPath() {
return _path;
}
public void setPath (String path) {
_path = path;
}
public String getFileEncoding () {
return _fileEncoding;
}
public void setFileEncoding(String fileEncoding) {
_fileEncoding = fileEncoding;
}
public boolean isAppend () {
return _append;
}
public void setAppend (boolean append) {
_append = append;
}
public boolean isOverwrite() {
return _overwrite;
}
public void setOverwrite(boolean overwrite) {
_overwrite = overwrite;
}
public List<UriBasedPostprocessor> getPostProcessor() {
return _postProcessor;
}
public void addPostProcessor(UriBasedPostprocessor postProcessor) {
_postProcessor.add (postProcessor);
}
}
}