/* * JABM - Java Agent-Based Modeling Toolkit * Copyright (C) 2013 Steve Phelps * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ package net.sourceforge.jabm.util; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import org.springframework.beans.BeansException; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.annotation.Required; @SuppressWarnings("rawtypes") public class CombiObjectFactory implements ObjectFactory { protected ArrayList<Integer> numberOfObjectsPerFactory; protected ArrayList<ObjectFactory> factories; protected int currentFactory = 0; protected int count = 0; protected int overFlowFactory = -1; protected boolean overflowed = false; public CombiObjectFactory(ArrayList<ObjectFactory> factories, ArrayList<Integer> numberOfObjectsPerFactory) { super(); this.numberOfObjectsPerFactory = numberOfObjectsPerFactory; this.factories = factories; } public CombiObjectFactory() { } @Override public Object getObject() throws BeansException { while (count >= numberOfObjectsPerFactory.get(currentFactory) && !overflowed) { nextFactory(); } Object result = factories.get(currentFactory).getObject(); count++; return result; } public void nextFactory() { currentFactory++; if (currentFactory > factories.size()) { currentFactory = overFlowFactory; } count = 0; } public int getOverFlowFactory() { return overFlowFactory; } public void setOverFlowFactory(int overFlowFactory) { this.overFlowFactory = overFlowFactory; } public ArrayList<Integer> getNumberOfObjectsPerFactory() { return numberOfObjectsPerFactory; } public void setNumberOfObjectsPerFactory( ArrayList<Integer> numberOfObjectsPerFactory) { this.numberOfObjectsPerFactory = numberOfObjectsPerFactory; } public ArrayList<ObjectFactory> getFactories() { return factories; } public void setFactories(ArrayList<ObjectFactory> factories) { this.factories = factories; } @Required public void setFactoryMap(Map<ObjectFactory, Integer> factoryMap) { int n = factoryMap.keySet().size(); factories = new ArrayList<ObjectFactory>(n); numberOfObjectsPerFactory = new ArrayList<Integer>(n); for(ObjectFactory factory : factoryMap.keySet()) { factories.add(factory); numberOfObjectsPerFactory.add(factoryMap.get(factory)); } } public Map<ObjectFactory, Integer> getFactoryMap() { LinkedHashMap<ObjectFactory, Integer> result = new LinkedHashMap<ObjectFactory, Integer>(); for(int i=0; i<factories.size(); i++) { result.put(factories.get(i), numberOfObjectsPerFactory.get(i)); } return result; } }