/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pieShare.pieTools.pieUtilities.service.pieExecutorService;
import java.util.Map;
import org.apache.commons.lang3.Validate;
import org.pieShare.pieTools.pieUtilities.service.beanService.BeanServiceError;
import org.pieShare.pieTools.pieUtilities.service.beanService.IBeanService;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.event.IPieEvent;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.task.IPieEventTask;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.IPieExecutorTaskFactory;
import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.exception.PieExecutorTaskFactoryException;
import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger;
/**
*
* @author Svetoslav
*/
public class PieExecutorTaskFactory implements IPieExecutorTaskFactory {
private Map<Class, Class> tasks;
private IBeanService beanService;
public void setBeanService(IBeanService beanService) {
this.beanService = beanService;
}
public void setTasks(Map<Class, Class> tasks) {
this.tasks = tasks;
}
@Override
public IPieEventTask getTask(IPieEvent event) throws PieExecutorTaskFactoryException {
Validate.notNull(event);
Class taskClass = this.tasks.get(event.getClass());
try {
Validate.notNull(taskClass);
} catch (NullPointerException ex) {
PieLogger.info(this.getClass(), "No task registered for given event: {}", event.getClass(), ex);
throw new PieExecutorTaskFactoryException("No task registered for given event!", ex);
}
IPieEventTask task = null;
try {
task = (IPieEventTask) this.beanService.getBean(taskClass);
} catch (BeanServiceError ex) {
throw new PieExecutorTaskFactoryException("Could not create task!", ex);
}
task.setEvent(event);
return task;
}
@Override
public <X extends P, P extends IPieEvent, T extends IPieEventTask<P>> void registerTask(Class<X> event, Class<T> task) {
Validate.notNull(event);
Validate.notNull(task);
this.tasks.put(event, task);
}
@Override
public <P extends IPieEvent> void removeTaskRegistration(Class<P> event) {
this.tasks.remove(event);
}
}