+package mircoders.producer;
+
+import java.util.*;
+import mir.entity.*;
+import mir.producer.*;
+
+public class CompositeProducerFactory implements ProducerFactory {
+ Map factories; // verb -> Vector ( ProducerFactory )
+
+ public CompositeProducerFactory() {
+ factories = new HashMap();
+ }
+
+ public CompositeProducerFactory(ProducerFactory[] aSubProducerFactories) {
+ this();
+
+ int i;
+
+ for (i=0; i<aSubProducerFactories.length; i++) {
+ addFactory(aSubProducerFactories[i]);
+ }
+ }
+
+ private List factoriesForVerb(String aVerb) {
+ List result;
+
+ result=(List) factories.get(aVerb);
+
+ if (result==null) {
+ result=new Vector();
+
+ factories.put(aVerb, result);
+ }
+
+ return result;
+ }
+
+ public void addFactory(ProducerFactory aFactory) {
+ Iterator i;
+
+ i=aFactory.verbs();
+
+ while (i.hasNext()) {
+ factoriesForVerb((String) i.next()).add(aFactory);
+ }
+ }
+
+ public mir.producer.Producer makeProducer(String aVerb) throws ProducerFailure {
+ CompositeProducer result = new CompositeProducer();
+
+ Iterator i=factoriesForVerb(aVerb).iterator();
+
+ while (i.hasNext())
+ result.addProducer(((ProducerFactory) i.next()).makeProducer(aVerb));
+
+ return result;
+ }
+
+ public Iterator verbs() {
+ return factories.keySet().iterator();
+ }
+}