package games.strategy.engine.data;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import games.strategy.engine.framework.GameObjectStreamFactory;
/**
* Please refer to the comments on GameObjectOutputStream.
*/
public class GameObjectInputStream extends ObjectInputStream {
private final GameObjectStreamFactory m_dataSource;
/**
* Creates new GameObjectReader.
*
* @param dataSource
* data source
* @param input
* input stream
*/
public GameObjectInputStream(final GameObjectStreamFactory dataSource, final InputStream input) throws IOException {
super(input);
m_dataSource = dataSource;
enableResolveObject(true);
}
public GameData getData() {
return m_dataSource.getData();
}
@Override
protected Object resolveObject(final Object obj) throws IOException {
// when loading units, we want to maintain == relationships for many
// of the game data objects.
// this is to prevent the situation where we have 2 Territory objects for the
// the same territory, or two object for the same player id or ...
// thus, in one vm you can add some units to a territory, and when you serialize the change
// and look at the Territory object in another vm, the units have not been added
if (obj instanceof GameData) {
return m_dataSource.getData();
} else if ((obj instanceof GameObjectStreamData)) {
return ((GameObjectStreamData) obj).getReference(getData());
} else if (obj instanceof Unit) {
return resolveUnit((Unit) obj);
} else {
return obj;
}
}
private Object resolveUnit(final Unit unit) {
m_dataSource.getData().acquireReadLock();
try {
final Unit local = m_dataSource.getData().getUnits().get(unit.getID());
if (local != null) {
return local;
}
getData().getUnits().put(unit);
return unit;
} finally {
m_dataSource.getData().releaseReadLock();
}
}
}