Vous êtes sur la page 1sur 6

#70 Get More Refcardz! Visit refcardz.

com

CONTENTS INCLUDE:
n
About Eclipse Plug-ins

Eclipse Plug-in Development


n
How Plug-ins Work
n
The OSGi Manifest
n
The Plug-in Manifest
n
Plug-in Model
n
Hot Tips and more... By James Sugrue

Manifest Entry Use Example


About Eclipse Plug-ins
Manifest-Version Manifest versioning 1.0
information for your own
The Eclipse platform consists of many plug-ins, which are records
bundles of code that provide some functionality to the entire
Bundle- A bundle manifest may 2
system. Plug-ins contribute functionality to the system by ManifestVersion express the version of the
implementing pre-defined extension points. You can provide syntax in which it is written
by specifying a bundle
extension points in your own plug-in to allow other plug-ins to manifest version. If using
extend your functionality. syntax from OSGi Release
4 or later, you must specify
a bundle manifest version.
The bundle manifest
Eclipse has a dedicated perspective for development version defined by OSGi
of plug-ins, the PDE (Plug-in Development Release 4 is “2”.
Hot Environment). You can download Eclipse for RCP/
Tip Plug-in Developers with all you need to get started
Bundle-Name Human readable name for
the plug-in.
MyPlugin

from http://www.eclipse.org. Bundle-SymbolicName A unique name for this com.dzone.


plug-in, usually in package tests.myplugin
naming convention.
www.dzone.com

How plug-ins work Bundle-Version The version of this plug- 1.0.1.alpha


in. This should follow
the typical three number
A plug-in describes itself to the system using an OSGi manifest versioning format of
(MANIFEST.MF) file and a plug-in manifest (plugin.xml) file. <major version>.<minor
version>.<revision>
The Eclipse platform maintains a registry of installed plug-ins This can also be appended
and the function they provide. As Equinox, the OSGi runtime, by an alphanumeric
qualifier.
is at the core of Eclipse, you can think of a plug-in as an OSGi
bundle. The main difference between plug-ins and bundles Bundle-Activator The activator, or plug-in com.dzone.
class, that controls this tests.
is that plug-ins use extension points for interaction between myplugin.
plug-in.
bundles. Activator

Bundle-Vendor Human readable string for DZone


Plug-ins take a lazy-loading approach, where they can be the plug-in provider.
installed and available on the registry but will not be activated Bundle-Classpath A comma-separated list
Eclipse Plug-in Development

lib/junit.
until the user requests some functionality residing in the plug-in. of directories and jar jar,lib/
files used to extend this xerces.jar
bundle’s functionality.
the osgi manifest

MANIFEST.MF, usually located in the META-INF directory, Get More Refcardz


deals with the runtime details for your plug-in. Editing of the (They’re free!)
manifest can be done through the editor provided, or directly
in the MANIFEST.MF tab. The following is an example of one
such manifest for a simple plug-in: n Authoritative content
n Designed for developers
Manifest-Version: 1.0 n Written by top experts
Bundle-ManifestVersion: 2
Bundle-Name: Myplugin n Latest tools & technologies
Bundle-SymbolicName: com.dzone.tests.myplugin
Bundle-Version: 1.0.0.qualifier n Hot tips & examples

Bundle-Activator: com.dzone.tests.myplugin.Activator
n Bonus content online
Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime
Bundle-ActivationPolicy: lazy n New issue every 1-2 weeks
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

The Eclipse OSGi Framework implements the complete OSGi


R4.1 Framework specification and all of the Core Framework Subscribe Now for FREE!
services. Here we list the most common manifest headers and Refcardz.com
directives.

DZone, Inc. | www.dzone.com


2
Eclipse Plug-in Development

