blob: fe54396fbff47883dabb63f53cbf3a5907fcd6a6 [file] [log] [blame]
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Checking for internal references Requirements</title>
</head>
<body>
<h1>
Requirements for A Tool for Checking API Usage in Eclipse-based Components</h1>
<p>Jim des Rivieres<br>
Last updated Dec. 10, 2004</p>
<p>This document lists the general requirements for a tool for checking API usage in Eclipse-based components
and products.</p>
<h2>1. The Problem</h2>
<p>The context is the same as the current API Usage Scanner tool. That is, we need a
tool for checking Eclipse-based products that will help in identifying
inappropriate use of APIs and non-APIs. We want tools to be able to check Eclipse-based plug-ins and products for
obvious cases of where plug-ins are not playing by the rules. The open-ended,
heterougeous, and heavily componentized nature of Eclipse are what make it
somewhat different from checking more monolithic applications.</p>
<p> Eclipse is based on the notion of a plug-in. Products end up being a
collection of plug-ins, collected from diverse development efforts spanning open
source projects, multiple IBM teams, and third-party tool vendors. Set of these
plug-ins are often bundled into various &quot;platforms&quot; (e.g., Eclipse
Platform, IBM Eclipse SDK), and assembled into product stacks or families (IBM
RAD, WBIT). Component-based software is easier to develop, maintain, and evolve
when the inter-component coupling is well understood and well managed. This is
done by having each component offer its services through a well-defined API that
serves are the sole interface between it and other components. To the
extent that all inter-component coupling abides by the contracts spelled out
in the API specifications, replacing one component by a different version
supporting the same API contracts will work the same way. Moreover, component
APIs can be evolved in compatible ways to meet changing requirements, without
invalidating previously working configurations. However, when inter-component coupling does not follow the terms of the API
contracts, replacing a component by a different version supporting the same
API contracts may break some previously-working configurations. This is a
destabilizing factor that decreases robustness, increases maintenance costs,
and inhibits component growth.</p>
<p>In component-based software, the premium is on all inter-component coupling being
through the components API and in accord with all API contracts. Although
the Java
language has some features for controlling visibility that are enforced at
compile-time (e.g., private fields and methods cannot be referenced from
outside the code of the class itself), there are many constraints
restrictions that
the Java language cannot express (e.g., that a particular public class is
internal rather than API, or that a particular interface must not be implemented outside
its own component). Detection of inappropriate inter-component coupling is
most useful when the component is under development; after a problematic component
has shipped in a product, the information can at least be useful in managing the
problem (although not solving it).</p>
<p>The problem we are addressing is helping development teams to manage inter-component coupling
in Eclipse-based components. In particular, we aim to do this by providing an
automatic tool that can detect obvious cases where one component is more tightly
coupled to another component that it should be.</p>
<h2>2. General Requirements</h2>
<p>The tool should meet the following general requirements:</p>
<ol>
<li><b>Tool will be used for checking Eclipse components.<br>
</b>The notion of a &quot;component&quot; in Eclipse is not formally defined.
Rather, a component is a loosely-defined grouping of a small number of plug-ins and/or
plug-in fragments that are designed and maintained as a unit, generally
by a small team of developers. For instance, the Eclipse Platform itself is
made of a number of components each with between 1 and 5 plug-ins. The Java
code for each plug-in is housed in one or more JARs (this relationship is
formalized and captured in the plug-in's mainfest). Whereas coupling within
a component in intended to be tight/intimate, all coupling between
components is intended to be mediated through well-defined Java-based APIs.
The primary use of the tool will be used for checking collections of Eclipse
components to see whether the inter-component couplings are in line with the
component APIs. the Java code in the various plug-ins.
</li>
<li><b>Helpful to component developers.<br>
</b>Component developers (and development teams) are the primary customers of this
tool. The tool should be designed to meet their needs. Their main need for
such a tool is helping manage inter-component dependencies to ensure that
they do not accidentally exceed the bounds of the component APIs. Early
detection of problems means they can be addressed while the component is
still under development. So the tool should detect and report cases of <i>illegitimate</i>
couplings from component A to component B are not covered by B's API, the
most common mistake being A referencing one of B's internal classes. A
secondary need is to detect and report <i>legitimate</i> API couplings
components, as an aid for planning and impact assessment.
</li>
<li><b>Modular, component-based input.<br>
</b>Eclipse components to be checked will be fed to the tool. Since the
notion of component and API are not formally specified in Eclipse, the tool
will also need to be fed some a description of each component capturing
things like the set of plug-ins that comprise the component, and the rules
for separating component API from component internals and for distinguishing
legitimate from illegitimate API usage. Component owners should create and
maintain the component descriptions for their individual components
(although it should also be easy to furnish an after-market component
description&nbsp; for a component that does not come with its own). Each
component description should be in a file that the component owner can
easily maintain. Component description files should be in a well-specified
XML-based format so
that they could be read or generated by other tools. A set of relevant
component description files would be fed to the tool whenever checking
components.
</li>
<li><b>Performant and scalable.</b>&nbsp;<br>
The tool should be amenable to checking large numbers of Eclipse components.
We already have instances for Eclipse-based products with 1500 plug-ins. The
tool should make it easy to check anything from a single component, to a
group of components that form a &quot;platform&quot; of some ilk, to an
entire product distribution. The components may be a heterogeneous mix of product-specific, open
source,
or third party. The tool should deal gracefully with incompleteness, so
that it is possible to check a component without necessarily having complete information
about other
components. The tool should be reasonably fast, with speed proportional
to the number of components being checked.
</li>
<li><b>Modular, component-based output.<br>
</b>The tool should produce modular, component-based reports. The outputs
should be in a well-specified XML-based format so that they could
be post-processed for populating databases, generating web
pages, printing reports, etc.
</li>
<li><b>Fully-automatic operation.</b><br>
The tool should be suitable for inclusion in automated build processes that
build the components, or repackage components into larger aggregations. In
other words, something without a GUI that can be run from the command line, or from
an Ant build file.
</li>
<li><b>Open source.</b><br>
The tool itself should be open source, so that it can be used by development
teams
working on open source Eclipse components, which includes those at
eclipse.org.
</li>
</ol>
<h2>References</h2>
<ul>
<li><a href="http://eclipse.org/articles/Article-API%20use/eclipse-api-usage-rules.html">How
to Use the Eclipse API<br>
</a>This is a good example of the ways some Eclipse-based components
separate API from internals at the Java package level, and of the kinds of
blanket API usage rules that are out there. Note that these rules apply only
to the components in the Eclipse Platform itself; other Eclipse-based
components will have their own rules and practices.</li>
<li><a href="http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/jdt-core-home/tools/internal/index.html">JDT
Core &quot;Internal&quot; tool<br>
</a>This simple tool is used for locating references to internal types in
Eclipse-based distributions. It has many of the right characteristics, but
is overly simplistic in assuming that 1 plug-in = 1 component and that all
components separate API from internal based on Eclipse's package-level
naming conventions.</li>
</ul>
</body>
</html>