Archive for the ‘OTEquinox’ Category
Compiling OT/Equinox projects using Tycho
In a previous post I showed how the tycho-compiler-jdt Maven plug-in can be used for compiling OT/J code with Maven.
Recently, I was asked how the same can be done for OT/Equinox projects. Given that we were already using parts from Tycho, this shouldn’t be so difficult, right?
Once you know the solution, finding the solution is indeed easy, also in this case. Here it is:
We use almost the same declaration as for plain OT/J applications:
<pluginManagement> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-compiler-plugin</artifactId> <version>${tycho.version}</version> <extensions>true</extensions> <dependencies> <dependency> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-compiler-jdt</artifactId> <version>${tycho.version}</version> <exclusions> <!-- Exclude the original JDT/Core to be replaced by the OT/J variant: --> <exclusion> <groupId>org.eclipse.tycho</groupId> <artifactId>org.eclipse.jdt.core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <!-- plug the OT/J compiler into the tycho-compiler-jdt plug-in: --> <groupId>org.eclipse</groupId> <artifactId>objectteams-otj-compiler</artifactId> <version>${otj.version}</version> </dependency> </dependencies> </plugin> </pluginManagement>
So, what’s the difference? In both cases we need to adapt the tycho-compiler-jdt plug-in because that’s where we replace the normal JDT compiler with the OT/J variant. However, for plain OT/J applications tycho-compiler-jdt is pulled in as a dependency of maven-compiler-plugin and must be adapted on this path of dependencies, whereas in Tycho projects tycho-compiler-jdt is pulled in from tycho-compiler-plugin. Apparently, the exclusion mechanism is sensitive to how exactly a plug-in is pulled into the build. Interesting.
Once I figured this out, I created and published a new version of our Maven support for Object Teams: objectteams-parent-pom:2.1.1 — publishing Maven support for Object Teams 2.1.1 was overdue anyway
With the updated parent pom, a full OT/Equinox hello world pom now looks like this:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <!-- We use Object Teams: --> <groupId>org.eclipse</groupId> <artifactId>objectteams-parent-pom</artifactId> <version>2.1.1</version> </parent> <artifactId>OTEquinox-over-tycho</artifactId> <version>1.0.0-SNAPSHOT</version> <!-- We are building an Eclipse plug-in (or OSGi bundle): --> <packaging>eclipse-plugin</packaging> <repositories> <!-- This is where we get all Object Teams stuff from: --> <repository> <id>ObjectTeamsRepository</id> <name>Object Teams Repository</name> <url>http://download.eclipse.org/objectteams/maven/3/repository</url> </repository> <!-- Add any p2 repositories needed for your application, e.g.: --> <repository> <id>Juno</id> <name>Eclipse Juno Repository</name> <url>http://download.eclipse.org/releases/juno</url> <layout>p2</layout> </repository> </repositories> <build> <plugins> <plugin> <!-- We build this project using Tycho: --> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-maven-plugin</artifactId> <extensions>true</extensions> </plugin> </plugins> </build> </project>
Looks pretty straight forward, right?
| To see the full OT/Equinox Hello World Example configured for Maven/Tycho simply import OTEquiTycho.zip as a project into your workspace. |
cheers,
Stephan
Object Teams 2.1 Milestone 7 (finally) brings hot code replacement
As part of the Juno Milestone 7 also Object Teams has delivered its Milestone 7.
As the main new feature in this milestone hot code replacement finally works when debugging OT/J or OT/Equinox applications.
What took us so long to make it work?
- Well, hot code replacement didn’t work out of the box because our load-time weaver only worked the first time each class was loaded. When trying to redefine a class in the VM the weaver was not called and thus class signatures could differ between the first loaded class and the redefined version. The VM would then reject the redefinition due to that signature change.
-
Secondly, we didn’t address this issue earlier, because I suspected this would be pretty tricky to implement. When I finally started to work on it, reality proved me wrong: the fix was actually pretty simple
In fact the part that makes it work even in an Equinox setting is so generic that I proposed to migrate the implementation into either Equinox or PDE/Debug, let’s see if there is interest.
Now when you debug any Object Teams application, your code changes can be updated live in the running debug target - no matter if you are changing teams, roles or base classes. Together with our already great debugging support, this makes debugging Object Teams programs still faster.
More new features can be found in the New&Noteworthy (accumulated since the Indigo release).
Using git for an interactive video - Replay the JDT tutorial
When preparing the tutorial How to train the JDT dragon, Ayushman and me packed way more material than we could possible teach in 3 hours time.
Luckily, Ayush came up with an idea that enables all of you to go through the exercise all on your own: instead of creating zip files with various stages of the example projects, we pushed everything to github. I apologize to those who were overwhelmed by how we pushed git onto the tutorial participants in Reston.
Now, as EclipseCon is over, here’s what you can do:
- Fetch the slides: PDF or slideshare
- Clone the material for the plain JDT part (git: URL), containing two projects for the first two exercises.
- org.eclipsecon2012.jdt.tutorial1: traverse the Java Model starting from the element selected in the UI
- org.eclipsecon2012.jdt.quickFix1: implement a quickfix for adding a missing null check
- Clone the misc repo (git: URL), containing
- handouts: instructions for the exercises
- org.eclipsecon2012.jdt.populator: plug-in that was used in the tutorial to create sample content in the runtime workbench; show cases how to programmatically create Java files from String content
- Clone the OT repo (git: URL), containing
- AntiDemo: the OT/Equinox hello-world: prohibition of class names starting with “Foo”.
- Reachability: a full blown reachability analysis in < 300 LOC.
The last exercise, “Reachability”, we couldn’t even show in Reston, but luckily this is the most detailed repo: in 13+1 commits I recorded the individual steps of adding inter-procedural reachability analysis piggy-back on top of the JDT compiler. If you replay these commits from the git repo you can watch me creating this little plug-in from scratch. Starting from step 5 you’ll be able to see the results when you fire up a runtime workbench: the analysis will print to stdout what methods it found during each full build.
Look at the commit comments which summarize what I would have explained in demo mode. Still the material is pretty dense as it explains three technologies at the same time:
- How does this analysis work?
- What points in the JDT do we hook onto?
- How is the integration achieved using Object Teams.
Speaking of integration: using the “Binding Editor” you can see all bindings in a tabular view:
The right hand side of the table give the full list of JDT elements we connect to:
- classes that are extended using a
role - methods/fields that are accessed externally via a
callout binding - methods that are intercepted using a
callin binding.
As a special bonus, step 14 in the git repo shows how to add problem markers for each unreachable method, so that the JDT will actually offer its existing quickfix for removing:

