package nl.ipo.cds.etl.operations;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import nl.ipo.cds.attributemapping.MapperContext;
import nl.ipo.cds.attributemapping.MappingDestination;
import nl.ipo.cds.attributemapping.MappingSource;
import nl.ipo.cds.attributemapping.executer.Executer;
import nl.ipo.cds.attributemapping.executer.MappingValidationException;
import nl.ipo.cds.attributemapping.executer.OperationExecutionException;
import nl.ipo.cds.attributemapping.operations.Operation;
import nl.ipo.cds.attributemapping.operations.discover.annotation.AnnotationOperationDiscoverer;
import nl.ipo.cds.etl.operations.OperationFactory.ConditionalInput;
import nl.ipo.cds.etl.operations.transform.ConditionalTransform;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith (SpringJUnit4ClassRunner.class)
@ContextConfiguration (classes = AbstractTestOperation.Config.class)
public abstract class AbstractTestOperation {
@Inject
protected OperationFactory factory;
@Configuration
@ComponentScan (basePackageClasses = nl.ipo.cds.etl.operations.Package.class)
public static class Config {
@Bean
public AnnotationOperationDiscoverer annotationOperationDiscoverer () {
return new AnnotationOperationDiscoverer ();
}
@Bean
public OperationFactory operationFactory () {
return new OperationFactory ();
}
}
public Operation stringConstant (final String value) {
return factory.stringConstant (value);
}
public Operation stringInput (final String attributeName) {
return factory.stringInput (attributeName);
}
public Operation conditional (final Operation elseBranch, final ConditionalInput ... inputs) {
return factory.conditional (elseBranch, inputs);
}
public ConditionalInput conditionalInput (final Operation input, final String attribute, final ConditionalTransform.Operation operation, final String ... values) {
return factory.conditionalInput (input, attribute, operation, values);
}
public ConditionalTransform.Condition condition (final String attribute, final ConditionalTransform.Operation operation, final String ... values) {
return factory.condition (attribute, operation, values);
}
public Operation split (final Operation input, final String boundary) {
return factory.split (input, boundary);
}
public Operation split (final Operation input, final String boundary, final boolean trimWhitespace) {
return factory.split (input, boundary, trimWhitespace);
}
public Operation split (final Operation input, final String boundary, final boolean trimWhitespace, final boolean ignoreEmpty) {
return factory.split (input, boundary, trimWhitespace, ignoreEmpty);
}
public Operation stringOut (final Operation input) {
return factory.stringOut (input);
}
public Operation stringArrayOut (final Operation input) {
return factory.stringArrayOut (input);
}
public Operation convertToString (final Operation input) {
return factory.convertToString (input);
}
public Operation makeInspireId (final Operation countryCode, final Operation bronhouderCode, final Operation uuid, final Operation datasetCode) {
return factory.makeInspireId (countryCode, bronhouderCode, uuid, datasetCode);
}
public Operation makeStringArray (final Operation ... operations) {
return factory.makeStringArray (operations);
}
public <T> T execute (final Operation op, final Class<T> resultClass) throws MappingValidationException, OperationExecutionException {
return execute (op, resultClass, (Map<String, Object>)null);
}
public <T> T execute (final Operation op, final Class<T> resultClass, final Object ... params) throws MappingValidationException, OperationExecutionException {
final Map<String, Object> values = new HashMap<String, Object> ();
for (int i = 0; i < params.length; i += 2) {
values.put ((String)params[i], params[i + 1]);
}
return execute (op, resultClass, values);
}
public <T> T execute (final Operation op, final Class<T> resultClass, final Map<String, Object> attributes) throws MappingValidationException, OperationExecutionException {
try (final Executer executer = new Executer (op, new MapperContext ())) {
final ValueContainer<T> container = new ValueContainer<T> ();
executer.execute (new MappingSource () {
@Override
public boolean hasAttribute (final String name) {
return attributes != null && attributes.containsKey (name);
}
@Override
public Object getAttributeValue (final String name) {
return attributes == null ? null : attributes.get (name);
}
}, new MappingDestination () {
@Override
public void setValue (final Object value) {
container.setValue (resultClass.cast (value));
}
});
return container.value;
}
}
private static class ValueContainer<T> {
public T value;
public void setValue (final T value) {
this.value = value;
}
}
}