package postingrules;
/*Generated by MPS */
import mf.MfDate;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.Collections;
public class AccountingEvent {
private EventType myType;
private MfDate myWhenOccurred;
private MfDate myWhenNoticed;
private Subject mySubject;
protected List mySecondaryEvents = new ArrayList();
protected Collection<Entry> myResultingEntries = new HashSet<Entry>();
protected boolean myProcessed = false;
private AccountingEvent myReplacementEvent;
private AccountingEvent myAdjustedEvent;
public AccountingEvent(EventType type, MfDate whenOccurred, MfDate whenNoticed, Subject subject) {
this.myType = type;
this.myWhenOccurred = whenOccurred;
this.myWhenNoticed = whenNoticed;
this.mySubject = subject;
}
public AccountingEvent(EventType type, MfDate whenOccurred, MfDate whenNoticed, Subject subject, AccountingEvent adjustedEvent) {
this(type, whenOccurred, whenNoticed, subject);
this.myAdjustedEvent = adjustedEvent;
adjustedEvent.setReplacementEvent(this);
}
/*package*/ void addResultingEntry(Entry arg) {
myResultingEntries.add(arg);
}
/*package*/ void friendAddSecondaryEvent(AccountingEvent arg) {
mySecondaryEvents.add(arg);
}
public Set<Entry> getAllResultingEntries() {
Set<Entry> result = new HashSet<Entry>();
result.addAll(myResultingEntries);
for (Object secondaryEvent : mySecondaryEvents) {
AccountingEvent each = (AccountingEvent) secondaryEvent;
result.addAll(each.getAllResultingEntries());
}
return result;
}
/*package*/ EventType getEventType() {
return myType;
}
/*package*/ AccountingEvent getReplacementEvent() {
return myReplacementEvent;
}
public Collection<Entry> getResultingEntries() {
return Collections.unmodifiableCollection(myResultingEntries);
}
/*package*/ List getSecondaryEvents() {
return Collections.unmodifiableList(mySecondaryEvents);
}
public Subject getSubject() {
return mySubject;
}
public MfDate getWhenNoticed() {
return myWhenNoticed;
}
public MfDate getWhenOccurred() {
return myWhenOccurred;
}
public boolean hasBeenAdjusted() {
return (myReplacementEvent != null);
}
public boolean isProcessed() {
return myProcessed;
}
public void markProcessed() {
myProcessed = true;
}
public void process() {
assert !(myProcessed);
if (myAdjustedEvent != null) {
myAdjustedEvent.reverse();
}
mySubject.process(this);
markProcessed();
}
public void reverse() {
assert isProcessed();
Entry[] entries = (Entry[]) getResultingEntries().toArray(new Entry[0]);
for (Entry entry : entries) {
mySubject.reverseEntry(entry);
}
reverseSecondaryEvents();
}
private void reverseSecondaryEvents() {
for (Object o : getSecondaryEvents()) {
AccountingEvent each = (AccountingEvent) o;
each.reverse();
}
}
/*package*/ void setIsProcessed(boolean newIsProcessed) {
myProcessed = newIsProcessed;
}
public void setReplacementEvent(AccountingEvent newReplacementEvent) {
myReplacementEvent = newReplacementEvent;
}
public ServiceAgreement getAgreement() {
return ((Customer) getSubject()).getServiceAgreement();
}
}