12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- /*
- Copyright (c) Xerox Corporation 1998-2002. All rights reserved.
-
- Use and copying of this software and preparation of derivative works based
- upon this software are permitted. Any distribution of this software or
- derivative works must comply with all applicable United States export control
- laws.
-
- This software is made available AS IS, and Xerox Corporation makes no warranty
- about the software, its performance or its conformity to any specification.
- */
-
- package telecom;
- /**
- * The Billing aspect deals with... billing.
- * How much money did each connection cost?
- * How much money did each call cost?
- * How much money is being debited to a customer?
- * This aspect can be used by other parts of the system. (not in this example)
- *
- * Billing can depend many things, such as timing, the type of the connection,
- * some special discounts the customer has, special features, etc. In here,
- * it depends only on timing and on the type of the connection.
- */
- public aspect Billing {
- // precedence required to get advice on endtiming in the right order
- declare precedence: Billing, Timing;
-
- public static final long LOCAL_RATE = 3;
- public static final long LONG_DISTANCE_RATE = 10;
-
- public Customer Connection.payer;
- public Customer getPayer(Connection conn) { return conn.payer; }
- /**
- * Caller pays for the call
- */
- after(Customer cust) returning (Connection conn):
- args(cust, ..) && call(Connection+.new(..)) {
- conn.payer = cust;
- }
-
- /**
- * Connections give the appropriate call rate
- */
- public abstract long Connection.callRate();
-
-
- public long LongDistance.callRate() { return LONG_DISTANCE_RATE; }
- public long Local.callRate() { return LOCAL_RATE; }
-
-
- /**
- * When timing stops, calculate and add the charge from the
- * connection time
- */
- after(Connection conn): Timing.endTiming(conn) {
- long time = Timing.aspectOf().getTimer(conn).getTime();
- long rate = conn.callRate();
- long cost = rate * time;
- getPayer(conn).addCharge(cost);
- }
-
-
- /**
- * Customers have a bill paying aspect with state
- */
- public long Customer.totalCharge = 0;
- public long getTotalCharge(Customer cust) { return cust.totalCharge; }
-
- public void Customer.addCharge(long charge){
- totalCharge += charge;
- }
- }
|