/**
* Copyright (C) 2002-2012 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol 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 2 of the License, or
* (at your option) any later version.
*
* FreeCol 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.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol.common.model;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
public class TileTypeChange {
/**
* The original tile type.
*/
private TileType from;
/**
* The destination tile type.
*/
private TileType to;
/**
* The goods produced by the tile type change, e.g. lumber when
* clearing a forest.
*/
private AbstractGoods production;
/**
* Get the <code>From</code> value.
*
* @return a <code>TileType</code> value
*/
public final TileType getFrom() {
return from;
}
/**
* Set the <code>From</code> value.
*
* @param newFrom The new From value.
*/
public final void setFrom(final TileType newFrom) {
this.from = newFrom;
}
/**
* Get the <code>To</code> value.
*
* @return a <code>TileType</code> value
*/
public final TileType getTo() {
return to;
}
/**
* Set the <code>To</code> value.
*
* @param newTo The new To value.
*/
public final void setTo(final TileType newTo) {
this.to = newTo;
}
/**
* Get the <code>Production</code> value.
*
* @return an <code>AbstractGoods</code> value
*/
public final AbstractGoods getProduction() {
return production;
}
/**
* Set the <code>Production</code> value.
*
* @param newProduction The new Production value.
*/
public final void setProduction(final AbstractGoods newProduction) {
this.production = newProduction;
}
/**
* Makes an XML-representation of this object.
*
* @param out The output stream.
* @throws XMLStreamException if there are any problems writing to the
* stream.
*/
public void toXML(XMLStreamWriter out) throws XMLStreamException {
out.writeStartElement(getXMLElementTagName());
out.writeAttribute("from", from.getId());
out.writeAttribute("to", to.getId());
if (production != null) {
out.writeStartElement("production");
out.writeAttribute("goods-type", production.getType().getId());
out.writeAttribute("value", Integer.toString(production.getAmount()));
out.writeEndElement();
}
out.writeEndElement();
}
/**
* Reads this object from an XML stream.
*
* @param in The XML input stream.
* @param specification a <code>Specification</code> value
* @throws XMLStreamException if a problem was encountered
* during parsing.
*/
public void readFromXML(XMLStreamReader in, Specification specification)
throws XMLStreamException {
from = specification.getTileType(in.getAttributeValue(null, "from"));
to = specification.getTileType(in.getAttributeValue(null, "to"));
while (in.nextTag() != XMLStreamConstants.END_ELEMENT) {
String childName = in.getLocalName();
if ("production".equals(childName)) {
GoodsType type = specification.getGoodsType(in.getAttributeValue(null, "goods-type"));
int amount = Integer.parseInt(in.getAttributeValue(null, "value"));
production = new AbstractGoods(type, amount);
in.nextTag();
}
}
}
/**
* Returns the tag name of the root element representing this object.
*
* @return "change".
*/
public static String getXMLElementTagName() {
return "change";
}
}