lotusphere 2011 jmp103 - jumpstart your "jedi plug-in development skills" with the masters
TRANSCRIPT
JMP103 Jumpstart Your "Jedi Plug-in Development Skills" with the
Masters
Ryan Baxter | Staff Software Engineer | IBMMikkel Flindt Heisterberg | Developer | IntraVision
About us
Mikkel Flindt Heisterberg - @lekkim
With IntraVision, Premier Business Partner from Denmark
Been working with Notes/Domino since version 3.x
Design Partner Program for Notes NEXT and Lotus Connections, writer for THE VIEW, speaker at Lotusphere
Recently had a baby daughter (explains why he looks so tired)
Ryan Baxter - @ryanjbaxterStaff Software Engineer, IBM
Developer for Lotus Notes
Lead developer for Notes Client Java UI APIs
OpenSocial Foundation Member
Novice blogger
Getting married in June (not so tired yet)
Let's pay attribution where it's due...
IBM Lotus Notes
IBM Lotus Sametime
IBM Lotus Expeditor
IBM Lotus Symphony
Microsoft Windows
Java
Linux
All Star Wars stuff is the property
of LucasArts!
All other trademarks are a property of their respective owner
Imageshttp://mistavybeworld.com/wp-content/uploads/2009/08/star-wars-episode3-darth-vader.jpg
http://2.bp.blogspot.com/_HigwL7YghlM/TB5in0r2sTI/AAAAAAAAA6g/axDh5qtbYAM/s1600/yoda.jpg
What we're going to build
Sidebar panelA list box
Three buttons at the bottomOne button reads from a web service
One button reads contacts from names.nsf
One button creates a new emailReads recipient from list
Create document
Set subject
Add data from web service call to body
Create a feature for the plugin
Create an update site with the feature
Create a widget for the feature from the update site
Agenda
About Eclipse and Lotus Expeditor Toolkit
Installing Lotus Expeditor Toolkit
Plugin Development Basics
Building UI's (SWT / JFace)
API's
Debugging Your Plugins
Building and Deploying
Resources, Examples, and Questions
Do or do not... there is no try. - Yoda
About Eclipse
100% open source project
Development Environment
Extensible platform
Eclipse Sitehttp://eclipse.org
Eclipse Wikihttp://wiki.eclipse.org
Planet Eclipsehttp://www.planeteclipse.org
Open Sources Project
One of the best IDEsIntegration for almost any kind of language you can images
ExtensibleSCM plugins, SQL DB plugins, UML plugins, Web Dev plugins
Expeditor and therefore Notes, Sametime, and Syphomy are build ontop of it
Other companies also build applications ontop of Eclipse, other IDEs like Aptana, and MyEclipse
Resources are endless with Eclipse
Eclipse Architecture
Workbench
JFace
SWT
Core ExtensionPoint Framework
Service FrameworkRich Client Platform
Plug-inPlug-inExtension Pt.
Plug-in
ExtensionPointExtensionPointExtensionPoint
A software component in EclipseExtension Point declares
contract
to extend plug-in functionalityExtension code extends this
functionalityRCP allows you to build GUI apps on multiple OSSWT
provides
uniform UI API across multiple OS that calls
OS UI API for native look and feelJFace provides components to make
it easier to write a GUI e.g. wizards, preference pages, actions,
dialogs Workbench is desktop UI and customizableService Framework
supports registration and lifecycle management of
plug-ins
IBM Lotus Clients Built on Eclipse
Notes
Sametime
Expeditor
SymphonyIndustry knowledge
and experienceecosystem of partners open and
extensible
Apps and Plug-ins (ISV + Customer)
collaborative servicesIntegratedapplications
Portal
BrowserDesktopMobileMultiplatformsupportScalabilitySecurity
Eclipse Workbench
Give a quick overview of the workbench, this will be useful for later on so they can see how it related to the Notes workbench and when we talk about things like views they know what they are
All of the pieces of the workbench correlate to Notes as well
Notes Workbench
sPoint out that some of the most recognizable parts of the Notes workbench are just Eclipse concepts. We achieve this via plugins
Why Plugin Development?
Plugin development is often about integrationYou often build extensions to existing applications to add functionality
Eclipse and therefore Expeditor, Notes, Symphony, and Sametime, are built to allow for extensibility
Plugin development has several advantagesJavaMature
Well Adopted
Multi-platform
Libraries
Eclipse CommunityWeb Services
Web Applications
Database Integrations
etc....
Why should they care about plugins?Its all about extensibility and integration
Plugin development is a great way to integrate into Lotus products. Once you have the knowledge you know how to integrate into 4 Lotus products
Java Java JavaJava is a 1st class language, its mature and has a ton of libraries
You can do a ton of things with plugins like work with web services, integrate with web applications, integrate with Database applications
Lotus Expeditor Toolkit A Plugin Developer's Lightsaber
An integrated set of tools to develop, test, and deploy applications built on top of ExpeditorSupports Expeditor, Sametime, Notes and Symphony
FREE! No charge to use the Expeditor toolkit
Supported on Windows and Linux operating systems
Benefits Of Using The ToolkitEasily configure your development environment to develop for the platforms aboveTakes ~ 1 minute to configure your environmentSet your target environment
Point to the target locations on your machine
Provides a new launcher to launch products built on top of ExpeditorCreate a new launch configuration to launch the application from Eclipse
Provides numerous samples to get your started developing for Expeditor based products
The Expeditor toolkit provides tools for developers to get started building plugins for Lotus products
Makes your life easy, easy configuration and easy launching to test your plugins
Free not charge to download it
Lotus Expeditor Toolkit Architecture
Integrated Development Environment (IDE)
RationalApplication
Developer7.5Eclipse 3.4WTP* 3.0
Rational
Software
Architect
7.5LotusExpeditorToolkit 6.2Microsoft WindowsRedHat LinuxSuSE
LinuxIntegrated Development Environment (IDE)
optionaloptionaloptionalEclipse Feature
You can use any number of eclipse configurations with the expeditor toolkit
Agenda
About Eclipse and Lotus Expeditor Toolkit
Installing Lotus Expeditor Toolkit
Plugin Development Basics
Building UI's (SWT / JFace)
API's
Debugging Your Plugins
Building and Deploying
Resources, Examples, and Questions
Do or do not... there is no try. - Yoda
Installing the Expeditor Toolkit
Download the Expeditor Toolkithttp://bit.ly/fKMF5o
Unzip
In EclipseHelp Software Updates...
Download from IBM
Unzip
In Eclipse go to Help Software Updates
This is where you install features into eclipse, we will talk more about features later
Adding The Update Site
Click New Local Site...
Browse to unziped update site
Select OK
Select Local Site
Go to where you unziped the download
Click OK
Selecting The Expeditor Toolkit Feature
Select The Expeditor Toolkit Feature
Click Install...
Select the top level expeditor toolkit feature
Click Install
Accepting The License Agreement
Agree to the license agreement
Install all features
Restart
Accept the license agreement and install the features
After the install finished restart eclipse
Demo: Configuring the Expeditor Toolkit
Start IDE
Select Test EnvironmentSymphony
Sametime
Notes
Expeditor
Specify Target LocationPoint to target runtime
/framework/rcp/eclipse
Click OK
Run Run Configuration
Double Click Client Services
Give The Configuration A Name
Select Run
Walk them through setting up the expeditor toolkit
Create a new workspace in eclipse
Configure the toolkit
Create a new run configuration
Launch Notes
Agenda
About Eclipse and Lotus Expeditor Toolkit
Installing Lotus Expeditor Toolkit
Plugin Development Basics
Building UI's (SWT / JFace)
API's
Debugging Your Plugins
Building and Deploying
Resources, Examples, and Questions
Do or do not... there is no try. - Yoda
What Are Plugins?
Plugins are the building blocks of Eclipse based applicationsAt their core a plugin is some code plus some declarations (extension points)
By themselves plugins may not do anything, but when you start combining plugins you can build very powerful applications
Examples: Eclipse, Sametime, Symphony, Notes
Application
Plugin
From Pierre:automatic manifest management, migration of secondary dependencies, other migration capabilities (mostly on other CS project types), common UI category (requested via UI team).
Anatomy Of A Plugin
Whats inside a plugin?Java code
Manifest.mf Basic properties of a plugin
Specifies dependencies this plugin has
Plugin.xmlExtension points the plugin uses
Extension points the plugin defines (covered in the advanced session)
Build.propertiesManages the build configuration of the plugin (covered in the advanced session)
Resources (Optional)Jars the plugin may need
Files used for translation
Images
etc....
Java goes in the src folder
Manifest.mf basic properties, and dependencies
Plugin.xml extention points
Build.properties for when you build your plugin
Resources other resources your plugin uses
Anatomy Of A Plugin compiled code
Expeditor platform plugins installed in:\framework\rcp\eclipse
Lotus Notes platform plugins installed in:\framework\shared\eclipse\plugins
Third party plugins installed in Notes Data directory\workspace\applications\eclipse\plugins
Compiled as a .jar file or as directory
Plugins live in the Notes install directory
Most are compiled as jars
Demo: Creating A Plugin Project
File New Project Plugin Development
Select Plug-in Project
Walk through creating a new plugin project
Explain the different pieces just covered in the slides
Extension Points
Extension points make plugins pluggablePlugins define extension points for other plugins to useExamples: sidebar, toolbar buttons, right click menus...
Extension points allow the platform to be more performant
Eclipse has a nice editor for adding and defining extension points
How do I know what extension points are available?Eclipse.org and the Expeditor wiki are your friends
Plugin
Using Extension Point
Extension Point Definition
Extension points provide you with integration points
Plugins define extension points for other plugins to useEclipse, and Expeditor both define extension points
The reason for extension points is to allow the platform to me performant, eclipse only loads the code when it has to
Eclipse provides an editor for you to leverage and define extension points, also provides wizards
Extension points are documented
Key Extension Points
org.eclipse.ui.viewsRegisters a view part with the platform
View parts can be used inside perspectives or in the sidebar
com.ibm.rcp.ui.shelfViewAn Expeditor extension point
Used to add a view part to the sidebar
org.eclipse.ui.actionSetsUsed to add top level toolbars and menus
org.eclipse.ui.menusUsed to add context menus
org.eclipse.ui.preferencePagesUsed to add preference pages to the preferences
Agenda
About Eclipse and Lotus Expeditor Toolkit
Installing Lotus Expeditor Toolkit
Plugin Development Basics
Building UI's (SWT / JFace)
API's
Debugging Your Plugins
Building and Deploying
Resources, Examples, and Questions
Do or do not... there is no try. - Yoda
Platform native look and feel
Drag and Drop
Keyboard integration
2D and Vector Graphics
Better responsiveness
Hardware Device Integration
Protection from OS Level Changes
Building User Interfaces With SWT
JFace
UI toolkit built on top of SWT without hiding it
Provides coarser grained components than SWTDialogs
Image / Font Registries
Wizards
Viewers
JFace (cont.)
Viewers are very usable not that the others are not but you have to grok how to use them
Consists of 3 core componentsThe viewer (e.g. TreeViewer, TableViewer)
The content provider (provides the objects we show in the viewer)
The label provider (provides the labels for the viewer usually obtained from the objects)
http://www.eclipse.org/articles/Article-TreeViewer/TreeViewerArticle.htm
SWT WindowBuilder Pro FREE!! from Google
For More Info Visit http://bit.ly/9ZxwNA
Demo: Create A Sidebar And Try It Out
Add org.eclipse.ui.views extension point
Create view part class
Add com.ibm.rcp.ui.shelfView extension point
Use WindowBuilder to create UI
Try It Out!
Demo adding a view and a sidebar
Agenda
About Eclipse and Lotus Expeditor Toolkit
Installing Lotus Expeditor Toolkit
Plugin Development Basics
Building UI's (SWT / JFace)
API's
Debugging Your Plugins
Building and Deploying
Resources, Examples, and Questions
Do or do not... there is no try. - Yoda
All The APIs You Need
Do not reinvent the wheel!
Java and Eclipse contains a rich set of API's that you can use when developing plugins for Lotus clients
Knowing the API's available to you is crucial
We'll coverJobs (threading)
Logging
Notes backend
Notes frontend
Threading lightly!
A thread is an abstraction in computers to allow programs to perform multiple operations simultaneouslyAvoid tying up the program with background operations
Two ways to call other codeSynchronously == blockingBlocks
current code until call is done and then
returns to continue processing
Like you're used to from LotusScript
Asynchronously == non-blockingThe calling code continues to run
you now
have two pieces of code running
To tell the caller we're done we use callbacks
or listeners
Harder to grasp
Used in AJAX you request data in the
background and once the data has been
fetched you are told
Jobs, jobs, jobs lets vote for jobs!
Eclipse Job Frameworkjava.lang.Thread is way too low-level and error prone
Allows for easy background processing
Very simple to use
Allows scheduling of jobs (run this code in 2 minutes)
Allows weaving of jobs
Allows for listening to job status etc.
Standard UI for manipulating jobs
Two types of JobJob for background processing
UIJob for user interface updates
Both are abstract classes and normally used as anonymous inner classes
HIGHLY recommended article: http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html
There can be only one!
Any Eclipse application only has ONE thread that may update the user interface
It's surprise, surprise called the UI thread
This means thatTying up the UI thread will render the entire client unresponsive
Attempts to access the UI (i.e. set the text of a label) outside the UI thread will fail with an exception
You need a way to do stuff in the UI thread
To do stuff in the UI thread you use an UIJob from the Job API
Using Job in code
public void fireOnTheEmpire(int initDelay, final String jediName) { // create recurring job to poll web service new Job("Poll the Force!") { protected IStatus run(IProgressMonitor monitor) { // invoke endpoint using input String srvc = http://moon5.tatooine.com/JediFinder; WSFacade facade = new WSFacade(srvc); String result = facade.fire(jediName); // do something with the result ...
// reschedule this job (in 5 mintues) this.schedule(5 * 60 * 1000); // return return Status.OK_STATUS; } }.schedule(initialDelay * 60 * 1000);}
Using UIJob in code
final List lstJedis = new List(parent, SWT.NONE);...
public void psssst(final String[] jedis) { // since we're called
in a background process // use that UIJob we learned about to
update the UI new UIJob("Load Jedis") { public IStatus
runInUIThread(IProgressMonitor monitor) { // update UI for (String
jedi : jedis) { lstJedis.add(jedi); }
// return status return Status.OK_STATUS; } }.schedule();}
Don't Go To The Dark Side!
public void createPartControl(Composite parent) { final Label txt = new Label(parent, SWT.NONE); new UIJob("Indicate job starting") { public IStatus runInUIThread(IProgressMonitor monitor) { // update label txt.setText("Turning star cruiser (" + new Date() + ")..."); // do long running task try { Thread.sleep(5000); } catch (Exception e) {} // update label txt.setText("Done turning star cruiser (" + new Date() + ")..."); // schedule this.schedule(5000); // return return Status.OK_STATUS; } }.schedule(5000);}
Weaving jobs
Most operations usually include a UI and a background component so you need to weave jobs
A typical operation from the user consists of 3 steps:
Usually you start of with a UI call (button click i.e. button selection)
You perform some background operation (e.g. load data from a web service or similar)
You need to call back into the UI and update or inform
We call this to weave job
We do it by nesting Job instances
A nice example of how a Jedi does it!
public void widgetSelected(SelectionEvent event) { // update label to tell user we're starting off list.add("Starting to run code (" + new Date() + ")...", 0); // create job for background operation and schedule it new Job("Long running job") { protected IStatus run(IProgressMonitor monitor) { // do operation that possibly takes a while downloadEntireGalacticLibrary(); // call back into UI to tell user we're done new UIJob("Update UI") { public IStatus runInUIThread(IProgressMonitor monitor) { list.add("Done running code (" + new Date() + ")...", 0); return Status.OK_STATUS; } }.schedule(); // return return Status.OK_STATUS; } }.schedule();}
Demo: Using Jobs in your code
Adding a button for background operation
Add selection listener
Load data from the web
Once call is done update the UI
Logging
System.out.println is NEVER the solution!Seems easy at first but 99% of the time it's easier to just use logging from the beginning
Lotus Expeditor / Notes comes with many supported logging mechanismsThe one to use is java.util.logging as it's built-in and easy to use and configure
Logging is done through the Logger class and at a specified LevelLevel (SEVERE, WARNING, INFO, FINE, FINER, FINEST, CONFIG)
Expensive logging may be guarded using isLoggable(Level)
Loggers are hierarchically named and level is set hierarchically as wellcomls11jmp103
ad201
## ## ######## ## ## ####### ## ## ####### ######## ## ######## #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ######### ###### ## ## ## ## ## ## ## ## ## ######## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ## ######## ######## ######## ####### ### ### ####### ## ## ######## ######## ####
Logging example
package com.ls11.demo1;
public class MainViewPart extends ViewPart { private static final Logger logger = Logger.getLogger(MainViewPart.class .getPackage().getName());
public MainViewPart() { try { logger.info("Main view part instantiated"); String senateCount = this.countSenators(); if (logger.isLoggable(Level.FINEST)) { logger.finest("Found + senateCount + senators (" + this + )); } } catch (Throwable t) { logger.severe(There was a disturbance in the Force!, t); } }}
Logging output goes to client logHelp > Support > View Log/Trace
Configured using OSGi console (come to AD201 for more info)
Edit /workspace/.config/rcpinstall.properties and add .level= at the endcom.lekkimworld.twitnotes2.level=FINEST
Logger name will be com.ls11.demo1
Demo: Add logging to the code
Add a logger to our view part
Log the current sunrise and sunset
Enable logging
Notes backend API
You have access to the Notes Java API you know and love!
Basic usage is almost the same as you know and love
To get access to the classes youDO NOT import notes.jar as you normally do
DO depend on the com.ibm.notes.java.api plugin
To access Notes data youDO NOT use NotesThread.sinitThread
DO use the Job API and the supplied NotesSessionJob
new NotesSessionJob("Access Notes data") { public IStatus runInNotesThread(Session session, IProgressMonitor monitor) throws NotesException { // print username System.out.println(session.getDatabase(null, names.nsf).getTitle()); // return return Status.OK_STATUS; } }.schedule();
Notes frontend API
Modeled pretty much like the LotusScript UI APINotesUIWorkspace
NotesUIView
NotesUIDocument
Should run in the UI thread
Ryan (and team) wrote it and bridges a MAJOR gap in the Notes product as it gives us access to the Notes UI from Java
Been with us for a whileAdded in Notes 8.5 as beta
Supported from Notes 8.5.1
More functionality added in Notes 8.5.2
To use it add a dependency on com.ibm.notes.java.ui
Example project available from OpenNTF.org (Java UI API Exerciser)
Notes frontend API (cont.)
NotesUIWorkspaceEntry point
Access to run an agent with context (access to LotusScript!)
NotesUIViewMost functionality added in Notes 8.5.2
Listen for selection events and view entries
Works for Java and traditional views
NotesUIDocumentYou can work in the document on the glass
Access to backend document
Edit / Field / Modify listeners
Access to copy/paste, refresh, reload
Data classes for easy access (i.e. NotesViewData)
Demo: Use the Notes API's
Use NotesSessionJob to access the user's name.nsf file
Place the email addresses of the user's contacts in the list box
Use the composeDocument API to compose an email to a selected contact with the current sunrise and sunset
Notes frontend API (cont.)
The API is a real treasure chest we invite
you to explore it!
There is also a lot of property testers for
controlling visibility of commands and actionsRead the RedWiki for
more info on property
testers
For more on the Notes Java UI API you should mark your schedule forAD201 (How the Jedis do plugin development) on Monday @ 3:45pm in SW 7-10
BP203 (Leveraging the New Java APIs in IBM Lotus Notes 8.5.1 and 8.5.2) on Thursday @ 11.15am in Dolphin S. Hemisphere III
Taking a Sametime Symphony into Account
Plug-in development is much more than Lotus Notes
Remember that Lotus Sametime and Lotus Symphony are built on the same Eclipse technology and your skills can be reused thereDifferent API's but the core stuff is the same - a sidebar view is still a sidebar view
Lotus Expeditor contains a plethora of API's look into those before you reinvent the wheel or say it cannot be doneAsk us if you have specific questions we love showing off! :-)
Other Lotus APIs
AccountsSecure storage for credentials
Automatic authentication for HTTP requests
Lotus SametimeAwareness / realtime collaboration
SearchSearch other applications from the search center
Domino DesignerExtend Domino Designer with custom actions
Composite ApplicationsCreate components for CompApps using Eclipse technology and listen for properties and expose actions
XPages Extensibility LibraryAdd custom widgets for XPages
LiveText / Toolbox (LiveText / Widgets API's is targeted to be publicly supported from 8.5.3)Inject recognizers based on business rules
Eclipse API's
Like with Lotus Notes there a multitude of API's available to you for Selection
Jobs
Actions / menus
Drag'n'drop
Custom drawing
Charting
Explore Eclipse.org and remember to search for Eclipse and not Lotus Notes as it will yield far more results
Agenda
About Eclipse and Lotus Expeditor Toolkit
Installing Lotus Expeditor Toolkit
Plugin Development Basics
Building UI's (SWT / JFace)
API's
Debugging Your Plugins
Building and Deploying
Resources, Examples, and Questions
Do or do not... there is no try. - Yoda
Launching Notes from Eclipse
Set breakpoints
Inspecting variables
The console, logging levels
Demo: Debugging Basics
Show this page but just jump right to a demo
This is probably a good 5 minutes of demo
Probably just show the attachment viewerPreference page or selection
Show the Debug configuration screen
Set a breakpoint line 73, Viewer.java(selectionChanged)
Launch Notes and open an email with an attachment
Explain the variables panel, show the selection object
Then show what the osgi console is all aboutSetting logging levels
Agenda
About Eclipse and Lotus Expeditor Toolkit
Installing Lotus Expeditor Toolkit
Plugin Development Basics
Building UI's (SWT / JFace)
API's
Debugging Your Plugins
Building and Deploying
Resources, Examples, and Questions
Do or do not... there is no try. - Yoda
Sharing Your Plugins
Now that you have coded your plugin you want to share it
Features and Update Sites
Features contain one or more pluginsThe plugins in a feature should be related
Features can be created in Eclipse by creating a feature projectContains a feature.xml and build.properties file
Dependencies can be specified in the feature.xml
Update sites contain one or more featuresUpdate sites typically contain all the features needed for your extension
Can be created and built in Eclipse using an update site project
Feature
Plug-in
Plug-in
. . .Feature
Plug-in
Plug-in
. . .Update Site. . .
Deployment
When deploying features to Lotus products we suggest you use the Update Site template (updatesite.ntf) and a Widget CatalogBetter integration this way, especially via policies
Simpler for the end user
The Update Site template is designed to host your Eclipse features in an update site running on the Domino serverAccess it via HTTP or NRPC
Did you know widgets can be used to deploy Eclipse features?It's true!
All you have to do is create a widget which points to an Eclipse update site
You can use these types of widgets the same way you use other widgets
Demonstration: Features, Update Sites, and Deployment
Create a feature project
Create an update site
Create an update site NSF
Add our feature to the update site NSF
Create a widget for our feature
Add it to the catalog
Watch a video at: http://bit.ly/h4pjMb
Policies
The Widgets feature can be managed via Domino policies
The Domino administrator has control over several aspects of the Widgets feature includingEnablement/disablement of the My Widgets sidebar panel
Installation of widgets and push the installation of widgets to clients
Restrict the installation of widgets based on Provider
Eclipse extension point used
Restrict the installation of widgets to specific typesGoogle Gadget
Plugin
Notes View
etc.
Agenda
About Eclipse and Lotus Expeditor Toolkit
Installing Lotus Expeditor Toolkit
Plugin Development Basics
Building UI's (SWT / JFace)
API's
Debugging Your Plugins
Building and Deploying
Resources, Examples, and Questions
Do or do not... there is no try. - Yoda
Examples
Tunglehttp://bit.ly/f5h2hK
Gist.comhttp://bit.ly/fL37Zr
TwitNoteshttp://bit.ly/e5ZtIi
File Explorerhttp://bit.ly/hlGc5Y
Attachment Viewerhttp://bit.ly/eB8spk
External Resources
Eclipse Community Siteshttp://eclipse.org
http://wiki.eclipse.org
http://planeteclipse.org
Plugin Development articleshttp://www.eclipse.org/resources/?sort=date&category=Plug-ins
Lotus Community SitesNotes Client Java UI Javadochttp://www-10.lotus.com/ldd/ddwiki.nsf/dx/Notes_Client_Java_UI_APIs-v8.5.2
Expeditor JavaDoc http://www-10.lotus.com/ldd/lewiki.nsf/dx/JavaDoc_6.2.2
Planet Lotus http://planetlotus.org/
Great blogs to visit regularlyMikkels - http://lekkimworld.com/
Ryans - http://ryanjbaxter.wordpress.com/
Bob Balfes - http://blog.balfes.net/
Please fill in your evaluations!!
Only positive comments please... :-)
Q&A
Why?!
But?!
How?!
Join the community on lsonline.infohttp://bit.ly/JMP103
Or come talk to us after the mean room staff throws us out! :-) Remember that we're here for you and there's nothing we'll rather do than answer your questions!
May the force be with you.
Legal Disclaimer
IBM Corporation 2011. All Rights Reserved.The information
contained in this publication is provided for informational
purposes only. While efforts were made to verify the completeness
and accuracy of the information contained in this publication, it
is provided AS IS without warranty of any kind, express or implied.
In addition, this information is based on IBMs current product
plans and strategy, which are subject to change by IBM without
notice. IBM shall not be responsible for any damages arising out of
the use of, or otherwise related to, this publication or any other
materials. Nothing contained in this publication is intended to,
nor shall have the effect of, creating any warranties or
representations from IBM or its suppliers or licensors, or altering
the terms and conditions of the applicable license agreement
governing the use of IBM software.References in this presentation
to IBM products, programs, or services do not imply that they will
be available in all countries in which IBM operates. Product
release dates and/or capabilities referenced in this presentation
may change at any time at IBMs sole discretion based on market
opportunities or other factors, and are not intended to be a
commitment to future product or feature availability in any way.
Nothing contained in these materials is intended to, nor shall have
the effect of, stating or implying that any activities undertaken
by you will result in any specific sales, revenue growth or other
results. IBM, the IBM logo, Lotus, Lotus Notes, Notes, Domino,
Quickr, Sametime, WebSphere, UC2, PartnerWorld and Lotusphere are
trademarks of International Business Machines Corporation in the
United States, other countries, or both. Unyte is a trademark of
WebDialogs, Inc., 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.Microsoft and Windows are trademarks of Microsoft Corporation
in the United States, other countries, or both.Linux is a
registered trademark of Linus Torvalds in the United States, other
countries, or both.
Other company, product, or service names may be trademarks or
service marks of others.
Click to add text
2011 IBM Corporation
2011 IBM Corporation
2011 IBM Corporation
2011 IBM Corporation
2011 IBM Corporation