/*******************************************************************************
* Copyright 2012
* Ubiquitous Knowledge Processing (UKP) Lab
* Technische Universität Darmstadt
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.dkpro.lab.task;
import java.io.File;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.dkpro.lab.Lab;
import org.dkpro.lab.engine.TaskContext;
import org.dkpro.lab.storage.impl.PropertiesAdapter;
import org.dkpro.lab.task.ConfigurationAware;
import org.dkpro.lab.task.Dimension;
import org.dkpro.lab.task.Discriminator;
import org.dkpro.lab.task.ParameterSpace;
import org.dkpro.lab.task.Task;
import org.dkpro.lab.task.impl.DefaultBatchTask;
import org.dkpro.lab.task.impl.ExecutableTaskBase;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
public class BatchTaskTest
{
@Before
public void setup()
{
File path = new File("target/repository/" + getClass().getSimpleName() + "/"
+ name.getMethodName());
System.setProperty("DKPRO_HOME", path.getAbsolutePath());
FileUtils.deleteQuietly(path);
}
@Test(expected = RuntimeException.class)
public void importTest()
throws Exception
{
Task producer = new ExecutableTaskBase()
{
@Override
public void execute(TaskContext aContext)
throws Exception
{
System.out.println("Running producer");
Properties data = new Properties();
data.setProperty("key", "value");
aContext.storeBinary("DATA", new PropertiesAdapter(data));
}
};
Task consumer = new ExecutableTaskBase()
{
@Override
public void execute(TaskContext aContext)
throws Exception
{
System.out.println("Running consumer");
Properties data = new Properties();
aContext.retrieveBinary("DATA", new PropertiesAdapter(data));
Assert.assertEquals(data.getProperty("key"), "value");
}
};
consumer.addImport(producer, "DATA1", "DATA");
DefaultBatchTask batch = new DefaultBatchTask();
batch.addTask(producer);
batch.addTask(consumer);
Lab.getInstance().run(batch);
}
@Test
public void testNested()
throws Exception
{
Dimension innerDim = Dimension.create("inner", "1", "2", "3");
ParameterSpace innerPSpace = new ParameterSpace(innerDim);
DefaultBatchTask innerTask = new DefaultBatchTask()
{
@Override
public void setConfiguration(Map<String, Object> aConfig)
{
super.setConfiguration(aConfig);
System.out.printf("A %10d %s %s%n", this.hashCode(), getType(), aConfig);
}
};
innerTask.setParameterSpace(innerPSpace);
innerTask.addTask(new ConfigDumperTask1());
Dimension outerDim = Dimension.create("outer", "1", "2", "3");
ParameterSpace outerPSpace = new ParameterSpace(outerDim);
DefaultBatchTask outerTask = new DefaultBatchTask()
{
@Override
public void setConfiguration(Map<String, Object> aConfig)
{
super.setConfiguration(aConfig);
System.out.printf("B %10d %s %s%n", this.hashCode(), getType(), aConfig);
}
};
outerTask.setParameterSpace(outerPSpace);
outerTask.addTask(innerTask);
outerTask.addTask(new ConfigDumperTask2());
Lab.getInstance().run(outerTask);
}
@Test
public void testNested2()
throws Exception
{
DefaultBatchTask innerTask = new DefaultBatchTask()
{
@Discriminator
private Integer outer;
@Override
public ParameterSpace getParameterSpace()
{
// Dynamically configure parameter space of nested batch task
Integer[] values = new Integer[outer];
for (int i = 0; i < outer; i++) {
values[i] = i;
}
Dimension<Integer> innerDim = Dimension.create("inner", values);
ParameterSpace innerPSpace = new ParameterSpace(innerDim);
return innerPSpace;
}
@Override
public void setConfiguration(Map<String, Object> aConfig)
{
super.setConfiguration(aConfig);
System.out.printf("A %10d %s %s%n", this.hashCode(), getType(), aConfig);
}
};
innerTask.addTask(new ConfigDumperTask1());
Dimension<Integer> outerDim = Dimension.create("outer", 1, 2, 3);
ParameterSpace outerPSpace = new ParameterSpace(outerDim);
DefaultBatchTask outerTask = new DefaultBatchTask()
{
@Override
public void setConfiguration(Map<String, Object> aConfig)
{
super.setConfiguration(aConfig);
System.out.printf("B %10d %s %s%n", this.hashCode(), getType(), aConfig);
}
};
outerTask.setParameterSpace(outerPSpace);
outerTask.addTask(innerTask);
outerTask.addTask(new ConfigDumperTask2());
Lab.getInstance().run(outerTask);
}
@Test(expected = RuntimeException.class)
public void testUnresolvable()
throws Exception
{
Dimension<String> dim = Dimension.create("param", "1", "2", "3");
ParameterSpace pSpace = new ParameterSpace(dim);
Task task1 = new ExecutableTaskBase()
{
@Discriminator
private String param;
@Override
public void execute(TaskContext aContext)
throws Exception
{
// Nothing to do
}
};
Task task2 = new ExecutableTaskBase()
{
@Discriminator
private String param;
@Override
public void execute(TaskContext aContext)
throws Exception
{
// Nothing to do
}
};
task2.addImport(task1, "DUMMY");
task1.addImport(task2, "DUMMY");
DefaultBatchTask batchTask = new DefaultBatchTask();
batchTask.setParameterSpace(pSpace);
batchTask.addTask(task1);
batchTask.addTask(task2);
Lab.getInstance().run(batchTask);
}
public static class ConfigDumperTask1
extends ExecutableTaskBase
implements ConfigurationAware
{
@Discriminator
private String inner;
private Map<String, Object> config;
@Override
public void execute(TaskContext aContext)
throws Exception
{
System.out.printf("C %10d %s %s%n", this.hashCode(), getType(), config);
}
@Override
public void setConfiguration(Map<String, Object> aConfig)
{
config = aConfig;
}
}
public static class ConfigDumperTask2
extends ExecutableTaskBase
implements ConfigurationAware
{
@Discriminator
private String outer;
private Map<String, Object> config;
@Override
public void execute(TaskContext aContext)
throws Exception
{
System.out.printf("D %10d %s %s%n", this.hashCode(), getType(), config);
}
@Override
public void setConfiguration(Map<String, Object> aConfig)
{
config = aConfig;
}
}
@Rule
public TestName name = new TestName();
@Before
public void printSeparator()
{
System.out.println("\n=== " + name.getMethodName() + " =====================");
}
}