public History getSnapshot(int time) { // Create a snapshot of the receiver at the supplied time... History snapshot = new History(); snapshot.startOfTime = time; snapshot.endOfTime = time; snapshot.behaviourChangedEvents = new Vector<BehaviourChanged>(); snapshot.consumeEvents = new Vector<Consume>(); snapshot.newActorEvents = new Vector<NewActor>(); snapshot.sendEvents = new Vector<Send>(); snapshot.stateEvents = new Hashtable<Integer, Hashtable<Key, Stack<State>>>(); for (NewActor newActor : newActorEvents) { if (newActor.getTime() <= time) { BehaviourChanged b = null; for (BehaviourChanged b1 : behaviourChangedEvents) { if (b1.getId() == newActor.getId() && b1.getTime() <= time && b1.getTime() > newActor.getTime() && (b == null || b1.getTime() > b.getTime())) b = b1; } if (b == null) snapshot.newActorEvents.add( new NewActor(newActor.getId(), newActor.getBehaviour(), time)); else snapshot.newActorEvents.add(new NewActor(newActor.getId(), b.getNewBehaviour(), time)); } } for (Consume consume : consumeEvents) { if (consume.getTime() == time) snapshot.consumeEvents.add(consume); } for (Send send : sendEvents) { if (send.getTime() == time) snapshot.sendEvents.add(send); } for (int id : stateEvents.keySet()) { for (Key field : stateEvents.get(id).keySet()) { Stack<State> stack = stateEvents.get(id).get(field); if (!stack.isEmpty()) { State state = stack.peek(); if (state.getTime() <= time) snapshot.state(id, field.getString(), state.getValue(), time); } } } return snapshot; }