Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] SCM & aspectj

Ron Bodkin wrote:
> ... I suspect it will be difficult to implement weaving
> of the same abstract aspect multiple times.

Abstract aspects are not woven -- only concrete aspects are.

FWIW, I think the weave-once rule should be with us for a long
time, because it avoids a ton of difficult problems with
implementing the "single big weave" semantics Gregor described.
Even knowing whether you understood all the difficult problems
is itself a hard problem.

It *is* annoying to rebuild a system, but more troubling,
any libraries should be retested if they are to be woven
with application aspects, at least until we prove what aspects
are non-interfering.  Aspects are no different from any
other code in this respect, and we can't assume we're not
breaking the libraries until we can verify as much with
analysis or testing.

So my response to Eric's original concern would be to
understand more carefully what kind of testing needs to be
done for what kinds of aspects, and to automate the analysis
required to typify the aspects if not also the testing
itself.  The burden of rebuilding the system is annoying
to developers accustomed to fast build cycles, but small
relative to the potential burden of retesting.  This
testing should be reduced to what's really required by
the particular aspects, rather than what's potentially
required by more integrated aspects, for it to be
manageable.  (Understanding these interactions
might be a starting point for understanding multi-weave
implementations.)

As Eric suggested, SCM steps reflect a division of
responsibility for code.  Library or system test developers
might not test for a fault introduced by the misapplication
of an application aspect they didn't know about to library
code.  The developer applying aspects system-wide has
to take responsibility for the quality of the aspect and
the code it affects.  That probably means at least running
both unit and system tests for the library and the
application, and considering what other testing is
required.

Wes

Ron Bodkin wrote:
I agree with this principle. It would be very beneficial for ajc to support applying abstract aspects like Observer more than once. By contrast, applying the same concrete aspect more than once is not sensible (if one supported it at all, it would have the same effect as weaving once).

However, I suspect it will be difficult to implement weaving of the same abstract aspect multiple times. Hopefully I'm wrong.

Ron

Ron Bodkin
Chief Technology Officer
New Aspects of Security
m: (415) 509-2895


------------Original Message-------------
From: "Gregor Kiczales" <gregor@xxxxxxxxx>
To: <aspectj-users@xxxxxxxxxxx>
Date: Sat, Jul-12-2003 2:26 PM
Subject: RE: [aspectj-users] SCM & aspectj

I think that the "one weave rule" and the new "supporting multiple weaves"
should be considered properties of ajc, and not AspectJ.  A corollary of
that is that the semantics of multiple weaves should be the same as they
would be for a single big weave.

Otherwise the semantics is going to start getting pretty squirrely.  With
a rule like the above, you could apply Observer more than once, which makes
sense.  But you couldn't do something like try to find join points that
occurred within a class only because a previous weave had copied them there.


-----Original Message-----
From: aspectj-users-admin@xxxxxxxxxxx [mailto:aspectj-users-admin@xxxxxxxxxxx] On Behalf Of Lesiecki Nicholas
Sent: Saturday, July 12, 2003 12:10 PM
To: aspectj-users@xxxxxxxxxxx
Subject: RE: [aspectj-users] SCM & aspectj


In Response to Ron's comment:

<<<
One of
the big challenges I see is in defining behavior if you apply the same
aspect (even an abstract aspect) more than once. Presumably that would
still
be an error.

Perhaps I'm misunderstanding you, but this doesn't make sense to me.
Presumably I could wish to apply an Observer-Pattern aspect to the same class twice, during two different build steps. For instance if an Employee changes status I may want both a GUI view and a remote resource notified.

Does this present a logical problem?

I would wholeheartedly support an RFE removing the one-weave rule. As it is, it could make it very difficult to reuse pre-woven jars with your own aspects. For instance, the Cactus project uses aspects internally. If I
wanted to apply some aspects of my own to solve a testing problem, I
couldn't do it. This promotes a tension between those who wish to use
aspects in building reusable components and frameworks, and those who wish
to use them to build applications.

Cheers,
Nick

--- Eric.D.Friedman@xxxxxxxxxxxxxx wrote:

Ron,

Thanks very much for your thoughtful reply. For the

record, one other

problem that would arise out of multiple weaving passes is

that of aspect

dominance. Suppose that a library was woven with certain

aspects and

then
rewoven with others. There'd be no way to elegantly handle

the question

of
execution order, since the library aspects might

encapsulate behavior

that
would be distorted by a different execution order, but the

build process

for
those aspects wouldn't be capable of asserting their

dominance (or lack

thereof) w.r.t to application level aspects. A simple

example of this is

the old timing + logging case -- should timing aspects

include time spent

logging?  Suppose that you decide to answer that question by making
logging
dominate timing. OK, but what if you've modularized your

builds such

that
logging doesn't know that timing exists and so can't dominate it?  A
nasty
problem, IMHO.

