1 package net.sourceforge.rpgee.dice;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import net.sourceforge.rpgee.dice.exceptions.InvalidParameterException;
7 import net.sourceforge.rpgee.dice.exceptions.RandomValueException;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11
12 public abstract class AbstractGeneratedRandomValue implements GeneratedRandomValue {
13 private static Log log = LogFactory.getLog(AbstractGeneratedRandomValue.class);
14 private List<RandomValue> dieValues = new ArrayList<RandomValue>();
15 protected List<RandomValueHandler> handlers;
16 private List<Class> validRandomizerClasses = new ArrayList<Class>();
17 protected Object randomizerElement;
18 protected Object settings;
19
20 public AbstractGeneratedRandomValue() {
21 super();
22 }
23
24 public void setSettings(Object _settings) {
25 settings = _settings;
26 }
27
28 public RandomValue addRandomValue(Object dieConfig, RandomValueResultMapper mapper) throws InvalidParameterException {
29 RandomValue v = _getRandomValue(dieConfig, mapper);
30 addRandomValue(v);
31 return v;
32 }
33
34 public Object getRandomizerElement() {
35 return randomizerElement;
36 }
37
38 public void setRandomizerElement(Object o) throws InvalidParameterException {
39 for (Class<Object> c : validRandomizerClasses) {
40 if (c.isInterface()) {
41 if (c.isAssignableFrom(o.getClass())) {
42 this.randomizerElement = o;
43 log.debug("Setting randomizer to " + o);
44 return;
45 }
46 } else if (o.getClass().equals(c)) {
47 this.randomizerElement = o;
48 log.debug("Setting randomizer to " + o);
49 return;
50 }
51 }
52 throw new InvalidParameterException("Object " + o + " is not a valid randomizer");
53 }
54
55 public List<RandomValue> getRandomValues() throws RandomValueException {
56 log.debug("Returning dieValues : " + dieValues);
57 return dieValues;
58 }
59
60 public void addRandomValue(RandomValue v) {
61 log.debug("Adding RandomValue: " + v);
62 this.dieValues.add(v);
63 }
64
65 public void setRandomValueHandlers(List<RandomValueHandler> _handlers) {
66 log.debug("Setting DieHandlers : " + _handlers);
67 this.handlers = _handlers;
68 }
69
70 public void addRandomValueHandler(RandomValueHandler handler) {
71 log.debug("Adding RandomValueHandler : " + handler);
72 this.handlers.add(handler);
73 }
74
75 public List<RandomValue> getHandledValues() throws RandomValueException {
76 List<RandomValue> v = new ArrayList<RandomValue>(getRandomValues().size());
77 for (RandomValue i : getRandomValues()) {
78 RandomValue j = null;
79 for (RandomValueHandler h : this.handlers) {
80 j = h.transform(i, this);
81 }
82 v.add(j);
83 }
84 return v;
85 }
86
87
88 protected List<Class> getValidRandomizerClasses() {
89 return validRandomizerClasses;
90 }
91
92 /**
93 * Produce a RandomValue for this Roll using dieConfig and everything else we know
94 *
95 * @param dieConfig Generall an Integer of the number of sides, but may be null or a stack of cards or something. Useful as the
96 * synchronization lock for this method call
97 * @param mapper
98 * @return a RandomValue instance
99 * @throws InvalidParameterException
100 */
101
102 protected abstract RandomValue _getRandomValue(Object dieConfig, RandomValueResultMapper mapper)
103 throws InvalidParameterException;
104
105 }