Require-Bundle A comma-separated list of rg.eclipse.ui, Eclipse- This allows you to set Eclipse-
symbolic names of other org.eclipse. PlatformFilter particular rules for your PlatformFilter: (&
bundles required by this core.runtime bundle before it can start. (osgi.ws=win32)
plug-in. (osgi.os=win32)
osgi.nl for language (osgi.arch=x86))
Bundle- Manifest header identifying Lazy
osgi.os for operating
ActivationPolicy the bundle’s activation system
policy. This replaces the osgi.arch for
deprecated Eclipse- architecture
LazyStart directive. osgi.ws for windowing
Bundle-Required Manifest header identifying JavaSE-1.6 system
ExecutionEnvironment the required execution
environment for the All entries in the manifest can be internationalized by moving
bundle. The platform them to a separate plugin.properties file.
may run this bundle if
any of the execution
environments named in this the plug-in manifest
header match one of the
execution environments it
implements.
With the Manifest.MF file looking after the runtime
dependencies, plugin.xml deals with the plug-in extensions
Export-package A list of the packages that com.dzone.
this bundle provides for tests.api and extension points.
export to other plug-ins.
An extension allows you to extend the functionality of another
Plug-in Runtime plug-in in your system. An extension can be added through the
The Require-bundle manifest header has some extra plug-in editor’s Extensions tab, or to your plugin.xml.
functionality to help you manage your runtime dependencies. <extension point=”org.eclipse.ui.preferencePages”>
Bundles can be marked as optional dependencies by <page
class=”com.dzone.tests.myplugin.preferences.
annotating the bundle with �;resolution:=optional. SamplePreferencePage”
id=”com.dzone.tests.myplugin.preferences.
SamplePreferencePage”
You can also manage which version of the bundle your name=”Sample Preferences”>
dependent on needs to be present using the ;bundle- </page>
</extension>
version=”<values>” annotation. Here, the <values> that we
refer to are a range of versions where you can specify minimum Each extension point has a XML schema which specifies the
and maximum version ranges. The syntax of this range value is elements and attributes that make up the extension. As you
illustrated through these examples: can see in the listing above, each extension point has a unique
identifier. The <page> element above is specified in the XML
Example Meaning schema for the org.eclipse.ui.preferencesPages extension.
3.5 Dependent only on version 3.5 of this bundle
Plug-ins and extension points are expected to have
[3.5, 3.5.1] Must be either version 3.5 or 3.5.1
Hot the same unique identifiers following the Java
[3.0, 4.0] Must be a version of 3.0 or over, but not 4.0 Tip
package naming pattern.
Additional Eclipse Bundle Headers
Eclipse provides a number of addition bundle headers and You can also define your own extension points, and we will
directives. These extra headers are not part of the OSGi R4.1 detail that process in a later section.
specification, but allow developers to use additional Eclipse
OSGi Framework functionality. Plug-in model

Manifest Entry Use Example The plug-in class is a representation of your plug-in running in
Export-Package Additional directives Export-Package: the Eclipse platform. A plug-in class in Eclipse must extend org.
are available to manage org.eclipse. eclipse.core.runtime.Plugin, which is an abstract class that
the access restriction of foo.internal;
exported packages.
provides generic facilities for managing plug-ins. When using
x-internal:=true
the project wizard in the PDE, this class typically gets assigned
x-internal Export-Package:
Activator as its default name. Whatever name you assign to
org.eclipse.foo.
The default value for this formyfriends; this plug-in class, it must be the same as that mentioned in the
property is false. When x-friends:=”org. Bundle-Activator directive of your MANIFEST.MF.
internal packages are eclipse.foo.
specified as true using this friend1” The class has start and stop methods that refer to the
option, the Eclipse PDE
discourages their use. BundleContext and are provided by the BundleActivator
interface. These methods allow you to deal with the plug-ins
x-friends
lifecycle, so that you can do both initialization and cleanup
This option is similar to activities at the appropriate times. When overriding these
x-internal, but allows
certain bundles to use the
methods be sure to always call the superclass Implementations.
exported packages that
have this option. Other Plug-ins that contribute to the UI will have activators
bundles are discouraged. Hot that extend AbstractUIPlugin, while non-UI plug-ins
The x-internal option
takes precedence over
Tip
x-friends.
will extend Plugin.

