Professional Documents
Culture Documents
Thomas Watson
IBM Lotus
Equinox Committer
Peter Kriens
OSGi Technical Director
OSGi Evangelist
CEO aQute
© 2006 by IBM, aQute & OSGi; made available under the EPL v1.0 | 2006 | OSGi Alliance & IBM
Contents
Setup
Introduction to OSGi
OSGi Basics
Components
Services
Remoting
Conclusion
2 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Your Infrastructure
3 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Loading the tutorial projects from CVS
Window > Open Perspective > Other > CVS Repository Exploring
4 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Your Workspace (more or less)
5 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Section I - OSGi Background
6 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What is the OSGi service platform?
Cool!
7 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Why the OSGi Service Platform?
8 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Limited Binary Software Portability
9 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Complexity of Software
10 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Complexity of Software
Structured
Programming
Assembly
11 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Limits Object Oriented Technology
12 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Service Oriented Architectures
Based on contract
(interface)
Components are reusable
Not coupled to
implementation details
13 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Framework
Allows applications to
share a single Java VM Application
The Application
Application
Application
Classloading Blue-
Application
Application
Application
Speech XML USB
tooth Application
Isolation/Security OSGi Library
OSGi Web
JTAPI
OSGi 3D Math
OSGi Server
The Application
Communication `& Java
Comm
Java
Collaborations between Mail Java
Ports
VM
VM Security TCP/IP
VMLibraries
applications System Class
Java
Media Distri-
Imaging Java
VM SQL
Java
FWVM buted
Life cycle management Java
VM
Crypto- VM Direc-
Operating System GUI
UPnP
Policy free graphy Operating System
tories
Operating System
Operating Java
System
Policies are provided by Java
VM
VM
bundles
Operating System
Operating System
API is fully self managed
14 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Layering
Services
Security
Applications
Life Cycle
Module
Execution Environment
15 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Execution Environment
16 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Module Layer
17 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Life Cycle Layer
18 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Life Cycle Layer
19 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Service Layer
Provides an in-VM service model
Discover (and get notified about) services based on their
interface or properties
Bind to one or more services by
program control,
default rules, or
deployment configuration
SOA Confusion
Web services bind and discover over the net
The OSGi Service Platform binds and discovers inside a
Java VM
20 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Evolution
Planned R4
Application Manager
MIDP Container
Signed Bundles
Declarative Services
Power Management
Device Management
eli bo M Security Policies
R3 UPnP Exporter
Diagnostics/Monitoring
UPnP Framework Layering
Initial Provisioning Initial Provisioning
Name Space
UPnP
Jini
…
Start Level
IO Connector
Wire Admin
XML Parser
Measurement & State
Position
Execution Env.
el ci he V
R2
Package Admin
Configuration Admin
Permission Admin
User Admin
Preferences
MetaType
R1 Service Tracker
Framework
Http
Log
ot u A e mo H
Device Access
21 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Benefits of Using the OSGi Service Platform
Collaborative model
Allows reuse of other components for most problems
22 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Section II – Eclipse/Equinox
23 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What is Equinox ?
An open source community focused on OSGi Technology
Develop OSGi specification implementations
Prototype ideas related to OSGi
24 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Equinox Target Environment
goto: Bundle F
{}
25 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Setting up the Target Platform
26 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What Did We Learn
The OSGi Service Platform is kind of a Java Operating
System
It simplifies:
Deployment Problems
Software composition
Software management
27 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Section III - Fundamental OSGi concepts
28 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Framework Entities
OSGi Framework
Bundle A
{}
Bundle B
{}
29 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Bundles
30 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What is in a Bundle?
During Runtime:
Calls the Bundle Activator to start the bundle
Manages java classpath
Handles the service dependencies
Calls the Bundle Activator to stop the bundle
31 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Create the Hello World bundle
Step1.
Createnewplug-inproject
Step2
32 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Real code! Hello World (and Goodbye)
33 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Real code! Hello World (and Goodbye)
Notice:
Bundle-Activator (used to notify
the bundle of lifecycle changes)
Import-Package (dependencies)
34 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Eclipse Launch Configuration
Press Run
35 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Equinox Launch Configuration
36 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Run the Hello World bundle
37 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Self-Hosting Bundle Projects
JAR file layout
Normally, a bundle is packaged META-INF/MANIFEST.MF
helloworld/HelloWorld.class
in a JAR file
file:c;/…
The traditional edit-compile-
debug cycle.
38 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Creating deployable bundles – how it works
39 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What Did We Learn
40 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Section IV – Component interaction and collaboration
41 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Collaborative model
42 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Collaborative model
OSGi Framework
Service
registry
Bundle Bundle
packages
packages
JAVA
Operating System
Hardware
43 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Collaborative model
No management bundles
Service
Midlet, registry Midlet, No collaboration
Xlet, Xlet,
or or
Applet packages Applet
packages No package management
(versions!)
JAVA
Hardware
44 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Classpath issues
45 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
OSGi dependency resolution
Framework
org.osgi.framework
org.osgi.service.http
Bundle A
Export org.osgi.service.log A resolved
com.ibm.service.log
com.ibm.j9
Import org.osgi.service.http
javax.servlet.http
Bundle B
Export ericsson.osgi
B resolved
javax.servlet
javax.servlet.http
org.osgi.service.log
Import org.osgi.service.http
46 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Package or Bundle Dependencies?
Import-Package creates a s
dependency on just a package
Creates less brittle bundles because of Require-Bundle
substitutability
More cumbersome to use (Tools!) r
In almost all cases, Import-Package
is recommended because it eases
deployment and version migration
The specifications detail a number of
additional problems with Require-
Bundle
47 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
discover
Service Specifics
bind register
48 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Services continued
49 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Manipulating Services
50 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What Did We Learn
51 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Section V – Service Components
52 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Components Simplify Service Programming
53 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Import the necessary packages
Step1–AddnewImportedPackages
Step2–Select thenecessarypackages
Step3–Savethebundlemanifest
54 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Login Component Source Code
OSGI-INF/component.xml
<?xml version="1.0" encoding="UTF-8"?>
A component can be any class <component name="hello.component.log">
<implementation
No specific interface
class="hello.Component"/>
<reference name="LOG"
The activate and deactivate methods interface=
are called when the component is "org.osgi.service.log.LogService"/>
activated/deactivated </component>
55 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Add Declarative Services, Log, and Component
56 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Launching
57 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What Did We Learn
58 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Section VI – Use Case: Developing a Chat Service
59 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
A Chat Service
60 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Channel Service Design
Channel.java
61 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
White Board Approach
Bundle C Bundle B Bundle A
The White Board approach is: {} {} {}
Register a service
Let any interested bundle use it
register
The White Board approach was
discovered during finishing of R1 Registry
Publisher
We were not brave enough to scrap,
that is why the Log Service and Http Events: register,
Service are not white board unregister,
modified
It is very effective because it reduces
the number of couplings between
bundles
get
There is a white-paper comparing a
whiteboard approach with a non
Server
whiteboard approach.
bundle
62 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Telnet Based Chat Client
63 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The TelnetChat Manifest and component.xml
META-INF/MANIFEST.MF
Create a new project for a telnet chat Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Call this project <myname>.telnetchat Bundle-Name: Telnetchat Plug-in
This is a Plug-in Project Bundle-SymbolicName: aQute.telnetchat
Bundle-Version: 1.0.0
Define the manifest and component Bundle-Localization: plugin
Service-Component: OSGI-INF/component.xml
definition
Import-Package: aQute.chat,
aQute.service.channel,
Add the package import dependencies org.osgi.framework;version="1.3.0",
to the manifest. Either org.osgi.service.component,
Direct in the source code org.osgi.service.log
Via the Dependencies tab
64 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The TelnetChat Component code
TelnetChat.java
The code does not show the import protected void
activate( ComponentContext context) {
packages and field definitions
this.context = context;
The source code is provided for you to this.log = (LogService)
further check in aQute.telnetchat context.locateService("LOG");
Eclipse will tell you when they miss start();
}
The activate method:
protected void deactivate(
Remembers the context for later
ComponentContext context) throws
Gets the log service Exception {
Starts the thread. quit = true;
for (Iterator i =
The deactivate method: handlers.iterator();
i.hasNext();) {
Sets the quit flag so any loops in the Handler h = (Handler) i.next();
started Thread will finally end
try { h.close();}
Closes all created Handlers catch (Throwable e) {
Exceptions are ignored because we are // We are closing
closing }
And closes the server socket object, }
this will surely quit the main socket server.close();
accept loop. }
65 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The TelnetChat run method
TelnetChat.java
The run method creates a socket and public void run() {
accepts incoming connections. while (!quit) try {
server = new ServerSocket(2030);
For bundles, it is crucial that this server.setSoTimeout(1000);
loop();
loop never quits, but also not
} catch (Exception e) {
overloads the system log.log(LogService.LOG_ERROR,
There is usually no end user watching "[TelnetChat] Inner loop",
a server … e);
sleep(10000);
The outer loop therefore catches }}
errors, sleeps and try again void loop() throws Exception {
A lot of problems disappear over time. while (!quit) try {
For example, an Internet connection Socket socket = server.accept();
can be temporarily be down Handler handler = new Handler(
context.getBundleContext(),
The socket has a timeout to check socket, this);
the flag regularly handlers.add(handler);
handler.start();
The inner loop } catch (SocketTimeoutException e) {
Wait for an incoming socket // Just for checking the quit flag
Creates a handler // at a regular basis
}}
And starts the handler’s thread
66 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
TelnetChat convenience methods
TelnetChat.java
void remove(Handler handler) {
Convenience methods handlers.remove(handler);
}
67 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Handler Source Code
Handler.java
68 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Handler Source Code
Handler.java
69 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Handler Source Code
Handler.java
70 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Handler Source Code
Handler.java
void dispatch(String line) throws
The dispatch method parses Exception {
the destination name from String parts[] = line.split("\\W");
ServiceReference channels[] =
the input ctxt.getServiceReferences(
Channel.class.getName(),
"(" + Channel.CH_NAME + "="
For this name , finds a + parts[0] + ")");
if (channels != null) {
Channel service Channel toChannel =
(Channel) ctxt.getService(
channels[0]);
It then sends the remainder toChannel.send(user,
line.substring(
of the line to that service parts[0].length()));
ctxt.ungetService(channels[0]);
} else {
send("error",
"no such user: " + parts[0]);
}
}
71 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Run the Telnet Chat
72 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What Did We Learn
73 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Section VII – Service Tracking
74 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Finishing the Chat Service
Chat.java
Chat(BundleContext cntxt,Channel user)
The TelnetChat contains code that
must be repeated between different void execute(String ln) throws IOException
clients
String[] getBuddies()
A Chat library that captures the shared
code would be useful void close()
As a bundle, this could run on phones, String getName()
Eclipse, etc.
void login( String user, String passwd)
For this example, we create a Chat
class that works on a command line
basis META-INF/MANIFEST.MF
The Chat class will be added to the Manifest-Version: 1.0
<myname>.chat bundle Bundle-ManifestVersion: 2
/xxx are commands Bundle-Name: Chat Plug-in
Bundle-SymbolicName: aQute.chat
This bundle will therefore act as a Bundle-Version: 1.0.0
library and exports the chat package Bundle-Localization: plugin
Import-Package:
Not all code is shown, however, this is org.osgi.framework;version="1.3.0"
available in the aQute.chat project Export-Package: aQute.service.channel,
aQute.chat
75 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Case for the ServiceTracker
The service tracker is used to track channels and store them in a Map
76 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
ServiceTracker: create
Framework Bundle
A
Bundle
B
Bundle
C
77 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
ServiceTracker: open
Framework Bundle
addServiceListener A
Bundle
B
Bundle
C
Object addingService(ServiceReference r){…}
78 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
ServiceTracker: adding
Framework Bundle
addServiceListener A
Bundle
B
Bundle
C
Object addingService(ServiceReference r){…}
79 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
ServiceTracker: removing
Framework Bundle
addServiceListener A
Bundle
B
Bundle
C
void removedService(ServiceReference r,Objecto){…}
80 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
ServiceTracker: modified
Framework Bundle
addServiceListener A
Bundle
B
Bundle
C
void modifiedService(ServiceReference r, Object o){…}
81 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Chat Library
Chat.java
public Chat(BundleContext context,
The Constructor initializes final Channel user) {
some fields and creates the this.user = user;
this.cntxt = context;
service tracker channels = doChannelTracker(
context, user);
channels.open();
The user is given as a }
82 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Chat Library Service Tracker
Chat.java
ServiceTracker doChannelTracker(
The Service Tracker is used BundleContext cntxt,
to track Channel services final Channel user) {
return new ServiceTracker(
cntxt,
The addingService method Channel.class.getName(), null) {
gets the Channel and puts public Object addingService(
the Channel in a Map under ServiceReference ref) {
Channel buddy = (Channel)
the given name context.getService(ref);
if (buddy != user) {
The removedService String name = (String)
method just cleans up the ref.getProperty(Channel.CH_NAME);
Map when a Channel service String rn = name; int n = 0;
synchronized (bdds) {
is removed while(bdds.containsKey(rn))
rn = name + "-" + n++;
bdds.put(rn, buddy);
}}return buddy;}
83 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Chat Library
Chat.java
public void login(String name,
The login method registers a String password) throws IOException {
new Channel service if (registration != null)
registration.unregister();
registration = null;
The password is ignored this.name = name;
Hashtable properties =
new Hashtable();
The result is sent as a
properties.put(
message to the user Constants.SERVICE_PID,
"pid:chat[" +
InetAddress.getLocalHost()
+ "]:" + name);
properties.put(
Channel.CH_NAME, name);
registration = cntxt.registerService(
Channel.class.getName(),
user, properties);
user.send("", "Logged in as "
+ name);
}
84 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Chat Library: execute
Chat.java
public void execute(String line)
The execute method looks at throws IOException {
the command line and scans if (!line.startsWith("/"))
send(line);
for ‘/’ characters, which are else {
String ws[]=line.split("\\s+");
commands if ("/buddies".startsWith(ws[0]))
doBuddies();
/help – Show short help else if("/help".startsWith(ws[0]))
doHelp();
/buddies – List the buddies else if("/login".startsWith(ws[0]))
login(ws[1], null);
/login – Login else {
lastTo = ws[0].substring(1);
/<buddy> to send to a buddy send(line.substring(ws[0].length()
+ 1));
}
If no / is given the message }
is sent to the last used }
buddy
85 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Chat Library: send
Chat.java
void send(String line)
The send method must throws IOException {
transfer the message to the if ( lastTo == null )
user.send("", "No buddy");
lastTo buddy. else {
Channel channel =
(Channel) bdds.get(lastTo);
We maintain all the buddy if (channel != null) {
channel.send(name, line);
Channel services in the bdds user.send(name, line);
} else
Map field, so it is easy to find user.send("?", "Can't find "
+ lastTo);
them }
}
86 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Chat Library: doBuddies, getBuddies
Chat.java
void doBuddies() throws IOException {
The doBuddies method sends StringBuffer sb = new StringBuffer();
String del = "";
the list of currently logged in for( Iterator i=
buddies to the user bdds.keySet().iterator();
i.hasNext();) {
sb.append(del);
The getBuddies method sb.append(i.next());
del = ", ";
returns the buddies as a }
user.send("", sb.toString());
String[] }
87 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The Chat Library: utiltities
Chat.java
void doHelp() throws IOException {
The doHelp method sends user.send("", "…n as: " + name);
some help text to the user user.send("", "/bdds …");
user.send("", "/help …");
user.send("", "/login …");
The getName method user.send("", "/<name> … ");
user.send("", "…");
returns the currently logged }
88 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What Did We Learn
89 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Section VIII – Finishing Touch
90 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Using the Chat Library META-INF/MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Swtchat Plug-in
We now have a library bundle that is Bundle-SymbolicName: aQute.swtchat
Bundle-Version: 1.0.0
easy to use Service-Component:
OSGI-INF/component.xml
We could adapt the Telnet Chat, but Bundle-Localization: plugin
Import-Package: aQute.chat,
that is old news
aQute.service.channel,
org.eclipse.swt,
Lets make a small SWT program that org.eclipse.swt.events,
shows a simple chat window org.eclipse.swt.layout,
org.eclipse.swt.widgets,
Call this project <myname>.swtchat org.osgi.framework,
org.osgi.service.component
This is a Plug-in Project
OSGI-INF/component.xml
Such a program is provided in the <?xml version="1.0" encoding="UTF-8"?>
aQute.swtchat bundle <component name="aQute.swtchat.component">
<implementation class=
"aqute.swtchat.ChatWindow"/>
</component>
91 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Using the Chat Library
ChatWindow.java
92 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Using the Chat Library
void createShell() {
The usual window verbosity shell = new Shell();
shell.setText("SWT Chat");
… GridLayout layout = new GridLayout();
layout.numColumns = 1;
shell.setSize(500, 300);
The window creates: shell.setLayout(layout);
text = new Text(shell,
SWT.MULTI|SWT.BORDER|SWT.MULTI|SWT.V_SCROLL
A shell (the window itself), |SWT.READ_ONLY);
GridData spec = new GridData();
A text field that will contain spec.horizontalAlignment = GridData.FILL;
spec.grabExcessHorizontalSpace = true;
the chat output, and spec.verticalAlignment = GridData.FILL;
spec.grabExcessVerticalSpace = true;
A line field that will contain text.setLayoutData(spec);
line = new Text(shell,
the chat input SWT.MULTI|SWT.BORDER|SWT.V_SCROLL);
spec = new GridData();
spec.horizontalAlignment = GridData.FILL;
spec.grabExcessHorizontalSpace = true;
spec.verticalAlignment = GridData.FILL;
spec.grabExcessVerticalSpace = false;
spec.heightHint = 40;
line.setLayoutData(spec);
line.addKeyListener(this);
}
93 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Using the Chat Library
public void keyPressed(KeyEvent ev){}
public void keyReleased(KeyEvent ev){
The keyReleased method switch (ev.keyCode) {
processes when the new line case SWT.CR : try {
String txt = line.getText();
is entered chat.execute(txt.trim());
line.setText("");
} catch (IOException e1) {
The error method displays error(e1);
}
an error to the user break;}}
void error(Exception e) {
The send method displays a if (!quit) {
text.append("error> ");
message to the user from text.append(e + "");}}
another client public void send(final String from,
final String str) {
display.asyncExec(new Runnable() {
public void run() {
text.append(from + "> " + str
+ "\r\n");
}});}
94 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Running the SWT Chat
95 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Remoting
96 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Machine B
Remoting
Machine A
Machine C
Broadcast +p2p
network
Machine E
Proxy of Channel
Machine D
Real Channel
97 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What did we learn?
98 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
What We Did Not Learn
99 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
Conclusion
100 OSGi Component Programming | © 2006 by IBM, aQute & OSGi; made available under the EPL v1.0
The End
Further reading:
http://www.osgi.org
http://bundles.osgi.org
http://www.eclipse.org/osgi
http://www.aqute.biz
OSGi is a trademark of the OSGi Alliance in the United States, other countries, or both.
Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United
States, other countries, or both.
© 2006 by IBM, aQute & OSGi; made available under the EPL v1.0 | 2006 | OSGi Alliance & IBM