/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */
 package org.eclipse.osbp.ui.api.functionlibrary;

import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.osbp.runtime.common.validation.IStatus;
import org.eclipse.osbp.ui.api.statemachine.IStateMachine;

/**
 * This service provides access to the function library.
 */
public interface IFunctionLibraryService {

	public Object invoke(String className, String methodName,
			Object fieldValue, Locale locale, Object... params);

	public Object invoke(String className, String methodName,
			Object fieldValue);

	public Object invoke(String className, String methodName,
			Locale locale);

	public Object invoke(String className, String methodName);

	public boolean guard(IStateMachine statemachine, String className, String methodName);

	public boolean operation(IStateMachine statemachine, String className,
			String methodName, Object... params);

	public Object function(IStateMachine statemachine, String className,
			String methodName, Object... params);

	public boolean execute(IEclipseContext context, String className,
			String methodName, Object... params);

	public boolean canExecute(IEclipseContext context, String className,
			String methodName, Object... params);
	
	public Set<IStatus> validation(String className, Object clazz, Map<String, Object> properties);
	
	public boolean initialization(String className, String methodName, Object clazz, Map<String, Object> properties);
}
