package ring.magic; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import ring.nrapi.xml.XMLParameterException; import ring.persistence.RingConstants; @XmlAccessorType(XmlAccessType.PROPERTY) @XmlRootElement @XmlType( namespace = RingConstants.RING_NAMESPACE, propOrder= { "parameters" }) /** * This is a very generic class that stores metadata about spells. * Metadata is stored as Strings, but the parameters can be converted * to any of the primitive types. * * MagicSystem implementations have their own implementation of spell * metadata that they convert this object into in order to have some * semblance of type safety. * @author projectmoon * */ public class SpellMetadata { @XmlType(propOrder = { "value", "key" }) public static class MetadataTuple { private String param; @XmlAttribute public String getKey() { return param; } public void setKey(String param) { this.param = param; } private String value; @XmlAttribute public String getValue() { return value; } public void setValue(String value) { this.value = value; } } private Map<String, String> parameters = new HashMap<String, String>(); private String implementationClass; public void setParameters(List<MetadataTuple> metadata) { for (MetadataTuple tuple : metadata) { parameters.put(tuple.getKey(), tuple.getValue()); } } @XmlElement(name = "entry") public List<MetadataTuple> getParameters() { ArrayList<MetadataTuple> list = new ArrayList<MetadataTuple>(parameters.size()); for (String param : parameters.keySet()) { MetadataTuple tuple = new MetadataTuple(); tuple.setKey(param); tuple.setValue(parameters.get(param)); list.add(tuple); } return list; } public String getImplementation() { return implementationClass; } public void setImplementation(String implementation) { implementationClass = implementation; } public String getAsString(String param) { return parameters.get(param); } public int getAsInt(String param) throws XMLParameterException { try { return Integer.parseInt(parameters.get(param)); } catch (Exception e) { throw new XMLParameterException("Couldn't convert to int.", e); } } public boolean getAsBoolean(String param) throws XMLParameterException { try { return Boolean.parseBoolean(parameters.get(param)); } catch (Exception e) { throw new XMLParameterException("Couldn't convert to boolean.", e); } } public double getAsDouble(String param) throws XMLParameterException { try { return Double.parseDouble(parameters.get(param)); } catch (Exception e) { throw new XMLParameterException("Couldn't convert to double.", e); } } public void addParameter(String param, String value) { parameters.put(param, value); } public Object removeParameter(String param) { return parameters.remove(param); } }