SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Downloaden Sie, um offline zu lesen
1 Modeling Aspects with AP&P Components
In this section, we outline the elements of APPC construct and show how APPCs can be used
to model aspects. We will start with a small set of APPC concepts, illustrate the use of these
concepts in modeling aspects and then inttroduce the rest of the concepts by presenting more
sophisticated examples. In order to facilitate the comparison, a good part of the examples in
this section are taken, eventually slightly modi ed, from the tutorial on AspectJ ?], which is
the rst extension of Java designed and implemented to bridge the gap between object and
aspectual decomposition in Java.
1.1 AP&P Components as a Language Construct
An AP&P component is a module construct for object-oriented languages on top of classes that
serves to capture behavior that a ects several classes. However, the captured behavior is written
in terms of an ideal class graph and not to a concrete application. An AP&P component consists
of the following elements:
     A set of participants. A participant is a formal class (or a class in an ideal class graph,
     ICG), which stands at the same level as a formal argument in a procedure declaration I
     needs to be later bound to classes in a concrete class graph, CCG.
     Instead of type constraints to be satis ed by the CCG classes, a participant de nition
     merely lists a set of operation signatures, preceded by the keyword expected.
     Expected operations are used in the appc-speci c de nition of the participant. This de -
     nition includes:
      (a) reimplementationsquot; of the expected operations, denoted by the keyword replace.
      (b) de nitions of new operations { all operations in the de nition of a participant that
          are declared public.
      (c) new eld de nitions that would extend the structure of the CCG classes to be bound
          to this participant.
      (e) In order to implements replacements or new functionality, a participant de nition
          might include localquot; de nitions (operations as well as elds). These are denoted by
          the same keywords as in Java: private, protected.
    The key idea behind APPCs as a construct for reconciling object-based and aspect-based
decomposition of the systems is to add a new dimension in the organization of object-oriented
software, as illustrated in Fig. 1. The software is rst decomposed based on aspects which are
symbolically represented by rectangle areas with di erent grey scales in Fig. 1. Each aspect
de nition has its own object-based decomposition. Di erent data types involved in an aspect
de nition are represented by di erent shapes in Fig. 1. Aspect de nitions are based on the as-
sumption that other aspects or/and the concrete application will supply part of the functionality
of the involved data which is then modi ed/extended by the aspect. The expected interface of
aspect de nitions is represented by the transparent (colorless) shapes on the left hand side of
all but one colored area in Fig. 1.
    The left most colored area in Fig. 1 represents a concrete application. It is self-contained in
that it does not expect anything to be supplied from the outside and provides the basic imple-
mentation of the application functionality. It is generally much richer in data type de nitions
than the aspect de nitions. The modi cations and/or extensions of the expected interface by
aspect de nitions are illustrated by the shape towers on the right hand side of each grey scale

                                                1
area: there are generally more shapes of each kind on the right hand side than on the left hand
side. Colorless shapes on the left hand side are replaced by colored shapes on the right hand
side. In addition, some new shapes are added to each tower.




                         Figure 1: Aspect Decomposition with APPCs
    For illutrating the concepts so far, we start with a very simple example. The aspect con-
sidered here is a trivial one: instrumenting access operations on data types. A description of
the aspect in informal English would be: For any data type in an application, say DataToAc-
cess, any read access operation, AnyType readOp() de ned for DataToAccess, and any invocation
of this operation on an instance of DataToAccess, dataInstance, display Read access on <string
representation of dataInstance>. Sure enough, the description is reusable in di erent contexts,
since it does not make any commitment about its application context. It is obvious that an
aspect de nition language that allows to delay binding aspects to their deployment contexts is
desirable. This is in fact the key point about using APPCs to model aspects.
    The code in the ShowReadAccess appc below is actually as free of details about concrete
deployment contexts as the informal English description above is. It simply states that whatever
classes in an application will be assigned to implement (play) the single participant in the aspect
de nition, DataToAccess, and whatever methods in these classes will be assigned to implement
the interface expected from DataToAccess, readOp in this case, the latter methods will be replaced
by implementations that rst print out a message and then execute the original methods (see
the replace statement below).
     ShowAccesses package
          appc ShowReadAccesses f
            participant DataToAccess f
              expected Object readOp ( )
              replace Object readOp () f
                System . out . println ( quot;Read access on quot; + this . toString ())
                return expected . read op ( )
              g
          g
      g



                                                2
...

    The meaning of the pseudo-variable this is the same as in a Java program. In the de nition
above, it denotes the application instance being instrumented. If there are no ambiguities, there
is no need to explicitly refer to the pseudo-variable this. Any invocation without an explicit
receiver is considered to be a self-invocation. A method for this invocation is rst looked-up in
the aspect-speci c de nition of the participant. If no method is found there, the class in the
application assigned to play the participant role is searched for.
    Now, given a concrete application the programmer needs to deploy the aspect with the ap-
plication by assigning classes in the application to aspect participants and by specifying how
the interface expected by the aspect is implemented in terms of the application. Specifying a
mapping for the expected interface of an aspect occurs apart of the de nition of an aspect by
means of so-called connector constructs. In abstract terms, the deployment process is schemati-
cally presented in Fig. 2. The connector is symbolically represented by the two colored rectangle
between the application and the aspect. It transforms a part of the application de nition into
the expected interface of the appc. The result of the deployment is equivalent to the set of shape
towers on the right hand side of Fig. 2. Partial de nitions from the application and the aspect
are mixed together into the nal de nition of each object.




                        Figure 2: Deploying Aspects with Applications
    For illustration consider the trivial example of an application that models graphical shapes
(the Shapes package below), and a simple deployment scenario in which we are interested in
instrumenting only read accesses on point objects.
  Shapes package
  class Point f
    private int x = 0
    private int y = 0
    void set ( int x , int y )        x=x       y=y
                                  f                     g


                                                3
void setX ( int x ) f       x=x   g
      void setY ( int y ) f       y=y   g
      int getX ()f return         xg
      int getY ()f return         yg
  g

  class Line f . . . g
  class Rectangle f . . .     g
  ...
    The deployment of ShowReadAccesses with the class Point is speci ed by the ShowReadAc-
cessConn1 connector below.
   Deployment package
  import ShowAccesses .
  import Shapes .
  connector ShowReadAccessesConn1               f
        Point is DataToAccess with          f readOp   = get   g
  g

  ...

    The connector in the example above is simple. It contains only one implement statement.
In general, a connector consists of several scopes, where each scope contains several implements
statements. A simpli ed grammar of the struture of connector is given in Fig. ??. The class-
to-participant mapping in an implements statement is in general many to one, as it will be
illustrated in the following. An implement statement has one or more mapping clauses for the
expected interfaces associated with it. In the example above the mappping is done based on
pattern matching on operation names, with the pattern being speci ed by the regular expression
get*. In general, this mapping can also take a more programmaticquot; form, i.e., an implemen-
tation of the expected signature is given by means of composing functionality provided by the
application. Later in this section, we will present more sophisticated examples that give a more
complete picture of the structure of connectors.
    For the moment being, it should be noted that specifying deployment details apart of an
aspect de nition, make the aspect reusable with other classes without changing its de nition.
Rather, what is needed is the de nition of a new connector. For illustration, assume that
after having de ned ShowReadAccessesConn1, we realize that read accesses on lines need also be
instrumented as well. For this purpose the ShowReadAccessesConn2 connector is de ned below
as an extension of ShowReadAccessesConn1.
connector ShowReadAccessesConn2 extends ShowReadAccessesConn1                   f
      Line is DataToAccess with     f readOp     = get    g
  g

...
    On the other side, if we knew from the very beginning that whatever classes are included in
the application, we would like to instrument all read access operations, we would have de ned
ShowReadAccessesConn3, rather than ShowReadAccessesConn1. If this was the case, no modi -
cation of the aspect or extension of the connectors would be needed, if we extend the application
with a new data type, say Circle.
connector ShowReadAccessesConn3             f


                                                  4
Shapes . is DataToAccess with            f
            readOp = set
             g
g

    An aspect can be de ned that a ects several operation categories of the same class in di erent
ways. For illustration, assume that in addition to read accesses, we would like to instrument
write accesses. This is expressed by the ShowReadWriteAccesses component below. The aspect
is then deployed with the shape package by ShowReadWriteAccessesConn1.
ShowAccesses package
appc ShowReadWriteAccesses f
  participant DataToAccess f
     expected Object readOp ( )
     expected void writeOp ( Object ] args )
     replace Object readOp () f
        System . out . println ( quot;Read quot; + displayString ( ) )
        return expected . read op ( )
                     g

                 replace void writeOp ( Object ] args ) f
                    System . out . println ( quot;Write quot; + displayString ( ) )
                    expected . write op ( Object ] args )
                     g

                 private String displayString () f
                   return quot; access on quot; + this . toString ( )
                 g

         g
 g

