/**
* Copyright (c) 2014 - 2017 Frank Appel
* 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:
* Frank Appel - initial API and implementation
*/
package com.codeaffine.workflow.test.util;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
import com.codeaffine.workflow.NodeLoader;
import com.codeaffine.workflow.WorkflowContext;
import com.codeaffine.workflow.definition.Activity;
import com.codeaffine.workflow.definition.Decision;
import com.codeaffine.workflow.definition.WorkflowDefinitionProvider;
import com.codeaffine.workflow.internal.NodeLoaderImpl;
public class NodeLoaderHelper {
private final NodeLoader nodeLoader;
public static <T> T load( WorkflowContext context, Class<T> type ) {
return new NodeLoaderImpl().load( type, context );
}
public static <T> T load( WorkflowContext context, LoadAdapter<T> loadAdapter ) {
try {
NodeLoaderImpl.lookupContext.set( context );
return loadAdapter.load();
} finally {
NodeLoaderImpl.lookupContext.set( null );
}
}
public NodeLoaderHelper() {
nodeLoader = mock( NodeLoader.class );
}
public NodeLoader getNodeLoader() {
return nodeLoader;
}
public void configureNodeLoader( WorkflowDefinitionProvider provider, DecisionConfiguration ... configurations ) {
Map<String, DecisionConfiguration> decisionConfiguration = mapToNodeId( configurations );
provider.define( new NodeSpyDispatcher( this, decisionConfiguration ) );
}
private static Map<String, DecisionConfiguration> mapToNodeId( DecisionConfiguration... configurations ) {
Map<String, DecisionConfiguration> result = new HashMap<String, DecisionConfiguration>();
for( DecisionConfiguration decisionConfiguration : configurations ) {
result.put( decisionConfiguration.nodeId, decisionConfiguration );
}
return result;
}
public void spyActivity( Class<? extends Activity> activity ) {
spyNode( nodeLoader, activity );
}
public void spyDecision(
String nodeId, Class<? extends Decision> decisionType, Map<String, DecisionConfiguration> configurationMap )
{
Decision decisionInstance = spyNode( nodeLoader, decisionType );
DecisionConfiguration decisionConfiguration = configurationMap.get( nodeId );
when( decisionInstance.decide() ).thenReturn( decisionConfiguration.decision, decisionConfiguration.decisions );
}
private static <T> T spyNode( NodeLoader nodeLoader, Class<T> type ) {
T result = mock( type );
when( nodeLoader.load( eq( type ), any( WorkflowContext.class ) ) ).thenReturn( result );
return result;
}
}