convert website to Lazarus/Phoenix
diff --git a/_projectCommon.php b/_projectCommon.php
index b3c6fc8..1af89cd 100644
--- a/_projectCommon.php
+++ b/_projectCommon.php
@@ -3,35 +3,43 @@
# Set the theme for your project's web pages.
# See the Committer Tools "How Do I" for list of themes
# https://dev.eclipse.org/committers/
- $theme = "Phoenix";
+ $theme = "Lazarus";
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/common/project-info.class.php");
#$projectInfo = new ProjectInfo("technology.aspectj");
#$projectInfo->generate_common_nav( $Nav );
+ $branding = <<<EOBRANDING
+<STYLE TYPE="text/css">
+ #midcolumn { margin-top: 5px; }
+ body { font-size: small; }
+</STYLE>
+<div id="branding">
+<img src="/aspectj/aspectjbanner2.png" width="502" height="42" alt="AspectJ">
+</div>
+EOBRANDING;
+$Menu->setProjectBranding($branding);
+
$Nav->setLinkList(array());
# Define your project-wide Nav bars here.
# Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
- $Nav->addNavSeparator("Eclipse Home", "/index.php");
- $Nav->addNavSeparator("AspectJ", "/aspectj/index_new.php");
+ $Nav->addNavSeparator("AspectJ", "/aspectj/index.php");
$Nav->addCustomNav(" About", "/aspectj/description.php", "_self", 1);
- $Nav->addCustomNav(" Committers", "/aspectj/committers.php", "_self", 1);
+ $Nav->addCustomNav(" Team", "/aspectj/team.php", "_self", 1);
$Nav->addCustomNav(" Plans", "/aspectj/plans_new.php", "_self", 1);
$Nav->addNavSeparator("Users", "", "_self", 1);
#$Nav->addCustomNav(" Getting Started", "/aspectj/gettingstarted.php", "_self", 1);
$Nav->addCustomNav(" Downloads", "/aspectj/downloads.php", "_self", 1);
+ $Nav->addCustomNav(" Docs", "/aspectj/docs.php", "_self", 1);
$Nav->addCustomNav(" Bugs", "/aspectj/bugs.php", "_self", 1);
- $Nav->addCustomNav(" FAQ", "/aspectj/doc/released/faq.html", "_self", 1);
- #$Nav->addCustomNav(" Demos", "/aspectj/demos/", "_self", 1);
- #$Nav->addCustomNav(" New Features", "/aspectj/newfeatures/", "_self", 1);
- $Nav->addCustomNav(" Mailing list", "http://dev.eclipse.org/mailman/listinfo/aspectj-users", "_self", 1);
- $Nav->addCustomNav(" Newsgroup", "http://www.eclipse.org/newsportal/thread.php?group=eclipse.technology.aspectj", "_self", 1);
+ $Nav->addCustomNav(" FAQ", "/aspectj/doc/released/faq.php", "_self", 1);
+ $Nav->addCustomNav(" Mailing lists", "/aspectj/userlists.php", "_self", 1);
$Nav->addNavSeparator("Developers", "", "_self", 1);
#$Nav->addCustomNav(" Contributing", "/aspectj/developers.php", "_self", 1);
- $Nav->addCustomNav(" CVS", "http://dev.eclipse.org/viewcvs/indextech.cgi/org.aspectj/modules/", "_self", 1);
+ $Nav->addCustomNav(" CVS", "http://dev.eclipse.org/viewcvs/index.cgi/org.aspectj/?cvsroot=Tools_Project", "_self", 1);
$Nav->addCustomNav(" Mailing list", "http://dev.eclipse.org/mailman/listinfo/aspectj-dev", "_self", 1);
#$Nav->addCustomNav(" Work tasks", "/aspectj/tasks.php", "_self", 1);
diff --git a/blank.php b/blank.php
new file mode 100644
index 0000000..f7da3f3
--- /dev/null
+++ b/blank.php
@@ -0,0 +1,47 @@
+<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
+
+ #*****************************************************************************
+ #
+ # template.php
+ #
+ # Author: Denis Roy
+ # Date: 2005-06-16
+ #
+ # Description: Type your page comments here - these are not sent to the browser
+ #
+ #
+ #****************************************************************************
+
+ #
+ # Begin: page-specific settings. Change these.
+ $pageTitle = "The AspectJ Project";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
+ $pageAuthor = "Type your name here";
+
+ # Add page-specific Nav bars here
+ # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+ # $Nav->addNavSeparator("My Page Links", "downloads.php");
+ # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
+ # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
+
+ # End: page-specific settings
+
+ # Paste your HTML content between the EOHTML markers!
+ $html = <<<EOHTML
+
+<div id="maincontent">
+ <div id="midcolumn" style="width: 80%">
+
+ <h1></h1>
+
+ </div>
+
+</div>
+
+
+EOHTML;
+
+
+ # Generate the web page
+ $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
diff --git a/bugs.php b/bugs.php
index ed44384..418ade5 100644
--- a/bugs.php
+++ b/bugs.php
@@ -15,7 +15,7 @@
#
# Begin: page-specific settings. Change these.
$pageTitle = "AspectJ Bugs";
- $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse, Contributors";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
$pageAuthor = "Andy Clement";
# Add page-specific Nav bars here
@@ -26,16 +26,14 @@
# End: page-specific settings
#
-
- $rightcolumn = file_get_contents("rightcolumn.html");
-
+
# Paste your HTML content between the EOHTML markers!
$html = <<<EOHTML
<div id="maincontent">
<div id="midcolumn">
- <div align="center"><h1>$pageTitle</h1></div>
+ <h1>Bugs</h1>
<p>The best way to report a problem or request a new feature in AspectJ
is to use the Bugzilla system. Here are some useful links to get you
@@ -56,8 +54,6 @@
<hr class="clearer" />
</div>
-$rightcolumn
-
</div>
diff --git a/description.php b/description.php
index 829e878..75f1bd6 100644
--- a/description.php
+++ b/description.php
@@ -25,8 +25,6 @@
# $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
# End: page-specific settings
-
- $rightcolumn = file_get_contents("rightcolumn.html");
# Paste your HTML content between the EOHTML markers!
$html = <<<EOHTML
@@ -34,7 +32,7 @@
<div id="maincontent">
<div id="midcolumn">
- <div align="center"><h1>$pageTitle</h1></div>
+ <h1>About</h1>
<table border="0" cellpadding="4">
<tr>
<td valign="top"><img border=0 src="logo.gif" width="164" height="229" alt="AJDT screenshot"></td>
diff --git a/doc/released/faq.php b/doc/released/faq.php
new file mode 100644
index 0000000..5f74c72
--- /dev/null
+++ b/doc/released/faq.php
@@ -0,0 +1,3583 @@
+<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
+
+ #*****************************************************************************
+ #
+ # template.php
+ #
+ # Author: Denis Roy
+ # Date: 2005-06-16
+ #
+ # Description: Type your page comments here - these are not sent to the browser
+ #
+ #
+ #****************************************************************************
+
+ #
+ # Begin: page-specific settings. Change these.
+ $pageTitle = "AspectJ Frequently Asked Questions";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
+ $pageAuthor = "Type your name here";
+
+ # Add page-specific Nav bars here
+ # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+ # $Nav->addNavSeparator("My Page Links", "downloads.php");
+ # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
+ # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
+
+ # End: page-specific settings
+
+ # Paste your HTML content between the EOHTML markers!
+ $html = <<<EOHTML
+
+<div id="maincontent">
+ <div id="midcolumn" style="width: 80%">
+
+ <h1>Frequently Asked Questions</h1>
+
+<p>Copyright (c) 1997-2001 Xerox Corporation,
+ 2002 Palo Alto Research Center, Incorporated,
+ 2003-2006 Contributors. All rights reserved.
+ </p><p>Last updated March 28, 2006
+ </p><p>
+ For a list of recently-updated FAQ entries, see <a href="#q:faqchanges">Q:What has changed since the last FAQ version?</a>
+ </p><div class="qandaset"><dl><dt>1 <a href="#overview">Overview</a></dt><dd><dl><dt>1. <a href="#q:whatisaj">What is AspectJ?</a></dt><dt>2. <a href="#q:benefits">What are the benefits of using AspectJ?</a></dt><dt>3. <a href="#q:compability">Can AspectJ work with any Java program?</a></dt><dt>4. <a href="#q:license">How is AspectJ licensed?</a></dt><dt>5. <a href="#q:project">What is the AspectJ Project?</a></dt></dl></dd><dt>2 <a href="#quickstart">Quick Start</a></dt><dd><dl><dt>1. <a href="#q:requirements">
+ What Java versions does AspectJ require and support?
+ </a></dt><dt>2. <a href="#q:install">How do I download and install AspectJ?</a></dt><dt>3. <a href="#q:startUsingAJ">How should I start using AspectJ?</a></dt><dt>4. <a href="#q:integrateWithDevTools">How does AspectJ integrate with existing Java development
+ tools?
+ </a></dt></dl></dd><dt>3 <a href="#typicalprograms">Typical AspectJ programs</a></dt><dd><dl><dt>1. <a href="#q:aspectsoptional">Are aspects always optional or non-functional parts of
+ a program?
+ </a></dt><dt>2. <a href="#q:developmentAndProductionAspects">
+ What is the difference between development and production aspects?
+ </a></dt><dt>3. <a href="#q:devAspects">
+ What are some common development aspects?
+ </a></dt><dt>4. <a href="#q:prodAspects">
+ What are some common production aspects?
+ </a></dt></dl></dd><dt>4 <a href="#concepts">Basic AOP and AspectJ Concepts</a></dt><dd><dl><dt>1. <a href="#q:crosscutting">What are scattering, tangling, and crosscutting?</a></dt><dt>2. <a href="#q:joinpoints">What are join points?</a></dt><dt>3. <a href="#q:pointcut">
+ What is a pointcut?
+ </a></dt><dt>4. <a href="#q:advice">What is advice?</a></dt><dt>5. <a href="#q:declarations">What are inter-type declarations?</a></dt><dt>6. <a href="#q:whatisanaspect">What is an aspect?</a></dt></dl></dd><dt>5 <a href="#whyaop">Why AOP?</a></dt><dd><dl><dt>1. <a href="#q:ccfromflaws">Are crosscutting concerns induced by flaws in parts of the
+ system design, programming language, operating system, etc. Or is
+ there something more fundamental going on?
+ </a></dt><dt>2. <a href="#q:definingaspectspercc">Does it really make sense to define aspects in terms of
+ crosscutting?
+ </a></dt><dt>3. <a href="#q:domainspecific">Is AOP restricted to domain-specific
+ applications?
+ </a></dt><dt>4. <a href="#q:whyaopifinterceptors">Why do I need AOP if I can use interceptors
+ (or JVMPI or ref
+ lection)?
+ </a></dt></dl></dd><dt>6 <a href="#related">Related Technology</a></dt><dd><dl><dt>1. <a href="#q:comparetonewforms">
+ How does AspectJ compare to other new forms of programming?
+ </a></dt><dt>2. <a href="#q:compartoreflection">How do you compare the features of AspectJ with
+ reflective systems?
+ </a></dt><dt>3. <a href="#q:comparetomixin">How do AspectJ features compare with those of mixin-based
+ inheritance?
+ </a></dt><dt>4. <a href="#q:dynamicaop">How does AspectJ compare with more dynamic AOP?
+ </a></dt><dt>5. <a href="#q:aopandxp">What is the relationship between AOP and
+ XP (extreme programming AKA agile methods)?
+ </a></dt><dt>6. <a href="#q:aspectjandcsharp">Will you support C#?</a></dt></dl></dd><dt>7 <a href="#adoption">Deciding to adopt AspectJ</a></dt><dd><dl><dt>1. <a href="#q:productplans">
+ Is it safe to use AspectJ in my product plans?
+ </a></dt><dt>2. <a href="#q:effectonsize">What is the effect of using AspectJ on the source code
+ size of programs?
+ </a></dt><dt>3. <a href="#q:effectonperformance">
+ Does AspectJ add any performance overhead?
+ </a></dt><dt>4. <a href="#q:modularityviolations">
+ I've heard that AspectJ leads to modularity violations. Does it?
+ </a></dt><dt>5. <a href="#q:encapsulation">
+ Why does AspectJ permit aspects to access and add members of another type?
+ Isn't that violating OO encapsulation?
+ </a></dt><dt>6. <a href="#q:aspectjandj2ee">Can I use AspectJ with J2EE?</a></dt><dt>7. <a href="#q:aspectjandgj">Can I use AspectJ with Generic Java?</a></dt><dt>8. <a href="#q:aspectjandj2me">Can I use AspectJ with J2ME?</a></dt><dt>9. <a href="#q:aopinjava"> Are you working to put AOP into Java?
+ It seems that every AOP toolset currently uses proprietary mechanisms
+ to describe point-cuts, etc.
+ </a></dt><dt>10. <a href="#q:support">What kind of support is available?</a></dt><dt>11. <a href="#q:mailingLists">What mailing lists are there?</a></dt></dl></dd><dt>8 <a href="#compiler">Using the AspectJ compiler</a></dt><dd><dl><dt>1. <a href="#q:compilerRequired">
+ Do I have to use the AspectJ compiler?
+ </a></dt><dt>2. <a href="#q:requiredsources">
+ What files do I need to include when compiling AspectJ programs?
+ </a></dt><dt>3. <a href="#q:listingsources">I have to list many files in the command line to
+ compile with ajc. Is there any other way to
+ provide the file names to ajc?
+ </a></dt><dt>4. <a href="#q:compilerVM">What Java virtual machine (JVM) do I use to run the
+ AspectJ compiler?
+ </a></dt><dt>5. <a href="#q:compilingForDifferentVMs">How can I use ajc to compile
+ programs for a JVM that is different from the one used to run it?
+ </a></dt><dt>6. <a href="#q:assert">Does the ajc compiler support
+ the assert keyword in Java 1.4?
+ </a></dt><dt>7. <a href="#q:generics">Does the ajc compiler support
+ generics and the other new language features of Java 5?
+ </a></dt><dt>8. <a href="#q:versionCompatibility">Will aspects work with different versions of the compiler/weaver and runtime?
+ </a></dt><dt>9. <a href="#q:msjvm">Are there any issues using AspectJ with the Microsoft
+ JVM?
+ </a></dt><dt>10. <a href="#q:javacbytecode">Does ajc rely
+ on javac for generating Java bytecode
+ (.class) files?
+ </a></dt><dt>11. <a href="#q:parsergenerators">
+ I noticed the AspectJ compiler doesn't use a parser generator. Why is that?
+ </a></dt><dt>12. <a href="#q:howIncrementalWorks">How does incremental mode work?
+ </a></dt></dl></dd><dt>9 <a href="#devtools">Integrating AspectJ into your development environment</a></dt><dd><dl><dt>1. <a href="#q:knowWhenAspectsAffectClasses">How do I know which aspects affect a class when looking
+ at that class's source code?
+ </a></dt><dt>2. <a href="#q:idesupport">What kind of IDE support is available for developing
+ AspectJ programs?
+ </a></dt><dt>3. <a href="#q:idesupportplans">What plans are there to support my IDE?</a></dt><dt>4. <a href="#q:portingajde">Can I port AJDE support to my development environment?</a></dt><dt>5. <a href="#q:hybridbuilds">I want the aspects for development builds but
+ remove them for production builds. How can I set up the build
+ system so they are unpluggable? And so I use javac
+ in my production build?
+ </a></dt><dt>6. <a href="#q:stepwiseBuilds">
+ We compile module jars and then assemble them. Can we continue this with AspectJ?
+ </a></dt><dt>7. <a href="#q:incrementalModuleCompiles">We use modules and would like to use incremental compilation.
+ Is that possible?
+ </a></dt></dl></dd><dt>10 <a href="#notes">Programming notes and tips</a></dt><dd><dl><dt>1. <a href="#q:methodsignatures">Is it possible to change methods by introducing keywords (like
+ synchronized), adding parameters,
+ or changing the "throws" clause?
+ </a></dt><dt>2. <a href="#q:seeingjoinpoints">
+ I don't understand what join points exist. How can I see them?
+ </a></dt><dt>3. <a href="#q:comparecallandexecution">
+ What is the difference between call and execution join points?
+ </a></dt><dt>4. <a href="#q:comparecflowandcflowbelow">
+ What is the difference between cflow and cflowbelow?
+ </a></dt><dt>5. <a href="#q:recursiveentrypoints">How do I say that I want the topmost entrypoint in a
+ recursive call? How about the most-recent prior entrypoint?
+ </a></dt><dt>6. <a href="#q:initializationjoinpoints">What is the difference between constructor call,
+ constructor execution, initialization, and static
+ initialization join points?
+ </a></dt><dt>7. <a href="#q:adviseconstructors">How do I work with an object right when it is created?
+ </a></dt><dt>8. <a href="#q:andingpointcuts">
+ I want advice to run at two join points, but it doesn't run at all. What gives?
+ </a></dt><dt>9. <a href="#q:staticfieldreferences">
+ How do I refer to a static field when my advice crosscuts multiple classes?
+ </a></dt><dt>10. <a href="#q:interfacesastypepatterns">I would like to reuse a type pattern, e.g., to
+ write advice that is limited to a certain set of classes.
+ Do I have to retype it each time?
+ </a></dt><dt>11. <a href="#q:exampleprograms">Where do I find example programs and how-to's?</a></dt><dt>12. <a href="#q:aspectlibraries">Are aspect libraries available?</a></dt><dt>13. <a href="#q:serialversionuid">How does ajc interact with the
+ serialVersionUID?
+ </a></dt><dt>14. <a href="#q:applets">How can I use AspectJ with applets?</a></dt><dt>15. <a href="#q:typeoblivious">How can I specify types for advice that captures primitives, void, etc.?</a></dt><dt>16. <a href="#q:versioninfo">How do I detect which version I am running?</a></dt></dl></dd><dt>11 <a href="#problems">Common Problems</a></dt><dd><dl><dt>1. <a href="#q:infiniterecursion">When I run, I get a StackOverflowError
+ (or a long stack trace or no output whatsoever)
+ </a></dt><dt>2. <a href="#q:typelessdeclarations">I've declared a field on every class in
+ my package; how do I use it in advice?
+ </a></dt><dt>3. <a href="#q:ajcoom">The AspectJ compiler aborts with an OutOfMemoryError when
+ compiling many classes. How can I fix this?
+ </a></dt><dt>4. <a href="#q:duplicateclass">
+ Why do I get a message that my class is already defined?
+ </a></dt><dt>5. <a href="#q:ajcrecompile">
+ ajc recompiles all files every time.
+ How can I make it recompile only the files that have changed?
+ </a></dt><dt>6. <a href="#q:ajcjvm">
+ ajc is using the wrong JVM. How do I
+ fix it?
+ </a></dt><dt>7. <a href="#q:idebalkingataspects">My IDE is trying to parse AspectJ files which makes my project unusable.
+ What can I do?
+ </a></dt><dt>8. <a href="#q:idememory">I used to be able to compile my program in my IDE, but when I
+ use AJDE, I run out of memory (or it goes really slow).
+ </a></dt><dt>9. <a href="#q:noaspectbound">
+ When I run, I get a NoAspectBoundException or a
+ ClassNotFound message for NoAspectBoundException.
+ </a></dt><dt>10. <a href="#q:stacktraces">
+ My stack traces don't make sense. What gives?
+ </a></dt><dt>11. <a href="#q:advicenotrunning">
+ My advice is not running (or running twice), and I don't know why.
+ </a></dt><dt>12. <a href="#q:adviceOnOveriddenMethods">
+ My advice runs for each overridden method!
+ </a></dt><dt>13. <a href="#q:tejpsp">
+ I don't understand when thisEnclosingJoinPointStaticPart is available.
+ </a></dt><dt>14. <a href="#q:packagedeclares">
+ I declared a member on a class with package access, but other classes in the package cannot see it.
+ </a></dt><dt>15. <a href="#q:interfaceDeclarations">I declared a member on a interface, but javac does not see it.
+ </a></dt><dt>16. <a href="#q:cantfindjavac">
+ ajc 1.0 complains that it can't find
+ javac. What's wrong?
+ </a></dt><dt>17. <a href="#q:ajdocneeds13">
+ I'm running under 1.4, but ajdoc asks for 1.3
+ (or throws IllegalAccessError for HtmlWriter.configuration)
+ </a></dt><dt>18. <a href="#q:compileunits">I set up different files to my compiles to change what
+ the aspects see, but now I don't
+ understand how the aspects are working.
+ </a></dt><dt>19. <a href="#q:readingpreprocessedcode">I'm reading the code generated by ajc 1.0
+ in -preprocess mode, and it seems like it would not
+ work (or "like it works this way").
+ </a></dt><dt>20. <a href="#q:injection">I've heard AspectJ can generate or inject code into my code.
+ Is this true?
+ </a></dt><dt>21. <a href="#q:newjoinpoints">Why can't AspectJ pick out local variables (or array elements or ...)?
+ </a></dt><dt>22. <a href="#q:reflectiveCalls">Why doesn't AspectJ pick out reflective calls?
+ The pointcut call(void run())
+ won't pick out a call using reflection, like
+ ((Method)run).invoke(null, args).
+ </a></dt><dt>23. <a href="#q:currentbugs">What are the bugs now most affecting users?</a></dt><dt>24. <a href="#q:runtimeMemory">What extra memory is required at runtime?
+ </a></dt></dl></dd><dt>12 <a href="#aj11">AspectJ 1.1 and eclipse.org</a></dt><dd><dl><dt>1. <a href="#q:whyeclipse">Why did the AspectJ project move to eclipse.org?
+ </a></dt><dt>2. <a href="#q:eclipserequired">Do I have to download Eclipse to use AspectJ?
+ </a></dt><dt>3. <a href="#q:eclipseetc">What are the relationships between AspectJ, JDT,
+ Eclipse, AJDT, and IDE support generally?
+ </a></dt></dl></dd><dt></dt><dd><dl><dt>1. <a href="#q:aspectj5features">
+ What are the new features of AspectJ 5?
+ </a></dt><dt>2. <a href="#q:codeversusannotationstyles">
+ Should I use code- or annotation-style aspects?
+ </a></dt><dt>3. <a href="#q:aspectj5ltw">
+ What's new about the load-time weaving support in AspectJ 5?
+ </a></dt></dl></dd><dt>14 <a href="#Technology">Understanding AspectJ Technology</a></dt><dd><dl><dt>1. <a href="#q:implementation">Do I need to know how the compiler or weaver works?
+ </a></dt><dt>2. <a href="#q:whitepapers">How does the compiler/weaver work? Are there any white papers?
+ </a></dt><dt>3. <a href="#q:reflection">Does AspectJ use reflection at runtime?
+ </a></dt><dt>4. <a href="#q:loadtimeWeaving">What about load-time weaving? Can I weave aspects at runtime?
+ </a></dt></dl></dd><dt>15 <a href="#Developers">AspectJ Project Development</a></dt><dd><dl><dt>1. <a href="#q:howitworks">I'm interested in the code implementing AspectJ.
+ </a></dt><dt>2. <a href="#q:contributions">How can I get involved with developing the AspectJ project?
+ </a></dt><dt>3. <a href="#q:buildingsource">How do I get and compile the source code for AspectJ?
+ </a></dt><dt>4. <a href="#q:buildingAspectJAndAJDT">How do I build AspectJ and integrate it into AJDT?
+ </a></dt><dt>5. <a href="#q:devDocs">Where do I find developer documentation on building and testing AspectJ source code?
+ </a></dt><dt>6. <a href="#q:harnesstestcases">How should I submit test cases for bugs?
+ </a></dt><dt>7. <a href="#q:testharness">I'd like to run my test case. How do I get the test harness?
+ </a></dt><dt>8. <a href="#q:bcel">BCEL is used by AspectJ but it's not actively developed. Will you change?
+ </a></dt></dl></dd><dt>16 <a href="#help">Getting Help</a></dt><dd><dl><dt>1. <a href="#q:moreaboutaj">
+ How do I find out more about AspectJ?
+ </a></dt><dt>2. <a href="#q:bugreports">How do I submit a bug report?</a></dt><dt>3. <a href="#q:talktousers">
+ How do I communicate with other AspectJ users?
+ </a></dt><dt>4. <a href="#q:searchingsite">
+ How can I search the email archives or the web site?
+ </a></dt><dt>5. <a href="#q:writingbugsandemails">
+ How should I write email queries?
+ </a></dt><dt>6. <a href="#q:idebugs">
+ How do I write bugs for IDE support?
+ </a></dt><dt>7. <a href="#q:ajcbugs">
+ How do I write bugs for the AspectJ compiler?
+ </a></dt><dt>8. <a href="#q:teachingmaterials">
+ Can you recommend reading or teaching material for AspectJ?
+ </a></dt><dt>9. <a href="#q:consulting">
+ Where can our group get consulting and support?
+ </a></dt><dt>10. <a href="#q:faqchanges">
+ What has changed since the last FAQ version?
+ </a></dt></dl></dd><dt>17 <a href="#project">About the AspectJ Project</a></dt><dd><dl><dt>1. <a href="#q:opensource">What does the fact that AspectJ is an Open Source
+ Project mean to me?
+ </a></dt><dt>2. <a href="#q:standardization">What are your plans to make AspectJ a general feature
+ of Java supported by Sun and the other key players in the Java
+ Industry?
+ </a></dt><dt>3. <a href="#q:bytecodeweaving">When will AspectJ work from class files?
+ When will it work at class-loading time?
+ </a></dt><dt>4. <a href="#q:differences">What are the differences between the current and
+ previously released versions of AspectJ?
+ </a></dt><dt>5. <a href="#q:schedule">
+ What is the AspectJ development schedule?
+ </a></dt><dt>6. <a href="#q:java5">
+ Will AspectJ support Java 5?
+ </a></dt></dl></dd></dl><div class="qandadiv"><h3 class="title"><a name="overview"></a>1 Overview</h3><div class="qandaentry"><div class="question"><p><a name="q:whatisaj"></a><b>1. </b>What is AspectJ?</p></div><div class="answer"><p><a name="d0e23"></a><b></b>
+ AspectJ(tm) is a simple and practical extension to the
+ Java(tm) programming
+ language that adds to Java aspect-oriented programming (AOP)
+ capabilities. AOP allows developers to reap the benefits of
+ modularity for concerns that cut across the natural units of
+ modularity. In object-oriented programs like Java, the natural unit
+ of modularity is the class. In AspectJ, aspects modularize concerns that
+ affect more than one class.
+ </p><p>You compile your program using the AspectJ compiler
+ (perhaps using the supported development environments)
+ and then run it,
+ supplying a small (< 100K) runtime library.
+ </p><p>The AspectJ technologies include
+ a compiler (<tt>ajc</tt>),
+ a debugger (<tt>ajdb</tt>),
+ a documentation generator (<tt>ajdoc</tt>),
+ a program structure browser (<tt>ajbrowser</tt>),
+ and integration with
+ Eclipse, Sun-ONE/Netbeans, GNU Emacs/XEmacs,
+ JBuilder, and Ant.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:benefits"></a><b>2. </b>What are the benefits of using AspectJ?</p></div><div class="answer"><p><a name="d0e46"></a><b></b>AspectJ can be used to improve the modularity of software
+ systems.
+ </p><p> Using ordinary Java, it can be difficult to modularize design
+ concerns such as
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e52"></a>system-wide error-handling</p></li><li><p><a name="d0e55"></a>contract enforcement</p></li><li><p><a name="d0e58"></a>distribution concerns</p></li><li><p><a name="d0e61"></a>feature variations</p></li><li><p><a name="d0e64"></a>context-sensitive behavior</p></li><li><p><a name="d0e67"></a>persistence</p></li><li><p><a name="d0e70"></a>testing</p></li></ul></div><p>The code for these concerns tends to be spread out across the
+ system. Because these concerns won't stay inside of any one module
+ boundary, we say that they <span class="emphasis"><i>crosscut</i></span> the
+ system's modularity.
+ </p><p>AspectJ adds constructs to Java that enable the modular
+ implementation of crosscutting concerns. This ability is
+ particularly valuable because crosscutting concerns tend to be both
+ complex and poorly localized, making them hard to deal with.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:compability"></a><b>3. </b>Can AspectJ work with any Java program?</p></div><div class="answer"><p><a name="d0e85"></a><b></b>AspectJ has been designed as a <span class="emphasis"><i>compatible</i></span>
+ extension to Java. By compatible, we mean
+ </p><div class="informaltable" id="d0e91"><a name="d0e91"></a><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="right"><span class="emphasis"><i>upward compatible</i></span></td><td>All legal Java programs are legal AspectJ
+ programs.
+ </td></tr><tr><td align="right"><span class="emphasis"><i>platform
+ compatible
+ </i></span></td><td>All legal AspectJ programs run on standard Java
+ virtual machines.
+ </td></tr><tr><td align="right"><span class="emphasis"><i>tool
+ compatible
+ </i></span></td><td>Existing tools can be extended to work with
+ AspectJ.
+ </td></tr><tr><td align="right"><span class="emphasis"><i>programmer compatible</i></span></td><td>Programming in AspectJ feels natural to Java
+ programmers.
+ </td></tr></tbody></table></div><p>The AspectJ tools run on any Java 2 Platform compatible
+ platform. The AspectJ compiler produces classes that run
+ on any Java 1.1 (or later) compatible platform.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:license"></a><b>4. </b>How is AspectJ licensed?</p></div><div class="answer"><p><a name="d0e124"></a><b></b>AspectJ 1.5.2 source code and documentation is available under the
+ <a href="http://eclipse.org/legal/epl-v10.html" target="_top">Eclipse Public License 1.0</a>.
+ </p><p>AspectJ 1.1 through 1.5.1 source code and documentation is available under the
+ <a href="http://eclipse.org/legal/cpl-v10.html" target="_top">Common Public License 1.0</a>.
+ </p><p>The AspectJ 1.0 tools are open-source software available under the
+ <a href="http://www.opensource.org/licenses/mozilla1.1" target="_top">Mozilla Public License 1.1</a>.
+ That documentation is available under a separate license
+ that precludes for-profit or commercial
+ redistribution.
+ </p><p>Most users only want to use AspectJ to build programs they distribute.
+ There are no restrictions here. When you distribute your program, be sure to
+ include all the runtime classes from the aspectjrt.jar for that version of AspectJ.
+ When distributing only the runtime classes, you need not provide any notice that
+ the program was compiled with AspectJ or includes binaries from the AspectJ project,
+ except as necessary to preserve the warranty disclaimers in our license.
+ </p><p>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:project"></a><b>5. </b>What is the AspectJ Project?</p></div><div class="answer"><p><a name="d0e148"></a><b></b>AspectJ is based on over ten years of research at
+ <a href="http://www.parc.xerox.com" target="_top">
+ Xerox Palo Alto Research Center
+ </a>
+ as funded by Xerox, a U.S. Government grant (NISTATP), and a
+ DARPA contract.
+ </p><p>It has evolved through open-source releases
+ to a strong user community and now operates as an
+ open source project at
+ <a href="http://eclipse.org/aspectj" target="_top">
+ http://eclipse.org/aspectj</a>
+ The AspectJ team works closely with the community
+ to ensure AspectJ continues to evolve as an effective
+ aspect-oriented programming language and tool set.
+ </p><p>
+ The latest release is 1.2
+ which can be downloaded from the
+ <a href="http://eclipse.org/aspectj" target="_top">AspectJ project page</a>,
+ including sources as described
+ <a href="#q:buildingsource">Q:How do I get and compile the source code for AspectJ?</a>.
+ Development is focused on supporting applications,
+ improving quality and performance,
+ enhancing integration with IDE's,
+ and building the next generations of the language.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="quickstart"></a>2 Quick Start</h3><div class="qandaentry"><div class="question"><p><a name="q:requirements"></a><b>1. </b>
+ What Java versions does AspectJ require and support?
+ </p></div><div class="answer"><p><a name="d0e175"></a><b></b>
+ The AspectJ compiler produces programs for any released version of the
+ Java platform (jdk1.1 and later). When running, your program classes must
+ be able to reach classes in the
+ small (< 100K) runtime library (aspectjrt.jar) from the distribution.
+ The tools themselves require J2SE 1.3 or later to run,
+ but the compiler can produce classes for any 1.1-compliant
+ version of the Java platform.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:install"></a><b>2. </b>How do I download and install AspectJ?</p></div><div class="answer"><p><a name="d0e182"></a><b></b>From AspectJ's
+ <a href="http://eclipse.org/aspectj" target="_top">web page
+ </a>, download the AspectJ distribution.
+ The <tt>jar</tt> file is installed by executing
+ </p><pre class="programlisting">
+ java -jar <span class="emphasis"><i>jar file name</i></span>
+ </pre><p>Do <span class="bold"><b>not</b></span> try to extract the
+ <tt>jar</tt> file contents and then attempt to execute
+ <tt>java org.aspectj.tools.Main</tt>. (A
+ <tt>NoClassDefFoundError</tt> exception will be
+ thrown.) The AspectJ distribution is not designed to be installed
+ this way. Use the <tt>java -jar</tt> form shown above.
+ </p><p>To uninstall, remove the files the installer wrote in your
+ file system. In most cases, you can delete the top-level install
+ directory (and all contained files), after you remove any
+ new or updated files you want to keep. On Windows, no
+ registry settings were added or changed, so nothing needs to be
+ undone. Do not install over prior versions, which might have
+ different files. Delete the prior version first.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:startUsingAJ"></a><b>3. </b>How should I start using AspectJ?</p></div><div class="answer"><p><a name="d0e219"></a><b></b>Many users adopt AspectJ in stages, first using it
+ to understand and validate their systems (relying on it only in
+ development) and then using it to implement crosscutting concerns
+ in production systems. AspectJ has been designed to make each
+ step discrete and beneficial.
+ </p><p>
+ In order of increasing reliance, you may use AspectJ:
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e225"></a>
+ <span class="bold"><b> In the development
+ process
+ </b></span> Use AspectJ to trace or log
+ interesting information. You can do this by adding
+ simple AspectJ code that performs logging or tracing.
+ This kind of addition may be removed ("unplugged") for
+ the final build since it does not implement a design
+ requirement; the functionality of the system is unaffected by
+ the aspect.
+ </p></li><li><p><a name="d0e231"></a>
+ <span class="bold"><b>As an ancillary part of your
+ system
+ </b></span> Use AspectJ to more completely and
+ accurately test the system.
+ Add sophisticated code that can check contracts,
+ provide debugging support, or implement test strategies.
+ Like pure development aspects, this code may also be
+ unplugged from production builds. However, the same code
+ can often be helpful in diagnosing failures in deployed
+ production systems, so you may design the functionality
+ to be deployed but disabled, and enable it when debugging.
+ </p></li><li><p><a name="d0e237"></a>
+ <span class="bold"><b>As an essential part of your
+ system
+ </b></span> Use AspectJ to modularize
+ crosscutting concerns in your system by design.
+ This uses AspectJ to implement logic integral to a system
+ and is delivered in production builds.
+ </p></li></ul></div><p>This adoption sequence works well in practice and has been
+ followed by many projects.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:integrateWithDevTools"></a><b>4. </b>How does AspectJ integrate with existing Java development
+ tools?
+ </p></div><div class="answer"><p><a name="d0e249"></a><b></b>AspectJ products are designed to make it easy to integrate
+ AspectJ into an existing development process.
+ Each release includes
+ Ant tasks for building programs,
+ the AspectJ Development Environment (AJDE) for writing
+ aspects inside popular IDE's, and
+ command-line tools for compiling and documenting Java and AspectJ code.
+ </p><p>AspectJ provides replacements for standard Java tools:
+ <div class="itemizedlist"><ul><li><p><a name="d0e256"></a><tt>ajc</tt>, the AspectJ compiler,
+ runs on any Java 2 compatible platform, and produces classes
+ that run on any Java 1.1 (or later) compatible platform.
+ </p></li><li><p><a name="d0e261"></a><tt>ajdoc</tt> produces API documentation like
+ javadoc, with additional crosscutting links. For example,
+ it shows advice affecting
+ a particular method or all code affected by a given aspect.
+ At present, <tt>ajdoc</tt> is only supported in AspectJ 1.0.
+ </p></li></ul></div>
+ </p><p>For debugging, AspectJ supports JSR-45, which provides a mechanism for
+ debugging .class files that have multiple source files.
+ Debugger clients and VM's are beginning to support this;
+ see Sun's J2SE 1.4.1 VM and jdb debugger
+ and recent versions of JBuilder.
+ </p><p>The AspectJ Development Environment (AJDE)
+ enables programmers to view and navigate the crosscutting structures
+ in their programs, integrated with existing support in
+ popular Java IDE's for viewing and navigating object-oriented
+ structures. For many programmers this provides a deeper understanding
+ of how aspects work to modularize their concerns and permits them
+ to extend some of their development practices without
+ having to abandon their existing tools.
+ </p><p>
+ AJDE is a set of API's providing the basis for the following
+ development tool integrations:
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e278"></a>Eclipse (version 2.0)
+ in the Eclipse AspectJ Development Tools project
+ <a href="http://eclipse.org/ajdt" target="_top">
+ http://eclipse.org/ajdt
+ </a>
+ </p></li><li><p><a name="d0e284"></a>Emacs (GNU version 20.3)
+ and XEmacs (version 21.1 on Unix and 21.4 on Windows),
+ in the SourceForge AspectJ for Emacs project
+ <a href="http://aspectj4emacs.sourceforge.net" target="_top">
+ http://aspectj4emacs.sourceforge.net
+ </a>
+ </p></li><li><p><a name="d0e290"></a>JBuilder (versions 4 through 7) from Borland
+ in the SourceForge AspectJ for JBuilder project
+ <a href="http://aspectj4jbuildr.sourceforge.net" target="_top">
+ http://aspectj4jbuildr.sourceforge.net
+ </a>
+ </p></li><li><p><a name="d0e296"></a>Netbeans up to 3.4
+ (and Sun Microsystems' Forte for Java (versions 2 and 3), Sun/One)
+ in the SourceForge AspectJ for NetBeans project
+ <a href="http://aspectj4netbean.sourceforge.net" target="_top">
+ http://aspectj4netbean.sourceforge.net
+ </a>
+ </p></li></ul></div><p>
+ The common functionality of AJDE is also available in
+ the stand-alone source code browser <tt>ajbrowser</tt>,
+ included in the tools distribution.
+ </p><p>Finally, as mentioned above,
+ AspectJ also supports building with Ant by providing
+ task interfaces to the ajc and ajdoc tools.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="typicalprograms"></a>3 Typical AspectJ programs</h3><div class="qandaentry"><div class="question"><p><a name="q:aspectsoptional"></a><b>1. </b>Are aspects always optional or non-functional parts of
+ a program?
+ </p></div><div class="answer"><p><a name="d0e316"></a><b></b>No. Although AspectJ can be used in a way that allows AspectJ
+ code to be removed for the final build, aspect-oriented code is not
+ <span class="emphasis"><i>always</i></span> optional or non-functional. Consider
+ what AOP really does: it makes the modules in a program correspond
+ to modules in the design. In any given design, some modules are
+ optional, and some are not.
+ </p><p>The examples directory included in the AspectJ distribution
+ contains some examples of the use aspects that are not optional.
+ Without aspects,
+ </p><div class="informaltable" id="d0e324"><a name="d0e324"></a><table border="0"><colgroup><col><col></colgroup><tbody><tr><td align="right"><span class="strong"><i>bean</i></span></td><td>Point objects would not be JavaBeans.</td></tr><tr><td align="right"><span class="strong"><i>introduction</i></span></td><td>Point objects would not be cloneable, comparable or
+ serializable.
+ </td></tr><tr><td align="right"><span class="strong"><i>spacewar</i></span></td><td>Nothing would be displayed.</td></tr><tr><td align="right"><span class="strong"><i>telecom</i></span></td><td>No calls would be billed.</td></tr></tbody></table></div></div></div><div class="qandaentry"><div class="question"><p><a name="q:developmentAndProductionAspects"></a><b>2. </b>
+ What is the difference between development and production aspects?
+ </p></div><div class="answer"><p><a name="d0e355"></a><b></b>
+ Production aspects are delivered with the finished product,
+ while development aspects are used during the development process.
+ Often production aspects are also used during development.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:devAspects"></a><b>3. </b>
+ What are some common development aspects?
+ </p></div><div class="answer"><p><a name="d0e362"></a><b></b>Aspects for logging, tracing, debugging, profiling
+ or performance monitoring, or testing.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:prodAspects"></a><b>4. </b>
+ What are some common production aspects?
+ </p></div><div class="answer"><p><a name="d0e369"></a><b></b>
+ Aspects for performance monitoring and diagnostic systems,
+ display updating or notifications generally, security,
+ context passing, and error handling.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="concepts"></a>4 Basic AOP and AspectJ Concepts</h3><div class="qandaentry"><div class="question"><p><a name="q:crosscutting"></a><b>1. </b>What are scattering, tangling, and crosscutting?</p></div><div class="answer"><p><a name="d0e379"></a><b></b>
+ "Scattering" is when similar code is distributed throughout many
+ program modules. This differs from a component being used by
+ many other components since
+ it involves the risk of misuse at each point and of inconsistencies
+ across all points. Changes to the implementation may require
+ finding and editing all affected code.
+ </p><p>"Tangling" is when two or more concerns are implemented in
+ the same body of code or component, making it more difficult to understand.
+ Changes to one implementation may cause unintended changes
+ to other tangled concerns.
+ </p><p>"Crosscutting" is how to characterize a concern than spans
+ multiple units of OO modularity - classes and objects. Crosscutting
+ concerns resist modularization using normal OO constructs, but
+ aspect-oriented programs can modularize crosscutting concerns.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:joinpoints"></a><b>2. </b>What are join points?</p></div><div class="answer"><p><a name="d0e390"></a><b></b>Join points are well-defined points in the execution of a
+ program. Not every execution point is a join point: only those
+ points that can be used in a disciplined and principled manner are.
+ So, in AspectJ, the execution of a method call is a join point, but
+ "the execution of the expression at line 37 in file Foo.java" is
+ not.
+ </p><p>The rationale for restricting join points is similar to the
+ rationale for restricting access to memory (pointers) or
+ restricting control flow expressions (<tt>goto</tt>) in
+ Java: programs are easier to understand, maintain and extend
+ without the full power of the feature.
+ </p><p>AspectJ join points include reading or writing a field; calling
+ or executing an exception handler, method or constructor.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:pointcut"></a><b>3. </b>
+ What is a pointcut?
+ </p></div><div class="answer"><p><a name="d0e404"></a><b></b>A pointcut picks out
+ <a href="#q:joinpoints">
+ join points
+ </a>. These join points are described by the pointcut
+ declaration. Pointcuts can be defined in classes or in aspects,
+ and can be named or be anonymous.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:advice"></a><b>4. </b>What is advice?</p></div><div class="answer"><p><a name="d0e414"></a><b></b>Advice is code that executes at each
+ <a href="#q:joinpoints">join point</a> picked out by a
+ <a href="#q:pointcut">pointcut</a>. There are three
+ kinds of advice: before advice, around advice and after advice. As
+ their names suggest, before advice runs before the join point
+ executes; around advice executes before and after the join point;
+ and after advice executes after the join point. The power of
+ advice comes from the advice being able to access values in the
+ execution context of a pointcut.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:declarations"></a><b>5. </b>What are inter-type declarations?</p></div><div class="answer"><p><a name="d0e427"></a><b></b>AspectJ enables you to declare members and supertypes of another class
+ in an aspect, subject to Java's type-safety and access rules. These are
+ visible to other classes only if you declare them as accessible.
+ You can also declare compile-time errors and warnings based on pointcuts.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:whatisanaspect"></a><b>6. </b>What is an aspect?</p></div><div class="answer"><p><a name="d0e434"></a><b></b>Aspects are a new class-like language element that has been
+ added to Java by AspectJ. Aspects are how developers encapsulate
+ concerns that cut across classes, the natural unit of modularity in
+ Java.
+ </p><p>Aspects are similar to classes because...
+ <div class="itemizedlist"><ul><li><p><a name="d0e440"></a>aspects have type</p></li><li><p><a name="d0e443"></a>
+ aspects can extend classes and other aspects
+ </p></li><li><p><a name="d0e446"></a>
+ aspects can be abstract or concrete
+ </p></li><li><p><a name="d0e449"></a>
+ non-abstract aspects can be instantiated
+ </p></li><li><p><a name="d0e452"></a>aspects can have static and non-static state and
+ behavior
+ </p></li><li><p><a name="d0e455"></a>aspects can have fields, methods, and types
+ as members
+ </p></li><li><p><a name="d0e458"></a>the members of non-privileged aspects follow the
+ same accessibility rules as those of classes
+ </p></li></ul></div>
+ </p><p>Aspects are different than classes because...
+ <div class="itemizedlist"><ul><li><p><a name="d0e465"></a>aspects can additionally include as members pointcuts,
+ advice, and inter-type declarations;
+ </p></li><li><p><a name="d0e468"></a>aspects can be qualified by specifying the
+ context in which the non-static state is available
+ </p></li><li><p><a name="d0e471"></a>aspects can't be used interchangeably with
+ classes
+ </p></li><li><p><a name="d0e474"></a>aspects don't have constructors or finalizers,
+ and they cannot be created with the new operator;
+ they are automatically available as needed.
+ </p></li><li><p><a name="d0e477"></a>privileged aspects can access private members of
+ other types
+ </p></li></ul></div>
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="whyaop"></a>5 Why AOP?</h3><div class="qandaentry"><div class="question"><p><a name="q:ccfromflaws"></a><b>1. </b>Are crosscutting concerns induced by flaws in parts of the
+ system design, programming language, operating system, etc. Or is
+ there something more fundamental going on?
+ </p></div><div class="answer"><p><a name="d0e488"></a><b></b>AOP's fundamental assumption is that in any sufficiently
+ complex system, there will inherently be some crosscutting
+ concerns.
+ </p><p>So, while there are some cases where you could re-factor a
+ system to make a concern no longer be crosscutting, the AOP idea
+ is that there are many cases where that is not possible, or where
+ doing so would damage the code in other ways.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:definingaspectspercc"></a><b>2. </b>Does it really make sense to define aspects in terms of
+ crosscutting?
+ </p></div><div class="answer"><p><a name="d0e497"></a><b></b>Yes.</p><p>The short summary is that it is right to define AOP in terms of
+ crosscutting, because well-written AOP programs have clear
+ crosscutting structure. It would be a mistake to define AOP in
+ terms of "cleaning up tangling and scattering", because that isn't
+ particular to AOP, and past programming language innovations also
+ do that, as will future developments.
+ </p><p>(Slides for a long talk on this topic were once available at
+ http://www.cs.ubc.ca/~gregor/vinst-2-17-01.zip.)
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:domainspecific"></a><b>3. </b>Is AOP restricted to domain-specific
+ applications?
+ </p></div><div class="answer"><p><a name="d0e508"></a><b></b>No. Some implementations of AOP are domain-specific, but
+ AspectJ was specifically designed to be general-purpose.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:whyaopifinterceptors"></a><b>4. </b>Why do I need AOP if I can use interceptors
+ (or JVMPI or ref
+ lection)?
+ </p></div><div class="answer"><p><a name="d0e515"></a><b></b>There are many mechanisms people use now to implement
+ some crosscutting concerns. But they don't have a way to express
+ the actual structure of the program so you (and your tools)
+ can reason about it. Using a language enables you to express the
+ crosscutting in first-class constructs. You can not only avoid the
+ maintenance problems and structural requirements of some other
+ mechanisms, but also combine forms of crosscutting so that all
+ the mechanisms for a particular concern are one piece of code.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="related"></a>6 Related Technology</h3><div class="qandaentry"><div class="question"><p><a name="q:comparetonewforms"></a><b>1. </b>
+ How does AspectJ compare to other new forms of programming?
+ </p></div><div class="answer"><p><a name="d0e525"></a><b></b>There are many recent proposals for programming languages that
+ provide control over crosscutting concerns. Aspect-oriented
+ programming is an overall framework into which many of these
+ approaches fit. AspectJ is one particular instance of AOP,
+ distinguished by the fact that it was designed from the ground up
+ to be compatible with Java.
+ </p><p>For more alternatives for aspect-oriented programming, see
+ <a href="http://aosd.net" target="_top">http://aosd.net</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:compartoreflection"></a><b>2. </b>How do you compare the features of AspectJ with
+ reflective systems?
+ </p></div><div class="answer"><p><a name="d0e537"></a><b></b>Reflective and aspect-oriented languages have an important
+ similarity: both provide programming support for dealing with
+ crosscutting concerns. In this sense reflective systems proved
+ that independent programming of crosscutting concerns is
+ possible.
+ </p><p>But the control that reflection provides tends to be low-level
+ and extremely powerful. In contrast, AspectJ provides more
+ carefully controlled power, drawing on the rules learned from
+ object-oriented development to encourage a clean and understandable
+ program structure.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:comparetomixin"></a><b>3. </b>How do AspectJ features compare with those of mixin-based
+ inheritance?
+ </p></div><div class="answer"><p><a name="d0e546"></a><b></b>Some features of AspectJ, such as introduction, are related to
+ <span class="emphasis"><i>mixin-based inheritance</i></span>. But, in order to
+ support crosscutting, a core goal for AspectJ, AspectJ goes beyond
+ mixin-based inheritance.
+ </p><p>Firstly, an aspect imposes behavior on a class, rather than a
+ class requesting behavior from an aspect. An aspect can modify a
+ class without needing to edit that class. This property is
+ sometimes called <span class="emphasis"><i>reverse inheritance</i></span>.
+ </p><p>Secondly, a single aspect can affect multiple classes in
+ different ways. A single paint aspect can add different paint
+ methods to all the classes that know how to paint, unlike mixin
+ classes.
+ </p><p>
+So mixin-based inheritance doesn't have the reverse inheritance
+property, and mixins affect every class that mixes them in the same.
+If I want to do something like SubjectObserverProtocol, I need two
+mixins, SubjectPartofSubjectObserverProtocol and ObserverPartof...
+In AspectJ, both halves of the protocol can be captured in a single
+aspect.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:dynamicaop"></a><b>4. </b>How does AspectJ compare with more dynamic AOP?
+ </p></div><div class="answer"><p><a name="d0e565"></a><b></b>
+ Some AOP techniques are presented as "dynamic" because the weaving
+ occurs when classes are loaded, because aspects can be configured
+ in a separate XML file before launch, or because some advice
+ depends on runtime reflection. They are said to be more flexible
+ than AspectJ.
+ </p><p>
+ This is a misconception. First, the AspectJ 1.1 weaver has always
+ supported weaving at compile-time or class-load-time. Weaving at
+ compile-time reduces application launch and running time, and it helps
+ IDE's offer support for tracking down weaving errors and understanding
+ the impact of aspects on a system.
+ On the other hand, weaving at load-time simplifies build and deployment.
+ Before AspectJ 1.2, the user had to write a class loader that used the
+ weaver API to weave at load time; since 1.2, AspectJ comes with a
+ command-line launcher to support weaving at class-load-time without
+ any other changes to a build configuration. In AspectJ 5, we expect
+ to get a similar level of support as AspectWerkz, and to exploit
+ the class bytecode weaving hook available in Java 5 VM's.
+ </p><p>
+ Second, AspectJ programs, like Java programs generally, can be
+ written to support any level of XML configuration or to depend on
+ runtime reflection. There are some benefits to using AspectJ;
+ e.g., the proceed() form within around advice simplifies a lot of
+ the work that otherwise would go into writing a generalized
+ interceptor, without introducing many of the runtime errors that can
+ result from interceptors.
+ For AspectJ examples of configurable or reflection-dependent programs,
+ see the sample code linked off the AspectJ documentation page
+ or the examples discussed on the mailing list, e.g.,
+ <a href="http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg02151.html" target="_top">
+ Incremental and runtime weaving support?</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:aopandxp"></a><b>5. </b>What is the relationship between AOP and
+ XP (extreme programming AKA agile methods)?
+ </p></div><div class="answer"><p><a name="d0e579"></a><b></b>From a question on the user list:
+ <pre class="programlisting">
+> Anyone know the connections between AOP and Extreme Programming?
+> I am really confused. It seems AOP is a programming paradigm, which
+> is the next level of abstraction of OOP. Extreme Programming, however,
+> this is a lightweight software development process. One of the common
+> motivations of AOP and XP is designed to adopt to the requirement
+> changes, so that it can save the cost of software development.
+ </pre>
+ </p><p>
+ This is Raymond Lee's answer:
+ </p><p>
+ You're not really that confused. AOP and XP are orthogonal concepts,
+ although AOP can be used to help accomplish XP goals.
+ One of the goals of XP is to respond to changing requirements.
+ Another is to reduce the overall cost of development. These are
+ not necessarily the same thing.
+ </p><p>
+ One of the principles of XP that contribute to meeting those goals
+ is to maintain clean, simple designs. One of the criteria for clean,
+ simple designs is to factor out duplication from the code. Benefits
+ of removing duplication include the code being easier to understand,
+ better modularity of the design, lower costs of code changes, less
+ chance of conflicting changes when practicing collective code
+ ownership, etc.
+ </p><p>
+ Different types of duplication lend themselves to being addressed by
+ different design paradigms and language features. Duplicate snippets
+ of code can be factored out into methods. Duplicate methods can be
+ factored out to common classes, or pushed up to base classes.
+ Duplicate patterns of methods and their use can be factored out to
+ mechanisms of classes and methods (i.e. instantiations of design
+ patterns).
+ </p><p>
+ AOP addresses a type of duplication that is very difficult to handle
+ in the other common paradigms, namely cross-cutting concerns. By
+ factoring out duplicate cross-cutting code into aspects, the target
+ code becomes simpler and cleaner, and the cross-cutting code becomes
+ more centralized and modular.
+ </p><p>
+ So, AOP as a paradigm, and the associated tools, gives an XPer, or
+ anyone wanting to remove duplication from the code base, a powerful
+ way to remove a form of duplication not easily addressed until now.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:aspectjandcsharp"></a><b>6. </b>Will you support C#?</p></div><div class="answer"><p><a name="d0e601"></a><b></b>Not at this time. Although the resemblances between C# and Java
+ means it would probably be a fairly straightforward matter to take
+ the AspectJ language design and produce AspectC#, our current focus
+ is only on supporting effective uses of AspectJ.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="adoption"></a>7 Deciding to adopt AspectJ</h3><div class="qandaentry"><div class="question"><p><a name="q:productplans"></a><b>1. </b>
+ Is it safe to use AspectJ in my product plans?
+ </p></div><div class="answer"><p><a name="d0e611"></a><b></b>You may use AspectJ in your product or project with little
+ risk. Several factors play a role in reducing the risk of adopting
+ this new technology:
+ <div class="itemizedlist"><ul><li><p><a name="d0e615"></a>AspectJ is an <span class="emphasis"><i>addition</i></span> to
+ Java, and can be introduced into a project
+ in a way that limits risk.
+ See <a href="#q:startUsingAJ">Q: How should I start using AspectJ?</a> for
+ some suggestions on how to do this.
+ </p></li><li><p><a name="d0e623"></a>The AspectJ compiler accepts standard Java as
+ input and produces standard Java bytecode as output.
+ In 1.0, an optional mode produces standard Java source code
+ which may then be compiled with any compliant Java compiler
+ (e.g. Sun's <tt>javac</tt> compiler
+ or IBM's <tt>jikes</tt> compiler).
+ In 1.1, an optional mode accepts standard Java bytecode
+ from any compliant Java compiler
+ and weaves in the aspects to produce new bytecode.
+ </p></li><li><p><a name="d0e632"></a>AspectJ is available under a non-proprietary, open source license,
+ either the
+ <a href="http://www.opensource.org/licenses/mozilla1.1" target="_top">
+ Mozilla Public License 1.1</a>
+ for 1.0 or the
+ <a href="http://eclipse.org/legal/cpl-v10.html" target="_top">
+ Common Public License 1.0</a> for 1.1.
+ AspectJ will continue to evolve and be available, regardless
+ of the fate of any particular organization involved with
+ AspectJ.
+ </p></li><li><p><a name="d0e641"></a>Removing AspectJ from your program is not
+ difficult, although you will lose the flexibility and
+ economy that AspectJ provided.
+ </p></li></ul></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:effectonsize"></a><b>2. </b>What is the effect of using AspectJ on the source code
+ size of programs?
+ </p></div><div class="answer"><p><a name="d0e649"></a><b></b>Using aspects reduces, as a side effect, the number of source
+ lines in a program. However, the major benefit of using aspects
+ comes from <span class="emphasis"><i>improving</i></span> the modularity of a
+ program, not because the program is smaller. Aspects gather into a
+ module concerns that would otherwise be scattered across or
+ duplicated in multiple classes.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:effectonperformance"></a><b>3. </b>
+ Does AspectJ add any performance overhead?
+ </p></div><div class="answer"><p><a name="d0e659"></a><b></b>The issue of performance overhead is an important one. It is
+ also quite subtle, since knowing what to measure is at least as
+ important as knowing how to measure it, and neither is always
+ apparent.
+ </p><p>We aim for the performance of our implementation of AspectJ to
+ be on par with the same functionality hand-coded in Java. Anything
+ significantly less should be considered a bug.
+ </p><p>There is currently no benchmark suite for AOP languages in
+ general or for AspectJ in particular. It is probably too early to
+ develop such a suite because AspectJ needs more maturation of the
+ language and the coding styles first. Coding styles really drive
+ the development of the benchmark suites since they suggest what is
+ important to measure.
+ </p><p>Though we cannot show it without a benchmark suite, we believe
+ that code generated by AspectJ has negligible performance overhead.
+ Inter-type member and parent introductions should have very little
+ overhead, and advice should only have some indirection which
+ could be optimized away by modern VM's.
+ </p><p>The <tt>ajc</tt> compiler will use static typing information
+ to only insert the advice and dynamic pointcut tests that are absolutely necessary.
+ Unless you use 'thisJoinPoint' or 'if', the main dynamic checks will be
+ 'instanceof' checks which are generally quite fast.
+ These checks will only be inserted when they can not be inferred from
+ the static type information.
+ </p><p>When measuring performance, write AspectJ code
+ fragments and compare them to the performance of the
+ corresponding code written without AspectJ. For example, don't
+ compare a method with before/after advice that grabs a lock to just
+ the method. That would be comparing apples and oranges. Also be
+ sure to watch out for JIT effects that come from empty method
+ bodies and the like. Our experience is that they can be quite
+ misleading in understanding what you've measured.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:modularityviolations"></a><b>4. </b>
+ I've heard that AspectJ leads to modularity violations. Does it?
+ </p></div><div class="answer"><p><a name="d0e679"></a><b></b>
+ Well I haven't yet seen a language in which you can't write bad code!
+ </p><p>
+ But seriously, most AspectJ users find that just like when they learned
+ OO, it takes a while to really get the hang of it. They tend to start
+ in the usual way, by copying canonical examples and experimenting with
+ variations on them.
+ </p><p>
+ But users also find that rather than being dangerous, AspectJ helps them
+ write code that is more clear and has better encapsulation -- once they
+ understand the kind of modularity AspectJ supports. There are several
+ good papers that talk about this (see below), but here's a basic point
+ to keep in mind: when properly used, AspectJ makes it possible program
+ in a modular way, something that would otherwise be spread throughout
+ the code. Consider the following code, adapted from the AspectJ tutorial:
+ </p><pre class="programlisting">
+aspect PublicErrorLogging {
+ Log log = new Log();
+
+ pointcut publicInterface(Object o):
+ call(public * com.xerox.*.*(..)) && target(o);
+
+ after(Object o) throwing (Error e): publicInterface(o) {
+ log.write(o, e);
+ }
+}
+ </pre><p>
+ The effect of this code is to ensure that whenever any public method of
+ an interface or class in the <tt>com.xerox</tt> package
+ throws an error, that error is logged before being thrown to its caller.
+ </p><p>
+ Of course in the alternative implementation a large number of methods
+ have a try/catch around their body.
+ </p><p>
+ The AspectJ implementation of this crosscutting concern is clearly
+ modular, whereas the other implementation is not. As a result, if you
+ want to change it, its easier in the AspectJ implementation. For
+ example, if you also want to pass the name of the method, or its
+ arguments to <tt>log.write</tt>, you only have to edit
+ one place in the AspectJ code.
+ </p><p>
+ This is just a short example, but I hope it shows how what happens
+ with AOP and AspectJ is that the usual benefits of modularity are
+ achieved for crosscutting concerns, and that leads to better code,
+ not more dangerous code.
+ </p><p>
+ One paper someone else just reminded me of that talks some more
+ about this is:
+ <a href="http://www.cs.ubc.ca/~kdvolder/Workshops/OOPSLA2001/submissions/12-nordberg.pdf" target="_top">
+ http://www.cs.ubc.ca/~kdvolder/Workshops/OOPSLA2001/submissions/12-nordberg.pdf
+ </a>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:encapsulation"></a><b>5. </b>
+ Why does AspectJ permit aspects to access and add members of another type?
+ Isn't that violating OO encapsulation?
+ </p></div><div class="answer"><p><a name="d0e711"></a><b></b>In the spirit of Smalltalk, we have decided to give more power
+ to the language in order to let the user community experiment and
+ discover what is right. To date this has proven to be a successful
+ strategy because it has permitted the construction of many useful
+ aspects that crosscut the internal state of an object, and as such
+ need access the its private members. However, we are not
+ discounting that some sort of restrictions are useful, rather, we
+ are seeking input from the community in order to decide on what
+ these restrictions should be.
+ </p><p>
+ In that light, our position on encapsulation is :
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e717"></a>we respect Java's visibility rules</p></li><li><p><a name="d0e720"></a>we also provide open-classes, a mature OO technology</p></li><li><p><a name="d0e723"></a>we provide "privileged" access if you really need it.</p></li></ul></div><p>
+ Introducing parents or members to classes is a well-studied OO technique
+ known as open classes.
+ </p><p>
+ Open classes have been used in many languages prior to AspectJ,
+ including CLOS, Python, Smalltalk, Objective-C, and others.
+ Building from Java, introduction in AspectJ provides better
+ name hygiene and access control than prior languages.
+ Introduced code obeys all of Java's normal accessibility rules
+ for its lexical location in the aspect that it is introduced from.
+ Such code can not even see, much less access, private members of
+ the class it is introduced into. Further, introductions can be
+ declared private to the aspect, so they are not visible to
+ other clients of the class.
+ </p><p>
+ Privileged aspects do permit access to private members of another
+ class. They are a response to the very few cases where developers
+ genuinely need such access (typically for testing purposes where it
+ access is necessary), but it would be more risky to open access by
+ putting the aspect in the same package, adding test code, or changing
+ access in the target class. We recommend using privileged aspects
+ only as necessary, and believe that marking them "privileged" makes
+ any potential misuse apparent.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:aspectjandj2ee"></a><b>6. </b>Can I use AspectJ with J2EE?</p></div><div class="answer"><p><a name="d0e736"></a><b></b>
+ Consider the component types in J2EE:
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e740"></a>
+ Servlet: AspectJ works well within servlets
+ </p></li><li><p><a name="d0e743"></a>
+ JSP: It is possible to use AspectJ to affect code in JSPs by precompiling
+ them into Java sources and compiling these with ajc. This can be used, e.g., to
+ customize displays by turning on and off custom JSP taglibs. The mapping from a
+ given jsp source to java package and class name is not standardized, which means
+ doing this imposes dependencies on specific container versions.
+ </p></li><li><p><a name="d0e746"></a>
+ EJB: AspectJ supports a wide variety of aspects for EJBs. It can be used for
+ logging, tracing, debugging, error handling by layers, correlated method-level
+ interception (e.g., chargebacks), metering, fine-grained transactions, etc.
+ Indeed, it can be used to enforce adherence to coding restrictions within an
+ EJB (e.g., not using java.io, creating a class loader, or listening on
+ sockets) using <tt>declare error</tt>.
+ </p></li></ul></div><p>
+ The basic limitations are that there is no built-in support for writing J2EE
+ analogs for AspectJ extensions to Java, like distributed aspects, distributed
+ cflow, or managing state between invocations. These don't prevent one from using
+ AspectJ to do useful intra-container implementation, nor need they prevent one
+ from building distributed support, state management, and inter-component
+ implementations that leverage AspectJ. It just takes some work. In more detail:
+ </p><p>
+ All AspectJ implementations may define "code the implementation controls".
+ The AspectJ 1.0 implementation defines this as the files passed to the compiler
+ (AspectJ 1.1 will also support bytecode weaving).
+ </p><p>
+ Some advice on EJB operations will generate methods that confuse ejb compilers.
+ To avoid this problem, you can use the -XaddSafePrefix flag when compiling with ajc.
+ </p><p>
+ EJB components may be invoked remotely, and containers may passivate and
+ pool EJB's. Servlets have similar limitations, and in both cases the
+ lifespan of the defining class loader is implementation-dependent
+ (though it must span the operation of a particular request).
+ </p><p>
+ Being limited by lifecycle and namespace, the AspectJ 1.0 implementation
+ supports aspects that operate through non-remote invocations during the lifetime
+ of the namespace for a particular
+ deployment unit compiled in its entirety by the ajc compiler.
+ This means AspectJ supports common aspects only within a single local runtime
+ namespace (usually implemented as a class loader hierarchy).
+ </p><p>
+ Further, AspectJ recognizes language-level join points (object initialization,
+ method calls, etc.), not their EJB analogs (ejb find or create methods...).
+ These lead to the following consequences:
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e765"></a>
+ Issingleton aspects (the default) are limited to the lifetime of
+ the defining class loader, which in some implementations may not span
+ multiple invocations of the same application or EJB component.
+ </p></li><li><p><a name="d0e768"></a>
+ EJB lifecycles are different from object lifecycles, so perthis
+ and pertarget aspects will make little sense. They do not work
+ in the current implementation, which uses synchronized methods
+ to ensure a correct association in threaded environments
+ (EJB's may not have synchronized methods).
+ </p></li><li><p><a name="d0e771"></a>
+ Percflow or percflowbelow aspects are restricted to a chain of
+ non-remote invocations. While EJB 2.0 permits declaring an interface
+ local, this information is not available to the AspectJ compiler today.
+ For same reasons as stated above fore perthis, these will not work even
+ in the EJB container.
+ </p></li><li><p><a name="d0e774"></a>
+ Evaluation of cflow or cflowbelow pointcuts will be valid only
+ with respect to a chain of non-remote invocations.
+ </p></li></ul></div><p>
+ In addition, any AspectJ code should respect EJB operations:
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e780"></a>
+ The EJB container accesses EJB component fields directly, i.e.,
+ in code outside the control of the compiler. There is no join point for
+ these accesses, and hence no way to write a pointcut to advise that access.
+ </p></li><li><p><a name="d0e783"></a>
+ The EJB container may pool EJB components, so any initialization
+ join points may run once per component constructed, not once per
+ component initialized for purposes of a client call.
+ </p></li><li><p><a name="d0e786"></a>
+ The EJB container is permitted to change class loaders, even
+ between invocations of a particular EJB component (by passivating and
+ activating with a new class loader). In this case, instances of singleton
+ aspects will not operate over multiple invocations of the component, or that
+ static initialization join point recur for a given class as it is re-loaded.
+ This behavior depends on the container implementation.
+ </p></li></ul></div></div></div><div class="qandaentry"><div class="question"><p><a name="q:aspectjandgj"></a><b>7. </b>Can I use AspectJ with Generic Java?</p></div><div class="answer"><p><a name="d0e793"></a><b></b>We plan to support Generics when Java 1.5 is available.
+ </p><p>But at this time, unfortunately not. The two compilers are just not
+ at all compatible. In an ideal world, there would be a wonderful
+ Open Source extensible compiler framework for Java that both GJ and
+ AspectJ would be built on top of, and they would seamlessly
+ interoperate along with all other extensions to Java that you might
+ be interested in, but that's not the case (yet?).
+ </p><p>However, on 09 October 2000, the Java Community Process
+ approved a proposal to add generic types to Java that is largely
+ based on GJ (JSR 14). A draft specification was submitted for
+ public review, which closed on 01 August 2001, and a
+ prototype implementation has been released by Sun.
+ </p><p>We are committed to moving very rapidly to add support for
+ generic types in AspectJ when generic types become part of the Java
+ language specification. Everyone on the AspectJ team is looking
+ forward to this, because we too would really like to be able to
+ write code that includes both aspects and generic types.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:aspectjandj2me"></a><b>8. </b>Can I use AspectJ with J2ME?</p></div><div class="answer"><p><a name="d0e806"></a><b></b>The J2ME platform has several different components.
+ The diagram below shows how the different profiles
+ build on top of the two configurations CDC (Connected Device
+ Configuration) and CLDC (Connected Limited Device Configuration):
+ <pre class="programlisting">
+ --------------
+ | Personal |
+ -------------- --------
+ | Foundation | | MIDP |
+ ------------------ ------------------
+ | CDC | | CLDC |
+------------------------------------------
+| Java |
+------------------------------------------
+ </pre>
+ Which configuration you have dictates the restrictions when
+ running AspectJ compiled programs.
+ </p><p>
+ If you're running with a profile which sits on top of CDC then
+ there are not, as far as we are aware, any restrictions when
+ running AspectJ compiled code on this flavour of J2ME.
+ </p><p>
+ If you're running with a profile sitting on top of CLDC 1.1
+ you are currently unable to use the <tt>thisJoinPoint,
+ thisJoinPointStaticPart</tt> and <tt>
+ thisEnclosingJoinPointStaticPart</tt> variables, the
+ <tt>cflow</tt> and <tt>cflowbelow</tt>
+ pointcuts and the <tt>percflow</tt> and <tt>
+ percflowbelow</tt> perClauses.
+ </p><p>
+ Finally, if you're running with a profile which sits on top
+ of CLDC 1.0 you have all the restrictions of CLDC 1.1. There may
+ be further restrictions due to the lack of types corresponding
+ to the primitive types (e.g. Integer.TYPE), however, at the
+ time of writing we have been unable to do any extensive testing
+ on this.
+ </p><p>
+ Note that the aspectj runtime jar is now (as of AspectJ5) quite
+ large but only a small subset is required for executing code
+ in J2ME environments. We plan to ship a second aspectjrt.jar
+ built for the J2ME environment at some point.
+ </p><p>
+ For more discussion and to raise any issues you have with
+ AspectJ and J2ME, refer to
+ <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=92933" target="_top">
+ bugzilla entry 92933</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:aopinjava"></a><b>9. </b> Are you working to put AOP into Java?
+ It seems that every AOP toolset currently uses proprietary mechanisms
+ to describe point-cuts, etc.
+ </p></div><div class="answer"><p><a name="d0e847"></a><b></b>
+ We are working on standardization, but it's
+ a question of timing/ripeness (imagine going from thousands of users
+ to millions). (See <a href="#q:standardization">Q:What are your plans to make AspectJ a general feature of Java supported by Sun and the other key-players in the Java Industry?</a>.) We believe
+ AspectJ addresses this question in the best way possible now:
+ <div class="itemizedlist"><ul><li><p><a name="d0e853"></a>
+ It's open-source. Rather than being proprietary or controlled by a
+ vendor, it's available for anybody to use and build upon, forever.
+ </p></li><li><p><a name="d0e856"></a>
+ AspectJ is not a set of mechanisms, it's a language. It is currently
+ implemented using certain techniques, but there's nothing that prevents
+ it from being implemented with other techniques. That means users can
+ adopt the language with confidence that implementations will get better.
+ </p></li><li><p><a name="d0e859"></a>
+ There is no engineering need to change Java. The AspectJ language uses
+ the join point model already in Java, so there is no need to extend the
+ programming model. Our implementation produces valid Java bytecode, which
+ runs in any compliant J2SE VM and supports standard debuggers for those VM's
+ that support JSR-45 (debugging support for multi-language/multi-file sources).
+ This is a huge benefit to Sun since Sun must be extremely cautious
+ about extensions to the language or VM; before adopting AOP, Sun should
+ demand the kind of actual-proof that AspectJ implementations offer.
+ </p></li><li><p><a name="d0e862"></a>
+ On the issue of "proprietary mechanisms to describe pointcuts, etc.": Any AOP
+ has to have some language to describe pointcuts and the like ("pointcuts"
+ of course being the AspectJ term). Users would like to have one language
+ (to avoid having to learn or transform between many languages) and the
+ choice of multiple implementations (tailored for a configuration, subject
+ to competitive pressure, etc.). That's what AspectJ offers.
+ </p></li><li><p><a name="d0e865"></a>
+ That said, we believe the AspectJ extensions to Java could form the basis
+ for bringing AOP to Java; when that happens, there will be engineering
+ opportunities to make the implementation and tool support better.
+ </p></li></ul></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:support"></a><b>10. </b>What kind of support is available?</p></div><div class="answer"><p><a name="d0e873"></a><b></b>
+ The mailing lists provide the primary support for everyone
+ in the community
+ (See <a href="#q:mailingLists">Q: What mailing lists are there?</a>).
+ To request commercial support, tutorials, or presentations,
+ use the developer mailing list,
+ <tt>aspectj-dev@eclipse.org</tt>.
+ </p><p>
+ To find out about known issues, see the
+ <a href="progguide/implementation.html" target="_top">
+ AspectJ Programming Guide Appendix, "Implementation Notes"</a>
+ and the AspectJ bugs in the database at
+ <a href="http://bugs.eclipse.org/bugs" target="_top">http://bugs.eclipse.org/bugs</a>
+ (using the product <tt>AspectJ</tt>). Here are direct links to
+ <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED" target="_top">
+ view open compiler bugs</a>,
+ <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ" target="_top">
+ view all Aspectj bugs (open or closed)</a>, or
+ <a href="http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ" target="_top">
+ add new bugs</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:mailingLists"></a><b>11. </b>What mailing lists are there?</p></div><div class="answer"><p><a name="d0e905"></a><b></b>
+ The AspectJ users mailing list
+ (<tt>aspectj-users@eclipse.org</tt>)
+ provides an informal network of AspectJ language users who
+ can answer usage questions about AspectJ programs
+ and the AspectJ tools.
+ This is the place to ask how to code something in AspectJ
+ or how to write Ant or shell scripts to invoke the tools.
+ </p><p>
+ The AspectJ developers mailing list
+ (<tt>aspectj-dev@eclipse.org</tt>)
+ provides an informal network of AspectJ technology experts who
+ aim to understand the technology behind AspectJ.
+ The committers to the AspectJ project use this list
+ for open technical and planning discussions.
+ Developers can answer questions about what's possible and about
+ integrating AspectJ technology with other technologies.
+ </p><p>
+ For both mailing lists, only subscribed members may post messages.
+ To subscribe, visit the
+ <a href="http://eclipse.org/aspectj" target="_top">AspectJ web site</a>.
+ </p><p>
+ There you can also subscribe to
+ <tt>aspectj-announce@eclipse.org</tt>,
+ a low-traffic list containing only announcements
+ about significant AspectJ events and product releases.
+ To get on a similar list for aspect-oriented software
+ development generally, see
+ <a href="http://aosd.net" target="_top">http://aosd.net</a>.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="compiler"></a>8 Using the AspectJ compiler</h3><div class="qandaentry"><div class="question"><p><a name="q:compilerRequired"></a><b>1. </b>
+ Do I have to use the AspectJ compiler?
+ </p></div><div class="answer"><p><a name="d0e936"></a><b></b> The AspectJ compiler or weaver is required at some point, but
+ many people can use AspectJ without changing their build or
+ deployment process significantly. For aspects that are not
+ required to compile, you can use the AspectJ binary weaver, run
+ at build-time or class-load-time. You can write aspects using
+ the original code style (which must be compiled with the AspectJ
+ compiler) or using the annotation style new in AspectJ 5 (which
+ may be compiled with Javac or the AspectJ compiler). </p><p>
+ For more information, see
+ <a href="#q:codeversusannotationstyles">Q:Should I use code- or annotation-style aspects?</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:requiredsources"></a><b>2. </b>
+ What files do I need to include when compiling AspectJ programs?
+ </p></div><div class="answer"><p><a name="d0e947"></a><b></b>You need to specify to the compiler the files that
+ contain your aspects and the files that contain the
+ types affected by your aspects.
+ See <a href="#q:knowWhenAspectsAffectClasses">Q: How do I know which aspects affect a class when looking at that class's source code?</a>.
+ The AspectJ compiler will not search the source path for types
+ that may be affected (unlike Javac and Jikes).
+ In AspectJ 1.0, ajc requires all code to be in source form;
+ in AspectJ 1.1, Java and AspectJ code may be in either source
+ or binary form.
+ </p><p>In some cases you should compile your entire system all at once.
+ If this is too slow, then you can try to make reasonable divisions
+ between sets of source files whose aspects do not interact to
+ achieve a shorter compile cycle (particularly for development
+ aspects). If you have aspects that apply to different modules,
+ you can try compiling them into a binary form and using them
+ to weave each module. However, if you get any problems
+ or if you wish to run tests or do a release, you should recompile
+ the entire system.
+ </p><p>
+ For more information, see the
+ <a href="devguide/index.html" target="_top">
+ Development Environment Guide</a>
+ <a href="devguide/ajc-ref.html" target="_top">
+ Reference for ajc</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:listingsources"></a><b>3. </b>I have to list many files in the command line to
+ compile with <tt>ajc</tt>. Is there any other way to
+ provide the file names to <tt>ajc</tt>?
+ </p></div><div class="answer"><p><a name="d0e972"></a><b></b>
+ Yes, use the argfile option to ajc. List source
+ files in a line-delimited text file and direct ajc to that
+ file using <tt>-argfile</tt> or <tt>@</tt>:
+ </p><pre class="programlisting">ajc @sources.lst
+ajc -argfile sources.lst
+ </pre><p>Another way in AspectJ 1.1 is to use the
+ <tt>-sourceroots</tt> options, which reads all
+ source files in a given set of directories:
+ </p><pre class="programlisting">ajc -sourceroots "src;testsrc"
+ </pre><p>
+ For more information, see the
+ <a href="devguide/index.html" target="_top">
+ Development Environment Guide</a>
+ <a href="devguide/ajc-ref.html" target="_top">
+ Reference for ajc</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:compilerVM"></a><b>4. </b>What Java virtual machine (JVM) do I use to run the
+ AspectJ compiler?
+ </p></div><div class="answer"><p><a name="d0e1002"></a><b></b>Use the latest, greatest, fastest JVM you can get your hands on
+ for your platform. The compiler's performance is dependent on the
+ performance of the JVM it is running on, so the faster a JVM you
+ can find to run it on, the shorter your compile times will be. At a
+ minimum you need to use a Java 2 or later JVM to run the compiler
+ (J2SE 1.3 for AspectJ 1.1).
+ We realize that this constraint can be a problem for users who
+ don't currently have a Java 2 JVM available. We're sorry for the
+ inconvenience, but we had to make the hard decision that the
+ advantages of being able to rely on Java 2 were worth the cost of
+ losing a number of developers who are working on platforms without
+ Java 2 support. Here is a list of starting places where you might
+ find support for your system.
+ <div class="itemizedlist"><ul><li><p><a name="d0e1006"></a>
+ <a href="http://java.sun.com/j2se/" target="_top">Java 2
+ Platform, Standard Edition
+ </a>
+ </p></li><li><p><a name="d0e1012"></a>
+ <a href="http://www-106.ibm.com/developerworks/java/jdk/" target="_top">
+ developerWorks : Java technology : Tools and products - Developer kits
+ </a>
+ </p></li><li><p><a name="d0e1018"></a>
+ <a href="http://www-124.ibm.com/developerworks/oss/jikes/" target="_top">
+ developerWorks : Open Source - Jikes Project
+ </a>
+ </p></li><li><p><a name="d0e1024"></a>
+ <a href="http://java.sun.com/cgi-bin/java-ports.cgi" target="_top">Java
+ Platform Ports
+ </a>
+ </p></li></ul></div>
+ </p><p>The requirement of Java 2 support is only for
+ <span class="emphasis"><i>running</i></span> the AspectJ compiler. The AspectJ
+ compiler can be used to build programs that will run on Java 1.1
+ (or probably even on Java 1.0) systems. This means that it can
+ build programs that will run on Macintosh, FreeBSD, and applets
+ that will run in Internet Explorer and Netscape Navigator that are
+ still not yet Java 2 compliant.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:compilingForDifferentVMs"></a><b>5. </b>How can I use <tt>ajc</tt> to compile
+ programs for a JVM that is different from the one used to run it?
+ </p></div><div class="answer"><p><a name="d0e1043"></a><b></b>
+ <tt>ajc</tt> can be used to develop programs that are
+ targeted at the Java 1.1 platform, even though the
+ <tt>ajc</tt> compiler won't run on that platform. Here's
+ an example of using <tt>ajc</tt> in this sort of
+ cross-compilation mode (assuming a Windows platform with all the
+ default installation directories):
+ </p><pre class="programlisting">
+ajc -target 1.1 -bootclasspath c:\jdk1.1.7\lib\classes.zip \
+ -classpath c:\aspectj1.0\lib\aspectjrt.jar -extdirs "" \
+ -argfile jdk11system.lst
+ </pre><p>This same technique can be used if you want to run
+ <tt>ajc</tt> on a JDK 1.3 JVM (highly recommended) but
+ need to generate code for JDK 1.2. That would look something
+ like:
+ </p><pre class="programlisting">
+ajc -bootclasspath c:\jdk1.2\jre\lib\rt.jar \
+ -classpath c:\aspectj1.0\lib\aspectjrt.jar \
+ -extdirs c:\jdk1.2\jre\lib\ext
+ -argfile jdk12system.lst
+ </pre></div></div><div class="qandaentry"><div class="question"><p><a name="q:assert"></a><b>6. </b>Does the <tt>ajc</tt> compiler support
+ the <tt>assert</tt> keyword in Java 1.4?
+ </p></div><div class="answer"><p><a name="d0e1074"></a><b></b>Yes. As with <tt>Javac</tt>,
+ use the <tt>-source 1.4</tt> option as described
+ in the
+ <a href="devguide/index.html" target="_top">
+ Development Environment Guide</a>
+ <a href="devguide/ajc-ref.html" target="_top">
+ Reference for ajc</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:generics"></a><b>7. </b>Does the <tt>ajc</tt> compiler support
+ generics and the other new language features of Java 5?
+ </p></div><div class="answer"><p><a name="d0e1096"></a><b></b>Yes. As with <tt>Javac</tt>,
+ use the <tt>-1.5</tt> option as described
+ in the
+ <a href="devguide/index.html" target="_top">
+ Development Environment Guide</a>
+ <a href="devguide/ajc-ref.html" target="_top">
+ Reference for ajc</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:versionCompatibility"></a><b>8. </b>Will aspects work with different versions of the compiler/weaver and runtime?
+ </p></div><div class="answer"><p><a name="d0e1115"></a><b></b>Yes. Both <tt>ajc</tt> and
+ <tt>aspectjrt.jar</tt> should work with versions
+ of aspect code and libraries back to AspectJ 1.2.1.
+ Any aspects should be deployed
+ with the same version of <tt>aspectjrt.jar</tt>
+ they were compiled with. For more information, see the
+ <a href="devguide/index.html" target="_top">
+ Development Environment Guide</a>
+ <a href="devguide/ajc-ref.html" target="_top">
+ Reference for ajc</a>
+ and
+ <a href="devguide/deployment.html" target="_top">
+ Deployment notes</a> section on
+ <a href="devguide/versionCompatibility.html" target="_top">
+ Version compatibility</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:msjvm"></a><b>9. </b>Are there any issues using AspectJ with the Microsoft
+ JVM?
+ </p></div><div class="answer"><p><a name="d0e1143"></a><b></b>Since AspectJ requires Java 2 or later, it will not run on the
+ Microsoft JVM, which does not support Java 2.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:javacbytecode"></a><b>10. </b>Does <tt>ajc</tt> rely
+ on <tt>javac</tt> for generating Java bytecode
+ (<tt>.class</tt>) files?
+ </p></div><div class="answer"><p><a name="d0e1159"></a><b></b> No. Some previous versions of AspectJ had this requirement.
+ In AspectJ 1.0, <tt>javac</tt> can still be used as
+ <tt>ajc</tt> back end by using the
+ <tt>-usejavac</tt> flag. You can also run <tt>ajc</tt>
+ in preprocessor mode to generate Java source
+ (<tt>.java</tt>) files to be compiled using
+ <tt>javac</tt> or another java compiler.
+ Neither option is supported in AspectJ 1.1.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:parsergenerators"></a><b>11. </b>
+ I noticed the AspectJ compiler doesn't use a parser generator. Why is that?
+ </p></div><div class="answer"><p><a name="d0e1184"></a><b></b>In AspectJ 1.0,
+ the PARSER for ajc is written by hand. This choice was made with full
+ awareness of the generator tools out there. (Jim had for example used
+ the excellent javacc tool for building the parser for JPython (now Jython)).
+ One of the reasons that AspectJ uses a hand-written parser is that using
+ javacc taught Jim about the LL-k design for parsers (pioneered by antlr).
+ As opposed to the state-machine parsers produced by yacc, these parsers are
+ very readable and writable by humans.
+ </p><p>
+ Antlr and javacc did not really suit the project:
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e1190"></a>
+ Antlr's support for unicode in the lexer is still immature and this makes
+ using it with Java challenging. This was an even bigger issue 3 years ago
+ when we started on the Java implementation of ajc.
+ </p></li><li><p><a name="d0e1193"></a>
+ While javacc is freely available, it is not Open Source. Depending on a
+ closed-source tool to build an Open Source compiler would reduce some
+ of the transparency and control of open-source.
+ </p></li></ul></div><p>
+ There were also several things that were easier to implement with
+ a hand-written parser than with any of the exiting tools.
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e1199"></a>
+ Semi-keywords -- it's important to us that
+ "every legal Java program is also a legal AspectJ program."
+ This wouldn't be true if we made 'before' and 'call' full keywords in
+ AspectJ. It is easier to support these sorts of semi-keywords with a
+ hand-written parser. (Note: ajc-1.0.x handles 'aspect' and 'pointcut'
+ slightly specially which can break a few unusual pure Java programs.
+ This is a compiler limitation that will be fixed in a future release.)
+ </p></li><li><p><a name="d0e1202"></a>
+ Deprecated syntax warnings -- the syntax of AspectJ
+ changed many times from version 0.2 to the 1.0 release. It was easier
+ to provide helpful warning messages for these changes with our
+ hand-written parser.
+ </p></li><li><p><a name="d0e1205"></a>
+ Grammar modularity -- We like being able to have
+ AspectJParser extend JavaParser.
+ </p></li><li><p><a name="d0e1208"></a>
+ Part of the grammar for AspectJ is extremely hard for existing tools to
+ capture. This is the type pattern syntax, i.e. "com.xerox..*.*(..)".
+ The sort of case that gives standard parser generators fits is something
+ like "*1.f(..)" which no one would ever write, but which must be
+ supported for a consistent language.
+ </p><p>
+ In AspectJ 1.1, the parser was written as it is for the underlying
+ Eclipse compiler,
+ with some hand-coding of the sort that avoids adding keywords to
+ the language.
+ </p></li></ul></div></div></div><div class="qandaentry"><div class="question"><p><a name="q:howIncrementalWorks"></a><b>12. </b>How does incremental mode work?
+ </p></div><div class="answer"><p><a name="d0e1217"></a><b></b>In incremental mode, ajc minimizes the files that need
+ to be recompiled after another file has changed. In Java,
+ only the changed files need to be recompiled, but in AspectJ,
+ other files might also need to be recompiled or re-woven.
+ </p><p> Depending on what is modified, we may need to re-weave
+ code. If you change a pointcut and save it, we currently have
+ to check everywhere in case a new match is occurring or an old
+ match is no longer correct. However, if you simply change
+ the body of an advice in an aspect, there is (usually) no need
+ to reweave as the affected classes call the advice and the
+ advice (by design) maintains its name in the recompiled
+ aspect. </p><p> If you make a change to a class (as opposed to an aspect) and
+ save it, we usually can get away with merely having to
+ compile that class then weave the existing aspects with it -
+ rather than doing a full recompile of the entire system.
+ </p><p> There are a lot of possible optimizations to the
+ algorithms we use, by performing more complete analysis of
+ the change made to a file that will enable us to know more
+ accurately whether we need to reweave and if we do then what
+ we need to reweave - we just haven't gotten around to
+ implementing them yet. </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="devtools"></a>9 Integrating AspectJ into your development environment</h3><div class="qandaentry"><div class="question"><p><a name="q:knowWhenAspectsAffectClasses"></a><b>1. </b>How do I know which aspects affect a class when looking
+ at that class's source code?
+ </p></div><div class="answer"><p><a name="d0e1233"></a><b></b>When you are working with the IDE support, you can get an
+ understanding of which aspects affect any class.
+ This enables AspectJ programmers to get the benefits of
+ modularizing crosscutting concerns while still having immediate
+ access to what aspects affect a class.
+ </p><p>For example, the
+ <a href="devguide/index.html" target="_top">
+ Development Environment Guide</a>
+ <a href="devguide/ajbrowser.html" target="_top">
+ ajbrowser section</a>.
+ shows that you can list or navigate
+ between method and advice affecting that method and between a type
+ and declarations in an aspect on that type. (The IDE support may
+ have more features than <tt>ajbrowser</tt>, depending
+ on the IDE.
+ See <a href="#q:integrateWithDevTools">Q: How well does AspectJ integrate with existing Java development tools?</a> for more
+ information on which Java development environments are
+ supported.)
+ </p><p>
+ When you are looking at documentation for AspectJ 1.0 programs,
+ <tt>ajdoc</tt> will provide links from aspects and
+ advice to the affected code, but it provides less information
+ than the IDE support because it only parses declarations.
+ </p><p>
+ When you are compiling your program, pointcuts that are
+ statically-determinable can be used in declare statements
+ to identify the code picked out by the pointcut.
+ (A pointcut is statically determinable if it only uses
+ the pointcut designators
+ <tt>within</tt>,
+ <tt>withincode</tt>,
+ <tt>execution</tt>,
+ <tt>call</tt>,
+ <tt>get</tt>,
+ <tt>set</tt>,
+ <tt>initialiation</tt>, and
+ <tt>staticinitialiation</tt>.)
+ The compiler will list the static code points which will be
+ affected by any advice specifying the same pointcut.
+ For example, the following will print a warning
+ whereever some code in class Bar gets a field value from Foo:
+ <pre class="programlisting">
+ declare warning: get(* Foo.*) && within(Bar)
+ : "reading Foo state from Bar";
+ </pre>
+ </p><p>
+ When you are running your program,
+ you can trace advice as it executes. This
+ enables you to identify advice on join points picked out
+ dynamically, which cannot be reflected precisely by IDE support.
+ For a related tracing question,
+ see <a href="#q:seeingjoinpoints">Q:I don't understand what join points exist. How can I see them?</a>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:idesupport"></a><b>2. </b>What kind of IDE support is available for developing
+ AspectJ programs?
+ </p></div><div class="answer"><p><a name="d0e1291"></a><b></b>See <a href="#q:integrateWithDevTools">Q: How well does AspectJ integrate with existing Java development tools?</a></p></div></div><div class="qandaentry"><div class="question"><p><a name="q:idesupportplans"></a><b>3. </b>What plans are there to support my IDE?</p></div><div class="answer"><p><a name="d0e1299"></a><b></b>
+ The AspectJ team directly provided components for JBuilder, Forte,
+ and Emacs and supported the open-source AspectJ plugin project
+ at <a href="http://eclipse.org/ajdt" target="_top">http://eclipse.org/ajdt</a>
+ which uses the AJDE API support for IDE's.
+ Supporting new IDE's is a matter of building on the AJDE API's,
+ mostly likely adopting one of the existing open-source IDE
+ extensions as a design template.
+ Here are the IDE's where we know people have expressed interest,
+ so interested developer may want to join with others in their
+ developer communities to build the integration.
+ <div class="itemizedlist"><p><b></b></p><ul><li><p><a name="d0e1307"></a>IDEA/IntelliJ has an enthusiastic community and
+ the developers are working on an extensibility API
+ - <a href="http://intellij.com" target="_top">http://intellij.com</a>
+ </p></li><li><p><a name="d0e1313"></a>jEdit comes from a very active open-source community.</p></li><li><p><a name="d0e1316"></a>
+ Oracle JDeveloper is supported at
+ <a href="https://jdeveloperaop.dev.java.net/" target="_top">
+ https://jdeveloperaop.dev.java.net/</a>.
+ </p></li><li><p><a name="d0e1322"></a>Some have suggested Codeguide from Omnicore
+ <a href="http://www.omnicore.com" target="_top">http://www.omnicore.com/</a>
+ </p></li></ul></div>
+ </p><p>
+ For questions on AJDE, join the developer's list
+ <tt>aspectj-dev@eclipse.org</tt>.
+ For questions on the current IDE integrations, contact those projects.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:portingajde"></a><b>4. </b>Can I port AJDE support to my development environment?</p></div><div class="answer"><p><a name="d0e1338"></a><b></b>Yes. The core AJDE API is extensible and the source code is
+ available for download. Start by studying the sources
+ for the existing IDE support linked off the AspectJ site
+ <a href="http://eclipse.org/aspectj" target="_top">http://eclipse.org/aspectj</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:hybridbuilds"></a><b>5. </b>I want the aspects for development builds but
+ remove them for production builds. How can I set up the build
+ system so they are unpluggable? And so I use <tt>javac</tt>
+ in my production build?
+ </p></div><div class="answer"><p><a name="d0e1351"></a><b></b>
+ If you are using development-time-only aspects - aspects that only
+ exist when you are developing the code, not when you ship it -
+ you can use implement a hybrid build process by listing
+ the production source files into a javac-compliant argfile,
+ and the development source files in another ajc argfiles:
+ </p><pre class="programlisting">
+ -- file "production.lst":
+ One.java
+ two/Three.java
+ ...
+
+ -- file "tracing.lst":
+ trace/Library.java
+ Trace.java
+
+ -- file "development.lst":
+ @production.lst
+ @tracing.lst
+ </pre><p>
+ Then your development build can use <tt>ajc</tt>:
+ </p><pre class="programlisting">
+ ajc @development.lst
+ </pre><p>
+ And your development build can use
+ <tt>ajc</tt> or <tt>javac</tt>
+ or <tt>jikes</tt>:
+ </p><pre class="programlisting">
+ jikes @production.lst
+ </pre></div></div><div class="qandaentry"><div class="question"><p><a name="q:stepwiseBuilds"></a><b>6. </b>
+ We compile module jars and then assemble them. Can we continue this with AspectJ?
+ </p></div><div class="answer"><p><a name="d0e1380"></a><b></b>
+ Aspects apply to everything in a namespace, as if everything is
+ compiled together.
+ Sometimes you can break the build down into separate steps without breaking
+ this model, but we haven't stated exactly where it could break
+ because it depends on the interactions between all types.
+ You can try the approaches below, but remember to rebuild
+ everything in one go if there are problems.
+ </p><p>
+ The simplest scenario is when the aspects apply to all modules
+ and the modules compile without the aspects. In that case,
+ weaving in the aspects is just the final assembly step for
+ the build.
+ </p><p>
+ Next is the case where the aspects make changes to a common
+ library that are visible to other clients, which themselves
+ are otherwise unaffected by the aspects. In this case, the
+ common library can be built using ajc, and used on the
+ classpath for the module builds:
+ <pre class="programlisting">
+
+ ajc -outjar common.jar -sourceroots "aspectj-src:src" ...
+ cd ../otherProject
+ javac -classpath "../common/common.jar:${aspectjrt.jar}" {src}
+
+ </pre>
+ </p><p>
+ Combining these last two,
+ there's the case where a common set of aspects should
+ affect two or more modules that are in a dependency relationship
+ to one another. It should work to reuse the aspects
+ in binary form for each compile, in dependency order:
+
+ <pre class="programlisting">
+
+ ajc -outjar common-aspects.jar
+ -sourceroots "aspectj-src" ...
+
+ ajc -outjar common.jar
+ -sourceroots "src"
+ -aspectpath common-aspects.jar ...
+
+ cd ../module1
+ ajc -outjar module1.jar
+ -sourceroots "src"
+ -classpath common.jar
+ -aspectpath ../common-aspects.jar ...
+
+ cd ../module2
+ ajc -outjar module2.jar
+ -sourceroots "src"
+ -classpath "common.jar;../module1.jar"
+ -aspectpath ../common-aspects.jar ...
+
+ </pre>
+ </p><p>
+ If two modules are visibly affected by aspects and
+ mutually-dependent, the only thing to do is compile
+ them together.
+ </p><p>
+ It's safest to assume that all aspects can affect all
+ types in a namespace; using build boundaries to effect
+ crosscutting limits causes a dangerous dependency on
+ the build process and might cause problems.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:incrementalModuleCompiles"></a><b>7. </b>We use modules and would like to use incremental compilation.
+ Is that possible?
+ </p></div><div class="answer"><p><a name="d0e1403"></a><b></b>
+ Just incrementally-compile the whole system.
+ Specify to ajc the modules as multiple source roots
+ (or input jars if you are weaving libraries).
+ </p><p>
+ In Eclipse's AJDT, you can create a top-level project with symbolic
+ links out to the sources:
+
+ <pre class="programlisting">
+
+ app-assembly/
+ {link common/aspects}
+ {link common/src}
+ {link module1/src}
+ ...
+
+ </pre>
+
+ Then everything is part of one huge incremental compile. Also, you
+ can close this master project and work the others using the Java
+ compiler or AJDT.
+ </p><p>
+ The links make incremental development possible without affecting
+ the modularized Ant builds. (Our practice runs along those lines.)
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="notes"></a>10 Programming notes and tips</h3><div class="qandaentry"><div class="question"><p><a name="q:methodsignatures"></a><b>1. </b>Is it possible to change methods by introducing keywords (like
+ <tt>synchronized</tt>), adding parameters,
+ or changing the "throws" clause?
+ </p></div><div class="answer"><p><a name="d0e1423"></a><b></b>AspectJ does not enable you to change the signature of a method,
+ but you can (by express declaration) work around some
+ limits imposed by the signature. You can convert a checked exception to
+ unchecked using <tt>declare soft</tt>, privileged aspects
+ have access to private methods, and you can use a percflow aspect to
+ ferry additional state to a callee without changing intervening
+ signatures. For more details, see
+ <a href="progguide/index.html" target="_top">The AspectJ Programming Guide</a>.
+ In the case of <tt>synchronized</tt>,
+ we have what we consider a better solution that uses
+ around advice instead of introduction. This solution is described
+ in
+ <a href="http://aspectj.org/pipermail/users/2000/000534.html" target="_top">
+ this thread (no longer available)
+ </a> on the AspectJ users list, with some
+ <a href="http://aspectj.org/pipermail/users/2000/000536.html" target="_top">
+ additional comments (no longer available)
+ </a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:seeingjoinpoints"></a><b>2. </b>
+ I don't understand what join points exist. How can I see them?
+ </p></div><div class="answer"><p><a name="d0e1445"></a><b></b>
+ You can trace them using using an aspect.
+ For example, you can start logging at a particular method call and
+ see what join points occur after the call and before it returns.
+ </p><p>
+ Here's some code Jim Hugunin wrote to trace join points
+ and posted to the users list. To reuse the aspect,
+ define a subaspect and implement the pointcuts, for example:
+ <pre class="programlisting">
+
+aspect JoinPointSampleAspect extends aj.TraceJoinPoints {
+ protected pointcut entry() :
+ execution(static void JoinPointSample.main(String[]));
+ protected pointcut exit() :
+ call(static void JoinPointSampleAspect.exit());
+
+ public static void main (String[] args) {
+ JoinPointSample.main(args);
+ JoinPointSampleAspect.exit();
+ }
+ public static void exit() {}
+}
+
+class JoinPointSample {
+ public static void main(String[] args) {}
+}
+ </pre>
+ </p><p>Here's the aspect:
+ <pre class="programlisting">
+
+/* TraceJoinPoints.java */
+
+package aj;
+
+import org.aspectj.lang.*;
+import org.aspectj.lang.reflect.*;
+import java.io.*;
+
+public abstract aspect TraceJoinPoints {
+ protected abstract pointcut entry();
+ protected pointcut exit(): call(* java..*.*(..));
+ // this line is for AspectJ 1.1; for 1.0, use "dominates"
+ declare precedence : TraceJoinPoints, *;
+ final pointcut start(): entry() && !cflowbelow(entry());
+
+ final pointcut trace():
+ cflow(entry()) && !cflowbelow(exit()) && !within(TraceJoinPoints+);
+
+ before(): start() { makeLogStream(); }
+
+ before(): trace() { logEnter(thisJoinPointStaticPart); }
+ after(): trace() { logExit(thisJoinPointStaticPart); }
+
+ after(): start() { closeLogStream(); }
+
+ //------------ added
+ /**
+ * Emit a message in the log, e.g.,
+ * <pre>TraceJoinPoints tjp = TraceJoinPoints.aspectOf();
+ * if (null != tjp) tjp.message("Hello, World!");</pre>
+ */
+ public void message(String s) {
+ out.println("<message>" + prepareMessage(s) + "</message>");
+ }
+ public void message(String sink, String s) {
+ if (null == sink) {
+ message(s);
+ } else {
+ out.println("<message sink=" + quoteXml(sink)
+ + " >" + prepareMessage(s) + "</message>");
+ }
+ }
+ protected String prepareMessage(String s) { return s; } // XXX implement
+
+ //--------- end of added
+
+ PrintStream out;
+ int logs = 0;
+ protected void makeLogStream() {
+ try {
+ out = new PrintStream(new FileOutputStream("log" + logs++ + ".xml"));
+ } catch (IOException ioe) {
+ out = System.err;
+ }
+ }
+
+ protected void closeLogStream() {
+ out.close();
+ }
+
+
+ int depth = 0;
+ boolean terminal = false;
+ protected void logEnter(JoinPoint.StaticPart jp) {
+ if (terminal) out.println(">");
+ indent(depth);
+ out.print("<" + jp.getKind());
+ writeSig(jp);
+ writePos(jp);
+
+ depth += 1;
+ terminal = true;
+ }
+
+ void writeSig(JoinPoint.StaticPart jp) {
+ out.print(" sig=");
+ out.print(quoteXml(jp.getSignature().toShortString()));
+ }
+
+ void writePos(JoinPoint.StaticPart jp) {
+ SourceLocation loc = jp.getSourceLocation();
+ if (loc == null) return;
+
+ out.print(" pos=");
+ out.print(quoteXml(loc.getFileName() +
+ ":" + loc.getLine() +
+ ":" + loc.getColumn()));
+ }
+
+ String quoteXml(String s) {
+ return "\"" + s.replace('<', '_').replace('>', '_') + "\"";
+ }
+
+ protected void logExit(JoinPoint.StaticPart jp) {
+ depth -= 1;
+ if (terminal) {
+ out.println("/>");
+ } else {
+ indent(depth);
+ out.println("</" + jp.getKind() + ">");
+ }
+ terminal = false;
+ }
+
+ void indent(int i) {
+ while (i-- > 0) out.print(" ");
+ }
+}
+
+ </pre>
+ </p><p>Note that if you are using AspectJ 1.0,
+ the line starting with <tt>declare precedence</tt>
+ would be removed, and the aspect declaration would look like
+ <tt>aspect TraceMyJoinPoints dominates *</tt>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:comparecallandexecution"></a><b>3. </b>
+ What is the difference between call and execution join points?
+ </p></div><div class="answer"><p><a name="d0e1470"></a><b></b>
+ Briefly, there are two interesting times when a constructor or method is
+ run. Those times are when it is called, and when it actually
+ executes.
+ </p><p>
+ The main difference is that a call join point happens outside of
+ the target object (for non-static methods) or class (for static methods
+ and constructors), and that an execution join point happens inside
+ the object or class. This means that the <tt>within</tt>
+ and <tt>withincode</tt> pointcuts pick them out
+ differently: A call join point is picked out within the caller,
+ while an execution join point is picked
+ out where it is actually defined.
+ </p><p>
+ A call join point is the ``outermost'' join point for a particular
+ call. Once a call join point proceeds, then a number of different
+ things happen. For non-static methods, for example, method
+ dispatch happens, which will cause one method execution join point
+ -- perhaps more, if there are super calls. For constructors, the
+ super constructor is called, and fields are initialized, and then
+ various constructor execution join points will occur.
+ </p><p>
+ A call join point matches only the ``external'' calls of a method
+ or constructor, based on a signature, and it does not pick out
+ calls made with <tt>super</tt>, or
+ <tt>this</tt> constructor calls.
+ </p><p>Here's more detail:
+ </p><p>Consider method execution in Java as (1) the initial call from
+ this object to some method on the target object with a
+ particular signature; and (2) the execution of the actual code
+ in the particular method dispatched in the target object.
+ The call join point starts with the initial call and ends
+ when control returns to the call (by return or perhaps
+ thrown exception). The execution join point starts with
+ the method body and ends when the body completes (again
+ by return or throwing an exception), so the execution join
+ point always happens within the bounds of the corresponding
+ call join point. You can see this if you use the
+ join-point tracing aspect in see <a href="#q:seeingjoinpoints">Q:I don't understand what join points exist. How can I see them?</a>.
+ </p><p>As you would expect, the context differs
+ in advice on pointcuts picking out execution and call join
+ points; for call, <tt>this</tt> refers to the caller, whereas
+ for execution <tt>this</tt> refers to the called
+ (executing) object.
+ </p><p>
+ There are some subtle interactions with other AspectJ semantics.
+ First, the meaning of the signature in the
+ <tt>execution()</tt> and <tt>call()</tt>
+ pointcut designators (PCD's) differ: the call type depends upon
+ the type of the reference making the call, while the execution
+ type depends on the enclosing class.
+ Second, you may choose one over another if you cannot bring all
+ your sources within the code the compiler controls
+ (described in the <a href="progguide/semantics.html" target="_top">appendix</a>
+ to the <tt>Programming Guide</tt>).
+ For example, to trace calls into a
+ method from classes which are outside the code the compiler controls
+ at compile time, then using <tt>execution()</tt> will work
+ while using <tt>call()</tt>may not. Finally, since
+ <tt>super</tt> invocations are not considered method calls,
+ to trace <tt>super.foo()</tt> would require using
+ <tt>execution</tt>.
+ </p><p>
+ Because of differences in the way AspectJ 1.0 and 1.1
+ are implemented, in 1.0
+ you should use the <tt>call()</tt>
+ pointcut designator unless you have a good reason to use
+ <tt>execution()</tt>; in AspectJ 1.1, the
+ reverse is true.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:comparecflowandcflowbelow"></a><b>4. </b>
+ What is the difference between cflow and cflowbelow?
+ </p></div><div class="answer"><p><a name="d0e1546"></a><b></b>
+ Both pick out all the join points in the control flow of
+ the specified join points.
+ They differ only in that the <tt>cflowbelow()</tt>
+ pointcut designator does not pick out the join points
+ specified, while <tt>cflow()</tt> does.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:recursiveentrypoints"></a><b>5. </b>How do I say that I want the topmost entrypoint in a
+ recursive call? How about the most-recent prior entrypoint?
+ </p></div><div class="answer"><p><a name="d0e1559"></a><b></b>This is best seen by way of example.
+ Given a recursive call to <tt>int factorial(int)</tt>
+ you can print the arguments for
+ (a) the current and most-recent recursive call
+ or (b) the current and original recursive call:
+ </p><pre class="programlisting">
+aspect LogFactorial {
+ pointcut f(int i) : call(int factorial(int)) && args(i);
+
+ // most-recent
+ before(int i, final int j) : f(i) && cflowbelow(f(j)) {
+ System.err.println(i + "-" + j);
+ }
+
+ // original
+ before(int i, final int j) : f(i)
+ && cflowbelow(cflow(f(j)) && !cflowbelow(f(int))) {
+ System.err.println(i + "@" + j);
+ }
+}
+ </pre></div></div><div class="qandaentry"><div class="question"><p><a name="q:initializationjoinpoints"></a><b>6. </b>What is the difference between constructor call,
+ constructor execution, initialization, and static
+ initialization join points?
+ </p></div><div class="answer"><p><a name="d0e1571"></a><b></b>Static initialization pertains to initialization of
+ a class or interface type. Constructor call and execution
+ are akin to method call, and initialization generalizes this and
+ picks out the first constructor called.
+ </p><p>Their relations are best
+ demonstrated by tracing the join points. Below is the class
+ Test which implements an interface and extends a class
+ along with a trace of the join points below and including
+ the constructor call obtained using
+ <tt>TraceJointPoints.java</tt>
+ from <a href="#q:seeingjoinpoints">Q:I don't understand what join points exist. How can I see them?</a>.
+ </p><pre class="programlisting">
+
+public class Init {
+ public static void main (String[] args) {
+ new Test();
+ end();
+ }
+ static void end() {}
+}
+class Super {}
+interface I {}
+class Test extends Super implements I {
+ Test() {}
+}
+
+
+ </pre><p>For a program compiled with AspectJ 1.0,
+ the result is this:</p><pre class="programlisting">
+
+ <constructor-call sig="Test()" >
+ <staticinitialization sig="Super._init_" />
+ <staticinitialization sig="Test._init_" />
+ <initialization sig="Super()" >
+ <instanceinitializer-execution sig="Super._init_" />
+ <constructor-execution sig="Super()" />
+ </initialization>
+ <initialization sig="I()" >
+ <instanceinitializer-execution sig="I._init_" />
+ <constructor-execution sig="I()" />
+ </initialization>
+ <initialization sig="Test()" >
+ <instanceinitializer-execution sig="Test._init_" />
+ <constructor-execution sig="Test()" />
+ </initialization>
+ </constructor-call>
+
+ </pre><p>
+ Ordinarily, using a <tt>call</tt> pointcut designator
+ is best because the call join point surrounds the others, but in
+ the case of constructors there is no target object for
+ the call (because it has not been constructed yet), so you
+ might prefer to use the <tt>initialization</tt>
+ pointcut designator.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:adviseconstructors"></a><b>7. </b>How do I work with an object right when it is created?
+ </p></div><div class="answer"><p><a name="d0e1599"></a><b></b>
+ You can advise some form of constructor join point.
+ Constructors are tricky in Java, and that's exposed in AspectJ.
+ Here are some rules of thumb:
+ <div class="itemizedlist"><ul><li><p><a name="d0e1603"></a>If you want the join point on the "outside" of object creation,
+ use after returning from call to the constructor:
+ </p><pre class="programlisting">
+ after() returning (Foo newlyCreatedObject): call(Foo.new(..)) { ... }
+ </pre><p>
+ You might be tempted to use "this" or "target" to expose the new object, but remember
+ that if you're on the "outside" of object creation, the object itself might not be
+ created yet... it only exists "on the way out", when you return the object.
+ </p></li><li><p><a name="d0e1610"></a>If you want the join point inside a particular constructor, use:
+ </p><pre class="programlisting">
+ after(Foo newlyCreatedObject) returning: this(newlyCreatedObject) && execution(Foo.new(..)) { ... }
+ </pre><p>
+ Remember, though, that if you use "before" advice here, the body of the constructor
+ will not have run, and so the object may be somewhat uninitialized.
+ </p></li><li><p><a name="d0e1617"></a>
+ In the rare case that there are all sorts of constructors for the object that call
+ each other with <tt>this(...)</tt> and you want exactly one join point
+ for each initialization of <tt>Foo</tt>, regardless of the path of
+ constructors it takes, then use:
+ </p><pre class="programlisting">
+ after(Foo f) returning: this(f) && initialization(Foo.new(..)) { ... }
+ </pre></li></ul></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:andingpointcuts"></a><b>8. </b>
+ I want advice to run at two join points, but it doesn't run at all. What gives?
+ </p></div><div class="answer"><p><a name="d0e1633"></a><b></b>
+ This usually reflects both a conceptual error and a programming mistake.
+ Most likely you want to do something like "run the advice for all
+ public and private calls," and the code looks something like this:
+ </p><pre class="programlisting">
+ within(com.xerox.printing..*) && call(public * *(..)) && call(private * *(..))
+ </pre><p>
+ But a pointcut is evaluated at *each* join point.
+ The expression above would never pick out any call join point,
+ because no method signature has both public and private access.
+ In a pointcut, <tt>pc1() && pc2()</tt> means both
+ must be true at a given join point for advice to run at that join point.
+ The correct pointcut would use <tt>||</tt> as follows:
+ </p><pre class="programlisting">
+ within(com.xerox.printing..*) && (call(public * *(..)) || call(private * *(..)))
+ </pre><p>
+ Then the advice will run at the join point.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:staticfieldreferences"></a><b>9. </b>
+ How do I refer to a static field when my advice crosscuts multiple classes?
+ </p></div><div class="answer"><p><a name="d0e1654"></a><b></b>There is no way in advice to refer to the type of the
+ code executing in a static context except by specification.
+ This makes it impossible to refer to static members using
+ runtime information.
+ </p><p>However, AspectJ can determine the class for something
+ in the join point context, which you can use as a per-class key.
+ Then you can actually declare an instance field to contain
+ the per-class value (see the next question). This comes at
+ the cost of an extra reference, but the field can be final.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:interfacesastypepatterns"></a><b>10. </b>I would like to reuse a type pattern, e.g., to
+ write advice that is limited to a certain set of classes.
+ Do I have to retype it each time?
+ </p></div><div class="answer"><p><a name="d0e1663"></a><b></b>No. You can declare that all the types implement
+ an interface you define, and then use the interface type in
+ your program. For example:
+ </p><pre class="programlisting">
+/**
+ * Example of using an interface to represent a type pattern.
+ * sub-aspects use declare parents to add to traced types, e.g.,
+ * declare parents: com.mycompany.whatever..* implements Marked;
+ */
+abstract aspect MarkerExample {
+ /** marker interface for types that we want to trace */
+ interface Marked {}
+
+ /** calls to an instance of Marked not from an instance of Marked */
+ pointcut dynamicCallsIn(): call(* *(..)) && target(Marked) && !this(Marked);
+
+ /** calls to methods defined by a subtype of Marked
+ * that don't come from the body of a subtype of Marked
+ */
+ pointcut staticCallsIn(): call(* Marked+.*(..)) && !within(Marked+);
+
+ /** print dynamic calls */
+ before(): dynamicCallsIn() { System.out.println("before " + thisJoinPoint); }
+}
+
+aspect MyMarker extends MarkerExample {
+ declare parents: com.mycompany.whatever..* implements Marked;
+}
+ </pre></div></div><div class="qandaentry"><div class="question"><p><a name="q:exampleprograms"></a><b>11. </b>Where do I find example programs and how-to's?</p></div><div class="answer"><p><a name="d0e1672"></a><b></b>There are a number of places to find sample code
+ and instructions for using AspectJ with other programming tools.
+ <div class="orderedlist"><ol type="1"><li><p><a name="d0e1676"></a>
+ The AspectJ release includes examples in its
+ <tt>doc</tt> directory.
+ </p></li><li><p><a name="d0e1682"></a>
+ There is a community repository of sample code and tutorials
+ in the AspectJ CVS tree
+ <tt>docs</tt> module <tt>sandbox</tt> directory.
+ These are extracted and published (online only)
+ <a href="http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/sample-code.html" target="_top">
+ here
+ </a>.
+ </p></li><li><p><a name="d0e1694"></a>
+ The <tt>teaching</tt> directory of the
+ <tt>docs</tt> module contains public materials
+ the AspectJ committers use for presentations, some of
+ which include example code. To access CVS, see
+ <a href="#q:buildingsource">Q:How do I get and compile the source code for AspectJ?</a>.
+ </p></li><li><p><a name="d0e1705"></a>
+ The archives for the user and developer mailing lists
+ contain many good examples. To search the archives, see
+ <a href="#q:searchingsite">Q:How can I search the email archives or the web site?</a>.
+ </p></li></ol></div>
+ This code can vary in quality.
+ Code that we publish or include with AspectJ is generally
+ correct. However, code found in our CVS tree might not have
+ been tested thoroughly, and code from the mailing lists might
+ be untested or use older versions of the language.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:aspectlibraries"></a><b>12. </b>Are aspect libraries available?</p></div><div class="answer"><p><a name="d0e1715"></a><b></b>Some libraries are distributed in the release under the
+ examples folder in the distribution.
+ These are "libraries" in the sense that they are reusable,
+ but they are delivered in source form.
+ Similarly, some of the sample code is reusable; for that,
+ see <a href="#q:exampleprograms">Q:Where do I find example programs and how-to's?</a>.
+ If you develop such a library and want to make it available to
+ other users, feel to send it to the users mailing list
+ <tt>aspectj-users@eclipse.org</tt>.
+ </p><p>In AspectJ 1.1, ajc supports binary aspects, so
+ you can distribute aspect libraries without distributing the
+ source. For more information, see the
+ <tt>-aspectpath</tt>
+ option in the
+ <a href="devguide/ajc-ref.html" target="_top">
+ Reference for ajc</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:serialversionuid"></a><b>13. </b>How does <tt>ajc</tt> interact with the
+ <tt>serialVersionUID</tt>?
+ </p></div><div class="answer"><p><a name="d0e1741"></a><b></b>The current version of <tt>ajc</tt> can change the
+ <tt>serialVersionUID</tt> of generated
+ <tt>.class</tt> files as a result of weaving in advice.
+ This is an important fact that developers using both aspects and
+ serialization should be aware of. It is likely that a future
+ version of the compiler will be better behaved regarding the
+ <tt>serialVersionUID</tt>.
+ </p><p>However, changes to the <tt>serialVersionUID</tt>
+ attribute are typically only important when using serialization for
+ the long-term persistence of objects. Using standard Java
+ serialization for long-term persistence has a number of drawbacks
+ and many developers already use alternative solutions. For one
+ possibly standard solution, see
+ <a href="http://jcp.org/jsr/detail/057.jsp" target="_top">
+ Long-Term Persistence for JavaBeans Specification
+ </a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:applets"></a><b>14. </b>How can I use AspectJ with applets?</p></div><div class="answer"><p><a name="d0e1768"></a><b></b>
+ Just include the aspectjrt.jar as a required archive.
+ For example, here is the HTML code for an HTML editor
+ applet that contains some debugging aspects:
+ </p><pre class="programlisting">
+
+<APPLET
+ CODE='com.company.swing.applets.EditorApplet'
+ WIDTH='700'
+ HEIGHT='525'>
+ <PARAM NAME="CODE" VALUE="com.company.swing.applets.EditorApplet" >
+ <PARAM NAME="ARCHIVE"
+ VALUE ="../company-applets.jar,../aspectjrt.jar,../xmlrpc-applet.jar" >
+ <PARAM NAME="type" VALUE="application/x-java-applet;version=1.4">
+ <PARAM NAME="scriptable" VALUE="false">
+</APPLET>
+
+ </pre><p>
+ The above markup has worked reliably with the Java Plugin
+ (included in the JRE 1.4.x) in IE 6, Mozilla 1.1 (Win32),
+ and Mozilla 1.0.1 (Red Hat Linux 8.0).
+ The following link describes how to configure Mozilla/Netscape
+ 6.x/7.x to use the Java Plugin from a JRE/SDK installation:
+ <a href="http://java.sun.com/j2se/1.4.1/manual_install_linux.html" target="_top">
+ http://java.sun.com/j2se/1.4.1/manual_install_linux.html</a>.
+ (Thanks to Chris Bartling for this answer.)
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:typeoblivious"></a><b>15. </b>How can I specify types for advice that captures primitives, void, etc.?</p></div><div class="answer"><p><a name="d0e1782"></a><b></b>
+ In some cases, AspectJ allows conversion from values of primitive types to Object,
+ so that highly polymorphic advice may be written. This works if an advice parameter
+ or the return type for around is typed to Object. So:
+ </p><pre class="programlisting">
+class Test {
+ static int i;
+ public static void main(String[] args) {
+ i = 37;
+ }
+}
+
+aspect TraceSet {
+ before(Object val): set(* Test.*) && args(val) {
+ System.err.println(val);
+ System.err.println(val.class);
+ }
+}
+ </pre><p>
+ will print out
+ </p><pre class="programlisting">
+37
+java.lang.Integer
+ </pre><p>
+ For more information, see the Programming Guide
+ <a href="progguide/semantics-pointcuts.html" target="_top">
+ semantics section "Context Exposure"
+ </a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:versioninfo"></a><b>16. </b>How do I detect which version I am running?</p></div><div class="answer"><p><a name="d0e1800"></a><b></b>The <tt>ajc</tt>
+ compiler emits the version when passed the
+ <tt>-version</tt> flag as an argument.
+ </p><p>To programmatically
+ detect the version of the AspectJ runtime while running
+ under Java 1.4 or later, get the version from the package:
+ <pre class="programlisting">
+ Package lang = org.aspectj.lang.JoinPoint.class.getPackage();
+ String version = lang.getImplementationVersion();
+ </pre>
+ </p><p>When running under Java 1.3 or earlier, read the manifest
+ directly. For example code, see the source for
+ <tt>AjBuildManager.checkRtJar(AjBuildConfig)</tt>
+ in the <tt>org.aspectj.ajdt.internal.core.builder</tt>
+ package of the <tt>org.aspectj.ajdt.core</tt> module,
+ available as described in
+ <a href="#q:buildingsource">Q:How do I get and compile the source code for AspectJ?</a>.
+ </p><p>Note that the version of AspectJ for the tools in
+ <tt>aspectjtools.jar</tt> is in
+ <tt>org.aspectj.bridge.Version</tt>.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="problems"></a>11 Common Problems</h3><div class="qandaentry"><div class="question"><p><a name="q:infiniterecursion"></a><b>1. </b>When I run, I get a <tt>StackOverflowError</tt>
+ (or a long stack trace or no output whatsoever)
+ </p></div><div class="answer"><p><a name="d0e1845"></a><b></b>Most likely this is a case of infinite recursion,
+ where advice is advising itself. It presents as a
+ <tt>StackOverflowError</tt>
+ or silence as the VM exhausts itself in the recursion.
+ </p><p>Of course, infinite recursion is possible in Java:</p><pre class="programlisting">
+public class Main {
+ public static void main(String[] args) {
+ try {
+ main(args);
+ } finally {
+ main(args);
+ }
+ }
+}
+ </pre><p>If you compile and run this program, and it will fail silently, trying
+ to process the finally clause even after throwing the StackOverflowError.
+ </p><p>Here's a similar AspectJ program where the recursion is
+ not so obvious:
+ </p><pre class="programlisting">
+aspect A {
+ after(): call(* *(..)) { System.out.println("after " + thisJoinPoint); }
+}
+ </pre><p>This re-invokes itself because it advises any call.
+ It invokes itself even after an exception is thrown, since
+ <tt>after</tt> advice, like a finally clause, runs even
+ after exceptions are thrown. You can fix this by following two practices:
+ </p><p>In AspectJ 1.1, the String concatenation operator (+) is
+ advised in its StringBuffer form, so if your advise uses
+ String + in a way that is picked out by your pointcut,
+ you will get infinite recursion.</p><p>
+ (1) Use <tt>after returning</tt> to advise normal completions
+ or <tt>after throwing</tt> to advise abrupt completions.
+ If you use <tt>after</tt> or <tt>after throwing</tt>,
+ write the advice with the same care you would a finally clause,
+ understanding that it may run after some failure.
+ </p><p>(2) Avoid writing advice that advises itself. One simple way to
+ do so is to exclude the code within the current aspect:
+ </p><pre class="programlisting">
+aspect A {
+ after() returning: !within(A) && call(* *(..)) {
+ System.out.println("after " + thisJoinPoint);
+ }
+}
+ </pre><p>A better way is often to re-write the pointcut.
+ If the advice is advising itself accidentally, that's a sign that
+ the pointcut is not saying what you mean.
+ </p><pre class="programlisting">
+aspect A {
+ pointcut withinTargetClasses() : within(A+) || within(B+);
+ after() returning: withinTargetClasses() && call(* *(..)) {
+ System.out.println("after " + thisJoinPoint);
+ }
+}
+ </pre></div></div><div class="qandaentry"><div class="question"><p><a name="q:typelessdeclarations"></a><b>2. </b>I've declared a field on every class in
+ my package; how do I use it in advice?
+ </p><pre class="programlisting">
+aspect A {
+ boolean com.xerox..*.dirtyFlag;
+ after (Object target) returning
+ : target(target) && call(* com.xerox..*.set*(..)) {
+ target.dirtyFlag = true; // compile fails here
+ }
+}
+ </pre></div><div class="answer"><p><a name="d0e1896"></a><b></b>You need a type to refer to any member, field or method.
+ It's generally better to introduce onto an interface and
+ declare classes to implement the interface, which permits you
+ to use the interface type in advice formals.
+ </p><pre class="programlisting">
+aspect A {
+ interface TrackingSets {}
+ boolean TrackingSets.dirtyFlag;
+ declare parents : com.xerox..* implements TrackingSets;
+
+ after (TrackingSets target) returning
+ : target(target) && call(* com.xerox..*.set*(..)) {
+ target.dirtyFlag = true;
+ }
+}
+ </pre></div></div><div class="qandaentry"><div class="question"><p><a name="q:ajcoom"></a><b>3. </b>The AspectJ compiler aborts with an OutOfMemoryError when
+ compiling many classes. How can I fix this?
+ </p></div><div class="answer"><p><a name="d0e1905"></a><b></b><tt>ajc</tt> can use more memory than a javac
+ compile of the corresponding pure-java sources when aspects
+ are added to the mix. You'll need to increase the memory
+ available.
+ </p><p>The command <tt>ajc</tt> is actually a script that
+ launches a Java virtual machine with the correct classpath. You
+ should make a copy of this script, rename it, and then edit it.
+ Change the -Xmx option, size of memory allocation pool (heap). You
+ might try <tt>-Xmx128M</tt> or even
+ <tt>-Xmx256M</tt>.
+ </p><p>When running under Ant, give Ant more memory or
+ use the <tt>fork</tt> option together with
+ the <tt>Xmaxmem</tt> option.
+ </p><p>When running under an IDE, look to the documentation
+ for the IDE to determine how to increase available memory.
+ </p><p>In either case, doing incremental compilations can hold on to
+ more memory than a one-shot compile process, as the compiler
+ trades space for time in recompiles.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:duplicateclass"></a><b>4. </b>
+ Why do I get a message that my class is already defined?
+ </p></div><div class="answer"><p><a name="d0e1937"></a><b></b>
+ Most commonly, a source file was specified twice on the command line
+ (e.g., directly and by a *.java entry in a .lst file).
+ However, sometimes you have defined a class in two files in the
+ same package, and you need to rename the class or change its
+ scope. You should get this message from any Java compiler.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:ajcrecompile"></a><b>5. </b>
+ <tt>ajc</tt> recompiles all files every time.
+ How can I make it recompile only the files that have changed?
+ </p></div><div class="answer"><p><a name="d0e1947"></a><b></b>
+ <tt>ajc</tt> 1.0 does not support incremental
+ compilation, but since 1.1 <tt>ajc</tt> does when passed the
+ <tt>-incremental</tt> option. It may still recompile
+ files that have not changed, if they could be affected by aspects
+ in particular ways, but the files compiled should be fewer
+ and result in faster compiles.
+ Further, the 1.1 release supports binary weaving, so you
+ need not recompile if you already have .class files.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:ajcjvm"></a><b>6. </b>
+ <tt>ajc</tt> is using the wrong JVM. How do I
+ fix it?
+ </p></div><div class="answer"><p><a name="d0e1966"></a><b></b>The easiest way to fix this is to re-install
+ <tt>ajc</tt> (using the same <tt>.class</tt> or
+ <tt>.exe</tt> file that you originally downloaded) and
+ this time make sure to tell it to use the desired JDK (typically
+ the JDK versions 1.2 or 1.3 from Sun).
+ </p><p>If you are familiar with DOS batch files or shell programming,
+ you could also fix this by simply editing the
+ <tt>bin\ajc.bat</tt> or <tt>bin/ajc</tt>
+ script.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:idebalkingataspects"></a><b>7. </b>My IDE is trying to parse AspectJ files which makes my project unusable.
+ What can I do?
+ </p></div><div class="answer"><p><a name="d0e1990"></a><b></b>
+ When working with an unsupported IDE that objects to the syntax of
+ AspectJ source files (and, e.g., automatically gathers them
+ in a source tree as Java files based on the .java extension),
+ you can use the .aj extension for your AspectJ files.
+ The ajc compiler accepts both .java and .aj files, and you can
+ set up your build scripts to include the correct list of
+ source files. (You will have to find another editor for
+ editing AspectJ files; you can use the ajbrowser to view
+ edit your AspectJ files and navigate the crosscutting structure.)
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:idememory"></a><b>8. </b>I used to be able to compile my program in my IDE, but when I
+ use AJDE, I run out of memory (or it goes really slow).
+ </p></div><div class="answer"><p><a name="d0e1997"></a><b></b>
+ The ajc compiler does more analysis than (e.g.,) javac,
+ and AJDE may in some IDE's hold a copy of the structure tree until the
+ next tree is available from the compile process. Both mean that you may
+ need extra memory to compile the same program. However, increasing
+ available memory to the point that you are swapping to disk can
+ slow the process considerably.
+ </p><p>
+ If you are having problems and would like to find the optimal memory
+ allocation, iteratively decrease the amount of memory available until
+ AJDE or ajc signals out-of-memory errors, and then increase that
+ amount by 5-10%.
+ </p><p>
+ To increase memory for the ajc compiler, see <a href="#q:ajcoom">Q:The AspectJ compiler aborts with an OutOfMemoryError when compiling many classes. How can I fix this?</a>.
+ For your IDE, do something similar or follow the provider's instructions.
+ For example, to increase memory in JBuilder, edit the
+ <tt>jbuilderX/bin/jbuilder.config</tt>
+ file to have an entry like:
+<pre class="programlisting">
+vmparam -Xmx384m
+</pre>
+ </p><p>
+ If it turns out that your project is too big to use with AJDE, your IDE
+ may nonetheless support external commands or Ant build processes, which
+ run outside the IDE memory space. For a JBuilder Ant plugin, some
+ people have directed us to <a href="http://antrunner.sourceforge.net" target="_top">http://antrunner.sourceforge.net</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:noaspectbound"></a><b>9. </b>
+ When I run, I get a <tt>NoAspectBoundException</tt> or a
+ ClassNotFound message for <tt>NoAspectBoundException</tt>.
+ </p></div><div class="answer"><p><a name="d0e2026"></a><b></b>This happens when an aspect is not associated with an object
+ that is being advised. We have seen this happen two ways:
+ <div class="itemizedlist"><ul><li><p><a name="d0e2030"></a>You get a ClassNotFound message for
+ <tt>NoAspectBoundException</tt> when loading a
+ class affected by aspects if <tt>aspectjrt.jar</tt>
+ classes are not on the runtime classpath.
+ To fix this, put the classes on the classpath.
+ </p></li><li><p><a name="d0e2039"></a>
+ You can get a <tt>NoAspectBoundException</tt> when
+ there is a cycle in aspect initialization or static
+ initialization, most commonly when an aspect advises
+ its own initializer. To fix this, first find the class that
+ fails to load by running java in debug mode or looking
+ at the <tt>NoAspectBoundException</tt> trace,
+ and then fix the offending (probably unintended) dependency.
+ Most often, it comes from a pointcut like
+ <tt>staticinitialization(com.company..*)</tt>
+ or <tt>within(com.company..*)</tt>, which
+ can include any aspects in the same subpackages.
+ You can avoid advising most join points associated with
+ the aspect <tt>TheAspect</tt>
+ by adding <tt>&& !within(TheAspect)</tt>
+ to your pointcut.
+ </p></li></ul></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:stacktraces"></a><b>10. </b>
+ My stack traces don't make sense. What gives?
+ </p></div><div class="answer"><p><a name="d0e2065"></a><b></b>In 1.0, unless you are using the <tt>ajdb</tt> debugger,
+ stack traces may
+ have synthetic methods in the stack, and the line numbers may
+ not track your source code. The
+ <a href="devguide/index.html" target="_top">
+ Development Environment Guide</a>
+ discusses how to interpret stack at the end of the
+ <a href="devguide/ajc-ref.html" target="_top">
+ Reference for ajc</a>.
+ </p><p>In 1.1, line numbers should work correctly.
+ The only difference from a normal stack might be the addition
+ of extra stack frames for call-backs.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:advicenotrunning"></a><b>11. </b>
+ My advice is not running (or running twice), and I don't know why.
+ </p></div><div class="answer"><p><a name="d0e2083"></a><b></b>
+ When advice is not running,
+ there is probably a problem in the pointcut.
+ Sometimes users specify pointcuts that
+ do not mean what they intend -
+ most often when they misspell a type name. Run the compiler in
+ <tt>-Xlint</tt> mode, which will flag some likely mistakes,
+ like the type name.
+ If that does not work, and your pointcut is staticly-determinable,
+ use a declare statement to identify affected code. (For more
+ information, see <a href="#q:knowWhenAspectsAffectClasses">Q: How do I know which aspects affect a class when looking at that class's source code?</a>.)
+ If that does not work and your pointcut is dynamically determined,
+ see if your join points are executing at all by using
+ TraceJoinPoints.java from <a href="#q:seeingjoinpoints">Q:I don't understand what join points exist. How can I see them?</a>.
+ </p><p>When advice is running more than it should, either
+ (1) your advice is in an abstract aspect and the pointcut picks
+ out the same join point for more than one concrete instantiation
+ of the aspect, or
+ (2) your pointcut picks out more join points than you intend.
+ </p><p>
+ In the case of advice in abstract aspects, the advice will run once
+ for each concrete instance of the aspect.
+ If the pointcut for that advice picks out the same join point for two
+ concrete aspects, then the correct behavior is for the advice to run
+ the advice twice at that join point.
+ </p><p>
+ To see if your pointcut picks out the join points you intend, you
+ can use IDE support, logging, or declare-warnings.
+ If you are using IDE support, you should be able to trace back from
+ the pointcut or advice to the join points which can be statically
+ determined to be affected.
+ Without IDE support, you can write
+ declare-warning statements to identify code affected by staticly-
+ determinable pointcuts.
+ To identify advised dynamic join points,
+ you can try using <tt>TraceJoinPoints.java</tt> as above,
+ or update the advice to print the source location of the join point.
+ Doing any of these should show if the advice applies to code that
+ you did not expect.
+ </p><p>If you've done this and convinced yourself it's not working,
+ it may be a bug. See <a href="#q:bugreports">Q:How do I submit a bug report?</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:adviceOnOveriddenMethods"></a><b>12. </b>
+ My advice runs for each overridden method!
+ </p></div><div class="answer"><p><a name="d0e2110"></a><b></b>Most likely you are advising the method execution join
+ point and specifying the defining signature.
+ Since all overriding methods share this signature,
+ the advice runs for each method executed.
+ (This happens, e.g., when one method invokes the same method
+ in the superclass using <tt>super.{method}(..)</tt>).
+ This is the correct behavior.
+ </p><p>To avoid this, use the <tt>call(..)</tt> pointcut
+ designator, or use <tt>!cflow(..)</tt> to pick
+ out only the initial method-execution.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:tejpsp"></a><b>13. </b>
+ I don't understand when thisEnclosingJoinPointStaticPart is available.
+ </p></div><div class="answer"><p><a name="d0e2128"></a><b></b>
+ <tt>thisEnclosingJoinPointStaticPart</tt> is a special
+ variable available in the context of advice to refer to the
+ join point, if any, lexically enclosing the current join point:
+ <div class="table"><p><a name="d0e2134"></a><b>Table 1. thisEnclosingJoinPointStaticPart</b></p><table summary="thisEnclosingJoinPointStaticPart" border="1"><colgroup><col><col></colgroup><tbody><tr><td>One of these...</td><td>will be tEJSP for each of these:</td></tr><tr><td>
+ constructor-execution, method-execution,
+ advice execution, initialization,
+ pre-initialization, static initialization
+ </td><td>
+ constructor-call, method-call, handler,
+ field-set, field-get
+ </td></tr></tbody></table></div>
+ Expressions in the body of handlers have the same
+ <tt>thisEnclosingJoinPointStaticPart</tt>
+ as the handler itself.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:packagedeclares"></a><b>14. </b>
+ I declared a member on a class with package access, but other classes in the package cannot see it.
+ </p></div><div class="answer"><p><a name="d0e2157"></a><b></b>When declaring parents on other types from an aspect, package access only
+ applies to code the implementation controls. For AspectJ 1.0, that is the set of files
+ passed to the compiler. That means other classes not compiled with the aspect will not
+ be able to access the aspect-declared members even if they are in the same package.
+ The only way for classes outside the control of the implementation to access aspect-declared
+ members is to declare them public.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:interfaceDeclarations"></a><b>15. </b>I declared a member on a interface, but javac does not see it.
+ </p></div><div class="answer"><p><a name="d0e2164"></a><b></b>
+ You have to compile all the top-level implementating
+ classes of the interface using <tt>ajc</tt>.
+ From an email by Jim Hugunin on the requirements for AspectJ 1.1 to
+ implement members declared by an aspect on an interface:
+ </p><p>
+ If you introduce non-static fields or non-abstract methods on an interface
+ from an aspect, then all of the top-most implementors of that interface must
+ be woven by that same aspect.
+ (A class C is a top-most implementor of an interface I if C implements I
+ and the superclass of C does not implement I.)
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:cantfindjavac"></a><b>16. </b>
+ <tt>ajc</tt> 1.0 complains that it can't find
+ <tt>javac</tt>. What's wrong?
+ </p></div><div class="answer"><p><a name="d0e2182"></a><b></b>
+ <tt>ajc</tt> 1.0 does not try to locate
+ <tt>javac</tt> in your path: it uses the
+ <tt>javac</tt> classes directly. In JDK 1.2 and 1.3 these
+ classes are found in <tt>tools.jar</tt> (in the
+ <tt>lib</tt> directory of the JDK distribution), which
+ must be on your classpath to make
+ <tt>ajc</tt> work with <tt>javac</tt>.
+ Inspect the java command that launches ajc to make sure that
+ <tt>tools.jar</tt> is on the classpath for ajc;
+ the -classpath option only applies to the sources compiled.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:ajdocneeds13"></a><b>17. </b>
+ I'm running under 1.4, but <tt>ajdoc</tt> asks for 1.3
+ (or throws IllegalAccessError for HtmlWriter.configuration)
+ </p></div><div class="answer"><p><a name="d0e2216"></a><b></b>
+ The 1.0 implementation of <tt>ajdoc</tt> uses
+ specific javadoc classes in the J2SE 1.3 tools.jar.
+ We are working on addressing this limitation, but in the interim
+ it is best to run ajdoc under 1.3.
+ </p><p>
+ When running from the command-line scripts, edit the scripts directly
+ to put the 1.3 tools.jar first on the classpath. (The installer does
+ not know about this limitation of ajdoc.)
+ </p><p>
+ When running from Ant, users often have tools.jar in ${ant.classpath}
+ (to make javac, et al work). That makes it impossible to run the ajdoc
+ taskdef (which does not currently support forking), so you'll need to
+ run a separate ant process, either from the command-line or via Ant's
+ exec task (the Ant task will propagate the classpath).
+ If the wrong tools.jar is not on the ant classpath, then it should work
+ to put the 1.3 tools.jar in the taskdef classpath.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:compileunits"></a><b>18. </b>I set up different files to my compiles to change what
+ the aspects see, but now I don't
+ understand how the aspects are working.
+ </p></div><div class="answer"><p><a name="d0e2230"></a><b></b>It is a bad practice to use the compilation unit
+ to control crosscutting. Aspects and pointcuts especially
+ should be written to specify crosscutting precisely.
+ Aspects will behave the same when you add files if
+ you initially included all files affected by your aspects.
+ If you use the compilation unit, then your code will behave
+ differently in AspectJ implementations that do not limit
+ themselves to specified files.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:readingpreprocessedcode"></a><b>19. </b>I'm reading the code generated by <tt>ajc</tt> 1.0
+ in <tt>-preprocess</tt> mode, and it seems like it would not
+ work (or "like it works this way").
+ </p></div><div class="answer"><p><a name="d0e2243"></a><b></b>The generated code can be difficult for a human to read and
+ understand. The compiler uses implementation techniques which might
+ not be apparent. To determine if the code is behaving correctly, you
+ should write and run a program that attempts to provoke the error you
+ suspect. Similarly, you should not rely on invariants you infer from
+ the generated code (especially naming conventions for generated members).
+ Please rely only on the semantics stated in the appendix of the
+ AspectJ <a href="progguide/index.html" target="_top">Programming Guide</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:injection"></a><b>20. </b>I've heard AspectJ can generate or inject code into my code.
+ Is this true?
+ </p></div><div class="answer"><p><a name="d0e2253"></a><b></b>
+ This is a misconception spawned from the early implementation.
+ </p><p>
+ AspectJ does not "inject" or "generate" code. In AspectJ the
+ pointcut constructs allow the programmer to identify join points,
+ and the advice constructs define additional code to run at those
+ join points.
+ </p><p>
+ So the semantic model of advice is like the semantic model of a
+ method -- it says "when any of these things happen, do this".
+ </p><p>
+ People who worked with earlier versions of AspectJ, in which ajc
+ was very explicitly a pre-processor, sometimes thought of AspectJ
+ as injecting code. But that was an artifact of the implementation,
+ not the underlying language semantics.
+ </p><p>
+ This distinction is important for two reasons. One is that thinking
+ about it this way will make more sense at the implementation continues
+ to evolve towards load-time or runtime weaving. The other is that
+ it makes it much easier to understand the semantics of advice on
+ cflow pointcuts.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:newjoinpoints"></a><b>21. </b>Why can't AspectJ pick out local variables (or array elements or ...)?
+ </p></div><div class="answer"><p><a name="d0e2268"></a><b></b>Users have sometimes wanted AspectJ to pick out
+ many more join points, including
+ <div class="itemizedlist"><ul><li><p><a name="d0e2272"></a>method-local field access</p></li><li><p><a name="d0e2275"></a>array-element access</p></li><li><p><a name="d0e2278"></a>loop iteration</p></li><li><p><a name="d0e2281"></a>method parameter evaluation</p></li></ul></div>
+ Most of these have turned out not to make sense,
+ for a variety of reasons:
+ <div class="itemizedlist"><ul><li><p><a name="d0e2286"></a>it is not a commonly-understood unit for Java programmers</p></li><li><p><a name="d0e2289"></a>there are very few use-cases for advice on the join point</p></li><li><p><a name="d0e2292"></a>a seemingly-insignificant change to the underlying program
+ causes a change in the join point</p></li><li><p><a name="d0e2295"></a>pointcuts can't really distinguish the join point in question</p></li><li><p><a name="d0e2298"></a>the join point would differ too much for different
+ implementations of AspectJ, or would only be implementable
+ in one way
+ </p></li></ul></div>
+ We prefer to be very conservative in the join point model for the language,
+ so a new join point would have to be useful, sensible, and implementable.
+ The most promising of the new join points proposed are for exception
+ throws clauses and for synchronized blocks.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:reflectiveCalls"></a><b>22. </b>Why doesn't AspectJ pick out reflective calls?
+ The pointcut <tt>call(void run())</tt>
+ won't pick out a call using reflection, like
+ <tt>((Method)run).invoke(null, args)</tt>.
+ </p></div><div class="answer"><p><a name="d0e2312"></a><b></b>The pointcut
+ <tt>execution(void run())</tt> will
+ work. The call pointcut doesn't work because
+ <tt>Method.invoke(..)</tt> is the Java method-call,
+ and AspectJ cannot delve into the Java reflection library to
+ implement call semantics. To advise a reflective call
+ (e.g., because the compiler does not control the code for the
+ method execution), test the context for <tt>invoke(..)</tt>.
+ Here's a pointcut that tests only if the method name is
+ correct:
+ </p><pre class="programlisting">
+aspect A {
+ pointcut runReflectiveCall(Method run) : target(run) &&
+ call(Object Method.invoke(..)) && if("run".equals(run.getName()));
+ before() : runReflectiveCall(Method) {
+ System.out.println("before reflective call " + thisJoinPoint);
+ }
+}
+ </pre></div></div><div class="qandaentry"><div class="question"><p><a name="q:currentbugs"></a><b>23. </b>What are the bugs now most affecting users?</p></div><div class="answer"><p><a name="d0e2330"></a><b></b>The bugs affecting the semantics of the language
+ are marked with the "info" keyword. Find them with
+ the query
+ <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&keywords=info" target="_top">
+ http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&keywords=info
+ </a>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:runtimeMemory"></a><b>24. </b>What extra memory is required at runtime?
+ </p></div><div class="answer"><p><a name="d0e2340"></a><b></b>When running classes produced by the AspectJ weaver or compiler,
+ there are no significant hidden uses of memory. As would be expected,
+ each aspect is instantiated. The per-object aspects (like
+ <tt>pertarget</tt> or <tt>perthis</tt>)
+ in some implementations
+ use a map to link aspects and the associated object. When using
+ <tt>cflow</tt>-related pointcuts, a <tt>ThreadLocal</tt>
+ is used to track control flow for each affected thread.
+ </p><p>Of course, the size and code in an aspect can require memory.
+ Aside from normal Java practices, take care with join point references.
+ When referencing the static part of a join point (e.g.,
+ <tt>thisJoinPointStaticPart</tt>), only one object is
+ created. However, if you reference the join point itself
+ (e.g., <tt>thisJoinPoint</tt>), then one
+ <tt>JoinPoint</tt> object will be created for each
+ join point running advice.
+ </p><p>Aspect instances will be garbage collected just like regular objects
+ after there are no more strong references to them. For the default
+ aspect instantiation model, <tt>issingleton</tt>, the aspect
+ class retains a reference to the singleton instance, in order to
+ implement <tt>static {AspectClass} aspectOf()</tt>, so
+ singleton instances will not be garbage collected until the class is.
+ For long-running or memory-critical programs, consider using weak
+ references in singleton aspects for state that should be garbage collected.
+ </p><p>Finally, when using load-time weaving, the weaver can require
+ memory in its own right. Because the class loader never can
+ know when it is done loading classes, the weaver can hold on
+ to the aspects required to weave for some time. There are
+ strategies for minimizing this (with different trade-off's),
+ so the time and memory required for load-time weaving will
+ vary as load-time weaving evolves.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="aj11"></a>12 AspectJ 1.1 and eclipse.org</h3><div class="qandaentry"><div class="question"><p><a name="q:whyeclipse"></a><b>1. </b>Why did the AspectJ project move to eclipse.org?
+ </p></div><div class="answer"><p><a name="d0e2383"></a><b></b>From the message sent to users:
+ </p><p>
+ AspectJ has come a long way -- the language has
+ stabilized; there are a rapidly growing number of
+ commercial users; the 1.1 release is imminent and will
+ include byte-code weaving and incremental compilation;
+ and the tool support is now well integrated with several
+ major IDEs.
+ </p><p>
+ This growth of the community and the technology means
+ that the original research and prototype development of
+ AspectJ is complete. As such it is time for ongoing
+ development and support of AspectJ to move outside of
+ PARC. This has already started to happen; the Eclipse
+ AJDT plug-in and the several books in preparation are
+ examples.
+ </p><p>
+ To encourage the growth of the AspectJ technology and
+ community, PARC is transferring AspectJ to an
+ openly-developed eclipse.org project. This project will
+ include documentation, web site, mailing lists, bug
+ database, and sources for the compiler. The
+ command-line AspectJ compiler is still the primary tool
+ produced by this project, in addition to APIs that support
+ integration with a variety of IDEs. The Eclipse plug-in will
+ remain at eclipse.org, while the NetBeans, JBuilder and
+ Emacs support will move to SourceForge.net projects.
+ We look forward to your involvement with and
+ contribution to those projects.
+ </p><p>
+ We see Eclipse as an excellent new home for core
+ AspectJ technology development -- it is an active
+ community of Open Source development and innovation
+ in the Java space. Once development moves to
+ Eclipse.org, others will be able to contribute more easily.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:eclipserequired"></a><b>2. </b>Do I have to download Eclipse to use AspectJ?
+ </p></div><div class="answer"><p><a name="d0e2398"></a><b></b>No. The AspectJ tools download is completely self-contained
+ and does not require that you work in Eclipse.
+ For information on IDE support, see
+ <a href="#q:integrateWithDevTools">Q: How well does AspectJ integrate with existing Java development tools?</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:eclipseetc"></a><b>3. </b>What are the relationships between AspectJ, JDT,
+ Eclipse, AJDT, and IDE support generally?
+ </p></div><div class="answer"><p><a name="d0e2407"></a><b></b>Eclipse is a software platform.
+ </p><p>JDT is an eclipse project to support Java development.
+ JDT has a Java compiler.
+ </p><p>AspectJ 1.1 is built on Eclipse/JDT's Java compiler
+ but is distributed standalone and can run standalone.
+ With the AspectJ distribution, you can compile and run
+ AspectJ programs and use the AspectJ structure browser.
+ </p><p>AJDT is an eclipse project to integrate AspectJ
+ into Eclipse/JDT so you can use Eclipse to develop
+ AspectJ programs. AJDT aims to support the full Eclipse
+ experience - searching, compiler-error tasks, etc.
+ AJDT will use the AspectJ Development Environment (AJDE)
+ API's for creating IDE integrations, as well as hooking
+ in to the model underlying the Java compiler.
+ </p><p>Similarly, Sourceforge has projects integrating
+ AspectJ into other development environments
+ using the AJDE API's:
+ <a href="http://aspectj4emacs.sourceforge.net" target="_top">
+ AspectJ for Emacs</a>,
+ <a href="http://aspectj4jbuildr.sourceforge.net" target="_top">
+ AspectJ for JBuilder</a>, and
+ <a href="http://aspectj4netbean.sourceforge.net" target="_top">
+ AspectJ for NetBeans</a>.
+ </p><p>This is the right level of separation/integration.
+ AspectJ is available standalone, leverages an existing open-source
+ compliant Java compiler, and supports external projects
+ doing IDE integrations in Eclipse, Emacs, JBuilder, and NetBeans
+ through a common API, AJDE.
+ </p></div></div></div><div class="qandadiv"><div class="qandaentry"><div class="question"><p><a name="q:aspectj5features"></a><b>1. </b>
+ What are the new features of AspectJ 5?
+ </p></div><div class="answer"><p><a name="d0e2434"></a><b></b>
+ All the new features are documented in the
+ <a href="adk15notebook/index.html" target="_top">
+ AspectJ 5 Developer's Notebook</a>
+ and the
+ <a href="devguide/index.html" target="_top">
+ AspectJ Development Environment Guide</a>.
+ To summarize:
+ </p><div class="itemizedlist"><ul><li><p><a name="d0e2444"></a>
+ Java 5 support: as an extension to Java, AspectJ supports
+ all the new language features of Java 5, including generics
+ (parameterized types), autoboxing, covariant return types,
+ enhanced for-loops, enums, varargs, and of course
+ annotations.
+ </p></li><li><p><a name="d0e2447"></a>
+ Java 5 extensions: the AspectJ language has been extended
+ to make use of Java 5 language features.
+ <div class="itemizedlist"><ul><li><p><a name="d0e2451"></a>
+ Generic aspects: an abstract aspect can be declared
+ with a generic type parameter which can be used
+ in pointcuts and when declaring members on the aspect
+ (but not when declaring members on other types).
+ </p></li><li><p><a name="d0e2454"></a>
+ Annotations: pointcuts can now pick out join points
+ based on the associated annotations, annotation
+ values can be bound in the same way that other
+ context variables are bound at the join point,
+ and annotations may be declared on other types in
+ an aspect.
+ </p></li></ul></div>
+ </p></li><li><p><a name="d0e2458"></a>
+ Annotation-style aspects: AspectJ 5 integrates AspectWerkz-style
+ aspects declared in annotations. This permits aspects to
+ be written and compiled in pure-java code and woven using
+ build-time or load-time weaving with the AspectJ weaver.
+ (The original AspectJ language aspects are distinguished
+ as "code-style" aspects.)
+ </p></li><li><p><a name="d0e2461"></a>
+ AspectWerkz load-time weaving: Load-time weaving is
+ greatly improved for all versions of Java, and now supports
+ an XML configuration file which can declare concrete aspects.
+ This means developers can deploy binary abstract aspects
+ that deployers configure using only XML.
+ </p></li><li><p><a name="d0e2464"></a>
+ pertypewithin instantiation model: aspects may now be instantiated
+ on a per-class basis.
+ </p></li><li><p><a name="d0e2467"></a>
+ Reflection and runtime support: AspectJ 5 supports reflection
+ on aspects using the Aspect class, and also support runtime
+ evaluation of pointcuts using a pointcut parser.
+ </p></li></ul></div><p>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:codeversusannotationstyles"></a><b>2. </b>
+ Should I use code- or annotation-style aspects?
+ </p></div><div class="answer"><p><a name="d0e2476"></a><b></b>
+ To use AspectJ, you can use the original code-style aspects
+ or the annotation-style aspects new in AspectJ 5.
+ </p><p>
+ The original code-style is a small extension of the Java language
+ designed to express crosscutting as clearly as possible
+ in ways familiar to most Java programmers.
+ To use the original code-style aspects,
+ compile them with the AspectJ compiler or weave
+ pre-compiled binary aspects using the AspectJ binary (.class)
+ weaver, either at build-time or at class-load-time.
+ Code-style aspects have excellent IDE support, allowing
+ you to navigate to and from affected source code.
+ </p><p>
+ Annotation-style
+ aspects are written (not surprisingly) using annotations.
+ They use the subset of the AspectJ language that works
+ when aspects are woven after the code is compiled.
+ The source files are compiled with Javac, which simply saves the
+ annotations in the .class files. The resulting .class files
+ must be woven using
+ the AspectJ weaver, which reads the annotations from the
+ .class file and uses them to define aspects.
+ Annotation-style aspects have the benefit of being compilable
+ by Javac, but you can't use the full AspectJ language,
+ and you don't enjoy the same level of IDE support
+ for viewing crosscutting structure.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:aspectj5ltw"></a><b>3. </b>
+ What's new about the load-time weaving support in AspectJ 5?
+ </p></div><div class="answer"><p><a name="d0e2487"></a><b></b>
+ While the AspectJ weaver could be used at load-time in previous
+ releases, the AspectJ 5 release supports much better integration
+ with the Java 5 VM and the BEA JRocket JVM. It also supports
+ an XML file for configuration that allows deployers to declare
+ concrete aspects using only XML. This means aspect developers
+ can write abstract aspects, and deployers need only configure
+ <tt>aop.xml</tt> and run using the AspectJ weaver in Java 5.
+ For example, to run Java 5 VM with load-time weaving,
+ </p><pre class="programlisting">
+
+java -javaagent:aspectjweaver.jar -classpath "aspects.jar:${CLASSPATH}" ..
+
+ </pre><p>
+ To declare a concrete aspect, add a a
+ concrete-aspect XML entity to <tt>META-INF/aop.xml</tt>.
+ This example extends a tracing aspect to apply to
+ every type in the application:
+ </p><pre class="programlisting">
+
+<concrete-aspect
+ name="com.company.tracing.ConcreteTracing"
+ extends="tracing.AbstractTracing">
+ <pointcut
+ name="tracingScope"
+ expression="within(com.company.app..*)"/>
+</concrete-aspect>
+
+ </pre><p>
+ For more information, see the
+ <a href="devguide/index.html" target="_top">
+ AspectJ Development Environment Guide</a>.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="Technology"></a>14 Understanding AspectJ Technology</h3><div class="qandaentry"><div class="question"><p><a name="q:implementation"></a><b>1. </b>Do I need to know how the compiler or weaver works?
+ </p></div><div class="answer"><p><a name="d0e2514"></a><b></b>Writing AspectJ programs only requires understanding the
+ <a href="progguide/index.html" target="_top">Programming Guide</a>.
+ However, current implementations do not control everything in
+ a system, so AspectJ program semantics may be limited to code
+ the implementation controls. For our implementation, these
+ limitations are stated in
+ <a href="progguide/implementation.html" target="_top">
+ Programming Guide Appendix: Implementation Notes</a>.
+ Aside from understanding the use and limitations of the
+ implementation, there is no need to understand the underlying
+ technology when writing AspectJ programs.
+ </p><p>
+ The technology that implements AspectJ interests
+ some academic researchers and some developers
+ who want new features or new ways to weave.
+ These extensions are not discussed in the documentation.
+ Some are being developed already,
+ others are on the drawing board (or perhaps were left off
+ long ago), and still others haven't been considered.
+ If you are interested in a certain extension,
+ check the bug database for feature requests
+ and the mailing list archives for any past discussions.
+ Then email the list to see if it's been considered.
+ For more information, see
+ <a href="#Developers">AspectJ Project Development</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:whitepapers"></a><b>2. </b>How does the compiler/weaver work? Are there any white papers?
+ </p></div><div class="answer"><p><a name="d0e2531"></a><b></b>
+ There are currently no documents describing this process in detail.
+ You can compile programs and inspect the generated source or bytecode,
+ or view the source code (see <a href="#Developers">AspectJ Project Development</a>).
+ We hope to write papers on the bytecode weaving model used in
+ AspectJ-1.1 if we can find the time.
+ Erik Hilsdale and Jim Hugunin did draft a paper for AOSD 2004,
+ now available on Jim's web site:
+ <a href="http://hugunin.net/papers.html" target="_top">
+ http://hugunin.net/papers.html</a>
+ Jim summarized advice weaving in the AspectJ 1.1 implementation in the
+ <a href="http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg00519.html" target="_top">
+ following mailing-list reply</a>:
+ </p><p>
+ Each piece of advice in an aspect is associated with a pointcut.
+ This pointcut is stored in an attribute on the methods
+ corresponding to each piece of advice.
+ Before weaving, all of these pieces of advice are gathered
+ into one large list.
+ </p><p>
+ Each .class file is woven independently.
+ A .class file is woven by the following steps:
+ <div class="itemizedlist"><ul><li><p><a name="d0e2547"></a>
+ Collect all of the joinpoint shadows in the .class file.
+ For every dynamic joinpoint in the AspectJ language model,
+ there is a corresponding static shadow of that joinpoint
+ in the bytecode.
+ For example, every method call joinpoint has an INVOKE
+ bytecode as its static shadow. Some joinpoints
+ (such as initialization) have much more
+ complicated static shadows.
+ </p></li><li><p><a name="d0e2550"></a>
+ Each piece of advice is matched to each static shadow.
+ There are three results possible from this match.
+ <div class="itemizedlist"><ul><li><p><a name="d0e2554"></a>
+ Never matches,
+ in which case nothing is done to the shadow
+ </p></li><li><p><a name="d0e2557"></a>
+ Always matches,
+ in which case the advice is woven into this joinpoint shadow
+ </p></li><li><p><a name="d0e2560"></a>
+ Sometimes matches,
+ in which case the advice is woven into the shadow
+ along with the minimal dynamic tests to determine
+ if any particular joinpoint in the actual running
+ program matches the advice.
+ The simplest example of sometimes matches is
+ when the pointcut uses if(test()).
+ </p></li></ul></div>
+ </p></li><li><p><a name="d0e2564"></a>
+ If any advice matched any static shadows in the .class file,
+ then the transformed .class file is written out,
+ otherwise it is left unchanged.
+ </p></li></ul></div>
+ See <tt>BcelClassWeaver</tt> and
+ <tt>BcelShadow</tt> in the
+ <tt>org.aspectj.weaver.bcel</tt> package
+ for the two primary classes involved in this process.
+
+ </p><p>
+ Note: This explanation ignores the implementations of inter-type
+ declarations completely.
+ It also ignores performance optimizations such as fast-match
+ that speed up the weaving process.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:reflection"></a><b>3. </b>Does AspectJ use reflection at runtime?
+ </p></div><div class="answer"><p><a name="d0e2583"></a><b></b>
+ The only time that reflection is used during run-time is when the special
+ thisJoinPoint object is used to discover reflective information about the
+ join point. If you don't use thisJoinPoint then no reflection will be used.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:loadtimeWeaving"></a><b>4. </b>What about load-time weaving? Can I weave aspects at runtime?
+ </p></div><div class="answer"><p><a name="d0e2590"></a><b></b>
+ Since the 1.1 release, AspectJ can weave binary aspects
+ into classes in bytecode form. Hooked up to a class loader,
+ this can weave class bytecodes after they are read in,
+ before the
+ class is defined by the VM. (This means load-time weaving
+ only works were aspects are not required to compile the pure-java
+ classes. If the aspects are required, then the Java classes
+ have to be compiled with the aspects using the AspectJ compiler.)
+ The AspectJ 1.2 release had the
+ WeavingURLClassLoader, and the 1.2.1 release introduced
+ the aj.bat script for Java 1.4.
+ The AspectJ 5 release introduces much better support for
+ load-time weaving, including declaring concrete aspects
+ in XML files and integrating with Java 5 and BEA JRocket
+ JVM's. See <a href="#q:aspectj5ltw">Q:What's new about the load-time weaving support in AspectJ 5?</a>.
+ </p><p>Some have asked about only weaving particular classes
+ specified at run-time.
+ Aspects should work across an entire namespace, and problems
+ will likely result from weaving
+ some classes but not others. Also, it's confusing to
+ specify crosscutting both in the aspect and in the
+ list of runtime classes; the crosscutting specification
+ should be in the aspect itself,
+ where it can be processed by tools.
+ </p><p>And just to state the obvious:
+ do not use bytecode weaving, at load-time or otherwise,
+ to modify .class files protected by license,
+ without permission from the licensor.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="Developers"></a>15 AspectJ Project Development</h3><div class="qandaentry"><div class="question"><p><a name="q:howitworks"></a><b>1. </b>I'm interested in the code implementing AspectJ.
+ </p></div><div class="answer"><p><a name="d0e2606"></a><b></b>Most people do not need to see the code for AspectJ;
+ they can download the binary distribution for documentation
+ and tools for writing AspectJ programs.
+ </p><p>For people who want to know how the AspectJ technology works,
+ the source code is the best resource, until we write some
+ proper white papers
+ (see <a href="#q:implementation">Q:Do I need to know how the compiler works?</a>).
+ To get and compile the Java source code for the AspectJ
+ distribution, see
+ <a href="#q:buildingsource">Q:How do I get and compile the source code for AspectJ?</a>.
+ </p><p>Bear in mind when looking at the code that there are many
+ ways to implement the AspectJ language, and the code inspected
+ might be an initial version of a new architecture (e.g., bytecode
+ weaving).
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:contributions"></a><b>2. </b>How can I get involved with developing the AspectJ project?
+ </p></div><div class="answer"><p><a name="d0e2621"></a><b></b>For those who want to contribute to the project,
+ here's a general list of ways to do so, in no particular order:
+ <div class="itemizedlist"><ul><li><p><a name="d0e2625"></a>Participate effectively in the mailing lists.
+ The quality of the mailing lists makes a huge difference
+ in the ability of new and experienced AspectJ users
+ to write good code. For guidance on effective
+ participation, see
+ <a href="#q:talktousers">Q:How do I communicate with other AspectJ users?</a> and
+ <a href="#q:writingbugsandemails">Q:How should I write email queries?</a>.
+ Also, the time that experienced users take in answering emails
+ can directly translate to time developers can use (instead)
+ for fixing bugs or adding features.
+ </p></li><li><p><a name="d0e2632"></a>Write bugs. Good bugs, especially with test cases,
+ are always appreciated. We especially like proposals for
+ new <tt>XLint</tt> messages, since they are
+ sometimes easy to implement and help users learn
+ AspectJ, and for other implementable features
+ grounded in a compelling use-case.
+ </p></li><li><p><a name="d0e2638"></a>Write test cases for compiler bugs without test cases.
+ Compiler bugs without test cases are much less likely to be fixed;
+ until they are rendered in code, they might be user mistakes,
+ and they might duplicate another bug or actually cover many bugs.
+ </p><p>Find them by searching open compiler bugs and picking out
+ any which do not have test case attachments or a comment that
+ a test case has been written.
+ Here is a query for open compiler bugs:
+
+ <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED" target="_top">
+ http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED
+ </a>
+ </p><p>For how to write test cases, see
+ <a href="#q:harnesstestcases">Q:How should I submit test cases for bugs?</a>.
+ </p></li><li><p><a name="d0e2652"></a>Write patches to fix bugs.
+ If you particularly need a bug to be fixed, or if you're interested in
+ learning about the system, then get the source code and try to fix the
+ bug. Most likely you'll want to email aspectj-dev@eclipse.org to
+ declare your intentions and the approach you propose (based on having
+ looked at the code).
+ Mailing the list gives those experienced with the code a chance to
+ guide you away from pitfalls. To submit the patch, attach it to
+ the bug. (When creating patches, do so on a per-module basis; that
+ means if fixing the bug involves changes to three modules, submit
+ three patches.)
+ </p></li><li><p><a name="d0e2655"></a>Write patches for other reasons.
+ Often documentation needs to be fixed, or there may be a small new
+ feature you'd like to see. You can just do it and then submit it
+ as a patch to a bug you create. As with bugs, in some cases you
+ might want to declare your intentions on the mailing list to avoid
+ wasting time on something that's been fixed but not committed or
+ on an approach that will be fruitless.
+ </p></li></ul></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:buildingsource"></a><b>3. </b>How do I get and compile the source code for AspectJ?
+ </p></div><div class="answer"><p><a name="d0e2663"></a><b></b>AspectJ 1.0 source code is available in an archive available
+ with the 1.0 downloads. It contains instructions for building
+ from sources.
+ </p><p>AspectJ 1.1+ source code is available through CVS using the
+ CVS Root <tt>dev.eclipse.org:/cvsroot/tools</tt>.
+ For more information on accessing the CVS tree at eclipse.org,
+ see the documentation from <a href="http://eclipse.org" target="_top">http://eclipse.org</a>. Find
+ specific instructions in the AspectJ tree at <a href="http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/org.aspectj/modules/build/readme-build-and-test-aspectj.html?rev=HEAD&content-type=text/html&cvsroot=Technology_Project" target="_top">
+ org.aspectj/modules/build/readme-build-and-test-aspectj.html</a>.
+ If you would like to use Ant to checkout the sources, build the
+ distribution, and test everything, see <a href="http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/org.aspectj/modules/build/release/build.xml?rev=HEAD&content-type=text/xml&cvsroot=Technology_Project" target="_top">
+ org.aspectj/modules/build/release/build.xml</a>. </p><p>
+ To check out the source code in Eclipse go to (<tt>File > new > Other > CVS > Checkout Projects from CVS</tt>). You'll need about 125 MB of space for the source and build.
+ Host: <tt>dev.eclipse.org</tt>,
+ Repository Path: <tt>/cvsroot/tools</tt>,
+ user name: <tt>anonymous</tt>,
+ password: (your email address),
+ connection type: <tt>pserver</tt>,
+ default port.
+ Then select the individual modules you want to check out (you probably want all of them bar aspectj-attic and java5) and click Next and choose to check out the modules you selected as Java projects.
+ Once thats done each module you checked out should show up as a project in the package explorer.
+ If you have problems after this point you can view the build instructions that come with AspectJ by going in the package explorer to: <tt>build > readme-build-and-test-aspectj.html</tt>.
+ </p><p>
+ To get the modules to build you have to set some classpath variables (<tt>Window > Preferences > Java > Build Path > Classpath Variables</tt>):
+ </p><p>
+ <div class="itemizedlist"><ul><li><p><a name="d0e2708"></a>
+ Name: <tt>JAVA_HOME</tt>, Value: (wherever your Java JDK is installed)
+ </p></li><li><p><a name="d0e2714"></a>
+ Name: <tt>JRE14_LIB</tt>, Value: (wherever your Java 4 Runtime is installed)<tt>\jre\lib\rt.jar</tt>
+ </p></li><li><p><a name="d0e2723"></a>
+ Name: <tt>JRE15_LIB</tt>, Value: (wherever your Java 5 Runtime is installed)<tt>\jre\lib\rt.jar</tt>
+ </p></li><li><p><a name="d0e2732"></a>
+ Name: <tt>ASPECTJRT_LIB</tt>, Value: (wherever your workspace is)<tt>\lib\aspectj\lib\aspectjrt.jar</tt>. To find out where your workspace is go to <tt>File > Switch Workspace</tt>.
+ </p></li></ul></div>
+ </p><p>
+ The <tt>org.aspectj.lib</tt> project is an AspectJ project so
+ you also have to have AJDT installed. For the latest AJDT release and
+ download instructions visit the
+ <a href="http://www.eclipse.org/ajdt/downloads/" target="_top">AJDT Downloads</a> page.
+ </p><p>
+ When you've added the variables click OK to do a full rebuild, then run the tests by going in the Package Explorer to:
+ <tt>run-all-junit-tests > testsrc > (default package) > RunTheseBeforeYouCommitTests.java</tt>
+ and running this as a JUnit test (right click and select <tt>Run As > JUnit Test</tt>).
+ Don't worry about any errors that appear in the console output,
+ just check that there are no failures in the JUnit view (<tt>Window > Show View > Other > Java > JUnit</tt>).
+ If that finishes with no Failures and a full green bar you have the AspectJ compiler source and it's building and testing properly.
+ </p><p>
+ Further details:
+ </p><p>
+ You can check out the entire modules directory and build using the
+ Ant build script <tt>modules/build/build.xml</tt>.
+ All required libraries are included in <tt>modules/lib/</tt>,
+ (including Ant 1.5.1 in <tt>modules/lib/ant</tt>).
+ If you are using Eclipse, you can check out any <tt>modules/</tt>
+ subdirectory as an eclipse Java project.
+ Depending on what you are trying to build, you need not check out
+ all modules; as of this writing, here are the modules to get
+ for building the specific parts of AspectJ:
+ </p><p>
+ <div class="itemizedlist"><ul><li><p><a name="d0e2783"></a>For any builds: build, lib
+ </p></li><li><p><a name="d0e2786"></a>For the documentation: docs
+ </p></li><li><p><a name="d0e2789"></a>For the compiler: bridge, util, testing-util,
+ weaver, asm, org.eclipse.jdt.core, org.aspectj.ajdt.core,
+ and runtime.
+ </p></li><li><p><a name="d0e2792"></a>For ajbrowser: the compiler modules, plus
+ ajbrowser, ajdoc, taskdefs, and ajde.
+ </p></li><li><p><a name="d0e2795"></a>For the AspectJ distribution, the ajbrowser modules,
+ plus aspectj5rt and org.aspectj.lib.
+ </p></li><li><p><a name="d0e2798"></a>For the test harness (or to run the release build
+ scripts and tests): the ajbrowser modules, plus
+ testing, testing-client, and testing-drivers.
+ </p></li><li><p><a name="d0e2801"></a>To run the test suite: the test harness modules, plus
+ tests.
+ </p></li></ul></div>
+ </p><p>
+ Note that module interdependencies are recorded only in the eclipse
+ <tt>modules/{module}/.classpath
+ </tt>
+ files and may
+ change, so the list above may not be correct when you read it.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:buildingAspectJAndAJDT"></a><b>4. </b>How do I build AspectJ and integrate it into AJDT?
+ </p></div><div class="answer"><p><a name="d0e2814"></a><b></b>To build AspectJ, first get the source tree as
+ described in <a href="#q:buildingsource">Q:How do I get and compile the source code for AspectJ?</a>. Once you have
+ a development environment set up, copy the
+ <tt>build/sample-local.properties</tt> file
+ to <tt>build/local.properties</tt> and within this file point the
+ <tt>java14.home</tt> and <tt>java15.home</tt>
+ to the corresponding places on your machine.
+ </p><p>
+ To build AspectJ on the command line:
+ </p><p>
+ <div class="itemizedlist"><ul><li><p><a name="d0e2836"></a>
+ Open a command prompt
+ </p></li><li><p><a name="d0e2839"></a>
+ Navigate to the <tt>build</tt> directory within your AspectJ workspace
+ (to find out where your workspace is go to <tt>File >
+ Switch Workspace</tt> within Eclipse).
+ </p></li><li><p><a name="d0e2848"></a>
+ Run <tt>ant clean</tt> to remove the files from
+ previously built AspectJ versions.
+ </p></li><li><p><a name="d0e2854"></a>
+ Run <tt>ant</tt> to build AspectJ. The built files are created in
+ <tt>your_eclipse_installation_directory/aspectj_development_workspace/aj-build</tt>.
+ </p></li></ul></div>
+ </p><p>
+ To import a locally built AspectJ into AJDT first follow the
+ instructions on <a href="http://www.eclipse.org/ajdt/faq.php#q:develop" target="_top">
+ How do I setup an AJDT development environment in Eclipse?</a>
+ for setting up an AJDT development environment and running the
+ correctness tests. Then:
+ </p><p>
+ <div class="itemizedlist"><ul><li><p><a name="d0e2872"></a>
+ Create a file <tt>aspectjlib.properties</tt> within
+ the <tt>org.aspectj.ajde</tt> project and add the following two lines
+ <pre class="programlisting">
+aspectj.lib.dir=C:/eclipse/aspectj-workspace/aj-build/dist/tools/lib
+aspectj.doc.dir=C:/eclipse/aspectj-workspace/aj-build/dist/ide/eclipse/org.aspectj.ajde.doc/doc
+ </pre>
+ making sure to change the path to correspond to your set up.
+ </p></li><li><p><a name="d0e2884"></a>
+ Run the <tt>build.xml</tt> file in <tt>org.aspectj.ajde</tt>
+ with the <tt>plugin jars</tt> target:
+ <div class="itemizedlist"><ul><li><p><a name="d0e2897"></a>
+ Right click on the <tt>build.xml</tt> file in the
+ <tt>org.aspectj.ajde</tt> plugin
+ </p></li><li><p><a name="d0e2906"></a>
+ Select <tt>Run As > Ant build...</tt>
+ </p></li><li><p><a name="d0e2912"></a>
+ In the resultant dialog navigate to the <tt>Targets</tt> tab
+ </p></li><li><p><a name="d0e2918"></a>
+ Ensure <tt>plugin jars</tt> is the only selected target
+ </p></li><li><p><a name="d0e2924"></a>
+ Click <tt>Run</tt>
+ </p></li></ul></div>
+ </p></li><li><p><a name="d0e2931"></a>
+ Refresh the <tt>org.aspectj.ajde, org.aspectj.runtime</tt>
+ and <tt>org.aspectj.weaver</tt> plugins.
+ </p></li></ul></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:devDocs"></a><b>5. </b>Where do I find developer documentation on building and testing AspectJ source code?
+ </p></div><div class="answer"><p><a name="d0e2945"></a><b></b>Find the developer documentation in HTML files in the CVS tree,
+ inside the <tt>build</tt> and <tt>testing</tt> modules
+ (i.e., in <tt>org.aspectj/modules/build/...</tt>).
+ Most pertinant:
+ <div class="itemizedlist"><ul><li><p><a name="d0e2958"></a>
+ <tt>../build/readme-build-and-test-aspectj.html</tt>
+ describes how to build the AspectJ distribution in Eclipse
+ and in Ant.
+ </p></li><li><p><a name="d0e2964"></a><tt>../build/readme-docs-module.html</tt>
+ describes the AspectJ documentation sources and
+ how to build the documentation using Ant.
+ </p></li><li><p><a name="d0e2969"></a><tt>../build/readme-tests-module.html</tt>
+ describes the all the tests
+ in the <tt>tests</tt> module.
+ </p></li><li><p><a name="d0e2977"></a><tt>../build/readme-writing-compiler-tests.html</tt>
+ describes how to write compiler tests that can be run by
+ the AspectJ test harness.
+ </p></li><li><p><a name="d0e2982"></a><tt>../build/readme-testing-drivers-module.html</tt>
+ describes the test harness used to run the compiler tests
+ in the <tt>tests</tt> module.
+ </p></li><li><p><a name="d0e2990"></a><tt>../build/readme-testing-drivers-module.html</tt>
+ describes the test harness used to run the compiler tests
+ in the <tt>testing</tt> module.
+ </p></li></ul></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:harnesstestcases"></a><b>6. </b>How should I submit test cases for bugs?
+ </p></div><div class="answer"><p><a name="d0e3003"></a><b></b>You can attach files to a bug after it has been created.
+ The code of course should replicate the actual behavior
+ described in the bug when run on the target version.
+ If you have a single source file, you can attach it directly,
+ describing in the comments the expected result
+ (e.g., error on line 14, or successful compile/run).
+ The most helpful form for describing the test scenario
+ and the expected results are the test definitions
+ described next.
+ </p><p>For more complex bugs requiring many files,
+ create a zip file of a directory containing all the files
+ and an XML test definition file.
+ The XML test definition file contains specifications
+ for how to compile, recompile, or run the test sources.
+ Complete documentation is available in the CVS tree
+ at <tt>tests/readme-writing-compiler-tests.html</tt>
+ but here is a sample file with some example definitions,
+ preceded by comments showing the directory layout
+ of the files referred to in the test definitions.
+ </p><p>
+ <pre class="programlisting">
+
+<!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd">
+<suite>
+
+<!-- Compile and run
+ using the following files:
+
+ {testDefinitions}.xml
+ one/
+ pack1/
+ Main.java
+ p2/
+ BeforeConstructor.java
+
+ Note the bug number goes in the pr attribute.
+ ("pr" stands for "problem report")
+ -->
+<ajc-test dir="one" pr="234" title="before constructor call">
+ <compile files="pack1/Main.java,p2/BeforeConstructor.java"/>
+ <run class="pack1.Main"/>
+</ajc-test>
+
+<!-- Check that compiler warning was emitted
+ using the following files:
+
+ {testDefinitions}.xml
+ two/
+ UsesDeprecated.java
+ -->
+<ajc-test dir="two" pr="244" title="deprecated, noImportError">
+ <compile options="-warn:deprecated,-noImportError"
+ files="UsesDeprecated.java">
+ <message kind="warning" line="20"/>
+ </compile>
+</ajc-test>
+
+<!-- Cooked example that uses all compiler attributes
+ and the following files:
+ {testDefinitions}.xml
+ testCaseDir/
+ jars/
+ injar.jar
+ required.jar
+ requiredAspects.jar
+ pack/
+ Main.java
+ providedClassesDir/
+ ClassInDefaultPackage.class
+ org/
+ foo/
+ AnotherRequired.class
+ -->
+<ajc-test dir="testCaseDir" title="attributes test">
+ <compile files="pack/Main.java,jars/injar.jar"
+ staging="true"
+ options="-Xlint,-g:none"
+ argfiles="debug.lst,aspects/test.lst"
+ aspectpath="jars/requiredAspects.jar"
+ classpath="providedClassesDir,jars/required.jar"/>
+ <run class="Main"/>
+</ajc-test>
+
+<!-- Compiler errors, recompile after changing files, and run
+ using the following files:
+
+ {testDefinitions}.xml
+ three/
+ pack/
+ IncCompileFix.java
+ IncCompileFix.20.java
+
+ Before compiling, IncCompileFix.java is copied to a staging
+ directory. Before recompiling, IncCompileFix.20.java
+ replaces it, so the compiler treats file as updated.
+ -->
+<ajc-test dir="three" pr="622" title="incremental fix">
+ <compile staging="true" files="pack/IncCompileFix.java">
+ <message kind="error" line="20"/>
+ <message kind="error" line="42"/>
+ </compile>
+ <inc-compile tag="20"/>
+ <run class="pack.IncCompileFix"/>
+</ajc-test>
+
+</suite>
+
+ </pre>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:testharness"></a><b>7. </b>I'd like to run my test case. How do I get the test harness?
+ </p></div><div class="answer"><p><a name="d0e3020"></a><b></b>The test harness is not distributed.
+ To build it, get the source tree as
+ described in <a href="#q:buildingsource">Q:How do I get and compile the source code for AspectJ?</a> and then
+ build the <tt>build-testing-drivers</tt> target:
+ <pre class="programlisting">
+ cd build
+ ../lib/ant/bin/ant -f build.xml build-testing-drivers
+ </pre>
+ This produces
+ <tt>../aj-build/jars/testing-drivers-all.jar</tt>
+ which you can run as described in
+ <tt>tests/readme-tests-module.html</tt>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:bcel"></a><b>8. </b>BCEL is used by AspectJ but it's not actively developed. Will you change?
+ </p></div><div class="answer"><p><a name="d0e3041"></a><b></b>The AspectJ bytecode weaver has used BCEL for bytecode manipulation
+ since its first release. We have upgraded it extensively, to improve
+ performance, support Java 5, etc. The BCEL developers have not
+ incorporated our patches, so we continue to maintain our own version.
+ Ours has been optimized for the AspectJ weaver and battle-hardened
+ over years of development and use. At some point in the future,
+ the AspectJ weaver might be restructured to make it easy to see
+ whether another bytecode package offers the same stability,
+ functionality, and performance, but for now we prefer using something
+ that we know works well.
+ </p><p>
+ In the AspectJ 5 release, the weaver has been restructured to
+ use reflection where possible. Otherwise, it
+ continues to use BCEL, but does not hold BCEL structures in
+ memory after our evaluation completes.
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="help"></a>16 Getting Help</h3><div class="qandaentry"><div class="question"><p><a name="q:moreaboutaj"></a><b>1. </b>
+ How do I find out more about AspectJ?
+ </p></div><div class="answer"><p><a name="d0e3053"></a><b></b>Visit the AspectJ project web site:
+ <a href="http://eclipse.org/aspectj" target="_top">http://eclipse.org/aspectj</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:bugreports"></a><b>2. </b>How do I submit a bug report?</p></div><div class="answer"><p><a name="d0e3063"></a><b></b>You can submit a bug from
+ <a href="http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ" target="_top">
+ http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ
+ </a>.
+ If it seems to be a bug in the compiler,
+ please attach a small test case (source code)
+ to reproduce the problem.
+ For more information on writing compiler test cases, see
+ <a href="#q:ajcbugs">Q:How do I write bugs for the AspectJ compiler?</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:talktousers"></a><b>3. </b>
+ How do I communicate with other AspectJ users?
+ </p></div><div class="answer"><p><a name="d0e3075"></a><b></b>You can reach other AspectJ users by using the
+ aspectj-users mailing list. You can subscribe to the list or view the
+ list archives from the AspectJ home page
+ <a href="http://eclipse.org/aspectj" target="_top">
+ http://eclipse.org/aspectj
+ </a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:searchingsite"></a><b>4. </b>
+ How can I search the email archives or the web site?
+ </p></div><div class="answer"><p><a name="d0e3085"></a><b></b>
+ It is very effective to do a google search of the form,
+ <a href="http://www.google.com/search?q=site:eclipse.org+cflowbelow" target="_top">
+ http://www.google.com/search?q=site:eclipse.org+cflowbelow
+ </a>,
+ and you can use the eclipse.org search at
+ <a href="http://www.eclipse.org/search/search.cgi" target="_top">
+ http://www.eclipse.org/search/search.cgi
+ </a>.
+ You can also check the old archives available for download from
+ the AspectJ home page
+ <a href="http://eclipse.org/aspectj" target="_top">
+ http://eclipse.org/aspectj
+ </a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:writingbugsandemails"></a><b>5. </b>
+ How should I write email queries?
+ </p></div><div class="answer"><p><a name="d0e3101"></a><b></b>Here's the general form of a good email:
+ </p><div class="orderedlist"><ol type="1"><li><p><a name="d0e3105"></a>
+ Describe the big picture of what you are trying to do...
+ </p></li><li><p><a name="d0e3108"></a>
+ Describe what you think it takes, in AspectJ terms
+ (concepts, syntax, and semantics) from the
+ <a href="progguide/index.html" target="_top">Programming Guide</a>...
+ </p></li><li><p><a name="d0e3114"></a>
+ Show the AspectJ code you are using, what output it
+ produces when run, and what output you expect...
+ </p></li></ol></div><p>
+ The big picture helps others redirect you to other approaches.
+ Using AspectJ terms helps others correct mistakes in thinking
+ about the problem (the most common being to confuse join points
+ and pointcuts).
+ The code is key to clarifying your question and getting a good
+ response. On the mail list, someone can reply by fixing your
+ code. In bugs, the developers can reproduce the problem immediately
+ and start analyzing the fix.
+ The code should not be incomplete; it should run (or fail) as-is,
+ without additional libraries or source files.
+ </p><p>
+ For the mail lists, we try to follow the conventions for open-source
+ discussions that help avoid "the tragedy of the commons."
+ For example conventions, see
+ <a href="http://jakarta.apache.org/site/mail.html" target="_top">
+ http://jakarta.apache.org/site/mail.html
+ </a> and
+ <a href="http://www.tuxedo.org/%7Eesr/faqs/smart-questions.html" target="_top">
+ http://www.tuxedo.org/%7Eesr/faqs/smart-questions.html
+ </a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:idebugs"></a><b>6. </b>
+ How do I write bugs for IDE support?
+ </p></div><div class="answer"><p><a name="d0e3131"></a><b></b>
+ Bugs appearing in the IDE's may apply to the affected IDE
+ or to the compiler. Compiler stack traces in IDE message windows
+ are prefixed "Internal Compiler Error" and should be written up
+ as compiler bugs. If you are unsure, try redoing the compile
+ from the command line.
+ </p><p>
+ Bug report for the IDE extensions go to their respective projects,
+ listed in
+ <a href="#q:integrateWithDevTools">Q: How well does AspectJ integrate with existing Java development tools?</a>
+ (including bug reports for the AJDE Eclipse support,
+ which you can submit at
+ <a href="http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AJDT" target="_top">
+ http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AJDT
+ </a>).
+ </p><p>
+ Bug reports on ajbrowser should have version
+ information for both Java and AspectJ, and
+ (most importantly) clear steps for reproducing the bug.
+ You may submit ajbrowser bugs against the IDE component of AspectJ
+ via the web form
+ <a href="http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ" target="_top">
+ http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ
+ </a>.
+ </p><p>
+ One of the benefits of open-source is that you can
+ find and fix the bug for yourself; when you submit
+ the fix back to us, we can validate the fix for you
+ and incorporate it into the next release.
+ You can submit a patch by attaching it to the bug.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:ajcbugs"></a><b>7. </b>
+ How do I write bugs for the AspectJ compiler?
+ </p></div><div class="answer"><p><a name="d0e3152"></a><b></b>
+ The best compiler bug report is a reproducible test case,
+ standalone code that demonstrates the problem.
+ Sometimes with aspects, a test case requires several
+ files, if not some way to capture the behavior.
+ Here's how we recommend submitting test cases:
+ <div class="orderedlist"><ol type="1"><li><p><a name="d0e3156"></a>
+ Write the test case so that when the compiler bug
+ is fixed, the test completes normally without output
+ (e.g., expected compiler errors are issued,
+ or classes produced run correctly). This usually
+ means writing one or more source files.
+ </p></li><li><p><a name="d0e3159"></a>
+ In the bug report, briefly summarize the bug.
+ If it is not obvious, be sure to specify
+ the expected output/behavior (e.g., compiler error on line 32)
+ and, if the compile should complete, the main class to run.
+ </p></li><li><p><a name="d0e3162"></a>
+ Submit the bugs via the web form
+ <a href="http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ" target="_top">
+ http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ
+ </a>.
+ </p></li><li><p><a name="d0e3168"></a>Attach the test case to the bug.
+ The test case may be a single file
+ or it may be multiple files in a single zip archive,
+ of the form discussed in
+ <a href="#q:harnesstestcases">Q:How should I submit test cases for bugs?</a>.
+ </p></li></ol></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:teachingmaterials"></a><b>8. </b>
+ Can you recommend reading or teaching material for AspectJ?
+ </p></div><div class="answer"><p><a name="d0e3178"></a><b></b>The documentation available in the distribution is the
+ best source for language and usage questions. You can also find
+ selected AspectJ papers and presentations on the
+ <a href="http://www.parc.com/groups/csl/projects/aspectj/index.html" target="_top">
+ PARC AspectJ page</a>.
+ For links to Aspect-oriented programming materials in general, see
+ <a href="http://aosd.net" target="_top">http://aosd.net</a>.</p>
+ <p>See also a <a href="/aspectj/teaching.php">list of AOSD courses.</a>
+
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:consulting"></a><b>9. </b>
+ Where can our group get consulting and support?
+ </p></div><div class="answer"><p><a name="d0e3191"></a><b></b>The best thing to to is join and email the
+ <tt>aspectj-dev@eclipse.org</tt> mailing list.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:faqchanges"></a><b>10. </b>
+ What has changed since the last FAQ version?
+ </p></div><div class="answer"><p><a name="d0e3201"></a><b></b>
+ Entries changed recently:
+ <div class="itemizedlist"><ul><li><p><a name="d0e3205"></a><a href="#q:runtimeMemory">Q:What extra memory is required at runtime?</a></p></li><li><p><a name="d0e3208"></a><a href="#q:ajcoom">Q:The AspectJ compiler aborts with an OutOfMemoryError when compiling many classes. How can I fix this?</a></p></li><li><p><a name="d0e3211"></a><a href="#q:howIncrementalWorks">Q: How does incremental mode work?</a></p></li><li><p><a name="d0e3214"></a><a href="#q:compilerRequired">Q:Do I have to use the AspectJ compiler?</a></p></li><li><p><a name="d0e3217"></a><a href="#q:aspectj5features">Q:What are the new features of AspectJ 5?</a></p></li><li><p><a name="d0e3220"></a><a href="#q:codeversusannotationstyles">Q:Should I use code- or annotation-style aspects?</a></p></li><li><p><a name="d0e3223"></a><a href="#q:aspectj5ltw">Q:What's new about the load-time weaving support in AspectJ 5?</a></p></li><li><p><a name="d0e3226"></a><a href="#q:versionCompatibility">Q:Will AspectJ aspects work with different versions of the compiler/weaver and runtime?</a></p></li><li><p><a name="d0e3229"></a><a href="#q:bcel">Q:BCEL is used by AspectJ but it's not actively developed. Will you change?</a></p></li><li><p><a name="d0e3232"></a><a href="#q:reflectiveCalls">Q:Why doesn't AspectJ pick out reflective calls?</a></p></li><li><p><a name="d0e3235"></a><a href="#q:java5">Q:Will AspectJ support Java 5?</a></p></li><li><p><a name="d0e3238"></a><a href="#q:dynamicaop">Q:How does AspectJ compare with more dynamic AOP?</a></p></li><li><p><a name="d0e3241"></a><a href="#q:buildingsource">Q:How do I get and compile the source code for AspectJ?</a></p></li><li><p><a name="d0e3244"></a><a href="#q:buildingAspectJAndAJDT">Q:How do I build AspectJ and integrate it into AJDT?</a></p></li></ul></div>
+ </p></div></div></div><div class="qandadiv"><h3 class="title"><a name="project"></a>17 About the AspectJ Project</h3><div class="qandaentry"><div class="question"><p><a name="q:opensource"></a><b>1. </b>What does the fact that AspectJ is an Open Source
+ Project mean to me?
+ </p></div><div class="answer"><p><a name="d0e3255"></a><b></b>Open source protects your interest in a correct, long-lived,
+ up-to-date, and widely-accepted implementation of AspectJ.
+ <div class="itemizedlist"><ul><li><p><a name="d0e3259"></a>With the source code, you control your own destiny
+ in perpetuity. You can continue to use the implementation
+ and update it as necessary to fix bugs and add things you need.
+ </p></li><li><p><a name="d0e3262"></a>Because the code is available to all, anyone can find
+ and fix bugs. There is no need to hope for it to be fixed
+ in the next product release. Those who encounter the bugs
+ are motivated to fix them, and there are more eyeballs on
+ the code than in closed-source, so the quality tends to be high.
+ This can be particularly true for the AspectJ community,
+ which tends to be highly skilled.
+ </p></li><li><p><a name="d0e3265"></a>The same is true of new features or behavior, so the
+ implementation should be up-to-date. This is important as
+ the field of AOP develops, to capture the latest solutions.
+ </p></li><li><p><a name="d0e3268"></a>For a programming language which forms the basis of
+ an entire solution stack, open source facilitates the kind
+ of adoption -- tool integrations and significant projects --
+ that develop and prove the technology for wider adoption. This
+ limits delays caused by waiting for the completion of standards
+ process or promulgation by industry leaders, and also provides
+ the proofs necessary for such adoption.
+ </p></li></ul></div>
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:standardization"></a><b>2. </b>What are your plans to make AspectJ a general feature
+ of Java supported by Sun and the other key players in the Java
+ Industry?
+ </p></div><div class="answer"><p><a name="d0e3276"></a><b></b>Although we are committed to making AspectJ available to a wide
+ range of users, it is too early to decide on a strategy. Some
+ options include continuing AspectJ as a stand-alone product,
+ integrating it into IDEs, or possibly incorporating it into
+ standard Java with Sun's blessing.
+ </p><p>We currently focus on developing for the 1.1 implementation
+ which improves AspectJ in key areas: rapid
+ incremental compilation, bytecode weaving, and IDE integration.
+ </p><p>Through all of this our goal is to make AspectJ integrate as
+ seamlessly as possible with the Java programming language. The
+ AspectJ language design is becoming more integrated, the compiler
+ is becoming faster and more integrated, the IDE extensions are
+ becoming more integrated. All of this is designed to help users
+ really use AspectJ and give us feedback on it.
+ </p><p>As the system is improved and we work more closely
+ with users, we will be in good position to explore the best path
+ for AspectJ in the long term.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:bytecodeweaving"></a><b>3. </b>When will AspectJ work from class files?
+ When will it work at class-loading time?
+ </p></div><div class="answer"><p><a name="d0e3289"></a><b></b>Bytecode weaving is in AspectJ 1.1. We believe it
+ works as described in an email to the users list by Jim Hugugin:
+ </p><p>
+ The AspectJ language was designed to support weaving at many different times:
+ compile, load, or even run-time in the JVM. Weaving into bytecodes at both
+ compile and load-time will definitely be provided in a future release. This
+ will allow weaving at compile-time into libraries for which source code is
+ not available. It will also support aspect-aware class loaders that can
+ perform weaving at load time on arbitrary classes. One advantage of a
+ language like AspectJ, rather than an explicit meta-tool like jiapi, is
+ that it separates the specification of a crosscutting concern from any
+ particular implementation strategy for weaving.
+ </p><p>
+ ...AspectJ provides a language that can cleanly
+ capture crosscutting concerns while preserving the static type checking,
+ modularity, and composability of Java.
+ </p><p>If you have an application for using aspects and bytecode,
+ please let the AspectJ team know of your requirements.
+ We expect to have a demonstration classloader available in
+ the 1.1 release or soon thereafter.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:differences"></a><b>4. </b>What are the differences between the current and
+ previously released versions of AspectJ?
+ </p></div><div class="answer"><p><a name="d0e3302"></a><b></b>The AspectJ team aims to keep the implementation bug-free and
+ up-to-date with the Java language,
+ to limit AspectJ language changes to those that
+ are carefully considered, compelling, and backwards-compatible,
+ and to deliver those language changes only in significant releases (1.0, 1.1).
+ </p><div class="table"><p><a name="d0e3305"></a><b>Table 2. </b></p><table summary="" border="1"><colgroup><col><col></colgroup><tbody><tr><td align="left">Version</td><td align="left">Description</td></tr><tr><td>AspectJ 1.5</td><td>Upgrade to support Java 5 language and much better
+ load-time weaving.
+ See <a href="README-150.html" target="_top">README-150.html</a>
+ for more details.
+ </td></tr><tr><td>AspectJ 1.1</td><td>A few language changes and clarifications;
+ bytecode weaving and incremental compilation.
+ See <a href="README-11.html" target="_top">README-11.html</a>
+ for more detail.
+ </td></tr><tr><td>AspectJ 1.0</td><td>Many language changes, fixes, cleanup and
+ clarifications, some significant.
+ </td></tr><tr><td>AspectJ 0.8</td><td>More cleanup of the syntax and semantics.</td></tr><tr><td>AspectJ 0.7</td><td>Clean up of the semantics, 0.7 beta 4 is the first
+ open source release.
+ </td></tr><tr><td>AspectJ 0.6</td><td>Advice and crosscuts get explicit type signatures
+ which describe the values that are available to advice at a
+ crosscut.
+ </td></tr><tr><td>AspectJ 0.5</td><td>Improved tool support: better Emacs environment
+ support and <tt>ajdoc</tt> to parallel
+ <tt>javadoc</tt>. around advice is added, and the
+ <tt>aspect</tt> keyword is removed and replaced
+ by the Java keyword class.
+ </td></tr><tr><td>AspectJ 0.4</td><td>Clear separation of crosscuts and crosscut actions
+ makes it possible to define extensible library
+ aspects.
+ </td></tr><tr><td>AspectJ 0.3</td><td>First all Java implementation, also includes many
+ small language improvements.
+ </td></tr><tr><td>AspectJ 0.2</td><td>General-purpose support for crosscutting. Users could
+ program any kind of aspects, not just coordination. This
+ release dropped COOL.
+ </td></tr><tr><td>AspectJ 0.1</td><td>A single domain-specific aspect language, called COOL,
+ for programming coordination in multi-threaded
+ programs.
+ </td></tr></tbody></table></div><p> More details for 1.0 and earlier releases are available in
+ <a href="changes.html" target="_top">changes.html</a>.
+ </p></div></div><div class="qandaentry"><div class="question"><p><a name="q:schedule"></a><b>5. </b>
+ What is the AspectJ development schedule?
+ </p></div><div class="answer"><p><a name="d0e3393"></a><b></b>
+ Below is a table describing the goals for the major releases.
+ For information about specific features, search the bug database
+ for <tt>RFE</tt>'s ("requests for enhancement") by
+ <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&bug_severity=enhancement" target="_top">
+ selecting severity of "enhancement"</a>.
+
+ Like many open-source projects, we don't make or promise
+ schedules, but we do follow a pattern of issuing preview releases
+ which can give observers an idea of when
+ a particular release might be available.
+ </p><div class="table"><p><a name="d0e3402"></a><b>Table 3. The AspectJ Development Schedule</b></p><table summary="The AspectJ Development Schedule" border="1"><colgroup><col><col></colgroup><tbody><tr><td align="left">Version</td><td align="left">Description</td></tr><tr><td align="center" valign="top">1.0</td><td>Final syntax and semantic changes. Standalone structure
+ browser. Complete documentation.
+ </td></tr><tr><td align="center" valign="top">1.1</td><td>Faster incremental compilation, bytecode weaving,
+ and a small number of language changes.</td></tr><tr><td align="center" valign="top">1.2</td><td>Faster weaving, -inpath option, better error messages,
+ better handling of binary input and resources
+ during incremental compilation, faster runtime
+ </td></tr><tr><td align="center" valign="top">1.5 (AspectJ 5)</td><td>Support for Java 1.5, generic aspects,
+ annotations, etc. Integrates AspectWerkz-style
+ load-time weaving.
+ </td></tr></tbody></table></div></div></div><div class="qandaentry"><div class="question"><p><a name="q:java5"></a><b>6. </b>
+ Will AspectJ support Java 5?
+ </p></div><div class="answer"><p><a name="d0e3436"></a><b></b>
+ Yes. Java 5 is supported in AspectJ 5.
+ </p></div></div></div></div><p>AspectJ is a registered trademark of Palo Alto Research Center, Incorporated (PARC),
+ used with permission.
+ Java and all Java-based marks are trademarks or registered trademarks of
+ Sun Microsystems, Inc. in the United States and other countries. All other
+ trademarks are the property of their respective owners.
+ </p>
+
+ </div>
+
+</div>
+
+
+EOHTML;
+
+
+ # Generate the web page
+ $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
diff --git a/docs.php b/docs.php
index 703d88d..cf51a4f 100644
--- a/docs.php
+++ b/docs.php
@@ -1,41 +1,55 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>The AspectJ project at Eclipse.org: Documentation</title>
- <link rel="stylesheet" href="aspectj_style.css" type="text/css" />
-</head>
-<body>
-<div id="container">
-<?php require("banner.html"); ?>
- <!-- ================ Page specific content starts here ================ -->
+<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
-<!-- sub-banner for docs page -->
-<table BORDER=0 CELLSPACING=5 CELLPADDING=2 WIDTH="100%" >
- <!-- header row -->
- <tr>
- <td ALIGN=LEFT width="60%" valign="top">
- <h1>aspectj documentation</h1>
- </td>
- <td WIDTH="40%" align="right">
-
- <img src="http://eclipse.org/images/howto_banner.jpg" align="center" width="183" height="71">
- </td>
- </tr>
+ #*****************************************************************************
+ #
+ # template.php
+ #
+ # Author: Denis Roy
+ # Date: 2005-06-16
+ #
+ # Description: Type your page comments here - these are not sent to the browser
+ #
+ #
+ #****************************************************************************
+
+ #
+ # Begin: page-specific settings. Change these.
+ $pageTitle = "AspectJ Documentation";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
+ $pageAuthor = "Type your name here";
+
+ # Add page-specific Nav bars here
+ # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+ # $Nav->addNavSeparator("My Page Links", "downloads.php");
+ # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
+ # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
+ # End: page-specific settings
+
+ # Paste your HTML content between the EOHTML markers!
+ $html = <<<EOHTML
+
+<div id="maincontent">
+ <div id="midcolumn" style="width: 80%">
+
+ <h1>Documentation</h1>
+
+ <div id="container">
+ <table>
<!-- links row -->
<tr>
<td ALIGN=LEFT width="100%" colspan="2">
<table cellSpacing="0" cellPadding="0" align="left" border="0">
<tr>
<td class="smallParagraph" height="26"><b>
- <a href="http://www.eclipse.org/aspectj/docs.php">[doc index]</a>
+ <a href="/aspectj/docs.php">[doc index]</a>
<a href="doc/released/adk15notebook/index.html">
[AspectJ 5 language changes]</a>
<a href="doc/released/progguide/index.html">
[language]</a>
<a href="doc/released/devguide/index.html">
[tools]</a>
- <a href="doc/released/faq.html">
+ <a href="doc/released/faq.php">
[faq]</a>
<a href="http://www.eclipse.org/aspectj/publications.php">[publications]</a>
<a href="http://www.eclipse.org/aspectj/sample-code.html">
@@ -60,13 +74,21 @@
follow the trail proposed in the
<a href="doc/released/index.html#paths">released documentation</a>.
</p>
-<h2>AspectJ 5 Developer's Notebook</h2>
+
+
+<div class="homeitem" style="width: 97%">
+<h3>AspectJ 5 Developer's Notebook</h3>
+<ul>
<p>The <a href="doc/released/adk15notebook/index.html">AspectJ 5 Developer's Notebook</a>
summarises changes made to the AspectJ language in AspectJ 5. These changes are
<emphasis>not</emphasis> yet reflected in the programming guide.
</p>
-
-<h2>AspectJ Documentation packages</h2>
+</ul>
+</div>
+
+<div class="homeitem" style="width: 97%">
+<h3>AspectJ Documentation packages</h3>
+<ul>
<p>The AspectJ documentation package is included in the AspectJ download
and linked below (both the most-recent released version and the
next work-in-progress, as
@@ -78,7 +100,11 @@
<a href="doc/next/index.html">
<img border="0" height="13" width="13" src="images/next.gif" alt="next"/></a>.
</p>
-<h3>AspectJ Language</h3>
+</ul>
+
+<ul>
+<li>
+<h4>AspectJ Language</h4>
The <a href="doc/released/progguide/index.html">Programming Guide</a>
<a href="doc/next/progguide/index.html">
<img border="0" height="13" width="13" src="images/next.gif" alt="next"/></a>
@@ -121,7 +147,10 @@
<a href="doc/next/progguide/semantics.html">
<img border="0" border="0" height="13" width="13" src="images/next.gif" alt="next"/></a>
is the best reference for AspectJ usage.
-<h3>Runtime and tools APIs</h3>
+ </li>
+
+ <li>
+<h4>Runtime and tools APIs</h4>
<ul>
<li>
<a href="doc/released/runtime-api/index.html">Javadocs for the AspectJ runtime API</a>
@@ -140,7 +169,11 @@
<img border="0" border="0" height="13" width="13" src="images/next.gif" alt="next"/></a>.
</li>
</ul>
-<h3>AspectJ Tools</h3>
+
+</li>
+
+<li>
+<h4>AspectJ Tools</h4>
<p>
The
@@ -173,11 +206,13 @@
<img border="0" border="0" height="13" width="13" src="images/next.gif" alt="next"/></a>.
</p>
-
-<h3>Other stuff</h3>
+</li>
+
+<li>
+<h4>Other stuff</h4>
<p>
For answers to frequently-asked questions, see the
- <a href="doc/released/faq.html">FAQ</a>
+ <a href="doc/released/faq.php">FAQ</a>
<a href="doc/next/faq.html">
<img border="0" height="13" width="13" src="images/next.gif" alt="next"/></a>
</p>
@@ -193,32 +228,18 @@
<a href="doc/released/changes.html">
<img border="0" height="13" width="13" src="images/next.gif" alt="next"/></a>.
</p>
-
+</li>
+</ul>
</div>
-<div id="docs-inset">
-<!-- Eclipse AspectJ book -->
-
- <p align="center">
- <a href="http://www.amazon.com/exec/obidos/ASIN/0321245873/qid=1112868888/sr=2-3/ref=pd_bbs_b_2_3/103-5274059-2049410">
- <img src="images/eclipseaspectj.jpg" width="180" alt="Eclipse AspectJ Book Cover"/>
- </a>
- </p>
- <p align="center"><a href="http://www.amazon.com/exec/obidos/ASIN/0321245873/qid=1112868888/sr=2-3/ref=pd_bbs_b_2_3/103-5274059-2049410">
- Eclipse AspectJ</a> the book, by some of the leading AspectJ committers
- </p>
-
- <p/>
-
</div>
-<div id="main">
-
<br/>
-<h2>Online and external resources</h2>
-
+<div class="homeitem">
+<h3>Online and external resources</h3>
+<ul>
<p>
Books and articles we know of are listed on the
<a href="publications.php">Publications page</a>.
@@ -229,7 +250,7 @@
<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.aspectj/modules/docs/teaching/exercises/?cvsroot=Technology_Project">
<code>aspectj.org/modules/docs/teaching</code></a>.
(To get stuff from the CVS repository, see
-<a href="doc/released/faq.html#q:buildingsource">building source</a>.)
+<a href="doc/released/faq.php#q:buildingsource">building source</a>.)
Spanish speakers might also be interested in "Programemos en AspectJ" at
<a href="http://www.programemos.com">http://www.programemos.com</a>.
Find earlier project history, papers, and articles on the
@@ -239,7 +260,7 @@
<p>
For a list of places to get example AspectJ code,
- see the <a href="doc/released/faq.html#q:exampleprograms">FAQ entry on example programs</a>.
+ see the <a href="doc/released/faq.php#q:exampleprograms">FAQ entry on example programs</a>.
We collect and publish
<a href="sample-code.html">sample code contributions from community</a>,
including AspectJ programs and user-level trails for things like
@@ -252,11 +273,34 @@
and
<a href="sample-code.html#pubs-papers-aodesignpatterns">design pattern implementations</a>.
</p>
+</ul>
+</div>
+
+<div class="homeitem">
+<h3>Eclipse AspectJ book</h3>
+
+ <p align="center">
+ <a href="http://www.amazon.com/exec/obidos/ASIN/0321245873/qid=1112868888/sr=2-3/ref=pd_bbs_b_2_3/103-5274059-2049410">
+ <img src="images/eclipseaspectj.jpg" width="180" alt="Eclipse AspectJ Book Cover"/>
+ </a>
+ </p>
+
+ <p align="center"><a href="http://www.amazon.com/exec/obidos/ASIN/0321245873/qid=1112868888/sr=2-3/ref=pd_bbs_b_2_3/103-5274059-2049410">
+ Eclipse AspectJ</a> the book, by some of the leading AspectJ committers
+ </p>
+
</div>
+ </div>
- <!-- ================ End of page specific content ===================== -->
-</body>
-</html>
\ No newline at end of file
+</div>
+
+
+EOHTML;
+
+
+ # Generate the web page
+ $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
diff --git a/downloads.php b/downloads.php
index 290c020..1b96bf5 100644
--- a/downloads.php
+++ b/downloads.php
@@ -1,16 +1,98 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>The AspectJ project at Eclipse.org: Downloads</title>
- <link rel="stylesheet" href="aspectj_style.css" type="text/css" />
-</head>
-<body>
-<div id="container">
-<?php require("banner.html"); ?>
-<div id="main">
- <!-- ================ Page specific content starts here ================ -->
+<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
-<h1>aspectj downloads</h1>
+// Sorts by newest first
+function date_cmp($f1, $f2) {
+ $f1stats=stat($f1);
+ $f2stats=stat($f2);
+ return $f2stats[9]-$f1stats[9];
+}
+// return entries in the directory that represent dev builds
+function GetDevBuildsIn($dir){
+ ini_set("max_execution_time",10);
+ $devtag="aspectj-DEVELOPMENT-2";
+ $root=opendir($dir) or die("Check $dir !");
+ while (false!== ($file=readdir($root))) {
+ if($file=="." || $file=="..") {continue;}
+ // echo "$file<br>";
+ if (substr($file,0,21) == $devtag) {
+ $files[]="$dir/$file";
+ }
+ }
+ @closedir($dir);
+ usort($files, "date_cmp");
+ return $files;
+}
+
+function GetChangesFilesIn($dir){
+ ini_set("max_execution_time",10);
+ $devtag="changes-";
+ $root=opendir($dir) or die("Check $dir !");
+ while (false!== ($file=readdir($root))) {
+ if($file=="." || $file=="..") {continue;}
+ // echo "$file<br>";
+ if (substr($file,0,8) == $devtag) {
+ $files[]="$dir/$file";
+ }
+ }
+ @closedir($dir);
+ usort($files, "date_cmp");
+ return $files;
+}
+
+function ListDevBuilds($dir){
+ $str = "";
+
+ $devbuilds=GetDevBuildsIn($dir);
+ $justthefirstfile=basename($devbuilds[0]);
+ $stats=stat($devbuilds[0]);
+ $str = $str . "<a href=\"http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/dev/$justthefirstfile\">$justthefirstfile</a><br>(size: $stats[7] bytes)";
+ $str = $str . "<br><br>";
+ $changesFiles=GetChangesFilesIn($dir);
+ $justthefirstchangesfile=basename($changesFiles[0]);
+ $stats2=stat($changesFiles[0]);
+ $str = $str . "<a href=\"http://download.eclipse.org/tools/aspectj/dev/$justthefirstchangesfile\">Changes in this build</a><br>";
+
+ return $str;
+}
+
+ #*****************************************************************************
+ #
+ # template.php
+ #
+ # Author: Denis Roy
+ # Date: 2005-06-16
+ #
+ # Description: Type your page comments here - these are not sent to the browser
+ #
+ #
+ #****************************************************************************
+
+ #
+ # Begin: page-specific settings. Change these.
+ $pageTitle = "AspectJ Downloads";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
+ $pageAuthor = "Type your name here";
+
+ # Add page-specific Nav bars here
+ # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+ # $Nav->addNavSeparator("My Page Links", "downloads.php");
+ # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
+ # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
+
+ # End: page-specific settings
+
+ $builds = ListDevBuilds('/home/data/httpd/download.eclipse.org/tools/aspectj/dev');
+ #$builds = ListDevBuilds('c:/temp');
+
+
+ # Paste your HTML content between the EOHTML markers!
+ $html = <<<EOHTML
+
+<div id="maincontent">
+ <div id="midcolumn" style="width: 80%">
+
+ <h1>Downloads</h1>
+
<p>The AspectJ compiler produces programs for any version of the Java platform
(jdk1.1 and later). The compiler itself requires Java2 (1.3 or later) to run.
@@ -33,136 +115,112 @@
<a href="#ides">IDE support</a> can be found at the bottom of this page.
</p>
-
+<div class="homeitem3col">
<h3 id="most_recent">Most Recent Build</h3>
-
+ <ul>
+ <li>
+ <b>Last Known Good developer build</b>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
- <dl>
- <dt>Last Known Good developer build</dt>
- <dd>
+ <ul>
AspectJ Compiler, Browser, Ant tasks, and Documentation. Only download this version if you are prepared to work with a pre-release compiler.
The most recent stable build below is the currently supported release version.
- </dd>
- </dl>
+ </ul>
</td>
- <td width="30%" align="right">
+ <td rowspan="2" width="30%" align="right">
<!-- stick out reference to most recent dev build -->
- <?php
- #$devbuilds=GetDevBuildsIn('k:/tmp');
- $devbuilds=GetDevBuildsIn('/home/data/httpd/download.eclipse.org/tools/aspectj/dev');
- $justthefirstfile=basename($devbuilds[0]);
- $stats=stat($devbuilds[0]);
- echo "<a href=\"http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/dev/$justthefirstfile\">$justthefirstfile</a><br><br>(size: $stats[7] bytes)";
- echo "<br><br>";
- $changesFiles=GetChangesFilesIn('/home/data/httpd/download.eclipse.org/tools/aspectj/dev');
- $justthefirstchangesfile=basename($changesFiles[0]);
- $stats2=stat($changesFiles[0]);
- echo "<a href=\"http://download.eclipse.org/tools/aspectj/dev/$justthefirstchangesfile\">(Changes in this build)</a><br>";
- ?>
+
+ $builds
+
<br><a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&product=AspectJ&long_desc_type=allwordssubstr&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&keywords_type=allwords&keywords=&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=2006-06-30&chfieldto=Now&chfieldvalue=&field0-0-0=noop&type0-0-0=noop&value0-0-0=">
Bugs resolved since last release</a>
</td>
</tr>
<tr>
- <td colSpan="3"><br>
+ <td><br>
<i>This download is updated after every successful build and test cycle.</i>
</td>
</tr>
</tbody>
</table>
+ </li>
+ </ul>
+</div>
<!-- ============ LATEST STABLE RELEASE ======================= -->
+<div class="homeitem3col">
<h3 id="stable_release">Latest Stable Release</h3>
-
- <table border="0" cellspacing="0" cellpadding="0" width="100%">
- <tbody>
- <tr>
- <td>
- <dl>
- <dt>AspectJ 1.5.2a, Released 21st August, 2006</dt>
- <dd>AspectJ compiler, browser, documentation tool,
- Ant tasks, and documentation.
- </dd>
- </dl>
- </td>
- <td width="30%" align="right">
- <a href="http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.5.2a.jar">aspectj-1.5.2a.jar</a> (~10M)
- </td>
- </tr>
- </tbody>
- </table>
-
-
- <!-- ============ ASPECTJ 5 ======================= -->
-
- <h3 id="milestones">AspectJ 5</h3>
-
+ <ul>
+ <li>
+ <b>AspectJ 1.5.2a, Released 21st August, 2006</b>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
- <tbody>
-
+ <tr>
+ <td><ul>AspectJ compiler, browser, documentation tool, Ant tasks, and documentation.</ul></td>
+ <td width="30%" align="right">
+ <a href="http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.5.2a.jar">aspectj-1.5.2a.jar</a> (~10M)
+ </td>
+ </tr>
+ </table>
+ </li>
+ </ul>
+</div>
+
+ <!-- ============ ASPECTJ 5 ======================= -->
+<div class="homeitem3col">
+ <h3 id="milestones">AspectJ 5</h3>
+ <ul>
+ <li>
+ <b>AspectJ 1.5.2a, Released 21st August, 2006</b>
+ <table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
- <td>
- <dl>
- <dt>AspectJ 1.5.2a, Released 21st August, 2006</dt>
- <dd>AspectJ compiler, browser, documentation tool,
- Ant tasks, and documentation.
- </dd>
- </dl>
- </td>
+ <td><ul>AspectJ compiler, browser, documentation tool, Ant tasks, and documentation.</ul></td>
<td width="30%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.5.2a.jar">aspectj-1.5.2a.jar</a> (~10M)
</td>
</tr>
+ </table>
+ </li>
+ <li>
+ <b>AspectJ 1.5.2, Released 30th June, 2006</b>
+ <table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
- <td>
- <dl>
- <dt>AspectJ 1.5.2, Released 30th June, 2006</dt>
- <dd>AspectJ compiler, browser, documentation tool,
- Ant tasks, and documentation.
- </dd>
- </dl>
- </td>
+ <td><ul>AspectJ compiler, browser, documentation tool, Ant tasks, and documentation.</ul></td>
<td width="30%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.5.2.jar">aspectj-1.5.2.jar</a> (~10M)
</td>
</tr>
-
-
+ </table>
+ </li>
+
+ <li>
+ <b>AspectJ 1.5.1a, Released 10th April, 2006</b>
+ <table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
- <td>
- <dl>
- <dt>AspectJ 1.5.1a, Released 10th April, 2006</dt>
- <dd>AspectJ compiler, browser, documentation tool,
- Ant tasks, and documentation.
- </dd>
- </dl>
- </td>
+ <td><ul>AspectJ compiler, browser, documentation tool, Ant tasks, and documentation.</ul></td>
<td width="30%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.5.1_a.jar">aspectj-1.5.1_a.jar</a> (~10M)
</td>
</tr>
-
+ </table>
+ </li>
+
+ <li>
+ <b>AspectJ 1.5.0, Released 20th December, 2005</b>
+ <table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
- <td>
- <dl>
- <dt>AspectJ 1.5.0, Released 20th December, 2005</dt>
- <dd>AspectJ compiler, browser, documentation tool,
- Ant tasks, and documentation.
- </dd>
- </dl>
- </td>
+ <td><ul>AspectJ compiler, browser, documentation tool, Ant tasks, and documentation.</ul></td>
<td width="30%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.5.0.jar">aspectj-1.5.0.jar</a> (~10M)
</td>
</tr>
-
- </tbody>
</table>
+ </li>
+ </ul>
+</div>
<!--
Commenting out all pre-release AspectJ 5.
@@ -277,23 +335,28 @@
<!-- ============ ASPECTJ 1.2 ======================= -->
+<div class="homeitem3col">
<h3>AspectJ 1.2</h3>
-
+ <ul>
+
+ <li>
+ <b>Version 1.2.1, Released November 5th, 2004</b>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
- <dl>
- <dt>Version 1.2.1, Released November 5th, 2004</dt>
- <dd>AspectJ Compiler, Browser, Ant tasks, and Documentation</dd>
- </dl>
+ <ul>
+ AspectJ Compiler, Browser, Ant tasks, and Documentation
+ </ul>
</td>
<td width="30%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ajdt/aspectj-1.2.1.jar">
aspectj-1.2.1.jar</a> (7,382,062 bytes)
</td>
</tr>
-
+ </table>
+ </li>
+
<!--
<tr>
<td>
@@ -307,19 +370,25 @@
aspectj-1.2.1rc1.jar</a> (7,393,774 bytes)
</td>
</tr>
+
-->
+
+ <li>
+ <b>Version 1.2.0, Released May 25, 2004</b>
+ <table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td>
- <dl>
- <dt>Version 1.2.0, Released May 25, 2004</dt>
- <dd>AspectJ Compiler, Browser, Ant tasks, and Documentation</dd>
- </dl>
+ <ul>
+ AspectJ Compiler, Browser, Ant tasks, and Documentation
+ </ul>
</td>
<td width="30%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ajdt/aspectj-1.2.jar">
aspectj-1.2.jar</a> (5,859,690 bytes)
</td>
- </tr>
+ </tr>
+ </table>
+ </li>
<!--
<tr>
<td>
@@ -346,41 +415,47 @@
aspectj-1.2rc1.jar</a> (5,860,538 bytes)
</td>
</tr>
--->
- </tbody>
</table>
+-->
+</div>
<!-- ============ ASPECTJ 1.1 ======================= -->
-
+<div class="homeitem3col">
<h3>AspectJ 1.1</h3>
-
+ <ul>
+ <li>
+ <b>Version 1.1.1, Released September 22nd, 2003</b>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
- <tbody>
<tr>
<td>
- <dl>
- <dt>Version 1.1.1, Released September 22nd, 2003</dt>
- <dd>AspectJ Compiler, Browser, Ant tasks, and Documentation</dd>
- </dl>
+ <ul>
+ AspectJ Compiler, Browser, Ant tasks, and Documentation
+ </ul>
</td>
<td width="30%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ajdt/aspectj-1.1.1.jar">
aspectj-1.1.1.jar</a> (6,352,092 bytes)
</td>
</tr>
-
+ </table>
+ </li>
+
+ <li>
+ <b>Version 1.1.0, Released June 6, 2003</b>
+ <table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td>
- <dl>
- <dt>Version 1.1.0, Released June 6, 2003</dt>
- <dd>AspectJ Compiler, Browser, Ant tasks, and Documentation</dd>
- </dl>
+ <ul>
+ AspectJ Compiler, Browser, Ant tasks, and Documentation
+ </ul>
</td>
<td width="30%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ajdt/aspectj-1.1.0.jar">
aspectj-1.1.0.jar</a> (6,297,885 bytes)
</td>
</tr>
+ </table>
+ </li>
<!--
<tr>
<td>
@@ -436,69 +511,63 @@
</td>
</tr>
--->
</table>
</td>
</tr>
+-->
+ </ul>
+</div>
<!-- ============ ASPECTJ 1.0 ======================= -->
-
+<div class="homeitem3col">
<h3>AspectJ 1.0</h3>
+ <ul>
+ <li>
+ <b>Version 1.0.6</b>
- <table border="0" cellspacing="0" cellpadding="0" width="100%">
- <tbody>
- <tr>
- <td colspan="2">
- <dl>
- <dt>Version 1.0.6</dt>
- <dd>
- <table border="0" cellspacing="0" cellpadding="5" width="100%">
- <tbody>
+ <table border="0" cellspacing="0" cellpadding="2" width="100%">
<tr>
- <td>AspectJ Compiler and Browser (<i>binary distribution</i>)</td>
- <td width="30%" align="right">
+ <td><ul>AspectJ Compiler and Browser (<i>binary distribution</i>)</ul></td>
+ <td width="40%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ajdt/aspectj-tools-1.0.6.jar">
aspectj-tools-1.0.6.jar</a> <i>(1,580,450 bytes)</i>
</td>
</tr>
<tr>
- <td>AspectJ Compiler and Browser (<i>source</i>)</td>
- <td width="30%" align="right">
+ <td><ul>AspectJ Compiler and Browser (<i>source</i>)</ul></td>
+ <td width="40%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ajdt/aspectj-tools-src-1.0.6.tgz">
aspectj-tools-src-1.0.6.tgz</a> <i>(795,633 bytes)</i>
</td>
</tr>
<tr>
- <td>Documentation and Examples</td>
- <td width="30%" align="right">
+ <td><ul>Documentation and Examples</ul></td>
+ <td width="40%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ajdt/aspectj-docs-1.0.6.tgz">
aspectj-docs-1.0.6.tgz</a> <i>(1,715,824 bytes) </i>
</td>
</tr>
<tr>
- <td>Ant Tasks (released under the <a target="_top" href="http://apache.org/LICENSE.txt">
- Apache License</a>)</td>
- <td width="30%" align="right">
+ <td><ul>Ant Tasks (released under the <a target="_top" href="http://apache.org/LICENSE.txt">
+ Apache License</a>)</ul></td>
+ <td width="40%" align="right">
<a href="http://www.eclipse.org/downloads/download.php?file=/tools/ajdt/aspectj-antTasks-1.0.6.tgz">
aspectj-antTasks-1.0.6.tgz</a> <i>(83,124 bytes) </i>
</td>
</tr>
- </tbody>
- </table>
- </dd>
- </dl>
- </td>
- </tr>
- </tbody>
- </table>
-
+ </table>
- <p align="left">Note: All code, documentation and other files in the 1.0.6 release
+ <p align="left"><i>Note: All code, documentation and other files in the 1.0.6 release
are made available under the terms and conditions of the
<a target="_top" href="http://www.mozilla.org/MPL/MPL-1.1.html">
- Mozilla Public License version 1.1</a>.</p>
-
+ Mozilla Public License version 1.1</a>.</i></p>
+
+
+ </li>
+ </ul>
+</div>
+
<!-- ============ INSTALLATION ======================= -->
<h2 id="install">Installation</h2>
@@ -551,49 +620,15 @@
-->
</dl>
- <!-- ================ End of page specific content ===================== -->
-</div>
-</div>
-</body>
-</html>
-<?php
-// Sorts by newest first
-function date_cmp($f1, $f2) {
- $f1stats=stat($f1);
- $f2stats=stat($f2);
- return $f2stats[9]-$f1stats[9];
-}
-// return entries in the directory that represent dev builds
-function GetDevBuildsIn($dir){
- ini_set("max_execution_time",10);
- $devtag="aspectj-DEVELOPMENT-2";
- $root=opendir($dir) or die("Check $dir !");
- while (false!== ($file=readdir($root))) {
- if($file=="." || $file=="..") {continue;}
- // echo "$file<br>";
- if (substr($file,0,21) == $devtag) {
- $files[]="$dir/$file";
- }
- }
- @closedir($dir);
- usort($files, "date_cmp");
- return $files;
-}
-function GetChangesFilesIn($dir){
- ini_set("max_execution_time",10);
- $devtag="changes-";
- $root=opendir($dir) or die("Check $dir !");
- while (false!== ($file=readdir($root))) {
- if($file=="." || $file=="..") {continue;}
- // echo "$file<br>";
- if (substr($file,0,8) == $devtag) {
- $files[]="$dir/$file";
- }
- }
- @closedir($dir);
- usort($files, "date_cmp");
- return $files;
-}
+ </div>
-?>
\ No newline at end of file
+</div>
+
+
+EOHTML;
+
+
+ # Generate the web page
+ $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
diff --git a/index.php b/index.php
index 40c4d71..deee8ae 100644
--- a/index.php
+++ b/index.php
@@ -1 +1,276 @@
-<?php require('aspectj.php'); ?>
\ No newline at end of file
+<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
+
+ #*****************************************************************************
+ #
+ # template.php
+ #
+ # Author: Denis Roy
+ # Date: 2005-06-16
+ #
+ # Description: Type your page comments here - these are not sent to the browser
+ #
+ #
+ #****************************************************************************
+
+ #
+ # Begin: page-specific settings. Change these.
+ $pageTitle = "The AspectJ Project";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
+ $pageAuthor = "Type your name here";
+
+ # Add page-specific Nav bars here
+ # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+ # $Nav->addNavSeparator("My Page Links", "downloads.php");
+ # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
+ # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
+
+ # End: page-specific settings
+
+ # Paste your HTML content between the EOHTML markers!
+ $html = <<<EOHTML
+
+<div id="maincontent">
+ <div id="midcolumn" style="width: 80%">
+
+<!--
+<p align="center" style="margin-top: 0">
+<img src="aspectjbanner.png" width="340" height="58" alt="AspectJ">
+</p>
+-->
+
+<!-- style="position: absolute; top: 0; left: 250px" -->
+
+
+ <!-- ========== "aspectj is... " ============= -->
+ <table id="aspectj-is" borderColor="#111111"
+ cellSpacing="10" cellPadding="0" width="100%" border="0" valign="top">
+ <tr>
+ <td colSpan="2" width="50%">
+ <img alt="AspectJ[TM] is" src="http://www.eclipse.org/aspectj/aspectjIs.gif "
+ border="0" width="241" height="25">
+ </td>
+
+ <td colSpan="2" width="50%">
+ <img alt="aspectj enables" src="http://www.eclipse.org/aspectj/aspectjEnables.gif "
+ border="0" width="241" height="25">
+ </td>
+ </tr>
+ <tr>
+ <td width="10"> </td>
+ <td valign="top">
+ <ul>
+ <li> a seamless aspect-oriented extension
+ to the Java<sup><small>tm</small></sup> programming language</li>
+
+ <li>Java platform compatible</li>
+ <li>easy to learn and use</li>
+ </ul>
+ </td>
+ <td width="10"> </td>
+ <td valign="top">
+ <ul>
+ <li>clean modularization of crosscutting concerns, such as error
+ checking and handling, synchronization, context-sensitive behavior,
+ performance optimizations, monitoring and logging, debugging support,
+ and multi-object protocols
+ </li>
+
+ </ul>
+ </td>
+ </tr>
+ </table>
+
+<div class="homeitem" style="width: 97%">
+ <h3>Quick Links</h3>
+ <ul>
+<li>For Eclipse development: <a href="/ajdt">AJDT: The AspectJ Development Tools</a></li>
+<li>Popular AspectJ downloads: <a href="/aspectj/downloads.php#most_recent">Latest development build</a> | <a href="/aspectj/downloads.php#stable_release">Latest stable release</a> | <a href="/aspectj/downloads.php">More downloads...</a></li>
+ <li>Popular AspectJ docs: <a href="/aspectj/doc/released/adk15notebook/index.html">AspectJ 5 Developer's Notebook</a> | <a href="/aspectj/doc/released/progguide/index.html">Programming Guide</a> | <a href="/aspectj/docs.php">More docs...</a></li>
+ <li><a href="http://www.amazon.com/exec/obidos/ASIN/0321245873/qid=1112868888/sr=2-3/ref=pd_bbs_b_2_3/103-5274059-2049410">Eclipse AspectJ: </a> the book, by some of the leading AspectJ committers</li>
+ <li><a href="http://aosd.net/">AOSD.net</a></li>
+ <li><a href="http://www.parc.com/research/csl/projects/aspectj/default.html">AspectJ PARC Page</a></li>
+</ul>
+</div>
+
+ <div class="homeitem">
+ <h3>News and Events</h3>
+ <ul>
+
+ <li>
+ AspectJ 1.5.2 is now <a href="downloads.php">available for download</a>.
+ It includes approximately 60 fixes and enhancements that have been incorporated since the 1.5.1a
+ release. For full details see the
+ <a href="doc/released/README-152.html">1.5.2 README</a>.
+ <br><div align="right"><span class="dates"><i>posted 30-06-06</i></span></div>
+ </li>
+
+ <li>
+ AspectJ 1.5.2 release candidate 1 is now <a href="downloads.php">available for download</a>.
+ It includes approximately 60 fixes and enhancements that have been incorporated since the 1.5.1
+ release. For full details see the
+ <a href="doc/released/README-152.html">1.5.2 README</a>.
+ <br><div align="right"><span class="dates"><i>posted 26-06-06</i></span></div>
+ </li>
+
+ <li>
+A podcast <a href="http://www.se-radio.net/index.php?post_id=78154">
+ interview with Gregor Kiczales</a> recorded at this year's AOSD conference
+ is now available at <a href="http://www.se-radio.net">Software Engineering Radio</a>.
+ The interview covers a number of topics including the history of AOP, the
+ relationship of AOP to interceptors, industry acceptance of AOP, early aspects,
+ and adoption strategies.
+
+<br><div align="right"><span class="dates"><i>posted 09-04-06</i></span></div>
+ </li>
+
+<li>
+AspectJ 1.5.1 is now <a href="downloads.php">available for download</a>. This
+ release contains a number of bug fixes and minor enhancements from 1.5.0, together
+ with performance and memory usage improvements resulting in greatly reduced
+ memory usage when building from within AJDT (and noticeable improvements outside
+ of AJDT too). For full details see the
+ <a href="doc/released/README-151.html">1.5.1 README</a>.
+
+<br><div align="right"><span class="dates"><i>posted 04-04-06</i></span></div>
+</li>
+
+ </ul>
+ </div>
+
+ <div class="homeitem">
+ <h3>Recent Books and Articles</h3>
+ <ul>
+<li>
+<a target="_top" href="http://www-128.ibm.com/developerworks/java/library/j-aopwork17.html">
+ "AOP@Work: Component Design with Contract4J"</a>
+ by n Wampler
+</li>
+
+<li>
+<a target="_top" href="http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=AOP@work">
+ "AOP@Work series on IBM developerWorks"</a>
+ Series lead: Nicholas Lesiecki
+</li>
+
+<li>
+<a target="_top" href="http://www.ratio.co.uk/objectiveview.html">
+ "Introduction to AOP"</a> in ObjectiveView Issue 9
+ by Alex Ruiz
+</li>
+
+<li>
+ <a target="_top" href="http://www.ibm.com/developerworks/java/library/j-aopwork15/">
+ "AOP@Work: AOP myths and realities"</a>
+ by Ramnivas Laddad
+</li>
+
+<li>
+ <a target="_top" href="http://www.ibm.com/developerworks/java/library/j-aopwork14/">
+ "AOP@Work: Check out library aspects with AspectJ 5"</a>
+ by Wes Isberg
+</li>
+
+<li>
+ <a target="_top" href="http://www.ibm.com/developerworks/java/library/j-aopwork13.html">
+ "AOP@Work: Dependency Injection with AspectJ and Spring"</a>
+ by Adrian Colyer
+</li>
+
+</ul>
+</div>
+
+ <hr class="clearer" />
+
+
+</div>
+
+<!--
+ <div id="rightcolumn" style="width: 170px">
+ <div class="sideitem">
+ <h6>Related links</h6>
+ <ul>
+ <li><a href="http://eclipse.org/ajdt">AJDT</a></li>
+ <li><a href="http://aosd.net">AOSD.net</li>
+ <li><a href="http://www.parc.com/research/csl/projects/aspectj/default.html">AspectJ PARC Page</li>
+ <li><a href="http://www.amazon.com/exec/obidos/ASIN/0321245873/qid=1112868888/sr=2-3/ref=pd_bbs_b_2_3/103-5274059-2049410">Eclipse AspectJ Book</li>
+
+ </ul>
+ </div>
+ <div class="sideitem">
+ <h6>The Aspects Blog</h6>
+ <ul>
+ <li><a href="http://www.aspectprogrammer.org/blogs/adrian/2006/03/graham_hamilton.html" title="Graham Hamilton on AOP" target="external">Graham Hamilton on AOP</a></li>
+<li><a href="http://www.aspectprogrammer.org/blogs/adrian/2006/02/tips_for_using.html" title="Tips for using Eclipse effectively" target="external">Tips for using Eclipse effectively</a></li>
+
+<li><a href="http://www.aspectprogrammer.org/blogs/adrian/2006/02/a_practical_gui_2.html" title="A Practical Guide to Using an Aspect Library (part I)" target="external">A Practical Guide to Using an Aspect Library (part I)</a></li>
+
+ </ul>
+ </div>
+
+ <div class="sideitem">
+ <h6>Alex Vasseur's blog</h6>
+ <ul>
+ <li><a href="http://blogs.codehaus.org/people/avasseur/archives/001308_free_as_open_source_they_said.html" title="Free as Open Source they said?" target="external">Free as Open Source they said?</a></li>
+<li><a href="http://blogs.codehaus.org/people/avasseur/archives/001290_microsoft_goes_aop.html" title="Microsoft goes AOP?" target="external">Microsoft goes AOP?</a></li>
+
+<li><a href="http://blogs.codehaus.org/people/avasseur/archives/001281_spring_2x_innovation_or_maturity.html" title="Spring 2.x - innovation or maturity?" target="external">Spring 2.x - innovation or maturity?</a></li>
+ </ul>
+ </div>
+
+ <div class="sideitem">
+ <h6>Aspectivity</h6>
+ <ul>
+ <li><a href="http://ramnivas.com/blog/index.php?p=23" title="AOP Madness and Sanity: A Response" target="external">AOP Madness and Sanity: A Response</a></li>
+<li><a href="http://ramnivas.com/blog/index.php?p=22" title="AOP: Myths and realities" target="external">AOP: Myths and realities</a></li>
+
+<li><a href="http://ramnivas.com/blog/index.php?p=21" title="Javapolis Experience" target="external">Javapolis Experience</a></li>
+ </ul>
+ </div>
+
+ <div class="sideitem">
+ <h6>Ron Bodkin on AOP</h6>
+ <ul>
+ <li><a href="http://rbodkin.blogs.com/ron_bodkins_blog/2006/03/industry_case_s.html" title="Industry Case Studies at AOSD 2006" target="external">Industry Case Studies at AOSD 2006</a></li>
+<li><a href="http://rbodkin.blogs.com/ron_bodkins_blog/2006/03/demos_at_aosd_2.html" title="Demos at AOSD 2006" target="external">Demos at AOSD 2006</a></li>
+
+<li><a href="http://rbodkin.blogs.com/ron_bodkins_blog/2006/03/enterprise_aop_.html" title="Enterprise AOP Tutorial at AOSD" target="external">Enterprise AOP Tutorial at AOSD</a></li>
+
+ </ul>
+ </div>
+
+ <div class="sideitem">
+ <h6>Jonas Bonér's blog</h6>
+ <ul>
+ <li><a href="http://feeds.feedburner.com/grubbel?m=44" title="The Optimized Null Check Pattern" target="external">The Optimized Null Check Pattern</a></li>
+<li><a href="http://feeds.feedburner.com/grubbel?m=43" title="Interview" target="external">Interview</a></li>
+
+<li><a href="http://feeds.feedburner.com/grubbel?m=42" title="Want To Work At Terracotta?" target="external">Want To Work At Terracotta?</a></li>
+
+ </ul>
+ </div>
+
+ <div class="sideitem">
+ <h6>Dion Almaer on AOP</h6>
+ <ul>
+ <li><a href="http://www.almaer.com/blog/archives/001056.html" title="Application Monitoring with AspectJ, JMX, and GlassBox" target="external">Application Monitoring with AspectJ, JMX, and GlassBox</a></li>
+<li><a href="http://www.almaer.com/blog/archives/001046.html" title="Future of AOP 2005: Jonas Boner and Adrian Colyer move on!" target="external">Future of AOP 2005: Jonas Boner and Adrian Colyer move on!</a></li>
+
+<li><a href="http://www.almaer.com/blog/archives/000961.html" title="JVM support for AOP in JRockit" target="external">JVM support for AOP in JRockit</a></li>
+
+ </ul>
+ </div>
+
+
+ </div>
+
+-->
+
+</div>
+
+
+EOHTML;
+
+
+ # Generate the web page
+ $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
diff --git a/index_new.php b/index_new.php
deleted file mode 100644
index fcd1e4a..0000000
--- a/index_new.php
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
-
- #*****************************************************************************
- #
- # template.php
- #
- # Author: Denis Roy
- # Date: 2005-06-16
- #
- # Description: Type your page comments here - these are not sent to the browser
- #
- #
- #****************************************************************************
-
- #
- # Begin: page-specific settings. Change these.
- $pageTitle = "The AspectJ Project";
- $pageKeywords = "Type, page, keywords, here";
- $pageAuthor = "Type your name here";
-
- # Add page-specific Nav bars here
- # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
- # $Nav->addNavSeparator("My Page Links", "downloads.php");
- # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
- # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
-
- # End: page-specific settings
- #
- $theme = "Lazarus";
-
- $branding = <<<EOBRANDING
-<STYLE TYPE="text/css">
- #midcolumn { margin-top: 5px; }
- body { font-size: small; }
-</STYLE>
-<div id="branding">
-<img src="aspectjbanner2.png" width="502" height="42" alt="AspectJ">
-</div>
-EOBRANDING;
-$Menu->setProjectBranding($branding);
-
-
- # Paste your HTML content between the EOHTML markers!
- $html = <<<EOHTML
-
-<div id="maincontent">
- <div id="midcolumn" style="width: 80%">
-
-<!--
-<p align="center" style="margin-top: 0">
-<img src="aspectjbanner.png" width="340" height="58" alt="AspectJ">
-</p>
--->
-
-<!-- style="position: absolute; top: 0; left: 250px" -->
-
-
- <!-- ========== "aspectj is... " ============= -->
- <table id="aspectj-is" borderColor="#111111"
- cellSpacing="10" cellPadding="0" width="100%" border="0" valign="top">
- <tr>
- <td colSpan="2" width="50%">
- <img alt="AspectJ[TM] is" src="http://www.eclipse.org/aspectj/aspectjIs.gif "
- border="0" width="241" height="25">
- </td>
-
- <td colSpan="2" width="50%">
- <img alt="aspectj enables" src="http://www.eclipse.org/aspectj/aspectjEnables.gif "
- border="0" width="241" height="25">
- </td>
- </tr>
- <tr>
- <td width="10"> </td>
- <td valign="top">
- <ul>
- <li> a seamless aspect-oriented extension
- to the Java<sup><small>tm</small></sup> programming language</li>
-
- <li>Java platform compatible</li>
- <li>easy to learn and use</li>
- </ul>
- </td>
- <td width="10"> </td>
- <td valign="top">
- <ul>
- <li>clean modularization of crosscutting concerns, such as error
- checking and handling, synchronization, context-sensitive behavior,
- performance optimizations, monitoring and logging, debugging support,
- and multi-object protocols
- </li>
-
- </ul>
- </td>
- </tr>
- </table>
-
-<div class="homeitem" style="width: 97%">
- <h3>Quick Links</h3>
- <ul>
-<li>For Eclipse development: <a href="http://www.eclipse.org/ajdt">AJDT: The AspectJ Development Tools</a></li>
-<li>Popular AspectJ downloads: <a href="http://www.eclipse.org/aspectj/downloads.php#most_recent">Latest development build</a> | <a href="http://www.eclipse.org/aspectj/downloads.php#stable_release">Latest stable release</a> | <a href="http://www.eclipse.org/aspectj/downloads.php">More downloads...</a></li>
- <li>Popular AspectJ docs: <a href="http://www.eclipse.org/aspectj/doc/released/adk15notebook/index.html">AspectJ 5 Developer's Notebook</a> | <a href="http://www.eclipse.org/aspectj/doc/released/progguide/index.html">Programming Guide</a> | <a href="http://www.eclipse.org/aspectj/docs.php">More docs...</a></li>
- <li><a href="http://www.amazon.com/exec/obidos/ASIN/0321245873/qid=1112868888/sr=2-3/ref=pd_bbs_b_2_3/103-5274059-2049410">Eclipse AspectJ: </a> the book, by some of the leading AspectJ committers</li>
- <li><a href="http://aosd.net/">AOSD.net</a></li>
- <li><a href="http://www.parc.com/research/csl/projects/aspectj/default.html">AspectJ PARC Page</a></li>
-</ul>
-</div>
-
- <div class="homeitem">
- <h3>News and Events</h3>
- <ul>
-
- <li>
- AspectJ 1.5.2 is now <a href="downloads.php">available for download</a>.
- It includes approximately 60 fixes and enhancements that have been incorporated since the 1.5.1a
- release. For full details see the
- <a href="doc/released/README-152.html">1.5.2 README</a>.
- <br><div align="right"><span class="dates"><i>posted 30-06-06</i></span></div>
- </li>
-
- <li>
- AspectJ 1.5.2 release candidate 1 is now <a href="downloads.php">available for download</a>.
- It includes approximately 60 fixes and enhancements that have been incorporated since the 1.5.1
- release. For full details see the
- <a href="doc/released/README-152.html">1.5.2 README</a>.
- <br><div align="right"><span class="dates"><i>posted 26-06-06</i></span></div>
- </li>
-
- <li>
-A podcast <a href="http://www.se-radio.net/index.php?post_id=78154">
- interview with Gregor Kiczales</a> recorded at this year's AOSD conference
- is now available at <a href="http://www.se-radio.net">Software Engineering Radio</a>.
- The interview covers a number of topics including the history of AOP, the
- relationship of AOP to interceptors, industry acceptance of AOP, early aspects,
- and adoption strategies.
-
-<br><div align="right"><span class="dates"><i>posted 09-04-06</i></span></div>
- </li>
-
-<li>
-AspectJ 1.5.1 is now <a href="downloads.php">available for download</a>. This
- release contains a number of bug fixes and minor enhancements from 1.5.0, together
- with performance and memory usage improvements resulting in greatly reduced
- memory usage when building from within AJDT (and noticeable improvements outside
- of AJDT too). For full details see the
- <a href="doc/released/README-151.html">1.5.1 README</a>.
-
-<br><div align="right"><span class="dates"><i>posted 04-04-06</i></span></div>
-</li>
-
- </ul>
- </div>
-
- <div class="homeitem">
- <h3>Recent Books and Articles</h3>
- <ul>
-<li>
-<a target="_top" href="http://www-128.ibm.com/developerworks/java/library/j-aopwork17.html">
- "AOP@Work: Component Design with Contract4J"</a>
- by n Wampler
-</li>
-
-<li>
-<a target="_top" href="http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=AOP@work">
- "AOP@Work series on IBM developerWorks"</a>
- Series lead: Nicholas Lesiecki
-</li>
-
-<li>
-<a target="_top" href="http://www.ratio.co.uk/objectiveview.html">
- "Introduction to AOP"</a> in ObjectiveView Issue 9
- by Alex Ruiz
-</li>
-
-<li>
- <a target="_top" href="http://www.ibm.com/developerworks/java/library/j-aopwork15/">
- "AOP@Work: AOP myths and realities"</a>
- by Ramnivas Laddad
-</li>
-
-<li>
- <a target="_top" href="http://www.ibm.com/developerworks/java/library/j-aopwork14/">
- "AOP@Work: Check out library aspects with AspectJ 5"</a>
- by Wes Isberg
-</li>
-
-<li>
- <a target="_top" href="http://www.ibm.com/developerworks/java/library/j-aopwork13.html">
- "AOP@Work: Dependency Injection with AspectJ and Spring"</a>
- by Adrian Colyer
-</li>
-
-</ul>
-</div>
-
- <hr class="clearer" />
-
-
-</div>
-
-<!--
- <div id="rightcolumn" style="width: 170px">
- <div class="sideitem">
- <h6>Related links</h6>
- <ul>
- <li><a href="http://eclipse.org/ajdt">AJDT</a></li>
- <li><a href="http://aosd.net">AOSD.net</li>
- <li><a href="http://www.parc.com/research/csl/projects/aspectj/default.html">AspectJ PARC Page</li>
- <li><a href="http://www.amazon.com/exec/obidos/ASIN/0321245873/qid=1112868888/sr=2-3/ref=pd_bbs_b_2_3/103-5274059-2049410">Eclipse AspectJ Book</li>
-
- </ul>
- </div>
- <div class="sideitem">
- <h6>The Aspects Blog</h6>
- <ul>
- <li><a href="http://www.aspectprogrammer.org/blogs/adrian/2006/03/graham_hamilton.html" title="Graham Hamilton on AOP" target="external">Graham Hamilton on AOP</a></li>
-<li><a href="http://www.aspectprogrammer.org/blogs/adrian/2006/02/tips_for_using.html" title="Tips for using Eclipse effectively" target="external">Tips for using Eclipse effectively</a></li>
-
-<li><a href="http://www.aspectprogrammer.org/blogs/adrian/2006/02/a_practical_gui_2.html" title="A Practical Guide to Using an Aspect Library (part I)" target="external">A Practical Guide to Using an Aspect Library (part I)</a></li>
-
- </ul>
- </div>
-
- <div class="sideitem">
- <h6>Alex Vasseur's blog</h6>
- <ul>
- <li><a href="http://blogs.codehaus.org/people/avasseur/archives/001308_free_as_open_source_they_said.html" title="Free as Open Source they said?" target="external">Free as Open Source they said?</a></li>
-<li><a href="http://blogs.codehaus.org/people/avasseur/archives/001290_microsoft_goes_aop.html" title="Microsoft goes AOP?" target="external">Microsoft goes AOP?</a></li>
-
-<li><a href="http://blogs.codehaus.org/people/avasseur/archives/001281_spring_2x_innovation_or_maturity.html" title="Spring 2.x - innovation or maturity?" target="external">Spring 2.x - innovation or maturity?</a></li>
- </ul>
- </div>
-
- <div class="sideitem">
- <h6>Aspectivity</h6>
- <ul>
- <li><a href="http://ramnivas.com/blog/index.php?p=23" title="AOP Madness and Sanity: A Response" target="external">AOP Madness and Sanity: A Response</a></li>
-<li><a href="http://ramnivas.com/blog/index.php?p=22" title="AOP: Myths and realities" target="external">AOP: Myths and realities</a></li>
-
-<li><a href="http://ramnivas.com/blog/index.php?p=21" title="Javapolis Experience" target="external">Javapolis Experience</a></li>
- </ul>
- </div>
-
- <div class="sideitem">
- <h6>Ron Bodkin on AOP</h6>
- <ul>
- <li><a href="http://rbodkin.blogs.com/ron_bodkins_blog/2006/03/industry_case_s.html" title="Industry Case Studies at AOSD 2006" target="external">Industry Case Studies at AOSD 2006</a></li>
-<li><a href="http://rbodkin.blogs.com/ron_bodkins_blog/2006/03/demos_at_aosd_2.html" title="Demos at AOSD 2006" target="external">Demos at AOSD 2006</a></li>
-
-<li><a href="http://rbodkin.blogs.com/ron_bodkins_blog/2006/03/enterprise_aop_.html" title="Enterprise AOP Tutorial at AOSD" target="external">Enterprise AOP Tutorial at AOSD</a></li>
-
- </ul>
- </div>
-
- <div class="sideitem">
- <h6>Jonas Bonér's blog</h6>
- <ul>
- <li><a href="http://feeds.feedburner.com/grubbel?m=44" title="The Optimized Null Check Pattern" target="external">The Optimized Null Check Pattern</a></li>
-<li><a href="http://feeds.feedburner.com/grubbel?m=43" title="Interview" target="external">Interview</a></li>
-
-<li><a href="http://feeds.feedburner.com/grubbel?m=42" title="Want To Work At Terracotta?" target="external">Want To Work At Terracotta?</a></li>
-
- </ul>
- </div>
-
- <div class="sideitem">
- <h6>Dion Almaer on AOP</h6>
- <ul>
- <li><a href="http://www.almaer.com/blog/archives/001056.html" title="Application Monitoring with AspectJ, JMX, and GlassBox" target="external">Application Monitoring with AspectJ, JMX, and GlassBox</a></li>
-<li><a href="http://www.almaer.com/blog/archives/001046.html" title="Future of AOP 2005: Jonas Boner and Adrian Colyer move on!" target="external">Future of AOP 2005: Jonas Boner and Adrian Colyer move on!</a></li>
-
-<li><a href="http://www.almaer.com/blog/archives/000961.html" title="JVM support for AOP in JRockit" target="external">JVM support for AOP in JRockit</a></li>
-
- </ul>
- </div>
-
-
- </div>
-
--->
-
-</div>
-
-
-EOHTML;
-
-
- # Generate the web page
- $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
-?>
diff --git a/index_old.php b/index_old.php
new file mode 100644
index 0000000..40c4d71
--- /dev/null
+++ b/index_old.php
@@ -0,0 +1 @@
+<?php require('aspectj.php'); ?>
\ No newline at end of file
diff --git a/plans_new.php b/plans_new.php
index 39725b9..6988d86 100644
--- a/plans_new.php
+++ b/plans_new.php
@@ -14,7 +14,7 @@
#
# Begin: page-specific settings. Change these.
- $pageTitle = "AspectJ";
+ $pageTitle = "AspectJ Plans";
$pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
$pageAuthor = "Andy Clement";
@@ -26,19 +26,17 @@
# End: page-specific settings
#
-
- $rightcolumn = file_get_contents("rightcolumn.html");
-
+
# Paste your HTML content between the EOHTML markers!
$html = <<<EOHTML
<div id="maincontent">
<div id="midcolumn">
- <div align="center"><h1>$pageTitle</h1></div>
+ <h1>Plans</h1>
<p>
-<i>Last updated: 19 May 2006</i>
+<i>Last updated: 20 October 2006</i>
</p>
<p>
@@ -52,9 +50,25 @@
</p>
<div class="homeitem3col">
+ <h3>AspectJ 1.5.3</h3>
+ <p>
+ Status: Planned for October 2006
+ </p>
+ <p>
+ Release themes:
+ </p>
+
+ <ul>
+ <li>Improved memory usage</li>
+ <li>Improved LTW</li>
+ <li>Improved serviceability</li>
+ </ul>
+</div>
+
+<div class="homeitem3col">
<h3>AspectJ 1.5.2</h3>
<p>
- Status: Planned for June/July 2006 <br>
+ Released: 30th June 2006
</p>
<p>
Release themes:
@@ -83,27 +97,9 @@
</ul>
</div>
-<div class="homeitem3col">
- <h3>AspectJ 1.5.0</h3>
- <p>
- Released: 20th December 2005
- </p>
-
- <p>
- Release themes:
- </p>
-
- <ul>
- <li>Integrate Java5 with AspectJ</li>
- </ul>
-
-</div>
-
-
<hr class="clearer" />
</div>
- $rightcolumn
</div>
diff --git a/teaching.php b/teaching.php
index 60c9451..c20c001 100644
--- a/teaching.php
+++ b/teaching.php
@@ -1,16 +1,39 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>The AspectJ project at Eclipse.org: Teaching</title>
- <link rel="stylesheet" href="aspectj_style.css" type="text/css" />
-</head>
-<body>
-<div id="container">
-<?php require("banner.html"); ?>
-<div id="main">
- <!-- ================ Page specific content starts here ================ -->
+<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
-<h1>who's teaching aosd</h1>
+ #*****************************************************************************
+ #
+ # template.php
+ #
+ # Author: Denis Roy
+ # Date: 2005-06-16
+ #
+ # Description: Type your page comments here - these are not sent to the browser
+ #
+ #
+ #****************************************************************************
+
+ #
+ # Begin: page-specific settings. Change these.
+ $pageTitle = "The AspectJ Project: Teaching";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
+ $pageAuthor = "Type your name here";
+
+ # Add page-specific Nav bars here
+ # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+ # $Nav->addNavSeparator("My Page Links", "downloads.php");
+ # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
+ # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
+
+ # End: page-specific settings
+
+ # Paste your HTML content between the EOHTML markers!
+ $html = <<<EOHTML
+
+<div id="maincontent">
+ <div id="midcolumn" style="width: 80%">
+
+ <h1>Who's teaching AOSD</h1>
+
<p> This list is a compilation of responses to a query sent out in November 2004 to find out
which establishments and individuals were teaching courses on the topic of
aspect-oriented software development, or courses that included some AOSD content. The
@@ -20,12 +43,12 @@
this list then please let us know.</p>
<h2>Courses with online materials</h2>
-<table border="1" width="100%">
+<table border="1" cellspacing="0" cellpadding="5" width="100%">
<thead>
<tr>
- <td>Lecturer(s)</td>
- <td>Organisation</td>
- <td>Details</td>
+ <th>Lecturer(s)</th>
+ <th>Organisation</th>
+ <th>Details</th>
</tr>
</thead>
<tbody>
@@ -178,12 +201,12 @@
</table>
<h2>Other academic courses</h2>
-<table border="1" width="100%">
+<table border="1" cellspacing="0" cellpadding="5" width="100%">
<thead>
<tr>
- <td>Lecturer(s)</td>
- <td>Organisation</td>
- <td>Details</td>
+ <th>Lecturer(s)</th>
+ <th>Organisation</th>
+ <th>Details</th>
</tr>
</thead>
<tbody>
@@ -235,12 +258,12 @@
</table>
<h2>Open source offerings</h2>
-<table border="1" width="100%">
+<table border="1" cellspacing="0" cellpadding="5" width="100%">
<thead>
<tr>
- <td>Instructor</td>
- <td>Organisation</td>
- <td>Details</td>
+ <th>Instructor</th>
+ <th>Organisation</th>
+ <th>Details</th>
</tr>
</thead>
<tbody>
@@ -257,12 +280,12 @@
</table>
<h2>Commercial offerings</h2>
-<table border="1" width="100%">
+<table border="1" cellspacing="0" cellpadding="5" width="100%">
<thead>
<tr>
- <td>Instructor</td>
- <td>Organisation</td>
- <td>Details</td>
+ <th>Instructor</th>
+ <th>Organisation</th>
+ <th>Details</th>
</tr>
</thead>
<tbody>
@@ -303,8 +326,16 @@
</tbody>
</table>
- <!-- ================ End of page specific content ===================== -->
+<br clear="all">
+
+ </div>
+
</div>
-</div>
-</body>
-</html>
\ No newline at end of file
+
+
+EOHTML;
+
+
+ # Generate the web page
+ $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
diff --git a/team.php b/team.php
new file mode 100644
index 0000000..2240d21
--- /dev/null
+++ b/team.php
@@ -0,0 +1,97 @@
+<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
+
+ #*****************************************************************************
+ #
+ # template.php
+ #
+ # Author: Denis Roy
+ # Date: 2005-06-16
+ #
+ # Description: Type your page comments here - these are not sent to the browser
+ #
+ #
+ #****************************************************************************
+
+ #
+ # Begin: page-specific settings. Change these.
+ $pageTitle = "AspectJ Committers and Contributors";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse, Contributors";
+ $pageAuthor = "Andy Clement";
+
+ # Add page-specific Nav bars here
+ # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+ # $Nav->addNavSeparator("My Page Links", "downloads.php");
+ # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
+ # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
+
+ # End: page-specific settings
+ #
+
+ # Paste your HTML content between the EOHTML markers!
+ $html = <<<EOHTML
+
+<div id="maincontent">
+ <div id="midcolumn">
+
+ <h1>Team</h1>
+
+ <p>We are grateful to the following for their contributions to the AspectJ project:</p>
+
+ <div class="homeitem">
+ <h3>Committers</h3>
+ <table cellpadding="2">
+ <tr>
+ <td><a href="http://aspectprogrammer.org"/>Adrian Colyer</a></td>
+ <td>Interface 21</td>
+ </tr>
+ <tr>
+ <td>Andy Clement</td>
+ <td>IBM UK Ltd</td>
+ </tr>
+ <tr>
+ <td>Wes Isberg</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><a href="http://kerstens.org/mik">Mik Kersten</a></td>
+ <td>University of British Columbia</td>
+ </tr>
+ <tr>
+ <td>Alex Vasseur</td>
+ <td>BEA</td>
+ </tr>
+ <tr>
+ <td>Matthew Webster</td>
+ <td>IBM UK Ltd</td>
+ </tr>
+ <tr></tr>
+
+ </table>
+ </div>
+
+ <div class="homeitem">
+ <h3>Contributors</h3>
+ <table cellpadding="2">
+ <tr>
+ <td>Helen Hawkins</td>
+ <td>IBM UK Ltd</td>
+ </tr>
+ <tr>
+ <td>Ron Bodkin</td>
+ <td></td>
+ </tr>
+ </table>
+ </div>
+
+ <hr class="clearer" />
+ </div>
+
+</div>
+
+
+EOHTML;
+
+
+ # Generate the web page
+ $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
diff --git a/userlists.php b/userlists.php
new file mode 100644
index 0000000..1c010e9
--- /dev/null
+++ b/userlists.php
@@ -0,0 +1,96 @@
+<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon()); # All on the same line to unclutter the user's desktop'
+
+ #*****************************************************************************
+ #
+ # template.php
+ #
+ # Author: Denis Roy
+ # Date: 2005-06-16
+ #
+ # Description: Type your page comments here - these are not sent to the browser
+ #
+ #
+ #****************************************************************************
+
+ #
+ # Begin: page-specific settings. Change these.
+ $pageTitle = "AspectJ User Mailing lists";
+ $pageKeywords = "AspectJ, AJDT, Aspect Oriented Software Development, Eclipse";
+ $pageAuthor = "Type your name here";
+
+ # Add page-specific Nav bars here
+ # Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+ # $Nav->addNavSeparator("My Page Links", "downloads.php");
+ # $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
+ # $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
+
+ # End: page-specific settings
+
+ # Paste your HTML content between the EOHTML markers!
+ $html = <<<EOHTML
+
+<div id="maincontent">
+ <div id="midcolumn" style="width: 80%">
+
+ <h1>Mailing lists</h1>
+
+ <div class="homeitem3col">
+ <h3>aspectj-users@eclipse.org</h3>
+ <ul>
+ <li><a href="https://dev.eclipse.org/mailman/listinfo/aspectj-users">
+ aspectj-users at eclipse.org</a><br>
+ Supports discussion among AspectJ users and developers on topics such
+ as language design, new features, and best usage practices.</li>
+
+ <li><a href="http://dev.eclipse.org/mhonarc/lists/aspectj-users/maillist.html">
+ Mailing list archive</a></li>
+
+ <li><a href="http://www.eclipse.org/search/search.cgi?cmd=Search%21&form=extended&ps=10&m=all&t=5&ul=%2Fmhonarc%2Flists%2Faspectj-users&wm=wrd&t=News&t=Mail">Search list</a></li>
+
+ </ul>
+ </div>
+
+ <div class="homeitem3col">
+ <h3>aspectj-announce@eclipse.org</h3>
+ <ul>
+ <li><a href="https://dev.eclipse.org/mailman/listinfo/aspectj-announce">
+ aspectj-announce at eclipse.org</a><br>
+ Used only to announce new releases and other important events. This is
+ a low traffic list.</li>
+
+ <li><a href="http://dev.eclipse.org/mhonarc/lists/aspectj-announce/maillist.html">
+ Mailing list archive</a></li>
+
+ <li><a href="http://www.eclipse.org/search/search.cgi?cmd=Search%21&form=extended&ps=10&m=all&t=5&ul=%2Fmhonarc%2Flists%2Faspectj-announce&wm=wrd&t=News&t=Mail">Search list</a></li>
+
+ </ul>
+ </div>
+
+ <div class="homeitem3col">
+ <h3>Archives</h3>
+ <ul>
+ <li><a href="http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/archives/users.zip">
+ users at aspectj.org ZIP archive (deprecated mailing list)</a>
+ <br>These archives contain user discussion from August 1999 - December 2002.
+ </li>
+
+ <li><a href="http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/archives/announce.zip">
+ announce at aspectj.org ZIP archive (deprecated mailing list)</a>
+ <br>These archives contain announcement messages from August 1999 -
+ December 2002.
+ </li>
+
+ </ul>
+ </div>
+
+ </div>
+
+</div>
+
+
+EOHTML;
+
+
+ # Generate the web page
+ $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>