...
Deployment package
import ShowAccesses .
import Shapes .
connector ShowReadWriteAccessesConn1                  f
         Shapes . is DataToAccess with            f
            readOp = set
            writeOp = get
     g
g
    Assuming that ShowReadAccesses was already de ned, we could also de ne ShowReadWriteAc-
cesses as an extension of ShowReadAccesses, and the corresponding connector as an extension
of the ShowReadAccessesConn3 connector, thus supporting reuse at the level of both aspect and
connector de nitions.
appc ShowReadWriteAccesses extends ShowReadAccesses                     f

  participant DataToAccess f
                                                       5
expected void writeOp ( Object ] args )
                 replace void writeOp ( Object ] args ) f
                    System . out . println ( quot;Write access on quot; + this . toString ( ) )
                    expected . writeOp ( Object ] args )
                 g

         g
 g

connector ShowReadWriteAccessesConn2 extends ShowReadAccessesConn3                        f
         Shapes . is DataToAccess with            f
            writeOp = get
         g


1.2 AP&P Components versus Frameworks
1.3 Composing Aspects
The example discussed so far illustrated the basic elements of the AP&P Component language
for aspect de nition, deployment, and reuse. In the following, we show a few more details re-
lated to aspect de nition and concentrate on how aspects can be composed. The rst example
illustrates how aspects can be composed by being deployed simultaneously with the same appli-
cation. For illustrating this case, two new aspects are de ned below. The rst aspect is about
logging new instances in a system, called NewInstanceLogging below. The NewInstanceLogging
component illustrates the de nition/initialization and use of aspect related state which is shared
by all application classes that will be assigned to participant roles of the aspect for a certain de-
ployment. For instance, equally how many application classes will be assigned to be DataToLog
during a deployment, they all will share the logObject variable de ned in NewInstanceLogging.
appc NewInstanceLogging f
  participant DataToLog f
    expected public DataToLog( Object ] args )
    replace public DataToLog( Object ] args ) f
      expected . DataToLog( args )
      long time = System . currentTimeMillis ( )
      try f
        String class = this . class . getName () + quot; quot;
        logObject . writeBytes ( quot;New instance of quot; + class + at quot; quot; + time + quot; quot; n n )
      g catch ( IOException e ) f System . out . println ( e . toString ( ) ) g
             g
     g

     protected static DataOutputStream logObject = null
     public static i n i t () f
         try f logObject = new DataOutputStream (new FileOutputStream ( log ) )               g
         catch ( IOException e ) f System . out . println ( e . toString ( ) ) g
                 g
g
   The second aspect is about automatically resetting values of certain data types after a certain
number of accesses on that data has occurred. This second aspect, called AutoReset, is de ned
                                                       6
below It introduces a new instance variable to each application object that will be mapped to
the DataToReset participant role in the component, called count. It is an instance variable, since
it is declared as non-static within the aspect-speci c de nition of DataToReset. The AutoReset
component illustrates another feature of AP&P Components: there are two kinds of expected
operations. The rst kind, represented by setOp, includes operations which are expected in
order to be replaced by the aspect (expected operations preceded by the keyword replaced).
Operations of the second kind, represented by reset are expected in order to be used by the
aspect-speci c de nition of the participants. Expected operations of the rst kind constitute
the so-called modi cation interface between aspects and application. This corresponds to the
concept of joint points in AspectJ. Expected operations of the second case constitute what we
call usage interface between aspects and application.
appc AutoReset f
  participant DataToReset f
    expected void setOp ( Object ] args )
    expected void reset ( )
    protected int count = 0
    replace void setOp ( Object ] args ) f
     if ( ++ count >= 100 ) f
        expected . setOp ( args )
                     count = 0
                     reset ( )
             g
         g
    g
g
   Let us now consider how these aspects are composed by being deployed with the Shapes
application, we have been using so far. Assume that we want (a) all three aspects to apply
to points, (b) ShowReadWriteAccesses and NewInstanceLogging to apply to Line, and (c) only
NewInstanceLogging to apply to Rectangles. This is expressed by the connector CompositionConn1
below. This connector illustrates that besides specifying mappings for expected operations by
means of pattern matchings on method names, the deployment programmer can also directly
implement an operation in the expected interface in terms of operations and/or state de ned in
the application. This is illustrated by the de nition of reset() in CompositionConn1, i.e., in this
case the mapping is programmaticquot; rather than declarative.
connector CompositionConn1              f
        f Line        , Point g is DataToAccess with   f
                       readOp = set
                       writeOp = get
                 g

    Point is DataToReset with               f
          resetOp = set
          void reset () f
             x=0
             y=0 g
             g

    Shapes .             is DataToLog

                                                   7
g
    The composition structure expressed by CompositionConn1 is symbolically represented in
Fig. 3. The composed deployment is presented on the left hand side of Fig. 3. On the right hand
side the result of the deployment is shown by the towers of shapes, representing the resulting
weaved code for points (represented by triangles in the gure), lines (represented by xxx in the
  gure), respectively rectangles (represented by circles in the gure).




               Figure 3: Deploying Several Aspects with the Same Application
    Specifying connections apart of the de nitions of the individual aspects, makes aspect def-
initions more reusable. For instance, we can later add new connection statements to specify
additional joint pointsquot; between an application and aspects, as illustrated by the Composition-
Conn2 connector below, which deployes the AutoReset aspect also with lines.
connector CompositionConn2 extends CompositionConn1               f

    Line is DataToReset with f
      resetOp = set
       void reset () f i n i t ( ) g
       g
g

    Besides adding new connection statements, one can also modify existing ones. This is il-
lustrated by the connector CompositionConn3 below. It rede nes the connection Composition-
Conn1's statement for Point, to distinguish between the reset policy for operations that change
both coordinates simultaneously and operations that change only one of the coordinates. Three
di erent cases are distinguished by specifying three di erent connection clauses. This connection
statement overrides the respective connection statement for the class Point, in CompositionConn1.
connector CompositionConn3 extends CompositionConn1               f

    Point is DataToReset with          f
       f resetOp = set

                                               8
void reset ()    f
                   x=0 y=0          g
         g

              resetOp = setX
         f
              void reset ( )       x=0
                               f         g
         g

         f
              resetOp = setY
              void reset ( )       y=0
                               f         g
         g
     g

 g
    In the example considered so far, the aspects to be composed are independent form each
other. The connector CompositionConn1 is equivalent to specifying three independent connectors
(actually this is what Fig. 3 suggests). The order of deploying the individual aspects being
composed is not important. In the following, we will illustrate how the expected interface of
an aspect can be partly implemented by the application and partly connected to the provided
interface of another aspect after the latter has been itself deployed with classes in the concrete
application. Consider rst the following two components.
aspect package
appc DataWithCounter f
   participant Counter f
       void reset ( )
       void inc ( )
       void dec ( )
     g
   participant DataStructure f
       protected Counter counter
       expected void initCounter ( )
                 // the method for i n i t i a l i z i n g the count f i e l d is l e t to be bound
                 // at deployment time , when the concrete type of Counter is known
             expected void make empty ( )
             expected void push ( Object a )
             expected void pop ( )
             replace void make empty () f
                      counter . reset ( )
                      expected . empty ( )
                    g
             replace void push ( Object a ) f
                    counter . inc ( )
                    expected . push ( Object a )
                  g
             replace void pop () f
                      counter . dec ( )
                      expected . pop ( )
                    g


                                                   9
