/** * 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 java.util.ArrayList; import java.util.List; import java.util.Locale; import net.sf.freecol.common.model.Unit.Role; import org.freecolandroid.xml.stream.XMLStreamException; import org.freecolandroid.xml.stream.XMLStreamReader; import org.freecolandroid.xml.stream.XMLStreamWriter; /** * Contains the information necessary to create a new unit. */ public class AbstractUnit extends FreeColObject { /** * The role of this AbstractUnit. */ private Role role = Role.DEFAULT; /** * The number of units. */ private int number = 1; public AbstractUnit() { // empty constructor } public AbstractUnit(String id, Role someRole, int someNumber) { setId(id); this.role = someRole; this.number = someNumber; } public AbstractUnit(UnitType unitType, Role someRole, int someNumber) { this(unitType.getId(), someRole, someNumber); } public AbstractUnit clone() { return new AbstractUnit(getId(), getRole(), getNumber()); } /** * Creates a new <code>AbstractUnit</code> instance. * * @param in a <code>XMLStreamReader</code> value * @exception XMLStreamException if an error occurs */ public AbstractUnit(XMLStreamReader in) throws XMLStreamException { readFromXMLImpl(in); } /** * Get the <code>UnitType</code> value. * * @return an <code>UnitType</code> value */ public final UnitType getUnitType(Specification specification) { return specification.getUnitType(getId()); } /** * Get the <code>Role</code> value. * * @return a <code>Role</code> value */ public final Role getRole() { return role; } /** * Set the <code>Role</code> value. * * @param newRole The new Role value. */ public final void setRole(final Role newRole) { this.role = newRole; } /** * Get the <code>Number</code> value. * * @return an <code>int</code> value */ public final int getNumber() { return number; } /** * Set the <code>Number</code> value. * * @param newNumber The new Number value. */ public final void setNumber(final int newNumber) { this.number = newNumber; } /** * Describe <code>getLabel</code> method here. * * @param spec A <code>Specification<code> to query. * @return a <code>StringTemplate</code> value */ public StringTemplate getLabel(Specification spec) { return StringTemplate.template("abstractUnit") .addAmount("%number%", getNumber()) .add("%unit%", getUnitType(spec).getNameKey()); } /** * Returns the Equipment necessary to create a Unit with the same * type and role as this AbstractUnit. * * @return an <code>EquipmentType[]</code> value */ public EquipmentType[] getEquipment(Specification specification) { List<EquipmentType> equipment = new ArrayList<EquipmentType>(); switch(role) { case PIONEER: EquipmentType tools = specification.getEquipmentType("model.equipment.tools"); for (int count = 0; count < tools.getMaximumCount(); count++) { equipment.add(tools); } break; case MISSIONARY: equipment.add(specification.getEquipmentType("model.equipment.missionary")); break; case SOLDIER: equipment.add(specification.getEquipmentType("model.equipment.muskets")); break; case SCOUT: equipment.add(specification.getEquipmentType("model.equipment.horses")); break; case DRAGOON: equipment.add(specification.getEquipmentType("model.equipment.muskets")); equipment.add(specification.getEquipmentType("model.equipment.horses")); break; case DEFAULT: default: } return equipment.toArray(new EquipmentType[equipment.size()]); } /** * This method writes an XML-representation of this object to * the given stream. * * @param out The target stream. * @throws XMLStreamException if there are any problems writing * to the stream. */ protected void toXMLImpl(XMLStreamWriter out) throws XMLStreamException { super.toXML(out, getXMLElementTagName()); } /** * Write the attributes of this object to a stream. * * @param out The target stream. * @throws XMLStreamException if there are any problems writing * to the stream. */ @Override protected void writeAttributes(XMLStreamWriter out) throws XMLStreamException { super.writeAttributes(out); out.writeAttribute("role", role.toString().toLowerCase(Locale.US)); out.writeAttribute("number", String.valueOf(number)); } /** * Initialize this object from an XML-representation of this object. * * @param in The input stream with the XML. * @throws XMLStreamException if a problem was encountered * during parsing. */ @Override protected final void readAttributes(XMLStreamReader in) throws XMLStreamException { super.readAttributes(in); role = Enum.valueOf(Role.class, getAttribute(in, "role", "default").toUpperCase(Locale.US)); number = getAttribute(in, "number", 1); } @Override public String toString() { return Integer.toString(number) + " " + getId() + " (" + role.toString() + ")"; } /** * Returns the tag name of the root element representing this object. * * @return "abstractUnit". */ public static String getXMLElementTagName() { return "abstractUnit"; } }