DZone, Inc. | www.dzone.com


3
Eclipse Plug-in Development

Bundle Context Here we will run through some useful extension points in the
A BundleContext is associated with your plug-in when it is Eclipse platform. Note, that to make some of these available
started. As well as providing information about the plug-in, the for your plug-in, you will usually need to add dependencies.
BundleContext can provide information about other plug-ins
in the system. By providing a listener to BundleEvent, you can Example Meaning
monitor the lifecycle of any other plug-in. org.eclipse.core.runtime Allows plug-ins to use the Eclipse
.preferences preferences mechanism, including the
Bundle setting of default preference values.

The terms Bundle and Plug-in may be used interchangeably org.eclipse.core.runtime A plug-in that wishes to use the
when discussing Eclipse. The Bundle class provides us with the .applications platform but control all aspects of its
execution is an application.
OSGi unit of modularity. There are six states associated with
bundles: org.eclipse.core.resources Useful for IDE builders who wish to
.builders provide an incremental project builder,
State Meaning processing a set of resource changes.

UINSTALLED The bundle is uninstalled and not available.


org.eclipse.core.resources Markers are used to tag resources with
INSTALLED A bundle is in the INSTALLED state when it has been .markers use information – this marker can then
installed in the Framework but is not or cannot be resolved be utilized in the problems view.
RESOLVED Before a plug-in can be started, it must first be in the
RESOLVED state. org.eclipse.ui.activities The activity extension point allows the
filtering of plug-in contributions from
A bundle is in the RESOLVED state when the Framework has users until they wish to use them.
successfully resolved the bundle’s code dependencies.
org.eclipse.ui.editors Allows the addition of new editors to
STARTING A bundle is in the STARTING state when its start method is
the workbench, which can be tied to
active.
particular file extension types.
If the bundle has a lazy activation policy, the bundle may
remain in this state until the activation is triggered. org.eclipse.ui.intro When Eclipse is first started up
the welcome page, or intro is
STOPPING A bundle is in the STOPPING state when its stop method displayed. This extension point allows
is active. contributions to the welcome page.

When the BundleActivator.stop method completes the


org.eclipse.ui.menus Allows custom menus to be added
bundle is stopped and must move to the RESOLVED state.
to the workbench either in the main
ACTIVE A bundle is in the ACTIVE state when it has been menu, toolbar or popup menus
successfully started and activated. through the locationURI attribute.

org.eclipse.ui.perspective Allows the addition of a perspective


Lazy Loading factory to the workbench, defining a
particular layout of windows.
Plug-ins are normally set to load lazily, so that the code isn’t
org.eclipse. Adds a property page for objects of a
loaded into memory until it is required. This is normally a good ui.propertyPages given type.
thing as you don’t want to affect the startup time of Eclipse. If
you do require your plug-in to start up and load when Eclipse org.eclipse.ui.themes Allows the customization of the user
interface, overriding the default colors
launches, you can use the org.eclipse.ui.startup extension and fonts.
point.
org.eclipse.ui.views Provides the ability to add views to the
<extension point=”org.eclipse.ui.startup”> workbench.
<startup class=”com.myplugin.StartupClass”></startup>
</extension>

The startup class listed above must implement the


Creating your own extension points
org.eclipse.ui.IStartup interface which provides an
earlyStartup() method. The method is called in a separate
thread after the workbench initializes. As well as being a user of extension points, a plug-in can
provide its own extensions for other plug-ins. Extension points
Extension Points allow loose coupling of functionality – your plug-in exposes a
set of interfaces and an extension point definition for others to
The Eclipse platform provides a number of extension points use.
that you can hook into, to provide additional functionality. The
concept behind an extension point is that a class provides Extension Point Definition
some extendable behavior, and publishes this behavior as an You can create your extension point through the plugin.xml
extension point. In order to run this code, the plug-in requires file, or through the Add button in the Extension Points tab of
a host – in this case your own plug-in. the plug-in editor.

