| <?xml version="1.0" encoding="utf-8"?> |
| <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" |
| "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> |
| <article id="article"> |
| <articleinfo> |
| <publisher> |
| <publishername>Eclipse</publishername> |
| </publisher> |
| <title>Eclipse Platform Technical Overview</title> |
| <date>July 17, 2001</date> |
| <revhistory> |
| <revision> |
| <revnumber>1.0</revnumber> |
| <date>July 17, 2001</date> |
| <author> |
| <firstname>Jim</firstname> |
| <surname>des Rivieres</surname> |
| <affiliation> |
| <orgname>IBM</orgname> |
| </affiliation> |
| </author> |
| <revdescription> |
| <para>Original.</para> |
| </revdescription> |
| </revision> |
| <revision> |
| <revnumber>2.1</revnumber> |
| <date>February 1, 2003</date> |
| <author> |
| <firstname>Jim</firstname> |
| <surname>des Rivieres</surname> |
| <affiliation> |
| <orgname>IBM</orgname> |
| </affiliation> |
| </author> |
| <revdescription> |
| <para>Updated for Eclipse 2.1.</para> |
| </revdescription> |
| </revision> |
| <revision> |
| <revnumber>3.1</revnumber> |
| <date>April 19, 2006</date> |
| <author> |
| <firstname>Wayne</firstname> |
| <surname>Beaton</surname> |
| <affiliation> |
| <orgname>The Eclipse Foundation</orgname> |
| </affiliation> |
| </author> |
| <revdescription> |
| <para>Updated for Eclipse 3.1.</para> |
| </revdescription> |
| </revision> |
| </revhistory> |
| <edition>3.1</edition> |
| <copyright> |
| <year>2006</year> |
| <holder>International Business Machines Corp.</holder> |
| </copyright> |
| <abstract> |
| <para> |
| The Eclipse Platform is designed for building integrated development environments |
| (IDEs), and arbitrary tools. This paper is a general technical introduction to the |
| Eclipse Platform. Part I presents a technical overview of its architecture. Part II |
| is a case study of how the Eclipse Platform was used to build a full-featured Java |
| development environment. |
| </para> |
| </abstract> |
| <legalnotice> |
| <para> |
| Java and all Java-based marks are trademarks or registered trademarks of Sun |
| Microsystems, Inc. in the United States and other countries. |
| </para> |
| </legalnotice> |
| <legalnotice> |
| <para> |
| Windows and ActiveX are either registered trademarks or trademarks of Microsoft |
| Corporation in the United States and/or other countries. |
| </para> |
| </legalnotice> |
| <legalnotice> |
| <para> |
| Motif is a registered trademark of The Open Group in the United States and other |
| countries. |
| </para> |
| </legalnotice> |
| <legalnotice> |
| <para>Linux is a trademark of Linus Torvalds.</para> |
| </legalnotice> |
| <legalnotice> |
| <para> |
| MacOS is a trademark of Apple Computer Inc. in the United States and other |
| countries. |
| </para> |
| </legalnotice> |
| <legalnotice> |
| <para> |
| Solaris is a trademark or registered trademark of Sun Microsystems, Inc. in the |
| United States and other countries. |
| </para> |
| </legalnotice> |
| <legalnotice> |
| <para> |
| HPUX is a trademark of Hewlett-Packard Corp. in the United States and other |
| countries. |
| </para> |
| </legalnotice> |
| <legalnotice> |
| <para> |
| Other company, product, and service names may be trademarks or service marks of |
| others. |
| </para> |
| </legalnotice> |
| </articleinfo> |
| <section> |
| <title>Introduction</title> |
| <para> |
| When people speak of Eclipse, they very often mean the Eclipse Software Development Kit |
| (SDK) which is both the leading Java™ integrated development environment (IDE) and |
| the single best tool available for building products based on the Eclipse Platform. The |
| Eclipse SDK, a critical piece of the Eclipse tapestry, is a combination of the efforts |
| of several Eclipse projects, including |
| <ulink url="http://eclipse.org/platform">Platform</ulink>, Java Development Tools |
| (<ulink url="http://eclipse.org/jdt">JDT</ulink>), and the Plug-in Development Environment |
| (<ulink url="http://eclipse.org/pde">PDE</ulink>). |
| </para> |
| <para> |
| In its entirety, the Eclipse Platform contains the functionality required to build an |
| IDE. However, the Eclipse Platform is itself a composition of components; by using a |
| subset of these components, it is possible to build arbitrary applications. The Eclipse |
| Rich Client Platform (RCP) is one such subset of components. |
| <xref linkend="figure1" /> |
| shows a representation of some of the components in the Eclipse Platform and highlights |
| the subset that makes up the RCP (in reality there are a great many more components). |
| </para> |
| |
| <mediaobject id="figure1" xreflabel="Figure 1"> |
| <imageobject> |
| <imagedata fileref="images/rcp.gif" /> |
| </imageobject> |
| <caption> |
| Figure 1 - The Eclipse Rich Client Platform (RCP) is a subset of the Eclipse |
| Platform. |
| </caption> |
| </mediaobject> |
| |
| <para> |
| Eclipse Platform is more than just a foundation for building development environments: |
| it is a foundation for building arbitrary tools and applications. The RCP is being used |
| to build arbitrary applications that have nothing to do with software development in |
| diverse areas that include banking, automotive, medical, and space exploration. As the |
| name "rich client" implies, Eclipse RCP is an excellent platform for building |
| applications that work in conjunction with application servers, databases, and other |
| backend resources to deliver a rich user experience on the desktop. |
| </para> |
| <para> |
| One of the key benefits of the Eclipse Platform is realized by its use as an integration |
| point. Building a tool or application on top of Eclipse Platform enables the tool or |
| application to integrate with other tools and applications also written using the |
| Eclipse Platform. The Eclipse Platform is turned in a Java IDE by adding Java |
| development components (e.g. the JDT) and it is turned into a C/C++ IDE by adding C/C++ |
| development components (e.g. the <ulink url="http://eclipse.org/cdt">CDT</ulink>). |
| It becomes both a Java and C/C++ development environment by adding both sets of |
| components. Eclipse Platform integrates the individual tools into a single product |
| providing a rich and consistent experience for its users. |
| </para> |
| <para> |
| Integration extends into the rich client space as well. An organization can split up the |
| development of application components across development teams and then integrate the |
| results using the Eclipse Rich Client Platform. This doesn't trivialize the process of |
| developing large scale applications, but it does make the integration easier. |
| </para> |
| <para> |
| Perhaps the most obvious thing that the Eclipse Platform provides is a managed windowing |
| system. User interface components are part of this (including entry fields, push |
| buttons, tables, and tree views), but there's more. The platform provides window |
| lifecycle management, docking views and editors, the ability to contribute menu items |
| and tool bars, and drag and drop. |
| </para> |
| <para> |
| <xref linkend="figure2" /> |
| shows a screen capture of the main workbench window as it looks with only the standard |
| generic components that are part of the Eclipse Platform. |
| </para> |
| |
| <mediaobject id="figure2" xreflabel="Figure 2"> |
| <imageobject> |
| <imagedata fileref="images/workbench-3_2M3-xp.gif" /> |
| </imageobject> |
| <caption>Figure 2 - The Eclipse Platform User Interface.</caption> |
| </mediaobject> |
| |
| <para> |
| The navigator view ( |
| <xref linkend="figure2" /> |
| , top left) shows the files in the user's workspace; the text editor (top right) shows |
| the content of a file; the tasks view (bottom right) shows a list of to-dos; the outline |
| view (bottom left) shows a content outline of the file being edited (not available for |
| plain text files). |
| </para> |
| <para> |
| Although the Eclipse Platform has a lot of built-in functionality, most of that |
| functionality is very generic. It takes additional tools to extend the Platform to work |
| with new content types, to do new things with existing content types, and to focus the |
| generic functionality on something specific. |
| </para> |
| <para> |
| The Eclipse Platform is built on a mechanism for discovering, integrating, and running |
| modules called plug-ins, which are in turn represented as bundles based on the |
| <ulink url="http://osgi.org">OSGi</ulink> |
| specification. A tool provider writes a tool as a separate plug-in that operates on |
| files in the workspace and surfaces its tool-specific UI in the workbench. When the |
| Platform is launched, the user is presented with an integrated development environment |
| (IDE) composed of the set of available plug-ins. The quality of the user experience |
| depends significantly on how well the tools integrate with the Platform and how well the |
| various tools work with each other. |
| </para> |
| </section> |
| <section> |
| <title>Part I: Eclipse Platform Technical Overview</title> |
| <para> |
| The Eclipse Platform (or simply "the Platform" when there is no risk of confusion) is |
| designed and built to meet the following requirements: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Support the construction of a variety of tools for application development. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Support an unrestricted set of tool providers, including independent software |
| vendors (ISVs). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Support tools to manipulate arbitrary content types (e.g., HTML, Java, C, JSP, |
| EJB, XML, and GIF). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Facilitate seamless integration of tools within and across different content |
| types and tool providers. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Support both GUI and non-GUI-based application development environments. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Run on a wide range of operating systems, including Windows®, LinuxTM, Mac OS X, |
| Solaris AIX, and HP-UX. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Capitalize on the popularity of the Java programming language for writing tools. |
| </para> |
| </listitem> |
| </itemizedlist> |
| <para> |
| The Eclipse Platform's principal role is to provide tool providers with mechanisms to |
| use, and rules to follow, that lead to seamlessly-integrated tools. These mechanisms are |
| exposed via well-defined API interfaces, classes, and methods. The Platform also |
| provides useful building blocks and frameworks that facilitate developing new tools. |
| </para> |
| <para> |
| <xref linkend="figure3" /> |
| shows the major components, and APIs, of the Eclipse Platform. |
| </para> |
| |
| <mediaobject id="figure3" xreflabel="Figure 3"> |
| <imageobject> |
| <imagedata fileref="images/eclipse-platform-arch.gif" /> |
| </imageobject> |
| <caption>Figure 3 - Eclipse Platform architecture</caption> |
| </mediaobject> |
| <section> |
| <title>Platform Runtime and Plug-in Architecture</title> |
| <para> |
| A plug-in is the smallest unit of Eclipse Platform function that can be developed |
| and delivered separately. Usually a small tool is written as a single plug-in, |
| whereas a complex tool has its functionality split across several plug-ins. Except |
| for a small kernel known as the Platform Runtime, all of the Eclipse Platform's |
| functionality is located in plug-ins. |
| </para> |
| <para> |
| Plug-ins are coded in Java. A typical plug-in consists of Java code in a Java |
| Archive (JAR) library, some read-only files, and other resources such as images, web |
| templates, message catalogs, native code libraries, etc. Some plug-ins do not |
| contain code at all. One such example is a plug-in that contributes online help in |
| the form of HTML pages. A single plug-in's code libraries and read-only content are |
| located together in a directory in the file system, or at a base URL on a server. |
| There is also a mechanism that permits a plug-in to be synthesized from several |
| separate fragments, each in their own directory or URL. This is the mechanism used |
| to deliver separate language packs for an internationalized plug-in. |
| </para> |
| <para> |
| Each plug-in has a plug-in manifest declaring its interconnections to other |
| plug-ins. The interconnection model is simple: a plug-in declares any number of |
| named extension points, and any number of extensions to one or more extension points |
| in other plug-ins. |
| </para> |
| <para> |
| A plug-in’s extension points can be extended by other plug-ins. For example, the |
| workbench plug-in declares an extension point for user preferences. Any plug-in can |
| contribute its own user preferences by defining extensions to this extension point. |
| </para> |
| <para> |
| An extension point may have a corresponding API interface. Other plug-ins contribute |
| implementations of this interface via extensions to this extension point. Any |
| plug-in is free to define new extension points and to provide new API for other |
| plug-ins to use. |
| </para> |
| <para> |
| On start-up, the Platform Runtime discovers the set of available plug-ins, reads |
| their manifests, and builds an in-memory plug-in registry. The Platform matches |
| extension declarations by name with their corresponding extension point |
| declarations. Any problems, such as extensions to missing extension points, are |
| detected and logged. The resulting plug-in registry is available via the Platform |
| API. Plug-ins can also be added, replaced, or deleted after startup. |
| </para> |
| <para> |
| A plug-in's manifest is represented by a pair of files. The manifest.mf file is an |
| OSGi bundle manifest describing the plug-ins runtime dependencies; the plugin.xml |
| file is an XML-based description of the plug-in’s extensions and extension points. |
| An extension point may declare additional specialized XML element types for use in |
| the extensions. This allows the plug-in supplying the extension to communicate |
| arbitrary information to the plug-in declaring the corresponding extension point. |
| Moreover, extension and extension point information is available from the plug-in |
| registry without activating the contributing plug-in or loading of any of its code. |
| This property is key to supporting a large base of installed plug-ins only some of |
| which are needed in any given user session. Until a plug-in's code is loaded, it has |
| a negligible memory footprint and impact on start-up time. Using an XML-based |
| plug-in manifest also makes it easier to write tools that support plug-in creation. |
| The Plug-In Development Environment (PDE), which is included in the Eclipse SDK, is |
| such a tool. |
| </para> |
| <para> |
| A plug-in is activated when its code actually needs to be run. Once activated, a |
| plug-in uses the plug-in registry to discover and access the extensions contributed |
| to its extension points. For example, the plug-in declaring the user preference |
| extension point can discover all contributed user preferences and access their |
| display names to construct a preference dialog. This can be done using only the |
| information from the registry, without having to activate any of the contributing |
| plug-ins. The contributing plug-in will be activated when the user selects a |
| preference from a list. Activating plug-ins in this manner does not happen |
| automatically; there are a small number of API methods for explicitly activating |
| plug-ins. Once activated, a plug-in remains active until it is explicitly |
| deactivated or the Platform shuts down. Each plug-in is furnished with a |
| subdirectory in which to store plug-in-specific data; this mechanism allows a |
| plug-in to carry over important state between runs. |
| </para> |
| <para> |
| The Platform Runtime declares a special extension point for applications. When an |
| instance of the Platform is launched, the name of an application is specified via |
| the command line; the only plug-in that gets activated initially is the one that |
| declares that application. |
| </para> |
| <para> |
| By determining the set of available plug-ins up front, and by supporting a |
| significant exchange of information between plug-ins without having to activate any |
| of them, the Platform can provide each plug-in with a rich source of pertinent |
| information about the context in which it is operating. This context cannot change |
| while the Platform is running, so there is no need for complex life cycle events to |
| inform plug-ins when the context changes. A lengthy start-up sequence is avoided, as |
| is a common source of bugs stemming from unpredictable plug-in activation order. |
| </para> |
| <para> |
| The Eclipse Platform is run by a single invocation of a standard Java virtual |
| machine. Each plug-in is assigned its own Java class loader that is solely |
| responsible for loading its classes (and Java resource bundles). Each plug-in |
| explicitly declares its dependence on other plug-ins from which it expects to |
| directly access classes, and controls the visibility of the public classes and |
| interfaces in its libraries. This information is declared in the plug-in manifest |
| file; the visibility rules are enforced at runtime by the plug-in class loaders. |
| </para> |
| <para> |
| The plug-in mechanism is used to partition the Eclipse Platform itself. Indeed, |
| separate plug-ins provide the workspace, the workbench, and so on. Even the Platform |
| Runtime itself has its own plug-in. Non-GUI configurations of the Platform may |
| simply omit the workbench plug-in and the other plug-ins that depend on it. |
| </para> |
| <para> |
| The Eclipse Platform's update manager downloads and installs new features or |
| upgraded versions of existing features (a feature being a group of related plug-ins |
| that get installed and updated together). The update manager constructs a new |
| configuration of available plug-ins to be used the next time the Eclipse Platform is |
| launched. If the result of upgrading or installing proves unsatisfactory, the user |
| can roll back to an earlier configuration. |
| </para> |
| <para> |
| The Eclipse Platform Runtime also provides a mechanism for extending objects |
| dynamically. A class that implements an “adaptable” interface declares its instances |
| open to third party behavior extensions. An adaptable instance can be queried for |
| the adapter object that implements an interface or class. For example, workspace |
| resources are adaptable objects; the workbench adds adapters that provide a suitable |
| icon and text label for a resource. Any party can add behavior to existing types |
| (both classes and interfaces) of adaptable objects by registering a suitable adapter |
| factory with the Platform. Multiple parties can independently extend the same |
| adaptable objects, each for a different purpose. When an adapter for a given |
| interface is requested, the Platform identifies and invokes the appropriate factory |
| to create it. The mechanism uses only the Java type of the adaptable object (it does |
| not increase the adaptable object's memory footprint). Any plug-in can exploit this |
| mechanism to add behavior to existing adaptable objects, and to define new types of |
| adaptable objects for other plug-ins to use and possibly extend. |
| </para> |
| </section> |
| <section> |
| <title>Workspaces</title> |
| <para> |
| The various tools plugged in to the Eclipse Platform operate on regular files in the |
| user's workspace. The workspace consists of one or more top-level projects, where |
| each project maps to a corresponding user-specified directory in the file system. |
| The different projects in a workspace may map to different file system directories |
| or drives, although, by default, all projects map to sibling subdirectories of a |
| single workspace directory. |
| </para> |
| <para> |
| A project nature mechanism allows a tool to tag a project in order to give it a |
| particular personality, or nature. For example, the web site nature tags a project |
| that contains the static content for a web site, and the Java nature tags a project |
| that contains the source code for a Java program. Plug-ins may declare new project |
| natures and provide code for configuring projects with that nature. A single project |
| may have as many natures as required. This affords a way for tools to share a |
| project without having to know about each other. |
| </para> |
| <para> |
| Each project contains files that are created and manipulated by the user. All files |
| in the workspace are directly accessible to the standard programs and tools of the |
| underlying operating system. Tools integrated with the Platform are provided with |
| API for dealing with workspace resources (the collective term for projects, files, |
| and folders). Workspace resources are represented by adaptable objects so that other |
| parties can extend their behavior. |
| </para> |
| <para> |
| To minimize the risk of accidentally losing files, a low-level workspace history |
| mechanism keeps track of the previous content of any files that have been changed or |
| deleted by integrated tools. The user controls how the history is managed via space- |
| and age-based preference settings. |
| </para> |
| <para> |
| The workspace provides a marker mechanism for annotating resources. Markers are used |
| to record diverse annotations such as compiler error messages, to-do list items, |
| bookmarks, search hits, and debugger breakpoints. The marker mechanism is open. |
| Plug-ins can declare new marker subtypes and control whether they should be saved |
| between runs. |
| </para> |
| <para> |
| The Platform provides a general mechanism that allows a tool to track changes to |
| workspace resources. By registering a resource change listener, a tool is guaranteed |
| to receive after-the-fact notifications of all resource creations, deletions, and |
| changes to the content of files. The Platform defers the event notification until |
| the end of a batch of resource manipulation operations. Event reports take the form |
| of a tree of resource deltas that describe the effect of the entire batch of |
| operations in terms of net resource creations, deletions, and changes. Resource |
| deltas also provide information about changes to markers. |
| </para> |
| <para> |
| Resource tree deltas are particularly useful and efficient for tools that display |
| resource trees, since each delta points out where the tool may need to add, remove, |
| or refresh on-screen widgets. In addition, since a number of semi-independent tools |
| may be operating on the resources of a project at the same time, this mechanism |
| allows one tool to detect the activity of another in the vicinity of specific files, |
| or file types, in which it has an interest. |
| </para> |
| <para> |
| Tools like compilers and link checkers must apply a coordinated analysis and |
| transformation of thousands of separate files. The Platform provides an incremental |
| project builder framework; the input to an incremental build is a resource tree |
| delta capturing the net resource differences since the last build. Sophisticated |
| tools may use this mechanism to provide scalable solutions. |
| </para> |
| <para> |
| The Platform allows several different incremental project builders to be registered |
| on the same project and provides ways to trigger project and workspace-wide builds. |
| An optional workspace auto-build feature automatically triggers the necessary builds |
| after each resource modification operation (or batch of operations). |
| </para> |
| <para> |
| The workspace save-restore process is open to participation from plug-ins wishing to |
| remain coordinated with the workspace across sessions. A two-phase save process |
| ensures that the important state of the various plug-ins are written to disk as an |
| atomic operation. In a subsequent session, when an individual plug-in gets |
| reactivated and rejoins the save-restore process, it is passed a workspace-wide |
| resource delta describing the net resource differences since the last save in which |
| it participated. This allows a plug-in to carry forward its saved state while making |
| the necessary adjustments to accommodate resource changes made while it was |
| deactivated. |
| </para> |
| </section> |
| <section> |
| <title>Workbench and UI Toolkits</title> |
| <para> |
| The Eclipse Platform UI is built around a workbench that provides the overall |
| structure and presents an extensible UI to the user. The workbench API and |
| implementation are built from two toolkits: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| SWT - a widget set and graphics library integrated with the native window |
| system but with an OS-independent API. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| JFace - a UI toolkit implemented using SWT that simplifies common UI |
| programming tasks. |
| </para> |
| </listitem> |
| </itemizedlist> |
| |
| <section> |
| <title>SWT</title> |
| <para> |
| The Standard Widget Toolkit (SWT) provides a common OS-independent API for |
| widgets and graphics implemented in a way that allows tight integration with the |
| underlying native window system. The entire Eclipse Platform UI, and the tools |
| that plug in to it, use SWT for presenting information to the user. |
| </para> |
| <para> |
| A perennial issue in widget toolkit design is the tension between portable |
| toolkits and native window system integration. Java’s Abstract Window Toolkit |
| (AWT) provides low-level widgets such as lists, text fields, and buttons, but no |
| high-level widgets such as trees or rich text. AWT widgets are implemented |
| directly with native widgets on all underlying window systems. Building a UI |
| using AWT alone means programming to the least common denominator of all OS |
| window systems. The Java Swing toolkit addresses this problem by emulating |
| widgets like trees, tables, and rich text. Swing also provides look and feel |
| emulation layers that attempt to make applications look like the underlying |
| native window system. However, the emulated widgets invariably lag behind the |
| look and feel of the native widgets, and the user interaction with emulated |
| widgets is usually different enough to be noticeable, making it difficult to |
| build applications that compete head-on with shrink-wrapped applications |
| developed specifically for a particular native window system. |
| </para> |
| <para> |
| SWT addresses this issue by defining a common API that is available across a |
| number of supported window systems. For each different native window system, the |
| SWT implementation uses native widgets wherever possible; where no native widget |
| is available, the SWT implementation provides a suitable emulation. Common |
| low-level widgets such as lists, text fields, and buttons are implemented |
| natively everywhere. But some generally useful higher-level widgets may need to |
| be emulated on some window systems. For example, the SWT toolbar widget is |
| implemented as a native toolbar widget on Windows, and as an emulated widget on |
| Motif®. This strategy allows SWT to maintain a consistent programming model in |
| all environments, while allowing the underlying native window system's look and |
| feel to shine through to the greatest extent possible. |
| </para> |
| <para> |
| SWT also exposes native window system-specific API in cases where a particular |
| underlying native window system provides a unique and significant feature |
| unavailable on other window systems. Windows ActiveX® is a good example of this. |
| Window system-specific API is segregated into aptly named packages to indicate |
| the fact that it is inherently non-portable. |
| </para> |
| <para> |
| Tight integration with the underlying native window system is not strictly a |
| matter of look and feel. SWT also interacts with native desktop features such as |
| drag and drop, and can use components developed with OS component models, like |
| Windows ActiveX controls. |
| </para> |
| <para> |
| Internally, the SWT implementation provides separate and distinct |
| implementations in Java for each native window system. The Java native libraries |
| are completely different, with each surfacing the APIs specific to the |
| underlying window system. (Contrast this to Java AWT, which locates window |
| system-specific differences in the C code implementation of a common set of Java |
| native methods.) Because no special logic is buried in the natives, the SWT |
| implementation is expressed entirely in Java code. Nevertheless, the Java code |
| looks familiar to the native OS developer. Any Windows programmer would find the |
| Java implementation of SWT for Windows instantly familiar, since it consists of |
| calls to the Windows API that they already know from programming in C. Likewise |
| for a Motif programmer looking at the SWT implementation for Motif. This |
| strategy greatly simplifies implementing, debugging, and maintaining SWT because |
| it allows all interesting development to be done in Java. Of course, this is of |
| no direct concern for ordinary clients of SWT since these natives are completely |
| hidden behind the window system-independent SWT API. |
| </para> |
| </section> |
| <section> |
| <title>JFace</title> |
| <para> |
| JFace is a UI toolkit with classes for handling many common UI programming |
| tasks. JFace is window-system-independent in both its API and implementation, |
| and is designed to work with SWT without hiding it. |
| </para> |
| <para> |
| JFace includes the usual UI toolkit components of image and font registries, |
| dialog, preference, and wizard frameworks, and progress reporting for long |
| running operations. Two of its more interesting features are actions and |
| viewers. |
| </para> |
| <para> |
| The action mechanism allows user commands to be defined independently from their |
| exact whereabouts in the UI. An action represents a command that can be |
| triggered by the user via a button, menu item, or item in a tool bar. Each |
| action knows its own key UI properties (label, icon, tool tip, etc.) which are |
| used to construct appropriate widgets for presenting the action. This separation |
| allows the same action to be used in several places in the UI, and means that it |
| is easy to change where an action is presented in the UI without having to |
| change the code for the action itself. |
| </para> |
| <para> |
| Viewers are model-based adapters for certain SWT widgets. Viewers handle common |
| behavior and provide higher-level semantics than available from the SWT widgets. |
| The standard viewers for lists, trees, and tables support populating the viewer |
| with elements from the client's domain and keeping the widgets in synch with |
| changes to that domain. These viewers are configured with a content provider and |
| a label provider. The content provider knows how to map the viewer's input |
| element to the expected viewer content, and how to parlay domain changes into |
| corresponding viewer updates. The label provider knows how to produce the |
| specific string label and icon needed to display any given domain element in the |
| widget. Viewers can optionally be configured with element-based filters and |
| sorters. Clients are notified of selections and events in terms of the domain |
| elements they provide to the viewer. The viewer implementation handles the |
| mapping between domain elements and SWT widgets, adjusting for a filtered view |
| of the elements, and re-sorting when necessary. The standard viewer for text |
| supports common operations such as double click behavior, undo, coloring, and |
| navigating by character index or line number. Text viewers provide a document |
| model to the client and manage the conversion of the document to the information |
| required by the SWT styled text widget. Multiple viewers can be open on the same |
| model or document; all are updated automatically when the model or document |
| changes in any of them. |
| </para> |
| </section> |
| <section> |
| <title>Workbench</title> |
| <para> |
| Unlike SWT and JFace, which are both general purpose UI toolkits, the workbench |
| provides the UI personality of the Eclipse Platform, and supplies the structures |
| in which tools interact with the user. Because of this central and defining |
| role, the workbench is synonymous with the Eclipse Platform UI as a whole and |
| with the main window the user sees when the Platform is running (see |
| <xref linkend="figure2" /> |
| ). The workbench API is dependent on the SWT API, and to a lesser extent on the |
| JFace API. The workbench implementation is built using both SWT and JFace; Java |
| AWT and Swing are not used. |
| </para> |
| <para> |
| The Eclipse Platform UI paradigm is based on editors, views, and perspectives. |
| From the user's standpoint, a workbench window consists visually of views and |
| editors. Perspectives manifest themselves in the selection and arrangements of |
| editors and views visible on the screen. |
| </para> |
| <para> |
| Editors allow the user to open, edit, and save objects. They follow an |
| open-save-close lifecycle much like file system based tools, but are more |
| tightly integrated into the workbench. When active, an editor can contribute |
| actions to the workbench menus and tool bar. The Platform provides a standard |
| editor for text resources; more specific editors are supplied by other plug-ins. |
| </para> |
| <para> |
| Views provide information about some object that the user is working with in the |
| workbench. A view may assist an editor by providing information about the |
| document being edited. For example, the standard content outline view shows a |
| structured outline for the content of the active editor if one is available. A |
| view may augment other views by providing information about the currently |
| selected object. For example, the standard properties view presents the |
| properties of the object selected in another view. Views have a simpler |
| lifecycle than editors: modifications made in a view (such as changing a |
| property value) are generally saved immediately, and the changes are reflected |
| immediately in other related parts of the UI. The Platform provides several |
| standard views (see |
| <xref linkend="figure2" /> |
| ); additional views are supplied by other plug-ins. |
| </para> |
| <para> |
| A workbench window can have several separate perspectives, only one of which is |
| visible at any given moment. Each perspective has its own views and editors that |
| are arranged (tiled, stacked, or detached) for presentation on the screen (some |
| may be hidden at any given moment). Several different types of views and editors |
| can be open at the same time within a perspective. A perspective controls |
| initial view visibility, layout, and action visibility. The user can quickly |
| switch perspective to work on a different task, and can easily rearrange and |
| customize a perspective to better suit a particular task. The Platform provides |
| standard perspectives for general resource navigation, online help, and team |
| support tasks. Additional perspectives are supplied by other plug-ins. |
| </para> |
| <para> |
| Tools integrate into this editors-views-perspectives UI paradigm in well-defined |
| ways. The main extension points allow tools to augment the workbench: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para>Add new types of editors.</para> |
| </listitem> |
| <listitem> |
| <para>Add new types of views.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Add new perspectives, which arrange old and new views to suit new user |
| tasks. |
| </para> |
| </listitem> |
| </itemizedlist> |
| <para> |
| The Platform's standard views and editors are all contributed using these |
| mechanisms. |
| </para> |
| <para>Tools may also augment existing editors, views, and perspectives:</para> |
| <itemizedlist> |
| <listitem> |
| <para>Add new actions to an existing view's local menu and tool bar.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Add new actions to the workbench menu and tool bar when an existing |
| editor becomes active. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Add new actions to the pop-up content menu of an existing view or |
| editor. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Add new views, action sets, and shortcuts to an existing perspective. |
| </para> |
| </listitem> |
| </itemizedlist> |
| <para> |
| The Platform takes care of all aspects of workbench window and perspective |
| management. Editors and views are automatically instantiated as needed, and |
| disposed of when no longer needed. The display labels and icons for actions |
| contributed by a tool are listed in the plug-in manifest so that the workbench |
| can create menus and tool bars without activating the contributing plug-ins. The |
| workbench does not activate the plug-in until the user attempts to use |
| functionality that the plug-in provides. |
| </para> |
| <para> |
| Once an editor or view becomes an active part of a perspective it can use |
| workbench services for tracking activation and selection. The part service |
| tracks view and editor activation within the perspective, reporting activation |
| and deactivation events to registered listeners. A view or editor can also |
| register with the selection service as a source for selections. The selection |
| service feeds selection change events to all parties that have registered |
| interest. This is how, for example, the standard properties view is notified of |
| the domain object selected in the currently active editor or view. |
| </para> |
| </section> |
| </section> |
| <section> |
| <title>UI Integration</title> |
| <para> |
| Tools written in Java using the Platform APIs achieve the highest level of |
| integration with the Platform. At the other extreme, external tools launched from |
| within the Platform must open their own separate windows in order to communicate |
| with the user and must access user data via the underlying file system. Their |
| integration is therefore very loose, especially at the UI level. In some |
| environments, the Eclipse Platform also supports levels of integration between these |
| extremes: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| The workbench has built-in support for embedding any OLE document as an |
| editor (Windows only). This option provides tight UI integration. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| A plug-in tool can implement a container that bridges the Eclipse Platform |
| API to an ActiveX control so that it can be used in an editor, view, dialog, |
| or wizard (Windows only). SWT provides the requisite low-level support. This |
| option provides tight UI integration. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| A plug-in tool can use AWT or Swing to open separate windows. This option |
| provides loose UI integration, but allows tight integration below the UI. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </section> |
| <section> |
| <title>Team Support</title> |
| <para> |
| The Eclipse Platform allows a project in the workspace to be placed under version |
| and configuration management with an associated team repository. The Platform has |
| extension points and a repository provider API that allow new kinds of team |
| repositories to be plugged in. |
| </para> |
| <para> |
| The function provided by a particular team repository product invariably affects the |
| user’s workflow, for example, by adding overt steps for retrieving files from the |
| repository, for returning updated files to the repository, and for comparing |
| different file versions. The exact effect on the user’s workflow varies somewhat for |
| each different kind of repository. Accordingly, the Eclipse Platform takes a |
| hands-off view and allows each team repository provider to define its own workflow |
| so that users already familiar with the team repository product can quickly learn to |
| use it from within Eclipse. The Platform supplies basic hooks to allow a team |
| repository provider to intervene in certain operations that manipulate resources in |
| a project. These hooks provide good support for both optimistic and pessimistic |
| models. At the UI level, the Platform supplies placeholders for certain actions, |
| preferences, and properties, but leaves it to each repository provider to define |
| these UI elements. There is also a simple, extendable configuration wizard that lets |
| users associate projects with repositories, which each repository provider can |
| extend with UI elements for collecting information specific to that kind of |
| repository. |
| </para> |
| <para> |
| Multiple team repository providers can coexist peacefully within the Platform. The |
| Eclipse Platform includes support for CVS repositories accessed via either pserver, |
| ssh, or extssh protocols. |
| </para> |
| </section> |
| <section> |
| <title>Help</title> |
| <para> |
| The Eclipse Platform Help mechanism allows tools to define and contribute |
| documentation to one or more online books. For example, a tool usually contributes |
| help style documentation to a user guide, and API documentation (if it has any) to a |
| separate programmer guide. |
| </para> |
| <para> |
| Raw content is contributed as HTML files. The facilities for arranging the raw |
| content into online books with suitable navigation structures are expressed |
| separately in XML files. This separation allows pre-existing HTML documentation to |
| be incorporated directly into online books without needing to edit or rewrite them. |
| </para> |
| <para> |
| The add-on navigation structure presents the content of the books as a tree of |
| topics. Each topic, including non-leaf topics, can have a link to a raw content |
| page. A single book may have multiple alternate lists of top-level topics allowing |
| some or all of the same information to be presented in completely different |
| organizations; for example, organized by task or by tool. |
| </para> |
| <para> |
| The XML navigation files and HTML content files are stored in a plug-in's root |
| directory or subdirectories. Small tools usually put their help documentation in the |
| same plug-in as the code. Large tools often have separate help plug-ins. The |
| Platform uses its own internal documentation server to provide the actual web pages |
| from within the document web. This custom server allows the Platform to resolve |
| special inter-plug-in links and extract HTML pages from ZIP archives. |
| </para> |
| <para> |
| When organizing a help system, a full topic tree is only possible when the set of |
| tools to be documented is closed. With the Eclipse Platform, the set of tools is |
| open-ended, and, consequently, the structure of the help documentation needs to be |
| modular. The Platform Help mechanism allows tools to contribute both raw content and |
| sets of topics, and to indicate where to insert its topics into a pre-existing topic |
| tree at predefined insertion points. |
| </para> |
| </section> |
| <section> |
| <title>Epilogue</title> |
| <para> |
| In summary, the Eclipse Platform provides a nucleus of generic building blocks and |
| APIs like the workspace and the workbench, and various extension points through |
| which new functionality can be integrated. Through these extension points, tools |
| written as separate plug-ins can extend the Eclipse Platform. The user is presented |
| with an IDE specialized by the set of available tool plug-ins. However, rather than |
| being the end of the story, it is really just the beginning. Tools may also define |
| new extension points and APIs of their own and thereby serve as building blocks and |
| integration points for yet other tools. |
| </para> |
| <para> |
| This brief overview has omitted a number of other interesting aspects of the Eclipse |
| Platform such as debugger support and integration with the Ant build tool. Further |
| details about the Eclipse Platform API, extension points, and standard components |
| can be found in the Platform Plug-in Developer Guide, which is available as online |
| help for the Eclipse SDK. |
| </para> |
| </section> |
| </section> |
| <section> |
| <title>Part II: Case Study of Using the Eclipse Platform - Java Development Tooling</title> |
| <para> |
| As mentioned in Part I, the Eclipse Platform by itself is a foundation for building |
| tools and applications. The tools plugged in to the Platform supply the specific |
| capabilities that make it suitable for developing certain kinds of applications. This |
| part is a case study of a real tool, the Java development tooling (JDT), which adds Java |
| program development capability to the Platform. The JDT is included in the Eclipse SDK. |
| </para> |
| <section> |
| <title>JDT Features</title> |
| <para> |
| Before going behind the scenes to see how the JDT is put together, it helps to have |
| a sense of what the JDT does and what it looks like to the user. |
| <xref linkend="figure4" /> |
| shows what the workbench normally looks like when the user is writing a Java |
| program. |
| </para> |
| <mediaobject id="figure4" xreflabel="Figure 4"> |
| <imageobject> |
| <imagedata fileref="images/jdt-main-3_2M3-xp.gif" /> |
| </imageobject> |
| <caption>Figure 4 - Workbench showing Java perspective.</caption> |
| </mediaobject> |
| <para> |
| The JDT adds the capabilities of a full-featured Java IDE to the Eclipse Platform |
| (some of which are visible in Figure 4). The following is a brief summary of those |
| features: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para>Java projects</para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Java source (*.java) files arranged in traditional Java package |
| directories below one or more source folders. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| JAR libraries in the same project, another project, or external to |
| the workspace. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Generated binary class (*.class) files arranged in package |
| directories in a separate output folder. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Unrestricted other files, such as program resources and design |
| documentation. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Browsing Java projects</para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| In terms of Java-specific elements: packages, types, methods, and |
| fields. |
| </para> |
| </listitem> |
| <listitem> |
| <para>Arranged by package, or by supertype or subtype hierarchy.</para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Editing</para> |
| <itemizedlist> |
| <listitem> |
| <para>Java source code editor.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Keyword and syntax coloring (including inside Javadoc comments). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Separate outline shows declaration structure (automatic live updates |
| while editing). |
| </para> |
| </listitem> |
| <listitem> |
| <para>Compiler problems shown as annotations in the margin.</para> |
| </listitem> |
| <listitem> |
| <para>Declaration line ranges shown as annotations in the margin.</para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Code formatter.</para> |
| <itemizedlist> |
| <listitem> |
| <para>Code resolve opens selected Java element in an editor.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Code completion proposes legal completions of method, etc. names. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| API help shows Javadoc specification for selected Java element in |
| pop-up window. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Import assistance automatically creates and organizes import |
| declarations. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Refactoring</para> |
| <itemizedlist> |
| <listitem> |
| <para>For improving code structure without changing behavior.</para> |
| </listitem> |
| <listitem> |
| <para>Method extraction.</para> |
| </listitem> |
| <listitem> |
| <para>Safe rename for methods, etc. also updates references.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Preview (and veto) individual changes stemming from a refactoring |
| operation. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Search</para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Find declarations of and/or references to packages, types, methods, |
| and fields. |
| </para> |
| </listitem> |
| <listitem> |
| <para>Search results presented in search results view.</para> |
| </listitem> |
| <listitem> |
| <para>Search results reported against Java elements.</para> |
| </listitem> |
| <listitem> |
| <para>Matches are highlighted as annotations in the editor.</para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Compare</para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Structured compare of Java compilation units showing the changes to |
| individual Java methods, etc. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Replace individual Java elements with version of element in the |
| local history. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Compile</para> |
| <itemizedlist> |
| <listitem> |
| <para>JCK-compliant Java compiler.</para> |
| </listitem> |
| <listitem> |
| <para>Compiler generates standard binary *.class files.</para> |
| </listitem> |
| <listitem> |
| <para>Incremental compilation.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Compiles triggered manually upon demand or automatically after each |
| change to a source file (i.e., workspace auto-build). |
| </para> |
| </listitem> |
| <listitem> |
| <para>Compiler problems presented in standard tasks view.</para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Run</para> |
| <itemizedlist> |
| <listitem> |
| <para>Run Java program in separate target Java virtual machine.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Supports multiple types of Java virtual machine (user selectable). |
| </para> |
| </listitem> |
| <listitem> |
| <para>Console provides stdout, stdin, stderr.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Scrapbook pages for interactive Java code snippet evaluation. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para>Debug</para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Debug Java program with JPDA-compliant Java virtual machine. |
| </para> |
| </listitem> |
| <listitem> |
| <para>View threads and stack frames.</para> |
| </listitem> |
| <listitem> |
| <para>Set breakpoints and step through method source code.</para> |
| </listitem> |
| <listitem> |
| <para>Inspect and modify fields and local variables.</para> |
| </listitem> |
| <listitem> |
| <para>Expression evaluation in the context of a stack frame.</para> |
| </listitem> |
| <listitem> |
| <para> |
| Dynamic class reloading where supported by Java virtual machine. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| </itemizedlist> |
| </section> |
| <section> |
| <title>JDT Implementation</title> |
| <para> |
| The JDT is implemented by a group of plug-ins, with the user interface in a UI |
| plug-in and the non-UI infrastructure in a separate core plug-in. This separation of |
| UI and non-UI code allows the JDT core infrastructure to be used in GUI-less |
| configurations of the Eclipse Platform, and by other GUI tools that incorporate Java |
| capabilities but do not need the JDT UI. |
| </para> |
| <para> |
| <xref linkend="figure5" /> |
| illustrates key connections between the JDT and the Platform. |
| </para> |
| <mediaobject id="figure5" xreflabel="Figure 5"> |
| <imageobject> |
| <imagedata fileref="images/jdt-arch.gif" /> |
| </imageobject> |
| <caption>Figure 5 - Key connections between JDT and Eclipse Platform.</caption> |
| </mediaobject> |
| |
| <section> |
| <title>Java Projects</title> |
| <para> |
| At the workspace level, the JDT defines a special Java project nature that is |
| used to tag a project as a Java project. |
| </para> |
| <para> |
| Each Java project has a single special classpath file (named “.classpath”) that |
| records Java-specific information about the project. This information includes |
| the locations of the project's source folder(s), pre-compiled JAR libraries, and |
| the output folder for compiler-generated binary class files. |
| </para> |
| |
| </section> |
| <section> |
| <title>Java Compiler</title> |
| <para> |
| The Java nature configures each Java project with a Java incremental project |
| builder that invokes a built-in Java compiler. |
| </para> |
| <para> |
| In the case of an initial or full build, the Java compiler translates all Java |
| source files found in the project's source folder(s) into corresponding binary |
| class files in the project's output folder. The JDT declares a new marker |
| subtype for Java problems. As the compiler detects errors, it annotates the |
| offending source files with Java problem markers. A project specifies which JAR |
| libraries it depends on. This allows the JDT to target various Java runtime |
| configurations, such as CLDC, J2SE, and J2EE. |
| </para> |
| <para> |
| As the compiler encounters each source file, it adds information to an in-memory |
| dependency graph. This allows subsequent builds of the project to be handled |
| more efficiently. The workspace incremental project builder framework maintains |
| a resource delta tree with changes since the last time a given builder was |
| invoked. The next time the Java incremental project builder is called, it uses |
| this resource delta tree to determine the limited set of source files that need |
| to be recompiled because they were changed, removed, or added. The compiler uses |
| its dependency graph to further widen the recompilation set to include any other |
| source files that might compile differently as a consequence. The compiler then |
| deletes obsolete class files and Java problem markers, and compiles only the |
| computed subset of source files. The JDT participates in workspace saves so that |
| the dependency graph can be preserved on disk between sessions, otherwise the |
| next session would require a full build just to rediscover the dependency graph. |
| This incremental strategy allows the JDT to run builds very frequently, such as |
| after every source file save operation, even for projects containing hundreds or |
| thousands of source files. |
| </para> |
| </section> |
| <section> |
| <title>Java Model</title> |
| <para> |
| The Java model provides API for navigating the Java element tree. The Java |
| element tree represents projects in terms of Java-centric element types: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Package fragment roots corresponding to a project's source folders and |
| JAR libraries. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Package fragments corresponding to specific packages within a package |
| fragment root. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Compilation units and binary classes corresponding to individual Java |
| source (*.java) and binary class (*.class) files. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Various types of Java declarations that appear within a compilation unit |
| or class file: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para>Package declarations.</para> |
| </listitem> |
| <listitem> |
| <para>Import declarations.</para> |
| </listitem> |
| <listitem> |
| <para>Class and interface declarations.</para> |
| </listitem> |
| <listitem> |
| <para>Method and constructor declarations.</para> |
| </listitem> |
| <listitem> |
| <para>Field declarations.</para> |
| </listitem> |
| <listitem> |
| <para>Initializer declarations.</para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| </itemizedlist> |
| <para> |
| For most Java-specific tools (including the Java UI) navigating and operating on |
| a Java project via the Java model is more convenient than navigating the |
| underlying resources. Java elements are represented by adaptable objects so that |
| other parties can extend their behavior. |
| </para> |
| <para> |
| A Java project's classpath file and underlying resources define the Java element |
| tree. It is infeasible to keep the Java element tree in memory as it is an order |
| of magnitude larger than the workspace resource tree and would require reading |
| and parsing all Java source files to construct. Instead, the Java element tree |
| is built piecemeal and only on demand. The Java compiler parses individual |
| compilation units to extract declaration structure. The Java element tree |
| maintains an internal, limited size cache of recently analyzed compilation |
| units. The Java element tree registers a resource change listener with the |
| workspace so that it can remove obsolete cache entries when source files get |
| deleted or changed. The Java element tree issues its own deltas, which are |
| analogous to workspace resource tree deltas. |
| </para> |
| <para> |
| A cache-based Java element tree works well for simple navigation but cannot |
| support broad searches or other patterns of traversal that visit declarations |
| across a large number of different compilation units. The Java model addresses |
| this by maintaining internal indexes on disk. The indexes are composed of |
| summary entries that associate a declared or referenced name with the path of |
| the corresponding file. Given a name, these indexes can be efficiently searched |
| to identify files that contain at least one occurrence. The individual files can |
| be read and parsed if further precision is required or if line numbers are |
| needed. The Java model uses a resource change listener to keep track of files |
| currently in need of indexing. The actual work of indexing individual files |
| happens in a low priority background thread. |
| </para> |
| |
| </section> |
| <section> |
| <title>Java UI</title> |
| <para> |
| The JDT UI defines a Java perspective for users developing Java code. This |
| perspective contains the following Java-specific workbench contributions |
| (amongst others): |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para>Packages view.</para> |
| </listitem> |
| <listitem> |
| <para>Type hierarchy view.</para> |
| </listitem> |
| <listitem> |
| <para>Actions for creating Java elements.</para> |
| </listitem> |
| <listitem> |
| <para>Java editor and Java outline.</para> |
| </listitem> |
| </itemizedlist> |
| <para> |
| The packages view, which shows compilation units within a Java project, or class |
| files within a JAR library, cuts along structural lines (like the standard |
| workbench resource navigator view). The elements and relationships shown in the |
| tree viewer come directly from the Java model. |
| </para> |
| <para> |
| In contrast, the type hierarchy view cuts across structural lines to show |
| classes and interfaces arranged by the supertype-subtype relationship defined by |
| the Java language. The type hierarchy is built using a sequence of index-based |
| Java model searches combined with parsing the relevant compilation units to |
| extract direct supertype names. The elements presented in the viewer come |
| directly from the Java model. |
| </para> |
| <para> |
| The actions bring up wizards for creating a new Java project, package, class, or |
| interface. These actions operate on the Java model. |
| </para> |
| <para> |
| The Java editor is registered as the editor of choice for files of type *.java. |
| This editor collaborates with the standard workbench content outline view by |
| providing a tree of Java elements for the current declaration structure. The |
| Java editor makes extensive use of the JFace text viewer toolkit to implement |
| the following features: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Partitioning - The document is partitioned into regions of Java code and |
| Javadoc comments using a rules-based scanner. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Keyword and syntax coloring - Coloring rules are applied to visually |
| distinguish tokens within each region type. The coloring is maintained |
| with a presentation reconciler. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Marginal annotations - The margin of the text viewer shows declaration |
| line ranges, problem markers, and debugger breakpoints. These |
| annotations are adjusted automatically as the text is edited. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Formatting - Controls automatic indenting and redistributes whitespace |
| within and between lines. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Code assist - Proposes region-specific Java (or Javadoc) completions at |
| a given document position. This relies on special support from the Java |
| compiler. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Content outline - Updates as editing takes place. This is done |
| periodically as a background activity using a reconciler. Selections and |
| manipulations in the content outline are immediately reflected in the |
| editor buffer. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Method level edit - The editor can also present a single method (or |
| other kind of declaration) rather than the entire source file. |
| </para> |
| </listitem> |
| </itemizedlist> |
| <para> |
| Refactoring operations such as “safe rename” rely on index-based Java model |
| searches and special compiler support to locate and rewrite parts of the program |
| affected by the change. |
| </para> |
| </section> |
| <section> |
| <title>Java Run and Debug</title> |
| <para> |
| The workbench includes menu and tool bar actions for running and debugging |
| arbitrary programs, and provides a generic debug perspective better suited to |
| that task. This perspective includes a processes view that shows all currently |
| running and recently terminated processes, and a console view that allows |
| developers to interact with the selected running process via its standard input |
| and output streams. |
| </para> |
| <para> |
| JDT supplies the means for running and debugging Java programs. A target Java |
| virtual machine is launched as a separate process to run the Java program. The |
| JDT supports launchers for different types of Java virtual machines. Other tools |
| can contribute specialized launchers via a JDT-defined extension point. |
| </para> |
| <para> |
| Scrapbook pages are represented as text files (type *.jpage) that get edited by |
| a special text editor that knows how to run Java code snippets. This involves |
| turning the selected statement, expression, or declaration into a main class, |
| compiling it, downloading it to a running Java VM, running it, and extracting |
| the print string of the result and displaying it in the snippet editor. This |
| feature relies on special support from the Java compiler, but does not require |
| special support from the target Java VM. |
| </para> |
| <para> |
| When a Java program is launched in debug mode, a debug view shows the processes, |
| threads, and stack frames. When the debugger needs to show source code to the |
| user, it opens an editor using the workbench provided mechanisms. During single |
| stepping, the debugger instructs the editor which source code line to highlight. |
| Other debug-specific views show the list of breakpoints, the values of |
| variables, and the fields of objects. Breakpoints are represented by a special |
| type of marker. |
| </para> |
| <para> |
| The Java debugger works with any JDPA-compliant target Java VM. Evaluating a |
| Java expression in the debugger in the context of a running method is carried |
| out by a Java expression interpreter that walks the abstract syntax tree for the |
| expression and performs standard JDI calls. The JDI operations call across to |
| the target Java VM to access fields and invoke methods. Where the Java VM |
| supports dynamic class reloading, fixes made to the running program are |
| installed immediately so that the debug session can continue with the fixes in |
| place. The debugger registers a resource change listener so that it can discover |
| which binary class files in the project's output folder need to be reloaded into |
| the target VM. |
| </para> |
| |
| </section> |
| </section> |
| <section> |
| <title>Epilogue</title> |
| <para> |
| This has been only the briefest glimpse of how the JDT supplies the specific |
| capabilities that make the Eclipse Platform suitable for developing Java programs. |
| The Java UI plug-in makes extensive use of workbench extension points to contribute |
| special editors, views, perspectives, and actions that allow the user to work with |
| Java programs in Java-specific terms. The Java compiler and Java model can be |
| invoked programmatically from other tools through the Java model API defined by the |
| JDT core plug-in. Both the JDT core and UI plug-ins also declare extension points so |
| that other tools can extend them in pre-defined ways. |
| </para> |
| <para> |
| JDT is included in the Eclipse SDK; further details can be found in the Java |
| Development User Guide and JDT Plug-in Developer Guide, which is available as online |
| help for the Eclipse SDK |
| </para> |
| </section> |
| </section> |
| </article> |