package games.strategy.engine.data;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
public class GameObjectStreamData implements Externalizable {
private static final long serialVersionUID = 740501183336843321L;
enum GameType {
PLAYERID, UNITTYPE, TERRITORY, PRODUCTIONRULE, PRODUCTIONFRONTIER
}
public static boolean canSerialize(final Named obj) {
return obj instanceof PlayerID || obj instanceof UnitType || obj instanceof Territory
|| obj instanceof ProductionRule || obj instanceof IAttachment || obj instanceof ProductionFrontier;
}
private String m_name;
private GameType m_type;
public GameObjectStreamData() {}
/**
* Creates a new instance of GameObjectStreamData.
*
* @param named
* named entity
*/
public GameObjectStreamData(final Named named) {
m_name = named.getName();
if (named instanceof PlayerID) {
m_type = GameType.PLAYERID;
} else if (named instanceof Territory) {
m_type = GameType.TERRITORY;
} else if (named instanceof UnitType) {
m_type = GameType.UNITTYPE;
} else if (named instanceof ProductionRule) {
m_type = GameType.PRODUCTIONRULE;
} else if (named instanceof ProductionFrontier) {
m_type = GameType.PRODUCTIONFRONTIER;
} else {
throw new IllegalArgumentException("Wrong type:" + named);
}
}
public Named getReference(final GameData data) {
if (data == null) {
throw new IllegalArgumentException("Data cant be null");
}
data.acquireReadLock();
try {
switch (m_type) {
case PLAYERID:
return data.getPlayerList().getPlayerID(m_name);
case TERRITORY:
return data.getMap().getTerritory(m_name);
case UNITTYPE:
return data.getUnitTypeList().getUnitType(m_name);
case PRODUCTIONRULE:
return data.getProductionRuleList().getProductionRule(m_name);
case PRODUCTIONFRONTIER:
return data.getProductionFrontierList().getProductionFrontier(m_name);
}
throw new IllegalStateException("Unknown type" + this);
} finally {
data.releaseReadLock();
}
}
@Override
public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
m_name = (String) in.readObject();
m_type = GameType.values()[in.readByte()];
}
@Override
public void writeExternal(final ObjectOutput out) throws IOException {
out.writeObject(m_name);
out.writeByte((byte) m_type.ordinal());
}
}