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(); } }