/*******************************************************************************
* Copyright 2011
* 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.engine.impl;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.dkpro.lab.engine.TaskContextFactory;
import org.dkpro.lab.engine.TaskExecutionEngine;
import org.dkpro.lab.engine.TaskExecutionService;
import org.dkpro.lab.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.core.io.Resource;
public class DefaultTaskExecutionService
implements TaskExecutionService
{
@Autowired
private AutowireCapableBeanFactory beanFactory;
private TaskContextFactory contextFactory;
private final Map<Class<? extends Task>, Class<? extends TaskExecutionEngine>> map;
{
map = new HashMap<Class<? extends Task>, Class<? extends TaskExecutionEngine>>();
}
@Override
public String run(Task aConfiguration)
throws Exception
{
TaskExecutionEngine engine = createEngine(aConfiguration);
return engine.run(aConfiguration);
}
@Override
public TaskExecutionEngine createEngine(Task aConfiguration)
{
try {
for (Class<? extends Task> taskClass : map.keySet()) {
if (taskClass.isAssignableFrom(aConfiguration.getClass())) {
TaskExecutionEngine engine = map.get(taskClass).newInstance();
engine.setContextFactory(contextFactory);
beanFactory.autowireBean(engine);
return engine;
}
}
}
catch (InstantiationException e) {
throw new RuntimeException(e);
}
catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
throw new IllegalArgumentException("No engine registered for type ["
+ aConfiguration.getClass().getName() + "]");
}
@SuppressWarnings("unchecked")
public void setMappingDescriptors(Resource[] aResources)
throws ClassNotFoundException, IOException
{
final ClassLoader cl = getClass().getClassLoader();
for (final Resource res : aResources) {
final Properties props = new Properties();
props.load(res.getInputStream());
for (final Object key : props.keySet()) {
final String taskClass = (String) key;
final String engineClass = props.getProperty(taskClass);
map.put((Class<? extends Task>) Class.forName(taskClass, true, cl),
(Class<? extends TaskExecutionEngine>) Class.forName(engineClass, true, cl));
}
}
}
public void registerEngine(Class<? extends Task> aTaskClazz,
Class<? extends TaskExecutionEngine> aEngineClazz)
{
map.put(aTaskClazz, aEngineClazz);
}
public void unregisterEngine(Class<? extends Task> aTaskClazz)
{
map.remove(aTaskClazz);
}
public Class<? extends TaskExecutionEngine> getEngine(Class<? extends Task> aTaskClazz)
{
return map.get(aTaskClazz);
}
public void setContextFactory(TaskContextFactory aContextFactory)
{
contextFactory = aContextFactory;
}
@Override
public TaskContextFactory getContextFactory()
{
return contextFactory;
}
}