In your plugin.xml you take this extension point and provide For identifying your extension point you need to provide a
extra information to help it run. You will usually need to provide unique identifier and a human readable name. At this point
some class that implements a particular interface in order to do you can also point to a schema file and edit it afterwards. An
this. extension point schema must have .exsd as its suffix.

DZone, Inc. | www.dzone.com


4
Eclipse Plug-in Development

Type The available types are Boolean, String, Java,


Resource and Identifier. While Boolean and
String are self –explanatory, Resource should be
used if the attribute is a file. Identifier provides a
reference id for the extension point.
Extends If the type is Java this must be the name of the
class that the attribute must extend.
Implements If the type is Java this must be the name of the
class that the attribute must implement.
Translatable If the type is String this Boolean value indicates
whether the attribute should be translated.
Restrictions If the type is String this can be used to limit the
choice of value to a list of strings.
Description Attribute documentation.
References If the type is Identifier, this provides the id of
the extension point that you want to reference.
This will allow implementers of the extension
point to easily find the id, without having to look
through the plug-in registry.

Once you have created your elements and attributes for the
extension point, the element can be added to a sequence
for this extension. You can control the multiplicity of your
extension here.

The mapping of XML to extension point declaration is simple;



for users of your point, an xml element in the extension point
Figure 1: The New Extension Point Wizard
will always appear on the left hand side tree, as part of the
Defining an Extension Point Schema extension point declaration, while the xml attributes will
The PDE provides an editor for defining your .exsd file, appear as extension point attributes.
consisting of three tabs. First, the Overview tab allows you to
provide documentation and examples for your extension point.
The Code Behind an Extension Point
With the extension point defined, the producer of this needs to
This is an essential step if you want your extension point to be
provide some implementation that makes use of any extension
adopted. Next, the Definition tab presents a graphical way to
point contributions.
define your schema, while the Source tab allows editing of the
.exsd XML definition. To get a list of all the implementers of your extension point
you can query the extension registry as follows, providing your
extension point identifier as the parameter.

IConfigurationElement[] config = Platform.getExtensionRegistry()


.getConfigurationElementsFor(“myextid”);

To use the implementing extension point, you can get the


object from the IConfigurationElement.

final Object o = config[i].createExecutableExtension(“class”);

Useful Tools

The PDE plug-in editor provides a number of useful utilities for


working with your plug-ins. The Dependencies tab in particular
is essential for organizing your runtime.

Figure 2: The Extension Point editor

When creating your extension point, you will first want to


create one or more elements with attributes that will be used.
Each extension point attribute has a number of associated
properties:

Attribute Use
Name The name of the extension point attribute.
Deprecated Whether the attribute is deprecated or not.
Use Whether the attribute is optional, required or
default. Default allows you to specify a value for 

the attribute if it hasn’t been used.
Figure 3: The Dependencies Tab

DZone, Inc. | www.dzone.com


5
Eclipse Plug-in Development

From here you can investigate the plug-in dependency By adding some extra functionality over this simple
hierarchy, starting with your plug-in as the root. You can also implementation, you can leverage p2 to add extra meta data
see which plug-ins are dependent on your own plug-in, as well to your update site, which will make the installation experience
as find any unused dependencies. This can be useful if you faster for end users.
previously added a dependency to use an extension point, but
have found that it is since no longer required. Finally, and most p2 Update Site Publisher
importantly, the tab provides a utility for investigating for cyclic The UpdateSite Publisher application is provided by p2 to
dependencies. generate an artifact.xml and content.xml files for your standard
update site. You can run this application in headless mode
Another useful tool for plug-in development is the Plug-in using org.eclipse.equinox.p2.publisher.UpdateSitePublisher.
Registry view. This can be accessed from the Window>Show The following shows an example of how to run this application,
View>Other..>Plug-in Development category. This view will taken from the p2 wiki.
display all the plug-ins that are currently available in your java -jar <targetProductFolder>/plugins/org.eclipse.equinox.
Eclipse installation. launcher_*.jar
-application org.eclipse.equinox.p2.publisher.UpdateSitePublisher
-metadataRepository file:/<some location>/repository
-artifactRepository file:/<some location>/repository
-source /<location with a site.xml>
-configs gtk.linux.x86
-compress
-publishArtifacts

