package com.softwaremill.common.paypal.process.processors; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * @Author: lukasz.zuchowski at gmail dot com * Date: 05.04.12 * Time: 14:01 */ public class PayPalProcessorsFactory { private Set<Class<? extends PayPalProcessor>> processors = new HashSet<Class<? extends PayPalProcessor>>(); public PayPalProcessorsFactory(Class<? extends VerifiedPayPalProcessor> processor) { this.processors.add(InvalidPayPalProcessor.class); this.processors.add(UnknownPayPalProcessor.class); this.processors.add(processor); } public PayPalProcessorsFactory(Set<Class<? extends PayPalProcessor>> processors) { this.processors.addAll(processors); } public List<PayPalProcessor> buildProcessors() { List<PayPalProcessor> listOfProcessors = new ArrayList<PayPalProcessor>(); for (Class<? extends PayPalProcessor> processor : processors) { try { listOfProcessors.add(createNewInstance(processor)); } catch (InstantiationException e) { //if user needs to have args-constructor should extend this Factory with his own implementation throw new RuntimeException("Please check if processor class:" + processor.getCanonicalName() + "\n has non args constructor.", e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } return listOfProcessors; } protected <T extends PayPalProcessor> T createNewInstance(Class<T> processorClass) throws IllegalAccessException, InstantiationException { return processorClass.newInstance(); } }