package games.strategy.engine.data.changefactory;
import java.io.IOException;
import java.io.ObjectInputStream;
import games.strategy.engine.data.Change;
import games.strategy.engine.data.GameData;
import games.strategy.util.PropertyUtil;
public class ObjectPropertyChange extends Change {
private static final long serialVersionUID = 4218093376094170940L;
private final Object m_object;
private String m_property;
private final Object m_newValue;
private final Object m_oldValue;
public ObjectPropertyChange(final Object object, final String property, final Object newValue) {
m_object = object;
m_property = property.intern();
m_newValue = newValue;
// m_oldValue = PropertyUtil.get(property, object);
m_oldValue = PropertyUtil.getPropertyFieldObject(property, object);
}
public ObjectPropertyChange(final Object object, final String property, final Object newValue,
final Object oldValue) {
m_object = object;
// prevent multiple copies of the property names being held in the game
m_property = property.intern();
m_newValue = newValue;
m_oldValue = oldValue;
}
private void readObject(final ObjectInputStream stream) throws IOException, ClassNotFoundException {
stream.defaultReadObject();
m_property = m_property.intern();
}
@Override
public Change invert() {
return new ObjectPropertyChange(m_object, m_property, m_oldValue, m_newValue);
}
@Override
protected void perform(final GameData data) {
PropertyUtil.set(m_property, m_newValue, m_object);
}
@Override
public String toString() {
return "Property change, unit:" + m_object + " property:" + m_property + " newValue:" + m_newValue + " oldValue:"
+ m_oldValue;
}
}