Read more about p2 at http://wiki.eclipse.org/Equinox/p2

Enhancing your plug-in

When developing your plug-in, you should be aware of the


wide variety of projects available in the Eclipse eco-system that
help make your development easier and faster. This section
gives an overview of just a few of the useful projects that exist,
and explains how they can be used in your project.
Eclipse Modeling Project

http://eclipse.org/modeling/
Figure 4: Plug-in Registry
The Eclipse Modelling Project provides a large set of tools
for model driven development. The most popular part of
When launching an application containing you plug- this project is the Eclipse Modelling Framework (EMF). Using
Hot in, use the -consoleLog program argument from this technology, you can define a model in the ecore format,
Tip the Run Configurations dialog to see output to the generate Java code to represent, serialise and de-serialise the
system console. model. Other tools within the modelling project utilise EMF to
provide more specialised frameworks for developers.
Logging The Connected Data Objects (CDO) project provides a three-
It is recommended to log to a file, rather than using System. tier architecture for distributed and shared models.
out. The Activator or plug-in class provides a facility to access
The Graphical Modelling Framework (GMF) allows you to
the plug-in logging mechanism through the getLog() method,
generate graphical editors for your model based on EMF and
returning the org.eclipse.core.runtime.ILog interface.
the Graphical Editing Framework (GEF). For developers who
Each log entry using this framework is of typ�e IStatus. Any want to provide textual editor for their own language or DSL,
CoreExceptions thrown in Eclipse have an associated IStatus XText provides a EBNF grammar language and generates a
object. An implementation of this interface, Status, is available parser, meta-model and Eclipse text editor from this input.
for use. There is �also a MultiStatus class which allows multiple Eclipse Communication Framework
statuses to be logged at once. http://eclipse.org/ecf
If your plugin requires any communication functionality, the
Distributing your PLug-in ECF project is the first place to look. ECF consists of a number
of bundles that expose various communication APIs. These
Since Eclipse 3.4, p2 has been used as the method to provision APIs range from instant messaging, dynamic service discovery,
your application with new or updated plug-ins. For build file transfer to remote and distributed OSGi. Real-time shared
managers who have used the Update Site mechanism before, editing functionality is also available in the framework,
there doesn’t need to be any change. allowing you to collaborate remotely on anything that you are
editing within your plug-in’s environment.
To create an update site you can use the wizard provided to
Business Intelligence and Reporting Tools
create a new site.xml file. Using the Software Updates menu,
http://eclipse.org/birt
users can point to your update site on the web and download
the plug-in. BIRT is an open source reporting system based on Eclipse.

DZone, Inc. | www.dzone.com


6
Eclipse Plug-in Development

BIRT provides both programmatic access to report creation, as Rich Ajax Platform
well as functionality to create your own report template within http://eclipse.org/rap
the Eclipse IDE. While BIRT allows you to generate reports in
file formats such as PDF, it is also possible to use BIRT on an With the emergence of the web as a real platform for rich
application server to serve reports through a web browser. applications, the Rich Ajax Platform allows you to take a
standard RCP project, and with some minor modifications,
Equinox make it deployable to the web. This idea of single-sourcing is
http://eclipse.org/equinox
key to the RAP project, and reduces the burden for developers
As we have described in this card, Equinox is the Eclipse to make an application ready for either the desktop or the
implementation of the OSGi R4 core framework specification, web.
and provides the real runtime for all your plug-ins. However, as
well as running your plug-ins on the desktop on an instance of The same programming model is used, while qooxdoo is
Eclipse, you can take Equinox and run it on a server, allowing used for the client side presentation of your SWT and JFace
your plug-in to run on browsers as well as the desktop. widgets.

