Lessons Learned Writing the AWS Toolkit for Eclipse Zach Musgrave & Jason Fulghum Amazon Web Services March 28, 2013
Lessons Learned • Error Reporting • Build Automation and Distribution • Responsive UIs • Resource Management • Data Binding • Build on Eclipse Platform Projects • Tips and Tricks
Error Reporting When your software inevitably breaks.
Use the Error Log • Use Plugin’s getLog() method: • getLog().log(new Status(Status.ERROR, PLUGIN_ID, errorMessage, e)); • Or… use StatusManager directly, for more control
Proactively Debug Problems • Help your customers collect basic debugging information before you have to ask • Make it as easy as possible to report problems, or you might not find out about bugs before you start losing customers
Build Automation Release early and often; make it easy!
PDE Build • Eclipse’s standard release engineering tools • Built on Ant, so easy to integrate into existing build processes
Update Site Hosting • Plugins and features stored in Amazon S3 • Distributed through Amazon CloudFront for fast downloads from edge locations all over the world • Old versions remain in Amazon S3 if needed • Use Amazon CloudFront access logs feature for download metrics
Responsive UIs The UI thread is for UI, and nothing else. Really.
Number One Tip: DON’T DO SYNCHRONOUS IO IN THE UI THREAD! Seriously, not even once.
Jobs Framework • For work that needs customer visibility, but will take some amount of time
Cancelable Thread • Pattern for short-lived, but potentially disruptive IO work • Example: populate a Combo using data from a web service call
Cancelable Thread • From the UI: cancel any running thread, then start a new one • From the CancelableThread: do non-UI work (web services calls), then: • Check if canceled • If not, update UI • Otherwise exit • Synchronization is important
SWT Table Trees • Better performance than regular Tables • Use SWT.VIRTUAL to speed them up more
Display Thread Execution • Display.asyncExec(Runnable) • Display.syncExec(Runnable)
Resource Management Why make X copies when 1 will do?
Sharing Images with the Registry • Override AbstractUIPlugin#createImageRegistry()
Font Management • Remember: fonts use file handles! • Don’t create a font just to apply it to a control • Share fonts as much as possible, and remember to dispose() of them when they aren’t needed anymore • Or use shared fonts, like in JFaceResources
JFace Data Binding A cleaner way to implement MVC, but with a steep learning curve.
JFace Data Binding API • The basic idea: bind your data model to a UI element, and when one changes the other does too IObservableValue model = PojoObservables.observeValue(pojo, “field”); IObservabletarget = SWTObservables.observeText(text, SWT.Modify); bindingContext.bindValue(target, model);
Validation • Fields can validate themselves • Aggregate status gets rolled up
Build on Eclipse Platform Projects Stand on the shoulders of giants.
Web Tools Platform (WTP) • Tools for developing and deploying web and Java EE applications • Used in the toolkit for: • Deploying AWS Java web apps to AWS Elastic Beanstalkthrough custom server types
Data Tools Platform (DTP) • Vendor neutral platform and tools for working with relational and non-relational data sources • Used in the toolkit for: • Connecting to Amazon RDS databases • Browsing and editing Amazon SimpleDB data sources
Common Navigator Framework (CNF) • Aggregates data contributed by multiple plugins into a single, hierarchical tree view • Good support for drag and drop actions • Used in the toolkit for: • AWS Explorer view
Tips and Tricks A miscellany of time-saving advice.
Message Dialog • Easy pluggable dialog box with an optional custom control area
Eclipse Forms • Easy way to create clean, easy to use UIs
IDialogSettings • Used to store hierarchical data to persist preferences and history for views, dialogs, and wizards • Allows UIs to be prepopulated with users’ previous selections and history
Get the Source • Look for “SDK” packages on update sites
F4 Hierarchy • Q: How do I implement this interface? • A: Copy someone else!