g
g

appc DataWithLock f
    participant Data                f

                 Lock lock
                 expected void initLock ( )
                 expected AnyType method to wrap ( Object ] args )
                 replace AnyType method to wrap ( Object ] args ) f
                   if ( lock . is unlocked ( ) ) f
                         lock . lock ( )
                         expected . method to wrap ( Object ] args )
                        lock . unlock ( )   g
                  g
             g
     participant         Lock   f
        expected         void lock ( )
        expected         void unlock ( )
        expected         boolean is unlocked ( )
     g
g

    The rst aspect adds functionality for counting the elements included in a container data
type, such stacks, queues, etc. The second aspect adds functionality for synchronizing invoca-
tions of certain operations on a given data type by means of a lock. Now assume the following
application, which provides implementations for data types, such as stacks, queues, counters,
locks, etc. We can now model stack and queue objects that count their elements and the
operations of which are synchronized by means of a lock by specifying the connectors in the
deployment package below. This kind of composition is schematically presented in Fig. 4.
appl package
class StackImpl f
   String s = new String ( )
   void empty () f s = quot;quot; g
   void push ( char a ) f s = String . valueOf ( a ). concat ( s )     g
   void pop () f s = s . substring ( 1 ) g
   char top ( ) f return ( s . charAt ( 0 ) ) g
 g

class QueueImpl f . . . g
class CounterImpl f
   int i = 0
   void resetImpl () f i =0             g
     ...
 g

class LockImpl f
   boolean l = true
   boolean is unlocked () f return l            g
     ...

                                                    10
g


deployment package
connector addCounter        f
     Counter = CounterImpl is DataWithCounter . Counter
     Stack = StackImpl is DataWithCounter . DataStructure with f
         void initCounter () f counter = new Counter ( ) g
         void push ( Object obj ) f push ((( String ) obj ). charValue ( ) )   g
         Object top () f return ( Object ) String . valueOf ( top ( ) ) g
         ...
      g

     Queue = QueueImpl implements DataWithCounter . DataStructure with             f
        ... g
 g

connector addLock       f
     addCounter . Stack is DataWithLock . Data with f
        method to wrap = f pop , push , top , make empty g
      g

     addCounter . Queue is DataWithLock . Data with          ...
                                                         f         g

     LockImpl is DataWithLock . Lock
g




               Figure 4: Deploying Several Aspects with the Same Application (2)
    Alternatively, one can create composed aspects prior to deployment with any concrete ap-
plication by connecting part of the expected interface of one aspect to part of the provided
                                               11
interface of another. The remaining unbound parts of the expected interfaces are connected
to appliciations during deployment. Creating composed aspects prior to deployment is illus-
trated by the following code. First, DataWithStack is composed with DataWithLock into a new
aspect, DataWithCounter&Lock. Later DataWithCounter&Lock get deployed with the concrete
application. The process of creating DataWithCounter&Lock is schematically presented in Fig. 5.
aspect package
...
appc DataWithCounter&Lock f
    participant Data = DataWithCounter . DataStructure is DataWithLock . Data with                f
         method;to;wrap = f make empty , pop , top , push g g
      participant Counter = DataWithCounter . Counter
      participant Lock = DataWithLock . Lock
g

...
deployment package
conector addCounter&Lock            f

    CounterImpl is DataWithCounter&Lock . Counter with              f
        ...g
    StackImpl is DataWithCounter&Lock . Data with             f
         void make empty () f empty ( ) g
         void initCounter () f
            counter = new Counter ( )
                g
          void push ( Object obj ) f push ((( String ) obj ). charValue ( ) )    g
          ...
      g

    QueueImpl is DataWithCounter&Lock . Data with f . . . g
    LockImpl is DataWithCounter&Lock . Lock with f . . . g
g




                    Figure 5: Deploying Several Aspects with the Same Application (3)

                                                   12
1.4 De ning New Behavior: The Publisher-Subscriber Aspect
In the examples considered so far, there has always been a single deployement of an aspect
to a certain application. In the following we will illustrate that due to separate deployment
speci cation, an aspect can be multiply deployed with the same application, each deployment
with its own mappings. For illustration, a publisher/subscriber protocol aspect is modeled in
the appc below.
appc PublisherSubscriberProtocol f
   participant Publisher f
       expected void changeOp( Object ] args )
       protected Vector subscribers = new Vector ( )
       public void attach ( Subscriber subsc ) f
           subscribers . addElement ( subsc ) g
       public void detach ( Subscriber subsc ) f
                subscribers . removeElement ( subsc )    g

            replace void changeOp () f
               expected . changeOp ( )
               for ( int i = 0 i < subscribers . s i z e ( ) i ++) f
                 (( Subscriber ) subscribers . elementAt ( i ) ) . update ( this )   g
            g

     participant Subscriber f
        expected void subUpdate ( Publisher publ )
        protected Publisher publ
        public void update ( Publisher aPubl ) f
           publ = aPubl
           expected . subUpdate ( publ ) g
        g
    g
g
    In addition to replacing existing methods with enhancements, PublisherSubscriberProtocol
de nes new elds and methods that are involved in the protocol and establishes the structural
relationship between the protocol participants. Note that the protocol in PublisherSubscriber-
Protocol is de ned for two hypothetical participants and not in terms of particular classes. As
such, it can be applied to di erent publisher/subscribers pairs, as illustrated by the following
two connectors. In the rst case, the publisher role is played by the class Point, while the
subscriber role is played by a simple class, called ChangePrinter, shown below. Establishing
the publisher/subscriber protocol between Point and ChangePrinter is realized by the connector
PubSubConn1.
Output package
class ChangePrinter f
  void public printR ()       f
        System . out . println ( quot; Printer : quot; + this . toString () +
                         quot; read access has occurred . . . quot; + n n )
    g
    void public printW ()     f
        System . out . println ( quot; Printer : quot; + this . toString () +

                                                13
quot; write access has occurred . . . quot; + n n )
         g
     void public notifyChange ( )                  System . out . println ( quot;CHANGE . . . quot; )
                                               f
     g
g

...
Deployment package
...
connector PubSubConn1                 f
     Point is Publisher with
        f changeOp = f set , get g g
     ChangePrinter is Subscriber with f
         void subUpdate ( Publisher publ ) f
            notifyChange ( )
            System . out . println ( quot;on point object quot; + (( Point ) publ ). toString ( ) )
                 g
         g
 g
         In a similar way, the following code, illustrates the deployment of the protocol de ned by the
PublisherSubscriberProtocol aspect with another application: this time a game package including
a class for the TicTacToe game and a class for the graphical interface, GUI, with the latter being
an aggregate of two other classes, BoardDisplay and StatusDisplay, as shown in Fig. ??.
connector PubSubConn2                 f

     TicTacToe is Publisher with f
       changeOp = f startGame , newPlayer , putMark , endGamegg
     f BoardDisplay           , StatusDisplay g is Subscriber with           f
                 void update ( Publisher publ )        f
                         setGame (( Game) publ )
                         repaint ( )
                     g
             g
 g
    Both deployments of the publisher/subscriber aspect shown so far, result in the standard
publisher/subscriber protocol, i.e., the protocol with one publisher being subscribed by a single
set of subscribers, uniformly interested in any change in the publisher's state. One can also realize
modi ed versions of the standard protocol by simply de ning new connectors. For instance,
the connectors, PubSubConn3 and PubSubConn4, deploy the protocol with the same classes as
PubSubConn1, but now two di erent connection clauses distinguish the noti cation operations
that are invoked on the subscribers depending on which access operations are invoked on the
publisher. This corresponds to a variation on the publisher/subscriber pattern, where there are
several lists of subscribers for one publisher, distinguished by the events they are interested in.
connector PubSubConn3                 f

     Point is Publisher with                   changeOp = set
                                           f                       g

     ChangePrinter is Subscriber with f
        void subUpdate ( Publisher publ )                  f


                                                           14