A BOUT t he A u t h o r
James Sugrue is a software architect at Pilz Ireland, a company using many Eclipse
technologies. James is also editor at both EclipseZone and Javalobby. Currently he is
working on TweetHub, a Twitter client based on RCP and ECF. James has also written
previous Refcardz covering EMF and Eclipse RCP.
Zone Leader: EclipseZone, Javalobby
Twitter: @dzonejames

R E COMM E N D E D b o o k s
This book presents In Eclipse Rich Client
detailed, practical Platform, two leaders
coverage of every of the Eclipse RCP
aspect of plug-in project show exactly
development--with how to leverage Eclipse
specific solutions for the for rapid, efficient,
challenges you’re most cross-platform desktop
likely to encounter. development.

BUY NOW BUY NOW


books.dzone.com/books/eclipse-plug-ins books.dzone.com/books/eclipse-rcp

Bro
ugh
t to
you
by...
Professional Cheat Sheets You Can Trust
tt erns “Exactly what busy developers need:
n Pa
ld
ona

sig son
McD
simple, short, and to the point.”
De
Ja
By

#8
ired
Insp e
by th
GoF ller con
tinu
ed
ndle
r doe
sn’t
have
to

James Ward, Adobe Systems


ity,
r
E: e ha ndle
d th
LUD Best
se
ns ibil st an ith th
e ha

Upcoming Titles Most Popular


IN C que st w
ility spo
re
TS e le a req
ue
ome.
EN nsib
of R
nd le a
ay ha outc
NT spo sm hand tial hen
an
CO f Re in ject le to oten
Cha
o . le p .W
le ob bject be ab tern ethod
m

in tab
Cha d ultip ecific o should cep pat
this if the m up the
man
n M
an ac
z.co

n
sp s ents
be a ject ime. d is see passed

Download Now
Com reter of ob at runt handle plem ks to de to

Java Performance Tuning Spring Configuration


n
Use se t im ec b e co
rp
n A ined ges ch ld til t
Inte Whe
n
erm being ngua ime shou peats un paren
not e la the runt or if it
tor det s re ore
a rd

...
n
uest som tion proces e no m
Itera tor ore req
n A g in metho
d
cep
dm ndlin
e e ar

Adobe Live Cycle jQuery Selectors


dia e ex ack th
n
a ther
Me rver d an the n ha rown in ndle th ll st until
re f c

tho e to ptio th
Exce ion is sm to ha up th tered or
e ca
n

Ob
se Me S renc ral

Refcardz.com
plate RN refe listed in mp
le ce pt ni
echa n pa ssed co un avio
Beh
TTE
n
ex
is en
ick
Agile Adoption 3 Windows Powershell
am
Tem Exa he .
A s has ack. W tion uest to ject
NP a qu s, a ct- cep Ob
it

n
st q
IG e s e rn b je call e ex e re
vid patt able O le th nd th
DES
! V is

pro s, hand s to ha
UT ard ign us ram .
des diag
F# Dependency Injection with EJB 3
ct
ABO refc oF) f Re le obje
erns ts o lass exa
mp oke
r
Patt ur (G lemen es c Inv
arz

n F o d rl d h
Des
ig go
f s: E inclu al w
o suc
Th is G a n
l 23 sign Pa
tt e rn e rn
patt , and a
re je ts
t ob mentin
c g AN
D
WPF Netbeans IDE JavaEditor
c

a h c M M
ef

in c u
orig kD
e
re.
Ea tion ons
tr ple CO ma
nd
boo Softwa rma to c their im om
Blaze DS Getting Started with Eclipse
re R

the info ed Clie


nt
cre
teC
d
ente on, us
age : Us d from Con nd
Ori r ns ct () ma
ti atte uple bje cute Com )
lana al P e deco eo +exe
PostgreSQL Very First Steps in Flex
s
Mo