In any event, thanks for your practical advice; it's appreciated.

Eric

-----Original Message-----
From: Ron Bodkin [mailto:rbodkin@xxxxxxxxxxx]
Sent: Friday, July 11, 2003 1:53 PM
To: aspectj-users@xxxxxxxxxxx
Subject: Re: [aspectj-users] SCM & aspectj


Eric,

This sounds like a compelling example of why ajc should

allow weaving

more
than once. Allowing one aspect to layer on top of another one
independently
seems to be completely in synch with the spirit of AOP. I'd

definitely

support an RFE for 1.2 to allow this.

We should investigate how much work it would take to

support this. One of

the big challenges I see is in defining behavior if you

apply the same

aspect (even an abstract aspect) more than once. Presumably

that would

still
be an error. Given that, I wonder how hard this would be to

support. One

problem I can think of is naming the AspectJ-introduced members and
attributes in the bytecode: perhaps that could be based on

the specific

aspect or class in question?

For now, I would have the build script for the reusable

libraries create

multiple versions of the jars, which weave all useful

combinations of

aspects into the libraries. This lets applications just use

jars; they

pick
among preconfigured versions. It seems to me to be the best

of the bad

choices available.

Ron

Ron Bodkin
Chief Technology Officer
New Aspects of Security
m: (415) 509-2895


------------Original Message-------------
From: Eric.D.Friedman@xxxxxxxxxxxxxx
To: aspectj-users@xxxxxxxxxxx
Date: Fri, Jul-11-2003 10:40 AM
Subject: [aspectj-users] SCM & aspectj

I have a somewhat lengthy question about software configuration

management

(SCM) practices and aspectj. I'd be grateful for any

insight you folks

can

offer.

On a large project, it's quite common to break the code

base up into

separate libraries that roughly equate to the "separation

of concerns"

in

the design. So, for example, a large web application

might contain

several

jar files of "application" code, in addition to the usual

servlets and

other

GUI related code.   The goal of this practice would be to enable

developers

to work on those underlying libraries independently of the web

application

context. This is a good practice because it increases

the likelihood

that

the underlying libraries can be reused in other (non-web)

contexts as

well.

As a matter of developer efficiency, this approach also allows for

"build

avoidance" -- if you're working on the GUI, you don't need to keep
recompiling the underlying libraries, and vice versa.

It's also quite common, in my experience, for those underlying

libraries
to

have their own unit test suites to cover the behavior of

the library in

a

manner that doesn't assume usage in the web context.

Finally, it's

common

to want to "certify" a version of the library in its own right,
independently of the application(s) in which it's deployed.  It's

therefore

important the library be buildable in a consistent and

repeatable way

no

matter which application ends up using it.

Consider the following example: a project contains 3

distinct layers,

packaged as jars, and organized in separate builds for the reasons

described

above:
base messaging layer -- a distributed messaging framework

of some kind,

say

SOAP  [layer 1]
business logic layer -- components that represent

business entities and

that

rely on the base messaging layer to get things done [layer 2]
presentation layer -- web stuff, say struts actions --

implemented in

terms

of the business logic layer [layer 3a]

Let's further suppose that the two first two layers are

reused in a

second

application, one with a different presentation layer (a

conventional

GUI,
or

command line interface) [layer 3b].

So, there are two applications, but they share two

underlying libraries

in

common. Application A = layers {1,2,3a} ; Application B

= layers {1,

2,
3b}

Enter AspectJ. As you're aware, it is not possible to

weave the same

bytecode more than once in AspectJ. What's the "best"

way to manage

aspects

that cut across layers? Assume that you are using

aspects to implement

some

fundamental, er, aspect of the application, not merely bolting on

logging,

tracing, or timing after the thought. How do you deal

with cases in

which
a

higher layer (3a or 3b) wants to introduce advice of an

application-specific

nature into the shared libraries' classes, which may

already be woven

with

aspects of their own?

One answer is obviously to pull all aspects up to the

top-level build

(the

one that rolls up the different layers into application A

or B).  But

this

doesn't let you use aspects in the lower layers as more than an
afterthought. That is, you couldn't implement

fundamental behavior of

a

lower layer in an aspect and expect that layer's unit

tests to run or

even

compile.

Another incomplete answer would be to spread aspects

across the layers,

but

then you have to be extremely careful to avoid the one-weave

restriction.

It's not hard to conjure up real applications for which

this would not

work.

the only approach I know of that would work in all cases

is to always

compile everything, but then you lose the build avoidance

benefits, and

you

increase the risk of library and application code being

co-mingled.
Also,

you lose the ability to test/certify a library without

regard to the

application that uses it.

Many thanks in advance for your thoughts on this one,
Eric Friedman
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users


_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users



_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users


_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users




Back to the top