/* Copyright (c) 2009 Andr� Arnold. 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: Andr� Arnold - initial API and implementation */ package org.eclipse.xtend.middleend.javaannotations; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.xtend.backend.common.BackendTypesystem; import org.eclipse.xtend.backend.common.ExecutionContext; import org.eclipse.xtend.backend.common.FunctionDefContext; import org.eclipse.xtend.backend.common.QualifiedName; import org.eclipse.xtend.middleend.LanguageContributor; import org.eclipse.xtend.middleend.MiddleEnd; import org.eclipse.xtend.middleend.MiddleEndFactory; public class JavaAnnotationBackendFacade { private MiddleEnd _middleend; private String _className; /** * This method calls a function defined in a class. * @param className * The full qualified class name of class containing the function * to be called * @param ts * The type system, i.e. metamodels * @param functionName * The function to be called * @param params * The parameters of the function to be called * @return The result of the function call */ public static Object invokeFunction(String className, BackendTypesystem ts, QualifiedName functionName, List<?> params) { return createFromClass(className, ts).invokeFunction(functionName, params); } /** * This method calls a function defined in a class applying advices in the given resource. * @param className * The full qualified class name of class containing the function * to be called * @param ts * The type system, i.e. metamodels * @param adviceResource * The resource containing the advices to be applied to the * function, i.e. either a fully qualified classname or a * resource name * @param functionName * The function to be called * @param params * The parameters of the function to be called * @return The result of the function call */ public static Object invokeFunction(String className, BackendTypesystem ts, String adviceResource, QualifiedName functionName, List<?> params) { JavaAnnotationBackendFacade facade = createFromClass(className, ts, adviceResource); MiddleEnd me = facade.getMiddleEnd(); return facade.invokeFunction(functionName, params); } /** * This method calls a function registered at the middleend * @param functionName * The function to be called * @param params * The parameters of the function to be called * @return The result of the function call */ public Object invokeFunction(QualifiedName functionName, List<?> params) { final FunctionDefContext fdc = _middleend.getFunctions(_className); final ExecutionContext ctx = _middleend.getExecutionContext(); //BackendFacade.createExecutionContext(fdc, _middleend.getTypesystem(), true); // TODO configure // isLogStacktrace Object result = fdc.invoke(ctx, functionName, params); return result; } public static JavaAnnotationBackendFacade createFromClass(String className, BackendTypesystem ts) { JavaAnnotationBackendFacade facade = new JavaAnnotationBackendFacade ( className, ts); return facade; } /** * Creates a {@link LanguageSpecificMiddleEnd} for the JavaAnnotations middleend from a class * @param className The fully qualified classname * @param ts The typesystem in use, i.e. the metamodels * @param adviceResource The resource containing the advice (either a fully qualified classname or filename) * @return The LanguageSpecificMiddleEnd */ public static JavaAnnotationBackendFacade createFromClass (String className, BackendTypesystem ts, String adviceResource) { return new JavaAnnotationBackendFacade(className, ts, adviceResource); } private Map<Class<?>, Object> getSpecificParameters() { final Map<Class<?>, Object> result = new HashMap<Class<?>, Object>(); return result; } public MiddleEnd getMiddleEnd() { return _middleend; } private JavaAnnotationBackendFacade(String className, BackendTypesystem ts) { _className = className; if (MiddleEndFactory.canCreateFromExtentions()) { _middleend = MiddleEndFactory.createFromExtensions(ts, getSpecificParameters()); } else { _middleend = MiddleEndFactory.create(ts, LanguageContributor.INSTANCE.getFreshMiddleEnds(getSpecificParameters())); } } private JavaAnnotationBackendFacade(String className, BackendTypesystem ts, String adviceClass) { _className = className; if (MiddleEndFactory.canCreateFromExtentions()) { _middleend = MiddleEndFactory.createFromExtensions(ts, getSpecificParameters()); } else { _middleend = MiddleEndFactory.create(ts, LanguageContributor.INSTANCE.getFreshMiddleEnds(getSpecificParameters())); } _middleend.applyAdvice(adviceClass); } }