printW ( )
                     System . out . println ( quot;on point object quot; + (( Point ) publ ). toString ( ) )
                     g
             g
g

connector PubSubConn4              f

     Point is Publisher with                   changeOp = get
                                           f                    g

     ChangePrinter is Subscriber with f
          void subUpdate ( Publisher publ ) f
            printR ( )
            System . out . println ( quot;on point object quot; + (( Point ) publ ). toString ( ) )
                 g
         g
 g

   The sets of operations of Point that are mapped to di erent noti cation operations of the
subscriber participant need not be disjoint. For instance, we may want to distinguish between set
operations that a ect the x-coordinate, respectively, the y-coordinate of a point. The set(int, int),
however, will then fall in both categories. This is expressed by the connectors PubSubConn3.1
and PubSubConn3.2 below.
connector PubSubConn3 . 1              f

     Point is Publisher with                   changeOp = f set , setX g
                                           f                               g

     ChangePrinter is Subscriber with f
         void subUpdate ( Publisher publ ) f
            printW ( )
            System . out . println ( quot;on the X coordinate of
                   point object quot; + (( Point ) publ ). toString ( ) )
                     g
         g
g

connector PubSubConn3 . 2              f
     Point is Publisher with f changeOp = f set , setY g g
     ChangePrinter is Subscriber with f
         void subUpdate ( Publisher publ ) f
             printW ( )
             System . out . println ( quot;on the Y coordinate of
                    point object quot; + (( Point ) publ ). toString ( ) )
                     g
     g
g


1.5 Activating/Deactivating Aspects
There are two possible levels of applying aspects: object versus class level, which correspond to
two di erent operations in the interface of connectors. Plugging an aspect into an instance of a
class is realized by invoking adapt(ClassForParticipant instance) on the corresponding connector.
On the contrary, all instances of a class that plays a participant role in an aspect according
to the connector c are automatically adapted to their role in the program scope between the
                                                         15
pair of invocations c.activate() and c.deactivate(). Object level application is illustrated by the
client class (client in the sense that it uses Point ChangePrinter and PublisherSubscriberProtocol)
Client1, while class level application is illustrated by Client2 in the following.
class Client1 f
  ...
  public static void main ( String ] args )              f
     ...
     Point p = new Point ( )
     Point p1 = new Point ( )
           p = PubSubConn3 . adapt ( p )
           p1 = PubSubConn3 . adapt ( p1 )
           ChangePrinter ch = new ChangePrinter ( )
           ChangePrinter ch1 = new ChangePrinter ( )
           PubSubConn3 . addSubscriber ( ch , p )
           p . setX ( 12 )
           // w i l l print
           //       Printer ChangePrinter1678 : write access has occurred . . .
           //       in point object Point3578
           p1 . setY ( 26 )
           // nothing w i l l be printed
           PubSubConn3 . addSubscriber ( ch1 , p1 )
            p1 . setY ( 2 )
           // w i l l print :
           //       Printer ChangePrinter1802 : write access has occurred . . .
           //       in point object Point7382
           ...
           PubSubConn3 . remove ( p ) // p w i l l not react as a p u b l i s h e r anymore
           PubSubConn3 . removeSubscriber ( ch1 , p1 )
           ...
      g
    ...
g


class Client2 f
  ...
  public static void main ( String ] args )              f
          ...
          ShowReadWriteAccessesConn2 . activate ( )
          Point p1 = new Point ( 14 , 6)
          Point p2 = new Point ( 10 , 5 )
          Line l = new Line ( p1 , p2 )
          p1 . setX ( 10 )
          // W w i l l be printed on the screen
          Point p3 = l . getSource ( )
          // R w i l l be printed on the screen
          ...
          ShowReadWriteAccessesConn2 . deactivate ( )
          p3 . getY ( 10 )

                                                    16
// nothing w i l l be printed out
        ...
    g
g