( low
e x p o n la rg cute is al ch
ati an b rm ts. +exe . Th
bject nship
s su
Cre y c fo je c an o
t th
e
ed
to ob ms, d as ed rela
tio
Get

tha : Us arate rith eate as


s te m.
tt e r ns n y disp
g e algo je c ts. e r
be tr ject b
it to lly ob
sy Pa a b g
ana
iv
ral en m en o Rece
win
allo traditi
ona
to m betwe
s.
ctu twe sed
uest
req ndled in nt or
der
Stru s be
stru
cture ttern
l Pa d respo
s: U
nsib
ilitie
s

nsh
ips
that
can psu
Enca quest
the
re
late
sa

and
e ha
to b llbacks
ca
.

nalit
y.
riant
times
or in
varia

ling
the
invo
catio

ing
n.
DZone, Inc. ISBN-13: 978-1-934238-62-2
ra o pose uing nctio led at va hand
io n ti ct cess be
av ,a la P ur
as q
ue
ack
fu je pro
Beh nships t re
1251 NW Maynard
ob
e
ISBN-10: 1-934238-62-7
nd the to
je c a n b callb b e ha eded. m ro nous nality ed
tio ob at c
ed
You ne s need
to ne
sts is couple
d fro
ynch nctio y ne
rela with s th st que
n
e th
e as the fu
itho
ut an is
eals
it
ship Reque y of re de ar
ld be litat pattern ssing w tation articul
e: D tion faci

50795
or
e. Use
n

A hist shou d ce en p
ed to mman for pro implem ents its ting.
cop runtim rela type
ker
Cary, NC 27513
n
S s Whe invo y us
n
s co al m pec
jec t at cla Pro
to Th e
w id el th e ue ue
ac tu
d im
p le ex
are utilizing a job q of the ue is
Ob ged with
n
C ues ueue e que
han eals me.
y dge enq
que s. B en to th
e c : D P roxy Job orithm be giv knowle that is terface
b e ti
cop
g n ct
pile r S in
rato er mp
le of al ed ca to have d obje of the
ss S at com serv
888.678.0399
Exa ut
Deco nes
an
.com

Ob exec e queue comm


Cla d S B th e confi
nge de leto
n for
king
. Th
ithin
the
cha tory Faca od Sing invo hm w

DZone communities deliver over 6 million pages each month to ract


Fac S
Meth C algo
rit

919.678.0300
one

Abst tory
C C
Fac
B
State
t
pte
r eigh y
teg
Ada Flyw Stra od
z

Meth
more than 3.3 million software developers, architects and decision
S S r B
w. d

e rp rete plate
ridg
Refcardz Feedback Welcome
B B
Inte Tem
S B
er tor or
ww

Build Itera Visit


$7.95

C B r B

makers. DZone offers something for everyone, including news, diato


f
in o ral
refcardz@dzone.com
ty Me
Cha nsibili avio
B o B
ento Beh
Resp m ject
d Me Ob
m man B

tutorials, cheatsheets, blogs, feature articles, source code and more.


C o

NSIB
ILIT
Y B

S
Com
po si te

P O succ
ess
or Sponsorship Opportunities 9 781934 238622
RES
“DZone is a developer’s dream,” says PC Magazine.
F
CH
AIN
O
ace
>> sales@dzone.com
terf r
<<in andle
H st ( )

Copyright © 2009 DZone, Inc. All rights reserved.


Clie
nt
No part of this publication
dle
r2
d lere
que
may be reproduced, stored in a retrieval system, or transmitted, in any form or by means electronic, mechanical,
+ha
n
Version 1.0
Han
photocopying, or otherwise, without prior written permission Cof the
oncr
ete publisher.
que
st ( ) Reference:
s

re
ndle
+ha
ern

1 ki ng
ler by lin .c o
m
and uest one
teH req z
cre () le a w.d
Con uest hand | ww

Vous aimerez peut-être aussi