(Yep, both methods are detected as unreachable: calling each other without being called from another reachable method doesn’t help).
I hope you enjoy playing with the examples. For questions please use one of the forums:
- JDT
- Object Teams
Mix-n-match language support
I’ve been involved in the release of different versions of the JDT lately, supporting different flavors of Java.
Classical release management
At the core we have the plain JDT, of which we published the 3.7.0 release in June and right now first release candidates are being prepared towards the 3.7.1 service release, which will be the first official release to support Java 7. At the same time the first milestones towards 3.8 are being built. OK, this is almost normal business — with the exception of the service release differs more than usual from its base release, due to the unhappy timing of the release of Java 7 vs. Eclipse 3.7.
First variant: Object Teams
The same release plan is mirrored by the Object Teams releases 2.0.0, 2.0.1RC1, 2.1.0M1. Merging the delta from JDT 3.7 to 3.7.1 into the OTDT was a challenge, given that this delta contained the full implementation of all that’s new in Java 7. Still with the experience of regularly merging JDT/Core changes into the OT variant, the pure merging was less than one day plus a couple more days until all 50000+ tests were green again. The nice thing about the architecture of the OTDT: after merging the JDT/Core, I was done. Since all other adaptations of the JDT are implemented using OT/Equinox adopting, e.g., all the new quick assists for Java 7 required a total of zero minutes integration time.
I took the liberty of branching 2.0.x and 2.1 only after integrating the Java 7 support, which also means that 2.1 M1 has only a small number of OT-specific improvements that did not already go into 2.0.1.
Prototyping annotation based null analysis
As I wrote before, I’m preparing a comprehensive new feature for the JDT/Core: static analysis for potential NullPointerException based on annotations in the code. The latest patch attached to the bug had almost 3000 lines. Recent discussions at ECOOP made me change my mind in a few questions, so I changed some implementation strategies. Luckily the code is well modularized due to the use of OT/Equinox.
Now came the big question: against which version of the JDT should I build the null-annotation add-on? I mean, which of the 6 versions I have been involved in during the last 2 months?
As I like a fair challenge every now and then I decided: all six, i.e., I wanted to support adding the new static analysis to all six JDT versions mentioned before.
Integration details
Anybody who has worked on a Java compiler will confirm: if you change one feature of the compiler chances are that any other feature can be broken by the change (I’m just paraphrasing: “it’s complex”). And indeed, applying the nullity plug-in to the OTDT caused some headache at first, because both variants of the compiler make specific assumptions about the order in which specific information is available during the compilation process. It turned out that two of these assumptions where simply incompatible, so I had to make some changes (here I made the null analysis more robust).
At the point where I thought I was done, I tripped over an ugly problem that’s intrinsic to Java.
The nullity plug-in adapts a method in the JDT/Core which contains the following switch statement:
while ((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) { IExtendedModifier modifier = null; switch(token) { case TerminalTokens.TokenNameabstract: modifier = createModifier(Modifier.ModifierKeyword.ABSTRACT_KEYWORD); break; case TerminalTokens.TokenNamepublic: modifier = createModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD); break; // more cases } }
I have a copy of this method where I only added a few lines to one of the case blocks.
Compiles fine against any version of the JDT. But Eclipse hangs when I install this plugin on top of a wrong JDT version. What’s wrong?
The problem lies in the (internal) interface TerminalTokens. The required constants TokenNameabstract etc. are of course present in all versions of this interface, however the values of these constants change every time the parser is generated anew. If constants were really abstractions that encapsulate their implementation values, all would be fine, but the Java byte code knows nothing about such an abstraction, all constant values are inlined during compilation. In other words: the meaning of a constant depends solely on the definitions which the compiler sees during compilation. Thus compiling the above switch statement hardcodes a dependency on one particular version of the interface TerminalTokens. BAD.
After recognizing the problem, I had to copy some different versions of the interface into my plug-in, implement some logic to translate between the different encodings and that problem was solved.
What’s next?
Nothing is next. At this point I could apply the nullity plug-in to all six versions of the JDT and all are behaving well.
Mix-n-match
Would you like Java with our without the version 7 enhancements (stable release or milestone)? May I add some role and team classes? How about a dash more static analysis? It turns out we have more than just one product, we have a full little product line with features to pick or opt-out:
| Java 6 | Java 7 | |||
|---|---|---|---|---|
| Indigo | Indigo SR1 | Juno M1 | ||
| no null annotations | Plain JDT | |||
| OTDT | ||||
| with null annotations | Plain JDT | |||
| OTDT | ||||
- OTDT: http://www.eclipse.org/objectteams/download.php
- Null ananlysis: http://wiki.eclipse.org/JDT_Core/Null_Analysis
Just make your choice ![]()
Happy hacking with null annotations and try-with-resources in OT/J.
![]() |
BTW: if you want to hear a bit more about the work on null annotations, you should really come to EclipseCon Europe — why not drop a comment at this submission |
Follow-up: Object Teams Tutorial at EclipseCon 2011
At our EclipseCon tutorial we mentioned a bonus excercise, for which we didn’t have the time at the tutorial.
Now it’s time to reveal the solution.
Task
“Implement the following demo-mode for the JDT:
- • When creating a Java project let the user select:
- ❒ Project is for demo purpose only
- • When creating a class in a Demo project:
- insert class name as “Foo1”, “Foo2” …”
So creating classes in demo mode is much easier, and you’ll use the names “Foo1″… anyway ![]()
(See also our slides (#39)).
Granted, this is a toy example, yet it combines a few properties that I frequently find in real life and which cause significant pains without OT/J:
- The added behavior must tightly integrate with existing behavior.
- The added behavior affects code at distant locations,
here two plug-ins are affected:org.eclipse.jdt.uiandorg.eclipse.jdt.core. - The added behavior affects execution at different points in time,
here creation of a project plus creation of a class inside a project. - The added behavior requires to maintain more state at existing objects,
here a JavaProject must remember if it is a demo project.
Despite these characteristics the task can be easily described in a few English sentences. So the solution should be similarly concise and delivered as a single coherent piece.
Strategy
With a little knowledge about the JDT the solution can be outlined as this
- Add a checkbox to the New Java Project wizard
- When the wizard creates the project mark it as a demo project if the box is checked.
- Let the project also count the names of
Foo..classes it has created. - When the new class wizard creates a class inside a demo project pre-set the generated class name and make the name field unselectable.
From this we conclude the need to define 4 roles, playedBy these existing types:
org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPageOne.NameGroup:
the wizard page section where the project name is entered and where we want to add the checkbox.org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPageTwo:
the part of the wizard that triggers setup of the JavaProject.org.eclipse.jdt.core.IJavaProject:
this is where we need to add more state (isDemoProject and numFooClasses).org.eclipse.jdt.ui.wizards.NewTypeWizardPage:
this is where the user normally specifies the name for a new class to be created.
Note, that 3 classes in this list resided in org.eclipse.jdt.ui, but IJavaProject is from org.eclipse.jdt.core, which leads us to the next step:
Plug-in configuration
Our solution is developed as an OT/Equinox plug-in, with the following architecture level connections:

This simply says that the same team demohelper.ProjectAdaptor is entitled to bind roles to classes from both org.eclipse.jdt.ui and org.eclipse.jdt.core.
One more detail in these extensions shouldn’t go unmentioned: Don’t forget to set “activation: ALL_THREADS” for the team (otherwise you won’t see any effect …).
Now we’re ready to do the coding.
Implementing the roles
18 19 20 21 22 23 24 25 26 27 28 29 30 31 | protected class DialogExtender playedBy NameGroup { protected SelectionButtonDialogField isDemoField; void createControl(Composite parent) <- after Control createControl(Composite composite) with { parent <- (Composite) result } private void createControl(Composite parent) { isDemoField= new SelectionButtonDialogField(SWT.CHECK); isDemoField.setLabelText("Project is for demo purpose only"); isDemoField.setSelection(false); isDemoField.doFillIntoGrid(parent, 4); } } |
Our first role adds the checkbox. The implementation of createControl is straight-forward UI business. Lines 22,23 hook our role method into the one from the bound base class NameGroup. After the with keyword, we are piping the result from the base method into the parameter parent of the role method (with a cast). This construct is a parameter mapping.
Next we want to store the demo-flag to instances of IJavaProject, so we write this role:
52 53 54 55 56 57 58 59 60 | protected class EnhancedJavaProject playedBy IJavaProject { protected boolean isDemoProject; private int numFooClasses = 1; protected String getTypeName() { return "Foo"+(numFooClasses++); } } |
Great, now any IJavaProject can play the role EnhancedJavaProject which holds the two additional fields, and we can automatically serve an arbitrary number of class names Foo1 …
In the IDE you will actually see a warning, telling you that binding a role to a base interface currently imposes a few restrictions, but these don’t affect us in this example.
Next comes a typical question: how to transfer the flag from role DialogExtender to role EnhancedJavaProject?? The roles don’t know about each other nor do the bound base classes. The answer is: use a chain of references.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | protected class FirstPage playedBy NewJavaProjectWizardPageOne { DialogExtender getFNameGroup() -> get NameGroup fNameGroup; protected boolean isDemoProject() { return getFNameGroup().isDemoField.isSelected(); } } protected class WizardExtender playedBy NewJavaProjectWizardPageTwo { FirstPage getFFirstPage() -> get NewJavaProjectWizardPageOne fFirstPage; markDemoProject <- after initializeBuildPath; private void markDemoProject(EnhancedJavaProject javaProject) { if (getFFirstPage().isDemoProject()) javaProject.isDemoProject = true; } } |
Role WizardExtender intercepts the event when the wizard initializes the IJavaProject (line 46). Method initializedBuildPath receives a parameter of type IJavaProject but the OT/J runtime transparently translates this into an instance of type EnhancedJavaProject (this - statically type safe - operation is called lifting). Another indirection is needed to access the checkbox: The base objects are linked like this:
This link structure is lifted to the role level by the callout bindings in lines 35 and 44.
We’re ready for our last role:
62 63 64 65 66 67 68 69 70 71 72 73 | protected class NewTypeExtender playedBy NewTypeWizardPage { void setTypeName(String name, boolean canBeModified) -> void setTypeName(String name, boolean canBeModified); void initTypePage(EnhancedJavaProject prj) <- after void initTypePage(IJavaElement element) with { prj <- element.getJavaProject() } private void initTypePage(EnhancedJavaProject prj) { if (prj.isDemoProject) setTypeName(prj.getTypeName(), false); } } |
Here we intercept the initialization of the type page of a New Java Project wizard (lines 66,67). Another parameter mapping is used to perform two adjustments in one go: fetch the IJavaProject from the enclosing element and lift it to its EnhancedJavaProject role. This follows the rule-of-thumb that base-type operations (like navigating from IJavaElement to IJavaProject) should happen at the right hand side, so that we are ready to lift the IJavaProject to EnhancedJavaProject when the data flow enters the team.
The EnhancedJavaProject can now be asked for its stored flag (isDemoProject) and it can be asked for a generated class name (getTypeName()). The generated class name is then inserted into the dialog using the callout binding in line 64. Looks like this:

See this? No need to think of a good class name
Wrap-up
So that’s it. All these roles are collected in one team class and here is the fully expanded outline:

All this is indeed one concise and coherent module. In the tutorial I promised to do this no more than 80 LOC, and indeed the team class has 74 lines including imports and white space.
Or, if you are interested just in how this module connects to the existing implementation, you may use the “binding editor” in which you see all playedBy, callout and callin bindings:

The full sources are also available for download.
have fun
Null annotations: prototyping without the pain

So, I’ve been working on annotations @NonNull and @Nullable so that the Eclipse Java compiler can statically detect your NullPointerExceptions already during compile time (see also bug 186342).
By now it’s clear this new feature will not be shipped as part of Eclipse 3.7, but that needn’t stop you from trying it, as I have uploaded the thing as an OT/Equinox plugin.
Behind the scenes: Object Teams

Today’s post shall focus on how I built that plugin using Object Teams, because it greatly shows three advantages of this technology:
- easier maintenance
- easier deployment
- easier development

Before I go into details, let me express a warm invitation to our EclipseCon tutorial on Thursday morning. We’ll be happy to guide your first steps in using OT/J for your most modular, most flexible and best maintainable code.
Maintenance without the pain
It was suggested that I should create a CVS branch for the null annotation support. This is a natural choice, of course. I chose differently, because I’m tired of double maintenance, I don’t want to spend my time applying patches from one branch to the other and mending merge conflicts. So I avoid it wherever possible. You don’t think this kind of compiler enhancement can be developed outside the HEAD stream of the compiler without incurring double maintenance? Yes it can. With OT/J we have the tight integration that is needed for implementing the feature while keeping the sources well separated.
The code for the annotation support even lives in a different source repository, but the runtime effect is the same as if all this already were an integral part of the JDT/Core. Maybe I should say, that for this particular task the integration using OT/J causes a somewhat noticable performance penalty. The compiler does an awful lot of work and hooking into this busy machine comes at a price. So yes, at the end of the day this should be re-integrated into the JDT/Core. But for the time being the OT/J solution well serves its purpose (and in most other situations you won’t even notice any impact on performance plus we already have further performance improvements in the OT/J runtime in our development pipeline).
Independent deployment
Had I created a branch, the only way to get this to you early adopters would have been via a patch feature. I do have some routine in deploying patch features but they have one big drawback: they create a tight dependency to the exact version of the feature which you are patching. That means, if you have the habit of always updating to the latest I-build of Eclipse I would have to provide a new patch feature for each individual I-build released at Eclipse!
Not so for OT/Equinox plug-ins: in this particular case I have a lower bound: the JDT/Core must be from a build ≥ 20110226. Other than that the same OT/J-based plug-in seemlessly integrates with any Eclipse build. You may wonder, how can I be so sure. There could be changes in the JDT/Core that could break the integration. Theoretically: yes. Actually, as a JDT/Core committer I’ll be the first to know about those changes. But most importantly: from many years’ experience of using this technology I know such breakage is very seldom and should a problem occur it can be fixed in the blink of an eye.
As a special treat the OT/J-based plug-in can even be enabled/disabled dynamically at runtime. The OT/Equinox runtime ships with the following introspection view:

Simply unchecking the second item dynamically disables all annotation based null analysis, consistently.
Enjoyable development
The Java compiler is a complex beast. And it’s not exactly small. Over 5 Mbytes of source spread over 323 classes in 13 packages. The central package of these (ast) comprising no less than 109 classes. To add insult to injury: each line of this code could easily get you puzzling for a day or two. It ain’t easy.
If you are a wizard of the patches feel free to look at the latest patch from the bug. Does that look like s.t. you’d like to work on? Not after you’ve seen how nice & clean things can be, I suppose.
First level: overview
Instead of unfolding the package explorer until it shows all relevant classes (at what time the scrollbar will probably be too small to grasp) a quick look into the outline suffices to see everything relevant:

Here we see one top-level class, actually a team class. The class encapsulates a number of role classes containing the actual implementation.
Navigation to the details
Each of those role classes is bound to an existing class of the compiler, like:
protected class MessageSend playedBy MessageSend { ...
MessageSend denotes a role class in the current team, whereas the second MessageSend refers to an existing base class imported from some other package).
Ctrl-click on the right-hand class name takes you to that base class (the packages containing those base classes are indicated in the above screenshot). This way the team serves as the single point of reference from which each affected location in the base code can be reached with a single mouse click - no matter how widely scattered those locations are.
When drilling down into details a typical roles looks like this:

The 3 top items are
”callout” method bindings providing access to fields or methods of the base object. The bottom item is a regular method implementing the new analysis for this particular AST node, and the item above it defines a
”callin” binding which causes the new method to be executed after each execution of the corresponding base method.
Locality of new information flows
Since all these roles define almost normal classes and objects, additional state can easily be introduced as fields in role classes. In fact some relevant information flows of the implementation make use of role fields for passing analysis results directly from one role to another, i.e., the new analysis mostly happens by interaction among the roles of this team.
Selective views, e.g., on inheritance structures
As a final example consider the inheritance hierarchy of class Statement: In the original this is a rather large tree:

Way too large actually to be fully unfolded in a single screenshot. But for the implementation at hand most of these
classes are irrelevant. So at the role layer we’re happy to work with this reduced view:

This view is not obtained by any filtering in the IDE, but that’s indeed the real full inheritance tree of the role class
Statement. This is just one little example of how OT/J supports the implementation of selective views. As a result, when developing the annotation based null analysis, the code immediately provides a focused view of everything that is relevant, where relevance is directly defined by design intention.
A tale from the real world
I hope I could give an impression of a real world application of OT/J. I couldn’t think of a nicer structure for a feature of this complexity based on an existing code base of this size and complexity. Its actually fun to work with such powerful concepts.
Did I already say? Don’t miss our EclipseCon tutorial
Hands-on introduction to Object Teams
| See you at | ![]() |
New Honours, New Synergy
I’m flattered to see my name appear on one more Eclipse web-page:

Thanks to the JDT/Core team for accepting me as a new member!
Actually, I’ve been poking about the JDT source code since 2003 when we started implementing the Object Teams Development Tooling (OTDT) on top of the JDT. So it was only natural that I would stumble upon a bug in the JDT every once in a while (incl. one “greatbug”
). In this specific situation, reporting bugs and trying to help find solutions was more than just good Eclipse citizenship: the discussions in bugzilla also helped me to better understand the JDT sources and thus it helped me developing the OTDT. And that’s what this post is about: synergy!
Personal Goals
Actually, watching the JDT/Core bug inbox provides a constant stream of cool riddles: spooky Java examples producing unexpected compiler/runtime results. Sometimes those are real fun to crack. Which compiler is right, which one isn’t? What’s the programmer trying to do? I’d say there’s no better way to test your Java knowledge
Also, watching this stream helps me stay informed, because every patch will eventually need to be merged into the Object Teams branch of the JDT/Core.
But I also have some pet projects that I’d like to actively push forward. Currently I’m thinking about these two:
- Supporting inter-procedural null analysis
- Making the compiler closer match the OSGi semantics
Inter-procedural null analysis
Naturally, the JDT/Core is a facilitator for tons of cool functionality in the IDE, but it hardly communicates directly with the user. But we have one channel, where the compiler can actually talk to the developer and give advice that’s well worth your bucks: errors and warnings. Did you know, that the compiler can immediately tell you what’s wrong about this piece of code:
void foo(String in) { if (in == null) new IllegalArgumentException("Null is not allowed here"); ... // real work done here }
(Yep, that was bug 236385, see the New&Noteworthy on how to enable).
Many Java developers share the experience that one of the most frequent problems is also one of the most mundane: NPE. Those, who are aware of this easily produce the opposite problem: cluttering there code with meaningless null-checks (many of which have no better action than the above IllegalArgumentException which isn’t much better than throwing the NPE in the first place). The point is, we’d want to know which values can actually be null (and why!) so we write only the necessary null-checks and for those we should think really hard what would be a suitable action, right? (“This shouldn’t happen” is not an answer!).
Thus I’m happy I could get involved in some improvements of the compiler’s flow analysis. I also experienced that null-analysis combined with aggressive optimization is a delicate issue - remember SDK 3.7M2a? Sorry about that, but to my justification I might add that bug 325755 has always been dormantly present, I only woke’em up. I must admit for those 105 minutes my heart beat was a bit above average
.
Anyway, the current null analysis is still fundamentally limited: it knows nothing about nullness of method arguments nor method call results. So it would be a real cool enhancement if we could feed such information into the compiler. Fortunately, the theory of how to do this (you may either think of improved type systems or of design by contract) is a well-explored subject. Actually, bug 186342 already has some patches in this direction. Since discussing in bugs with long history is a bit tedious I created this wiki page. Sadly, it’s not a technical difficulty that’s keeping us from immediately releasing that patch, but a stalled standardization process
.
However, as outlined in the wiki, here comes another synergy: in case we can’t find a solution that will be sufficiently compatible with future standards, I can easily create an early-adopters release, so sorting out the details of implementation and usage can be done in parallel with the standardization process. How that? I’d simply ship the compiler enhancement as an OT/Equinox-enabled plug-in. This would allow us to ship the compiler enhancement as separate plug-in ready to be tried by early adopters.
OSGi-aware compiler
Some of you may have noticed (here, or here, or here, or here or one of the many duplicates) that the compiler’s concept of a (single, linear) classpath is not a good match for compiling OSGi code. I will soon write another wiki page with my current thinkings about that issue. Stay tuned …
Comments?
For both issues I’d appreciate any comments / feedback. I’ll be checking updates of the bugs I listed, or the wiki page or … talk to me during ESE! Let’s move something together.
See you all in Ludwigsburg!
Stephan
Get for free what Coin doesn’t buy you
Ralf Ebert recently blogged about how he extended Java to support a short-hand notation for throwing exceptions, like:
throw "this is wrong";
It’s exactly the kind of enhancement you’d expect from Project Coin, but neither do they have it, nor would you want to wait until they release a solution.
At this point I gave it a few minutes, adapted Ralf’s code, applied Olivier’s suggestion wrapped it in a little plugin et voilà:
Install
Use this p2 repository, check two features…
…install and restart, and you’re ready to use your “Medal” IDE:

So that’s basically the same as what Ralf already showed except:
It’s a module!
In contrast to Ralf’s patch of the JDT/Core my little plugin can be easily deployed and installed into any Eclipse (≥3.6.0). It just requires another small feature called “Object Teams Equinox Integration” or “OT/Equinox” for short.
So we’re all going to use our private own ”’dialects of Java?”’ Hm, firstly, once compiled this is of course plain Java, you wouldn’t be able to tell that the sources looked “funny”.
And: here’s the Boss Key: when somebody sniffs about your monitor, a single click will make Eclipse behave “normal”:

In other words, you can ”’dynamically enable/disable”’ this feature at runtime. The OT/Equinox Monitor view in the snapshot shows all known Team instances in the currently running IDE, and the little check boxes simply send activate() / deactivate() messages to the selected instance.
I coined the name Medal as our own playground for Java extensions of this kind. Feel free to suggest/contribute more!
Implementation
For a quick introduction on how to setup an OT/Equinox project in Eclipse I’d suggest our Quick Start (let me know if anything is unclear). For this particular case the key is in defining one little extension:

which the package explorer will render as:

Drilling into the Team class ThrowString you’ll see:

The Team class contains two Role classes:
- Role DontReport binds to class
ProblemReporter(not shown in the Outline), intercepts calls toProblemReporter.cannotThrowTypeand if the type in question is String, simply ignores the “error” - Role Generate binds to class
ThrowStatementto make sure the correct bytecodes for creating aRuntimeExceptionare generated
Also, in the Outline you see both kinds of method bindings that are supported by Object Teams:
getExceptionType/setExceptionTypeare getter/setter definitions for fieldThrowStatement.exceptionType(callout-to-field in OT/J jargon)- Things like “
adjustType <- after resolve” establish method call interception (callin bindings in OT/J jargon - the “after” is symbolized by the specific icon)
The actual implementation is really simple, like (full listing of the first role):
protected class DontReport playedBy ProblemReporter { cannotThrowType <- replace cannotThrowType; @SuppressWarnings("basecall") callin void cannotThrowType(ASTNode exception, TypeBinding exceptionType) { if (exceptionType.id != TypeIds.T_JavaLangString) // do the actual reporting only if it's not a string base.cannotThrowType(exception, exceptionType); } }
The base-call (base.cannotThrowType) delegates back to the original method, but only if the exception type is not String. The @SuppressWarnings annotation documents that not all control flows through this method will issue a base-call, a decision that deserves a second thought as it means the base plugin (here JDT/Core) does not perform its task fully as usual.
Intercepting resolve has the purpose of replacing type String with RuntimeException so that other parts of the Compiler and the IDE see a well-typed structure.
The method that performs the actual work is generateCode. Since this method is essentially based on the original implementation, the best way to see the difference is (select either the callin method or the callin binding):

which gives you this compare editor:

This neatly shows the two code blocks I inserted, one for creating the RuntimeException instance, the other for invoking its constructor. Or, if you just want to read the full role method:
/* This method is partly copied from the base method. */ @SuppressWarnings({"basecall", "inferredcallout"}) callin void generateCode(BlockScope currentScope, CodeStream codeStream) { if ((this.bits & ASTNode.IsReachable) == 0) return; int pc = codeStream.position; // create a new RuntimeException: ReferenceBinding runtimeExceptionBinding = (ReferenceBinding) this.exceptionType; codeStream.new_(runtimeExceptionBinding); codeStream.dup(); // generate the code for the original String expression: this.exception.generateCode(currentScope, codeStream, true); // call the constructor RuntimeException(String): MethodBinding ctor = runtimeExceptionBinding.getExactConstructor(new TypeBinding[]{this.stringType}); codeStream.invoke(Opcodes.OPC_invokespecial, ctor, runtimeExceptionBinding); // throw it: codeStream.athrow(); codeStream.recordPositionsFrom(pc, this.sourceStart); }
You may also fetch the full sources of this little plug-in (plus a feature for easy deployment) to play around with and extend.
Next?
Ralf mentioned that he’d like to play with ways for also extending the syntax. For a starter on how this can be done with Object Teams I recommend my previous posts IDE for your own language embedded in Java? (part 1) and part 2.
New Refactoring for OT/J: Change Method Signature
IDE Innovation
Every now and then some folks report that the IDE they’re developing now supports this or that cool new feature. Sometimes I envy them for such progress - but more often than not I end up realizing that the OTDT already has that feature or something very similar. Is that just my personal bias (which certainly I have) or are we cheating in some way, or what?
There’s a little detail in the design of the OTDT that turns out to make such a difference as normally can only achieved by cheating: by the way how the OTDT extends and adapts the JDT it is like saying we’re starting the race not at the line saying “START” but at the other one saying “FINISH” and run on from there. While many projects define “JDT-like user experience” as their long-term goal, the OTDT basically has this since the first release. How come? The OTDT basically is the JDT, with adaptations.
There’s a fine point in the word basically. To tell the truth, every feature that the JDT supports for Java development is not automatically fully available in the OTDT for OT/J development. In fact most JDT features need adaptation to provide equal convenience for OT/J development. It’s just that all these adaptations can be brought into the system very very easily - thanks to the self-application of OT/Equinox. And now, here is actually an example of a JDT feature that lacked OT/J support - until yesterday:
Change Method Signature Refactoring
If you refactor mercilessly the “Change Method Signature” refactoring is certainly one of your friends. Add/rename/remove/reshuffle parameters of a method without (too easily) breaking existing code, cool. It knows about the connections from method invocation to method declaration and about overriding. That’s good enough for Java, but not good enough for OT/J since OT/J introduces method bindings (”callout” and “callin”) that create a wiring between methods of different objects. Obviously, if one of the methods being wired changes its signature so must the method binding.
Technically, the JDT implementation of that refactoring bailed out when it asked a parameter/argument for its parent in the AST and found neither a method declaration nor a method invocation. The JDT refactoring does not know about OT/J method bindings, so it just failed to update those.
After a little of coding this is what happens now when you apply “Change Method Signature” on a piece of OT/J code. Assume you have a plain Java class:
public class BaseClass { public void bm(int i, boolean b) { } void other() { bm(3, false); } }
and a TeamClass whose contained RoleClass is bound to BaseClass:
1 2 3 4 5 6 7 8 9 10 | public team class TeamClass { protected class RoleClass playedBy BaseClass { void rm(int i2, boolean b2) <- after void bm(int i, boolean b); private void rm(int i2, boolean b2) { System.out.println((b2?i2:-i2)); } } } |
Here the right-hand side of the callin binding in line 4 refers to the normal method bm(int,boolean) defined in BaseClass.
What happens if you start messing around with the signature of bm?
Like:

I.e., we are adding a parameter str and also change the order of parameters (from i,b to b,str,i). I don’t have to tell you what this refactoring does to BaseClass, but here’s the preview of those changes affecting TeamClass:

(sorry the screenshot is a bit wide, you may have to click to really see).
The preview shows that the refactoring will do three things:
- Update the right-hand side of the method binding.
- Add a parameter mapping (the part starting with “
with“) to ensure that the role methodrmreceives the arguments it needs, the way it needs them. - Do not update any part of the role implementation, because that’s what the parameter mapping is for: shield the role implementation from any outside changes.
Some words on these parameter mappings: each element like “b2 <- b” feeds a value from the right-hand side (representing things at the baseclass side) into the parameter at the left-hand side (representing the role). The list of parameter mappings is not ordered, which means further swapping of base side parameters requires no further action. And indeed the current implementation of the refactoring does not attempt to adjust an existing parameter mapping (which might be a quite complex task). If adjustments are required which the refactoring cannot perform automatically, it will inform the user that perhaps a parameter mapping may need manual adjustment.
The refactoring applies no AI to guess what the intended solution should look like, but it performs a number of obvious adaptations and gives note when these adaptations may not suffice and manual cleanup may be needed.
Implementation
Those who have read previous posts may (almost) know the kind of statistics that follows:
- 299 LOC implementation
- 315 LOC testcode
- 170 LOC testdata
I should really show one of these OT/J based implementation, one of these days. For this post I will just give you an Outline, literally:

Role class Processor is bound to the JDT’s ChangeSignatureProcessor, and the nested roles OccurrenceUpdate and MethodSpecUpdate are bound to two inner classes of ChangeSignatureProcessor, which shows how even class nesting at the base level can be mapped to the team & role level. Instances of the innermost roles will only ever come into being, if a Processor role has detected that it needs to work in order to handle OT/J specific code. Inside each role - apart from regular fields and methods - you see those green arrow-things, denoting method bindings between a role and its base. The highlighted binding to createOccurrenceUpdate is actually the initial entry into the logic of this module. Further down you see how the base behavior reshuffleElements is intercepted to additionally add parameter mappings if needed (and yes, I’m hiding the details of role MethodSpecUpdate, but there are no secrets inside, I just more methods and more method bindings).
Voilà, we indeed have a new refactoring for OT/J. I’ve been planning this one for a while but in the end it took me little more than a day ![]()
Object Teams rocks :)
During the last week or so I modernized a part of the Object Teams Development Tooling (OTDT) that had been developed some 5 years ago: the type hierarchy for OT/J. I’ll mention the basic requirements for this engine in a minute. While most of the OTDT succeeds in reusing functionality from the JDT, the type hierarchy was implemented as a full replacement of the original. This is a pretty involved little machine, which took weeks and months to get right. It provides its logic to components like Refactoring and the Type Hierarchy View.
On the one hand this engine worked well for most uses, but over so many years we did not succeed to solve two remaining issues:
- Give a faithful implementation for
getSuperclass() - This is tricky because a role class in OT/J can have more than one superclass. Failing to implement this method we could not support the “traditional” mode of the hierarchy view that shows both the tree of subclasses of a focus type plus the path of superclasses up to
Object(this upwards path relies ongetSuperclass). - Support region based hierarchies
- Here the type hierarchy is not only computed for supertypes and subtypes of one given focus type, but full inheritance structure is computed for a set of types (a “region”). This strategy is used by many JDT Refactorings, and thus we could not precisely adapt some of these for OT/J.
In analyzing this situation I had to weigh these issues:
- In its current state the implementation strategy was a show stopper for one mode of the type hierarchy view and for precise analysis in several refactorings.
- Adding a region based variant of our hierarchy implementation would mean to re-invent lots of stuff, both from the JDT and from our own development.
- All this seemed to suggest to discard our own implementation and start over from scratch.
Object Teams to the rescue: Let’s re-build Rome in ten days.
As mentioned in my previous post, the strength of Object Teams lies in building layers: each module sits in one layer, and integration between layers is given by declarative bindings:

Applying this to the issue at hand we now actually have three layers with quite different structures:
Java Model
The bottom layer is the Java model that implements the containment tree of Jave elements: A project contains source folders, containing packages, containing compilation units, containing types containing members. In this model each Java type is represented by an instance of IType
Java Type Hierarchy
This engine from the JDT maintains the graph of inheritance information as a second way for navigating between ITypes. Interestingly, this module pretty closely simulates what Object Teams does natively, I may come back to that in a later post.
Object Teams Type Hierarchy
As an extension of Java, OT/J naturally supports the normal inheritance using extends, but there is a second way how an inheritance link can be established: based on inheritance of the enclosing team:
team class EcoSystem { protected class Project { } protected class IDEProject extends Project { } } team class Eclipse extends EcoSystem { @Override protected class Project { } @Override protected class IDEProject extends Project { } }
Here, Eclipse.Project is an implicit subclass of EcoSystem.Project simply because Eclipse is a subclass of EcoSystem and both classes have the same simple name Project. I will not go into motivation and consequences of this language design (that’ll be a separate post — which I actually promised many weeks ago).
Looking at the technical challenge we see that the implicit inheritance in OT/J adds a third layer, in which classes are connected in yet another graph.
Three Layers — Three Graphs
Looking at the IType representation of Eclipse.IDEProject we can ask three questions:
| Question | Code | Answer |
|---|---|---|
| What is your containing element? | type.getParent() |
Eclipse |
| What is your superclass? | hierarchy.getSuperclass(type) |
Eclipse.Project |
| What is your implicit superclass? | ?? | EcoSystem.Project |
Each question is implemented in a different layer of the system. Things get a little complicated when asking a type for all its super types, which requires to collect the answers from both the JDT hierarchy layer and the OT hierarchy. Yet, the most tricky part was giving an implementation for getSuperclass().
An "Impossible" Requirement
There is a hidden assumption behind method getSuperclass() which is pervasive in large parts of the implementation, especially most refactorings:
When searching all methods that a type inherits from other types, looping over
getSuperclass()until you reachObjectwill bring you to all the classes you need to consider, like so:IType currentType = /* some init */; while (currentType != null) { findMethods(currentType, /*some more arguments*/); currentType = hierarchy.getSuperclass(currentType); }
There are lots and lots of places implemented using this pattern. But, how do you do that if a class has multiple superclasses?? I cannot change all the existing code to use recursive functions rather than this single loop!
Looking at Eclipse.IDEProject we have two direct superclasses: Eclipse.Project (normal inheritance, “extends”) and EcoSystem.IDEProject (OT/J implicit inheritance), which cannot both be answered by a single call to getSuperclass(). The programming language theory behind OT/J, however, has a simple answer: linearization. Thus, the superclasses of Eclipse.IDEProject are:
- Eclipse.IDEProject → EcoSystem.IDEProject → Eclipse.Project → EcoSystem.Project
… in this order. And this is how this shall be rendered in the hierarchy view:

The final callenge: what should this query answer:
getSuperclass(ecoSystemIDEProject);
According to the above linearization we should answer: Eclipse.Project, but only if we are in the context of the superclass chain of Eclipse.IDEProject. Talking directly to EcoSystem.IDEProject we should get EcoSystem.Project! In other words: the function needs to be smarter than what it can derive from its arguments.
Layer Instances for each Situation
Let’s go back to the layer thing:

At the bottom you see the Java model (as rendered by the package explorer). In the top layer you see the OT/J type hierarchy (lets forget about the middle layer for now). Two essential concepts can be illustrated by this picture:
- Each layer is populated with objects and while each layer owns its objects, those objects connected with a red line between layers are almost the same, they represent the same concept.
- The top layer can be instantiated multiple times: for each focus type you create a new OT/J hierarchy instance, populated with a fresh set of objects.
It is the second bullet that resolves the “impossible” requirement: the objects within each layer instance are wired differently, implementing different traversals. Depending on the focus type, each layer may answer the getSuperclass(type) question differently, even for the same argument.
The first bullet answers how these layers are integrated into a system: Conceptually we are speaking about the same Java model elements (IType), but we superimpose different graph structure depending on our current context.
but in each layer these objects are connected in a specific way as suites for the task at hand.
Inside the hierarchy layer, we actually do not handle IType instances directly, but we have
roles that represent one given IType each. Those roles contain all the inheritance links needed for answering the various questions about inheritance relations (direct/indirect, explicit/implicit, super/sub).
A cool thing about Object Teams is, that having different sets of objects in different layers (
teams) doesn’t make the program more complex, because I can pass an object from one layer into methods of another layer and the language will quite automagically translate into the object that sits at the other end of that red line in the picture above. Although each layer has its own view, they “know” that they are basically talking about the same stuff (sounds like real life, doesn’t it?).
Summing up
OK, I haven’t shown any code of the new hierarchy implementation (yet), but here’s a sketch of before-vs.-after:
- Code Size
- The new implementation of the hierarchy engine has about half the size of the previous implementation (because it need not repeat anything that’s already implemented in the Java hierarchy).
- Integration
- The previous implementation had to be individually integrated into each client module that normally uses Java hierarchies and then should use an OT hierarchy instead. After the re-implementation, the OT hierarchy is transparently integrated such that no clients need to be adapted (accounting for even more code that could be discarded).
- Linearization
- Using the new implementation,
getSuperclass()answers the correct, context sensitive linearization, as shown in the screenshot above, which the old implementation failed to solve. - Region based hierarchies
- The old implementation was incompatible with building a hierarchy for a region. For the new implementation it doesn’t matter whether it’s built for a single focus type or for a region, so, many clients now work better without any additional efforts.
The previous implementation only scratched at the surface – literally worked around the actual issue (which is: the Java type hierarchy is not aware of OT/J implicit inheritance). The new solution solves the issue right at its core: the new team OTTypeHierarchies assists the original type hierarchy (such that its answers indeed respect OT/J’s implicit inheritance). By performing this adaptation at the issue’s core, the solution automatically radiates to all clients. So I expect that investing a few days in re-writing the implementation will pay off in no time. Especially, improving the (already strong) refactoring support for OT/J is now much, much easier.
Moving your solution into the core could easily result in a design were a few bloated and tangled core modules do all the work, mocking the very idea of modularity. This can be avoided by a technology that is based on some concept of perspectives and self-contained layers, as supported by teams in OT/J.
Need I say, how much fun this re-write was? ![]()