1.6 Comparison with AspectJ
        less tangled aspects
           { aspects easier to understand
           { aspects easier to reuse
           { aspects easier to modify
        better modularity by separating aspect de nition from aspect deployment
        Application and aspects could be even developed by di erent programmers.




                                              17

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Ood Post1
Ood Post1Ood Post1
Ood Post1
 
Functions in c++
Functions in c++Functions in c++
Functions in c++
 
Input and output in c++
Input and output in c++Input and output in c++
Input and output in c++
 
Handout#06
Handout#06Handout#06
Handout#06
 
Pointers in c++
Pointers in c++Pointers in c++
Pointers in c++
 
Functions-Computer programming
Functions-Computer programmingFunctions-Computer programming
Functions-Computer programming
 
4. function
4. function4. function
4. function
 
Pointers-Computer programming
Pointers-Computer programmingPointers-Computer programming
Pointers-Computer programming
 
Intake 38 4
Intake 38 4Intake 38 4
Intake 38 4
 
Intake 38 6
Intake 38 6Intake 38 6
Intake 38 6
 
Ch13
Ch13Ch13
Ch13
 
Strings-Computer programming
Strings-Computer programmingStrings-Computer programming
Strings-Computer programming
 
Data services-functions
Data services-functionsData services-functions
Data services-functions
 
Ch06
Ch06Ch06
Ch06
 
Objects and classes in Visual Basic
Objects and classes in Visual BasicObjects and classes in Visual Basic
Objects and classes in Visual Basic
 
Computer programming(CP)
Computer programming(CP)Computer programming(CP)
Computer programming(CP)
 
Unit 5 structure and unions
Unit 5 structure and unionsUnit 5 structure and unions
Unit 5 structure and unions
 
POINTERS IN C MRS.SOWMYA JYOTHI.pdf
POINTERS IN C MRS.SOWMYA JYOTHI.pdfPOINTERS IN C MRS.SOWMYA JYOTHI.pdf
POINTERS IN C MRS.SOWMYA JYOTHI.pdf
 
C functions list
C functions listC functions list
C functions list
 
Unit 2 c programming_basics
Unit 2 c programming_basicsUnit 2 c programming_basics
Unit 2 c programming_basics
 

Andere mochten auch

Livro aluno
Livro alunoLivro aluno
Livro alunoBlairvll
 
Projeto solo
Projeto soloProjeto solo
Projeto soloBlairvll
 
Nova ortografia
Nova ortografiaNova ortografia
Nova ortografiaBlairvll
 
Clark Memorial Library Slideshow
Clark Memorial Library SlideshowClark Memorial Library Slideshow
Clark Memorial Library SlideshowMary Cummings
 
Gifted & talented students 1
Gifted & talented students 1Gifted & talented students 1
Gifted & talented students 1Jeremy Litton
 
Saudepublica
Saudepublica Saudepublica
Saudepublica Blairvll
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programmingmukhtarhudaya
 
Introduction to AspectJ
Introduction to AspectJIntroduction to AspectJ
Introduction to AspectJmukhtarhudaya
 

Andere mochten auch (9)

Livro aluno
Livro alunoLivro aluno
Livro aluno
 
Projeto solo
Projeto soloProjeto solo
Projeto solo
 
Nova ortografia
Nova ortografiaNova ortografia
Nova ortografia
 
Sueños
SueñosSueños
Sueños
 
Clark Memorial Library Slideshow
Clark Memorial Library SlideshowClark Memorial Library Slideshow
Clark Memorial Library Slideshow
 
Gifted & talented students 1
Gifted & talented students 1Gifted & talented students 1
Gifted & talented students 1
 
Saudepublica
Saudepublica Saudepublica
Saudepublica
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Introduction to AspectJ
Introduction to AspectJIntroduction to AspectJ
Introduction to AspectJ
 

Ähnlich wie Modeling Aspects with AP&P Components

AspectC++: Language Proposal and Prototype Implementation
AspectC++: Language Proposal and Prototype ImplementationAspectC++: Language Proposal and Prototype Implementation
AspectC++: Language Proposal and Prototype Implementationdinomasch
 
Redux and context api with react native app introduction, use cases, implemen...
Redux and context api with react native app introduction, use cases, implemen...Redux and context api with react native app introduction, use cases, implemen...
Redux and context api with react native app introduction, use cases, implemen...Katy Slemon
 
Tagless Final Encoding - Algebras and Interpreters and also Programs
Tagless Final Encoding - Algebras and Interpreters and also ProgramsTagless Final Encoding - Algebras and Interpreters and also Programs
Tagless Final Encoding - Algebras and Interpreters and also ProgramsPhilip Schwarz
 
Component based models and technology
Component based models and technologyComponent based models and technology
Component based models and technologyMayukh Maitra
 
Java 8 - An Overview
Java 8 - An OverviewJava 8 - An Overview
Java 8 - An OverviewIndrajit Das
 
A formal conceptual framework
A formal conceptual frameworkA formal conceptual framework
A formal conceptual frameworkijseajournal
 
Component based models and technology
Component based models and technologyComponent based models and technology
Component based models and technologySaransh Garg
 
Book management system
Book management systemBook management system
Book management systemSHARDA SHARAN
 
Abstract Data Types (a) Explain briefly what is meant by the ter.pdf
Abstract Data Types (a) Explain briefly what is meant by the ter.pdfAbstract Data Types (a) Explain briefly what is meant by the ter.pdf
Abstract Data Types (a) Explain briefly what is meant by the ter.pdfkarymadelaneyrenne19
 
Algorithms and Their Explanations
Algorithms and Their ExplanationsAlgorithms and Their Explanations
Algorithms and Their ExplanationsMarco Benini
 
Restructuring functions with low cohesion
Restructuring functions with low cohesionRestructuring functions with low cohesion
Restructuring functions with low cohesionAditya Kumar Ghosh
 
C, C++ Interview Questions Part - 1
C, C++ Interview Questions Part - 1C, C++ Interview Questions Part - 1
C, C++ Interview Questions Part - 1ReKruiTIn.com
 
Interoduction to c++
Interoduction to c++Interoduction to c++
Interoduction to c++Amresh Raj
 
CSCI 383 Lecture 3 and 4: Abstraction
CSCI 383 Lecture 3 and 4: AbstractionCSCI 383 Lecture 3 and 4: Abstraction
CSCI 383 Lecture 3 and 4: AbstractionJI Ruan
 
.NET Portfolio
.NET Portfolio.NET Portfolio
.NET Portfoliomwillmer
 
VauhkonenVohraMadaan-ProjectDeepLearningBenchMarks
VauhkonenVohraMadaan-ProjectDeepLearningBenchMarksVauhkonenVohraMadaan-ProjectDeepLearningBenchMarks
VauhkonenVohraMadaan-ProjectDeepLearningBenchMarksMumtaz Hannah Vauhkonen
 

Ähnlich wie Modeling Aspects with AP&P Components (20)

AspectC++: Language Proposal and Prototype Implementation
AspectC++: Language Proposal and Prototype ImplementationAspectC++: Language Proposal and Prototype Implementation
AspectC++: Language Proposal and Prototype Implementation
 
Redux and context api with react native app introduction, use cases, implemen...
Redux and context api with react native app introduction, use cases, implemen...Redux and context api with react native app introduction, use cases, implemen...
Redux and context api with react native app introduction, use cases, implemen...
 
Tagless Final Encoding - Algebras and Interpreters and also Programs
Tagless Final Encoding - Algebras and Interpreters and also ProgramsTagless Final Encoding - Algebras and Interpreters and also Programs
Tagless Final Encoding - Algebras and Interpreters and also Programs
 
Bcsl 031 solve assignment
Bcsl 031 solve assignmentBcsl 031 solve assignment
Bcsl 031 solve assignment
 
Component based models and technology
Component based models and technologyComponent based models and technology
Component based models and technology
 
Java 8 - An Overview
Java 8 - An OverviewJava 8 - An Overview
Java 8 - An Overview
 
A formal conceptual framework
A formal conceptual frameworkA formal conceptual framework
A formal conceptual framework
 
Component based models and technology
Component based models and technologyComponent based models and technology
Component based models and technology
 
Book management system
Book management systemBook management system
Book management system
 
Abstract Data Types (a) Explain briefly what is meant by the ter.pdf
Abstract Data Types (a) Explain briefly what is meant by the ter.pdfAbstract Data Types (a) Explain briefly what is meant by the ter.pdf
Abstract Data Types (a) Explain briefly what is meant by the ter.pdf
 
Function
FunctionFunction
Function
 
Algorithms and Their Explanations
Algorithms and Their ExplanationsAlgorithms and Their Explanations
Algorithms and Their Explanations
 
Restructuring functions with low cohesion
Restructuring functions with low cohesionRestructuring functions with low cohesion
Restructuring functions with low cohesion
 
C, C++ Interview Questions Part - 1
C, C++ Interview Questions Part - 1C, C++ Interview Questions Part - 1
C, C++ Interview Questions Part - 1
 
Interoduction to c++
Interoduction to c++Interoduction to c++
Interoduction to c++
 
CSCI 383 Lecture 3 and 4: Abstraction
CSCI 383 Lecture 3 and 4: AbstractionCSCI 383 Lecture 3 and 4: Abstraction
CSCI 383 Lecture 3 and 4: Abstraction
 
.NET Portfolio
.NET Portfolio.NET Portfolio
.NET Portfolio
 
C++ programing lanuage
C++ programing lanuageC++ programing lanuage
C++ programing lanuage
 
VauhkonenVohraMadaan-ProjectDeepLearningBenchMarks
VauhkonenVohraMadaan-ProjectDeepLearningBenchMarksVauhkonenVohraMadaan-ProjectDeepLearningBenchMarks
VauhkonenVohraMadaan-ProjectDeepLearningBenchMarks
 
Map reduce
Map reduceMap reduce
Map reduce
 

Kürzlich hochgeladen

Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 

Kürzlich hochgeladen (20)

Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 

Modeling Aspects with AP&P Components

  • 1. 1 Modeling Aspects with AP&P Components In this section, we outline the elements of APPC construct and show how APPCs can be used to model aspects. We will start with a small set of APPC concepts, illustrate the use of these concepts in modeling aspects and then inttroduce the rest of the concepts by presenting more sophisticated examples. In order to facilitate the comparison, a good part of the examples in this section are taken, eventually slightly modi ed, from the tutorial on AspectJ ?], which is the rst extension of Java designed and implemented to bridge the gap between object and aspectual decomposition in Java. 1.1 AP&P Components as a Language Construct An AP&P component is a module construct for object-oriented languages on top of classes that serves to capture behavior that a ects several classes. However, the captured behavior is written in terms of an ideal class graph and not to a concrete application. An AP&P component consists of the following elements: A set of participants. A participant is a formal class (or a class in an ideal class graph, ICG), which stands at the same level as a formal argument in a procedure declaration I needs to be later bound to classes in a concrete class graph, CCG. Instead of type constraints to be satis ed by the CCG classes, a participant de nition merely lists a set of operation signatures, preceded by the keyword expected. Expected operations are used in the appc-speci c de nition of the participant. This de - nition includes: (a) reimplementationsquot; of the expected operations, denoted by the keyword replace. (b) de nitions of new operations { all operations in the de nition of a participant that are declared public. (c) new eld de nitions that would extend the structure of the CCG classes to be bound to this participant. (e) In order to implements replacements or new functionality, a participant de nition might include localquot; de nitions (operations as well as elds). These are denoted by the same keywords as in Java: private, protected. The key idea behind APPCs as a construct for reconciling object-based and aspect-based decomposition of the systems is to add a new dimension in the organization of object-oriented software, as illustrated in Fig. 1. The software is rst decomposed based on aspects which are symbolically represented by rectangle areas with di erent grey scales in Fig. 1. Each aspect de nition has its own object-based decomposition. Di erent data types involved in an aspect de nition are represented by di erent shapes in Fig. 1. Aspect de nitions are based on the as- sumption that other aspects or/and the concrete application will supply part of the functionality of the involved data which is then modi ed/extended by the aspect. The expected interface of aspect de nitions is represented by the transparent (colorless) shapes on the left hand side of all but one colored area in Fig. 1. The left most colored area in Fig. 1 represents a concrete application. It is self-contained in that it does not expect anything to be supplied from the outside and provides the basic imple- mentation of the application functionality. It is generally much richer in data type de nitions than the aspect de nitions. The modi cations and/or extensions of the expected interface by aspect de nitions are illustrated by the shape towers on the right hand side of each grey scale 1
  • 2. area: there are generally more shapes of each kind on the right hand side than on the left hand side. Colorless shapes on the left hand side are replaced by colored shapes on the right hand side. In addition, some new shapes are added to each tower. Figure 1: Aspect Decomposition with APPCs For illutrating the concepts so far, we start with a very simple example. The aspect con- sidered here is a trivial one: instrumenting access operations on data types. A description of the aspect in informal English would be: For any data type in an application, say DataToAc- cess, any read access operation, AnyType readOp() de ned for DataToAccess, and any invocation of this operation on an instance of DataToAccess, dataInstance, display Read access on <string representation of dataInstance>. Sure enough, the description is reusable in di erent contexts, since it does not make any commitment about its application context. It is obvious that an aspect de nition language that allows to delay binding aspects to their deployment contexts is desirable. This is in fact the key point about using APPCs to model aspects. The code in the ShowReadAccess appc below is actually as free of details about concrete deployment contexts as the informal English description above is. It simply states that whatever classes in an application will be assigned to implement (play) the single participant in the aspect de nition, DataToAccess, and whatever methods in these classes will be assigned to implement the interface expected from DataToAccess, readOp in this case, the latter methods will be replaced by implementations that rst print out a message and then execute the original methods (see the replace statement below). ShowAccesses package appc ShowReadAccesses f participant DataToAccess f expected Object readOp ( ) replace Object readOp () f System . out . println ( quot;Read access on quot; + this . toString ()) return expected . read op ( ) g g g 2
  • 3. ... The meaning of the pseudo-variable this is the same as in a Java program. In the de nition above, it denotes the application instance being instrumented. If there are no ambiguities, there is no need to explicitly refer to the pseudo-variable this. Any invocation without an explicit receiver is considered to be a self-invocation. A method for this invocation is rst looked-up in the aspect-speci c de nition of the participant. If no method is found there, the class in the application assigned to play the participant role is searched for. Now, given a concrete application the programmer needs to deploy the aspect with the ap- plication by assigning classes in the application to aspect participants and by specifying how the interface expected by the aspect is implemented in terms of the application. Specifying a mapping for the expected interface of an aspect occurs apart of the de nition of an aspect by means of so-called connector constructs. In abstract terms, the deployment process is schemati- cally presented in Fig. 2. The connector is symbolically represented by the two colored rectangle between the application and the aspect. It transforms a part of the application de nition into the expected interface of the appc. The result of the deployment is equivalent to the set of shape towers on the right hand side of Fig. 2. Partial de nitions from the application and the aspect are mixed together into the nal de nition of each object. Figure 2: Deploying Aspects with Applications For illustration consider the trivial example of an application that models graphical shapes (the Shapes package below), and a simple deployment scenario in which we are interested in instrumenting only read accesses on point objects. Shapes package class Point f private int x = 0 private int y = 0 void set ( int x , int y ) x=x y=y f g 3
  • 4. void setX ( int x ) f x=x g void setY ( int y ) f y=y g int getX ()f return xg int getY ()f return yg g class Line f . . . g class Rectangle f . . . g ... The deployment of ShowReadAccesses with the class Point is speci ed by the ShowReadAc- cessConn1 connector below. Deployment package import ShowAccesses . import Shapes . connector ShowReadAccessesConn1 f Point is DataToAccess with f readOp = get g g ... The connector in the example above is simple. It contains only one implement statement. In general, a connector consists of several scopes, where each scope contains several implements statements. A simpli ed grammar of the struture of connector is given in Fig. ??. The class- to-participant mapping in an implements statement is in general many to one, as it will be illustrated in the following. An implement statement has one or more mapping clauses for the expected interfaces associated with it. In the example above the mappping is done based on pattern matching on operation names, with the pattern being speci ed by the regular expression get*. In general, this mapping can also take a more programmaticquot; form, i.e., an implemen- tation of the expected signature is given by means of composing functionality provided by the application. Later in this section, we will present more sophisticated examples that give a more complete picture of the structure of connectors. For the moment being, it should be noted that specifying deployment details apart of an aspect de nition, make the aspect reusable with other classes without changing its de nition. Rather, what is needed is the de nition of a new connector. For illustration, assume that after having de ned ShowReadAccessesConn1, we realize that read accesses on lines need also be instrumented as well. For this purpose the ShowReadAccessesConn2 connector is de ned below as an extension of ShowReadAccessesConn1. connector ShowReadAccessesConn2 extends ShowReadAccessesConn1 f Line is DataToAccess with f readOp = get g g ... On the other side, if we knew from the very beginning that whatever classes are included in the application, we would like to instrument all read access operations, we would have de ned ShowReadAccessesConn3, rather than ShowReadAccessesConn1. If this was the case, no modi - cation of the aspect or extension of the connectors would be needed, if we extend the application with a new data type, say Circle. connector ShowReadAccessesConn3 f 4
  • 5. Shapes . is DataToAccess with f readOp = set g g An aspect can be de ned that a ects several operation categories of the same class in di erent ways. For illustration, assume that in addition to read accesses, we would like to instrument write accesses. This is expressed by the ShowReadWriteAccesses component below. The aspect is then deployed with the shape package by ShowReadWriteAccessesConn1. ShowAccesses package appc ShowReadWriteAccesses f participant DataToAccess f expected Object readOp ( ) expected void writeOp ( Object ] args ) replace Object readOp () f System . out . println ( quot;Read quot; + displayString ( ) ) return expected . read op ( ) g replace void writeOp ( Object ] args ) f System . out . println ( quot;Write quot; + displayString ( ) ) expected . write op ( Object ] args ) g private String displayString () f return quot; access on quot; + this . toString ( ) g g g ... Deployment package import ShowAccesses . import Shapes . connector ShowReadWriteAccessesConn1 f Shapes . is DataToAccess with f readOp = set writeOp = get g g Assuming that ShowReadAccesses was already de ned, we could also de ne ShowReadWriteAc- cesses as an extension of ShowReadAccesses, and the corresponding connector as an extension of the ShowReadAccessesConn3 connector, thus supporting reuse at the level of both aspect and connector de nitions. appc ShowReadWriteAccesses extends ShowReadAccesses f participant DataToAccess f 5
  • 6. expected void writeOp ( Object ] args ) replace void writeOp ( Object ] args ) f System . out . println ( quot;Write access on quot; + this . toString ( ) ) expected . writeOp ( Object ] args ) g g g connector ShowReadWriteAccessesConn2 extends ShowReadAccessesConn3 f Shapes . is DataToAccess with f writeOp = get g 1.2 AP&P Components versus Frameworks 1.3 Composing Aspects The example discussed so far illustrated the basic elements of the AP&P Component language for aspect de nition, deployment, and reuse. In the following, we show a few more details re- lated to aspect de nition and concentrate on how aspects can be composed. The rst example illustrates how aspects can be composed by being deployed simultaneously with the same appli- cation. For illustrating this case, two new aspects are de ned below. The rst aspect is about logging new instances in a system, called NewInstanceLogging below. The NewInstanceLogging component illustrates the de nition/initialization and use of aspect related state which is shared by all application classes that will be assigned to participant roles of the aspect for a certain de- ployment. For instance, equally how many application classes will be assigned to be DataToLog during a deployment, they all will share the logObject variable de ned in NewInstanceLogging. appc NewInstanceLogging f participant DataToLog f expected public DataToLog( Object ] args ) replace public DataToLog( Object ] args ) f expected . DataToLog( args ) long time = System . currentTimeMillis ( ) try f String class = this . class . getName () + quot; quot; logObject . writeBytes ( quot;New instance of quot; + class + at quot; quot; + time + quot; quot; n n ) g catch ( IOException e ) f System . out . println ( e . toString ( ) ) g g g protected static DataOutputStream logObject = null public static i n i t () f try f logObject = new DataOutputStream (new FileOutputStream ( log ) ) g catch ( IOException e ) f System . out . println ( e . toString ( ) ) g g g The second aspect is about automatically resetting values of certain data types after a certain number of accesses on that data has occurred. This second aspect, called AutoReset, is de ned 6
  • 7. below It introduces a new instance variable to each application object that will be mapped to the DataToReset participant role in the component, called count. It is an instance variable, since it is declared as non-static within the aspect-speci c de nition of DataToReset. The AutoReset component illustrates another feature of AP&P Components: there are two kinds of expected operations. The rst kind, represented by setOp, includes operations which are expected in order to be replaced by the aspect (expected operations preceded by the keyword replaced). Operations of the second kind, represented by reset are expected in order to be used by the aspect-speci c de nition of the participants. Expected operations of the rst kind constitute the so-called modi cation interface between aspects and application. This corresponds to the concept of joint points in AspectJ. Expected operations of the second case constitute what we call usage interface between aspects and application. appc AutoReset f participant DataToReset f expected void setOp ( Object ] args ) expected void reset ( ) protected int count = 0 replace void setOp ( Object ] args ) f if ( ++ count >= 100 ) f expected . setOp ( args ) count = 0 reset ( ) g g g g Let us now consider how these aspects are composed by being deployed with the Shapes application, we have been using so far. Assume that we want (a) all three aspects to apply to points, (b) ShowReadWriteAccesses and NewInstanceLogging to apply to Line, and (c) only NewInstanceLogging to apply to Rectangles. This is expressed by the connector CompositionConn1 below. This connector illustrates that besides specifying mappings for expected operations by means of pattern matchings on method names, the deployment programmer can also directly implement an operation in the expected interface in terms of operations and/or state de ned in the application. This is illustrated by the de nition of reset() in CompositionConn1, i.e., in this case the mapping is programmaticquot; rather than declarative. connector CompositionConn1 f f Line , Point g is DataToAccess with f readOp = set writeOp = get g Point is DataToReset with f resetOp = set void reset () f x=0 y=0 g g Shapes . is DataToLog 7
  • 8. g The composition structure expressed by CompositionConn1 is symbolically represented in Fig. 3. The composed deployment is presented on the left hand side of Fig. 3. On the right hand side the result of the deployment is shown by the towers of shapes, representing the resulting weaved code for points (represented by triangles in the gure), lines (represented by xxx in the gure), respectively rectangles (represented by circles in the gure). Figure 3: Deploying Several Aspects with the Same Application Specifying connections apart of the de nitions of the individual aspects, makes aspect def- initions more reusable. For instance, we can later add new connection statements to specify additional joint pointsquot; between an application and aspects, as illustrated by the Composition- Conn2 connector below, which deployes the AutoReset aspect also with lines. connector CompositionConn2 extends CompositionConn1 f Line is DataToReset with f resetOp = set void reset () f i n i t ( ) g g g Besides adding new connection statements, one can also modify existing ones. This is il- lustrated by the connector CompositionConn3 below. It rede nes the connection Composition- Conn1's statement for Point, to distinguish between the reset policy for operations that change both coordinates simultaneously and operations that change only one of the coordinates. Three di erent cases are distinguished by specifying three di erent connection clauses. This connection statement overrides the respective connection statement for the class Point, in CompositionConn1. connector CompositionConn3 extends CompositionConn1 f Point is DataToReset with f f resetOp = set 8
  • 9. void reset () f x=0 y=0 g g resetOp = setX f void reset ( ) x=0 f g g f resetOp = setY void reset ( ) y=0 f g g g g In the example considered so far, the aspects to be composed are independent form each other. The connector CompositionConn1 is equivalent to specifying three independent connectors (actually this is what Fig. 3 suggests). The order of deploying the individual aspects being composed is not important. In the following, we will illustrate how the expected interface of an aspect can be partly implemented by the application and partly connected to the provided interface of another aspect after the latter has been itself deployed with classes in the concrete application. Consider rst the following two components. aspect package appc DataWithCounter f participant Counter f void reset ( ) void inc ( ) void dec ( ) g participant DataStructure f protected Counter counter expected void initCounter ( ) // the method for i n i t i a l i z i n g the count f i e l d is l e t to be bound // at deployment time , when the concrete type of Counter is known expected void make empty ( ) expected void push ( Object a ) expected void pop ( ) replace void make empty () f counter . reset ( ) expected . empty ( ) g replace void push ( Object a ) f counter . inc ( ) expected . push ( Object a ) g replace void pop () f counter . dec ( ) expected . pop ( ) g 9
  • 10. g g appc DataWithLock f participant Data f Lock lock expected void initLock ( ) expected AnyType method to wrap ( Object ] args ) replace AnyType method to wrap ( Object ] args ) f if ( lock . is unlocked ( ) ) f lock . lock ( ) expected . method to wrap ( Object ] args ) lock . unlock ( ) g g g participant Lock f expected void lock ( ) expected void unlock ( ) expected boolean is unlocked ( ) g g The rst aspect adds functionality for counting the elements included in a container data type, such stacks, queues, etc. The second aspect adds functionality for synchronizing invoca- tions of certain operations on a given data type by means of a lock. Now assume the following application, which provides implementations for data types, such as stacks, queues, counters, locks, etc. We can now model stack and queue objects that count their elements and the operations of which are synchronized by means of a lock by specifying the connectors in the deployment package below. This kind of composition is schematically presented in Fig. 4. appl package class StackImpl f String s = new String ( ) void empty () f s = quot;quot; g void push ( char a ) f s = String . valueOf ( a ). concat ( s ) g void pop () f s = s . substring ( 1 ) g char top ( ) f return ( s . charAt ( 0 ) ) g g class QueueImpl f . . . g class CounterImpl f int i = 0 void resetImpl () f i =0 g ... g class LockImpl f boolean l = true boolean is unlocked () f return l g ... 10
  • 11. g deployment package connector addCounter f Counter = CounterImpl is DataWithCounter . Counter Stack = StackImpl is DataWithCounter . DataStructure with f void initCounter () f counter = new Counter ( ) g void push ( Object obj ) f push ((( String ) obj ). charValue ( ) ) g Object top () f return ( Object ) String . valueOf ( top ( ) ) g ... g Queue = QueueImpl implements DataWithCounter . DataStructure with f ... g g connector addLock f addCounter . Stack is DataWithLock . Data with f method to wrap = f pop , push , top , make empty g g addCounter . Queue is DataWithLock . Data with ... f g LockImpl is DataWithLock . Lock g Figure 4: Deploying Several Aspects with the Same Application (2) Alternatively, one can create composed aspects prior to deployment with any concrete ap- plication by connecting part of the expected interface of one aspect to part of the provided 11
  • 12. interface of another. The remaining unbound parts of the expected interfaces are connected to appliciations during deployment. Creating composed aspects prior to deployment is illus- trated by the following code. First, DataWithStack is composed with DataWithLock into a new aspect, DataWithCounter&Lock. Later DataWithCounter&Lock get deployed with the concrete application. The process of creating DataWithCounter&Lock is schematically presented in Fig. 5. aspect package ... appc DataWithCounter&Lock f participant Data = DataWithCounter . DataStructure is DataWithLock . Data with f method;to;wrap = f make empty , pop , top , push g g participant Counter = DataWithCounter . Counter participant Lock = DataWithLock . Lock g ... deployment package conector addCounter&Lock f CounterImpl is DataWithCounter&Lock . Counter with f ...g StackImpl is DataWithCounter&Lock . Data with f void make empty () f empty ( ) g void initCounter () f counter = new Counter ( ) g void push ( Object obj ) f push ((( String ) obj ). charValue ( ) ) g ... g QueueImpl is DataWithCounter&Lock . Data with f . . . g LockImpl is DataWithCounter&Lock . Lock with f . . . g g Figure 5: Deploying Several Aspects with the Same Application (3) 12
  • 13. 1.4 De ning New Behavior: The Publisher-Subscriber Aspect In the examples considered so far, there has always been a single deployement of an aspect to a certain application. In the following we will illustrate that due to separate deployment speci cation, an aspect can be multiply deployed with the same application, each deployment with its own mappings. For illustration, a publisher/subscriber protocol aspect is modeled in the appc below. appc PublisherSubscriberProtocol f participant Publisher f expected void changeOp( Object ] args ) protected Vector subscribers = new Vector ( ) public void attach ( Subscriber subsc ) f subscribers . addElement ( subsc ) g public void detach ( Subscriber subsc ) f subscribers . removeElement ( subsc ) g replace void changeOp () f expected . changeOp ( ) for ( int i = 0 i < subscribers . s i z e ( ) i ++) f (( Subscriber ) subscribers . elementAt ( i ) ) . update ( this ) g g participant Subscriber f expected void subUpdate ( Publisher publ ) protected Publisher publ public void update ( Publisher aPubl ) f publ = aPubl expected . subUpdate ( publ ) g g g g In addition to replacing existing methods with enhancements, PublisherSubscriberProtocol de nes new elds and methods that are involved in the protocol and establishes the structural relationship between the protocol participants. Note that the protocol in PublisherSubscriber- Protocol is de ned for two hypothetical participants and not in terms of particular classes. As such, it can be applied to di erent publisher/subscribers pairs, as illustrated by the following two connectors. In the rst case, the publisher role is played by the class Point, while the subscriber role is played by a simple class, called ChangePrinter, shown below. Establishing the publisher/subscriber protocol between Point and ChangePrinter is realized by the connector PubSubConn1. Output package class ChangePrinter f void public printR () f System . out . println ( quot; Printer : quot; + this . toString () + quot; read access has occurred . . . quot; + n n ) g void public printW () f System . out . println ( quot; Printer : quot; + this . toString () + 13
  • 14. quot; write access has occurred . . . quot; + n n ) g void public notifyChange ( ) System . out . println ( quot;CHANGE . . . quot; ) f g g ... Deployment package ... connector PubSubConn1 f Point is Publisher with f changeOp = f set , get g g ChangePrinter is Subscriber with f void subUpdate ( Publisher publ ) f notifyChange ( ) System . out . println ( quot;on point object quot; + (( Point ) publ ). toString ( ) ) g g g In a similar way, the following code, illustrates the deployment of the protocol de ned by the PublisherSubscriberProtocol aspect with another application: this time a game package including a class for the TicTacToe game and a class for the graphical interface, GUI, with the latter being an aggregate of two other classes, BoardDisplay and StatusDisplay, as shown in Fig. ??. connector PubSubConn2 f TicTacToe is Publisher with f changeOp = f startGame , newPlayer , putMark , endGamegg f BoardDisplay , StatusDisplay g is Subscriber with f void update ( Publisher publ ) f setGame (( Game) publ ) repaint ( ) g g g Both deployments of the publisher/subscriber aspect shown so far, result in the standard publisher/subscriber protocol, i.e., the protocol with one publisher being subscribed by a single set of subscribers, uniformly interested in any change in the publisher's state. One can also realize modi ed versions of the standard protocol by simply de ning new connectors. For instance, the connectors, PubSubConn3 and PubSubConn4, deploy the protocol with the same classes as PubSubConn1, but now two di erent connection clauses distinguish the noti cation operations that are invoked on the subscribers depending on which access operations are invoked on the publisher. This corresponds to a variation on the publisher/subscriber pattern, where there are several lists of subscribers for one publisher, distinguished by the events they are interested in. connector PubSubConn3 f Point is Publisher with changeOp = set f g ChangePrinter is Subscriber with f void subUpdate ( Publisher publ ) f 14
  • 15. printW ( ) System . out . println ( quot;on point object quot; + (( Point ) publ ). toString ( ) ) g g g connector PubSubConn4 f Point is Publisher with changeOp = get f g ChangePrinter is Subscriber with f void subUpdate ( Publisher publ ) f printR ( ) System . out . println ( quot;on point object quot; + (( Point ) publ ). toString ( ) ) g g g The sets of operations of Point that are mapped to di erent noti cation operations of the subscriber participant need not be disjoint. For instance, we may want to distinguish between set operations that a ect the x-coordinate, respectively, the y-coordinate of a point. The set(int, int), however, will then fall in both categories. This is expressed by the connectors PubSubConn3.1 and PubSubConn3.2 below. connector PubSubConn3 . 1 f Point is Publisher with changeOp = f set , setX g f g ChangePrinter is Subscriber with f void subUpdate ( Publisher publ ) f printW ( ) System . out . println ( quot;on the X coordinate of point object quot; + (( Point ) publ ). toString ( ) ) g g g connector PubSubConn3 . 2 f Point is Publisher with f changeOp = f set , setY g g ChangePrinter is Subscriber with f void subUpdate ( Publisher publ ) f printW ( ) System . out . println ( quot;on the Y coordinate of point object quot; + (( Point ) publ ). toString ( ) ) g g g 1.5 Activating/Deactivating Aspects There are two possible levels of applying aspects: object versus class level, which correspond to two di erent operations in the interface of connectors. Plugging an aspect into an instance of a class is realized by invoking adapt(ClassForParticipant instance) on the corresponding connector. On the contrary, all instances of a class that plays a participant role in an aspect according to the connector c are automatically adapted to their role in the program scope between the 15
  • 16. pair of invocations c.activate() and c.deactivate(). Object level application is illustrated by the client class (client in the sense that it uses Point ChangePrinter and PublisherSubscriberProtocol) Client1, while class level application is illustrated by Client2 in the following. class Client1 f ... public static void main ( String ] args ) f ... Point p = new Point ( ) Point p1 = new Point ( ) p = PubSubConn3 . adapt ( p ) p1 = PubSubConn3 . adapt ( p1 ) ChangePrinter ch = new ChangePrinter ( ) ChangePrinter ch1 = new ChangePrinter ( ) PubSubConn3 . addSubscriber ( ch , p ) p . setX ( 12 ) // w i l l print // Printer ChangePrinter1678 : write access has occurred . . . // in point object Point3578 p1 . setY ( 26 ) // nothing w i l l be printed PubSubConn3 . addSubscriber ( ch1 , p1 ) p1 . setY ( 2 ) // w i l l print : // Printer ChangePrinter1802 : write access has occurred . . . // in point object Point7382 ... PubSubConn3 . remove ( p ) // p w i l l not react as a p u b l i s h e r anymore PubSubConn3 . removeSubscriber ( ch1 , p1 ) ... g ... g class Client2 f ... public static void main ( String ] args ) f ... ShowReadWriteAccessesConn2 . activate ( ) Point p1 = new Point ( 14 , 6) Point p2 = new Point ( 10 , 5 ) Line l = new Line ( p1 , p2 ) p1 . setX ( 10 ) // W w i l l be printed on the screen Point p3 = l . getSource ( ) // R w i l l be printed on the screen ... ShowReadWriteAccessesConn2 . deactivate ( ) p3 . getY ( 10 ) 16
  • 17. // nothing w i l l be printed out ... g g 1.6 Comparison with AspectJ less tangled aspects { aspects easier to understand { aspects easier to reuse { aspects easier to modify better modularity by separating aspect de nition from aspect deployment Application and aspects could be even developed by di erent programmers. 17