Skip to main content

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

Ok, perhaps we can start experimenting with multi-weave...

Ron Bodkin wrote:

I think there's more than an annoyance factor involved.

I didn't say there was only an annoyance factor.

I said the real question is how to factor responsibilities
when aspects affect library code.  No one disputes that ajc's
current implementation interferes with with current SCM practice.
But I doubt current build and testing practice should stay the
same when using aspects, even if you have multi-weave.  When
Eric emails that the current implementation of AspectJ
interferes with using tested libraries by prohibiting multi-
weave, enabling multi-weave is not a sufficient answer
because it begs the question of what should be retested
when using a re-woven library.

Since we know that we don't know how multi-weave can safely work,
the best path is to default to leaving the decision in the hands
of library writers.  If they want to support subsequent weaving,
they can provide unwoven variants along with their aspects for
integration in a system build. (They have to provide binary
aspects anyway for the classpath.)

Finally, when I said weaving an abstract aspect, I meant
> meaning weaving a concrete aspect that extends the same
> abstract aspect.

>>>However, I suspect it will be difficult to implement
>>> weaving of the same abstract aspect multiple times.

I'd think that would not be hard: use an attribute to tag
any class woven by an aspect as such, and don't re-implement
inter-type declarations.

Which is to say, "multi-weave" could be implemented as
reweave-everything, with sufficient information in bytecode
attributes to backtrack to unwoven classes and aspects.
It's not really multi-weave, but it would
look like it for the purposes of SCM.  The implementation
could advance incrementally with safe local optimizations
on this worst-case algorithm, or some smart cookie can come
up with a better comprehensive approach.  We can roll it
out as an X compiler flag, so users can help distinguish
safe interactions from bad ones until we're sure of it.
(We'd have to decide whether to apply revived library
aspects to the broader scope of the reweaving, and
whether/how to maintain binary compatibility with
classes woven by ajc 1.1.X).

Note that there's still a separate question of whether
the library and the application can be separately
woven.  I don't believe that we've said yet that
the same thing results when weaving two classes with
an aspect in the same or in separate processes,
though this is implied in our current incremental
compilation scheme.  Until we make that claim,
even with multi-weaving you'd have to weave the
aspect with both the library and the application at
the same time, which absorbs the library into the
application (and makes it difficult to share the
library with other applications).  If Jim and Erik
think we can claim that now, it's worth adding to
the documentation of our implementation.

In any case, since Adrian also wants to fix this, he might
be interested in this approach of using an experimental
flag and a worst-case default implementation.  We'll see
what Jim and Erik think; they're the ones who have
thought about this and know what some of the real issues are,
and who would be advising the effort if not implementing it.

Wes


Ron

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


------------Original Message-------------
From: Wes Isberg <wes@xxxxxxxxxxxxxx>
To: aspectj-users@xxxxxxxxxxx
Date: Sun, Jul-13-2003 11:25 AM
Subject: 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


_______________________________________________
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