Top Banner
NetBeans TM Software Day at 2005 JavaOne SM Conference Developing Plug-Ins for NetBeans Tim Boudreau Staff Engineer Sun Microsystems NetBeans TM Software Day at 2005 JavaOne SM Conference
32
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Developing Plug-Ins for NetBeans

Tim BoudreauStaff EngineerSun Microsystems

NetBeansTM Software Day at 2005 JavaOneSM Conference

Page 2: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Agenda

● NetBeans Overview● Plug-In Development Support● Architectural Background● Developing a Plug-In

Page 3: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Modular Design

Page 4: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Everything is a Plug-In

Page 5: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

● A jar file with some special manifest entries

OpenIDE-Module: org.netbeans.modules.project.ant/1

OpenIDE-Module-IDE-Dependencies: IDE/1 > 4.48

OpenIDE-Module-Specification-Version: 1.6

OpenIDE-Module-Implementation-Version: 050219

OpenIDE-Module-Public-Packages: org.netbeans.api.project.ant.*, org.ne

tbeans.spi.project.ant.*

OpenIDE-Module-Module-Dependencies: org.netbeans.modules.projectapi/1,

org.netbeans.modules.queries/1, org.openide.loaders

OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bun

dle.properties

What is a plug-in (module)

Page 6: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

● Module code-name

OpenIDE-Module: org.netbeans.modules.project.ant/1

OpenIDE-Module-IDE-Dependencies: IDE/1 > 4.48

OpenIDE-Module-Specification-Version: 1.6

OpenIDE-Module-Implementation-Version: 050219

OpenIDE-Module-Public-Packages: org.netbeans.api.project.ant.*, org.ne

tbeans.spi.project.ant.*

OpenIDE-Module-Module-Dependencies: org.netbeans.modules.projectapi/1,

org.netbeans.modules.queries/1, org.openide.loaders

OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bun

dle.properties

What is a plug-in (module)

Page 7: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

● What version of the main APIs does it need

OpenIDE-Module: org.netbeans.modules.project.ant/1

OpenIDE-Module-IDE-Dependencies: IDE/1 > 4.48

OpenIDE-Module-Specification-Version: 1.6

OpenIDE-Module-Implementation-Version: 050219

OpenIDE-Module-Public-Packages: org.netbeans.api.project.ant.*, org.ne

tbeans.spi.project.ant.*

OpenIDE-Module-Module-Dependencies: org.netbeans.modules.projectapi/1,

org.netbeans.modules.queries/1, org.openide.loaders

OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bun

dle.properties

What is a plug-in (module)

Page 8: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

● Modules have version numbers

OpenIDE-Module: org.netbeans.modules.project.ant/1

OpenIDE-Module-IDE-Dependencies: IDE/1 > 4.48

OpenIDE-Module-Specification-Version: 1.6

OpenIDE-Module-Implementation-Version: 050219

OpenIDE-Module-Public-Packages: org.netbeans.api.project.ant.*, org.ne

tbeans.spi.project.ant.*

OpenIDE-Module-Module-Dependencies: org.netbeans.modules.projectapi/1,

org.netbeans.modules.queries/1, org.openide.loaders

OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bun

dle.properties

What is a plug-in (module)

Page 9: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

● Modules can expose APIs

OpenIDE-Module: org.netbeans.modules.project.ant/1

OpenIDE-Module-IDE-Dependencies: IDE/1 > 4.48

OpenIDE-Module-Specification-Version: 1.6

OpenIDE-Module-Implementation-Version: 050219

OpenIDE-Module-Public-Packages: org.netbeans.api.project.ant.*, org.ne

tbeans.spi.project.ant.*

OpenIDE-Module-Module-Dependencies: org.netbeans.modules.projectapi/1,

org.netbeans.modules.queries/1, org.openide.loaders

OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bun

dle.properties

What is a plug-in (module)

Page 10: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

● Modules can use APIs from other modules

OpenIDE-Module: org.netbeans.modules.project.ant/1

OpenIDE-Module-IDE-Dependencies: IDE/1 > 4.48

OpenIDE-Module-Specification-Version: 1.6

OpenIDE-Module-Implementation-Version: 050219

OpenIDE-Module-Public-Packages: org.netbeans.api.project.ant.*, org.ne

tbeans.spi.project.ant.*

OpenIDE-Module-Module-Dependencies: org.netbeans.modules.projectapi/1,

org.netbeans.modules.queries/1, org.openide.loaders

OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bun

dle.properties

What is a plug-in (module)

Page 11: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

● Everything is localized

OpenIDE-Module: org.netbeans.modules.project.ant/1

OpenIDE-Module-IDE-Dependencies: IDE/1 > 4.48

OpenIDE-Module-Specification-Version: 1.6

OpenIDE-Module-Implementation-Version: 050219

OpenIDE-Module-Public-Packages: org.netbeans.api.project.ant.*, org.ne

tbeans.spi.project.ant.*

OpenIDE-Module-Module-Dependencies: org.netbeans.modules.projectapi/1,

org.netbeans.modules.queries/1, org.openide.loaders

OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/ant/Bun

dle.properties

What is a plug-in (module)

Page 12: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Anatomy of a Module

Page 13: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

● NetBeans Plugin Projects● New Plugin Template● API class templates● Build Plugins outside source tree– Deploy to

● Separate Binary● Platform-only Binary● Current IDE

DEMO: Creating a Plugin

Plugin Support in NetBeans 4.2

Page 14: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

How the Hello World module works

● Installs a layer file which– Is merged into the system (configuration) filesystem– Defines a virtual filesystem fragment– Installs an instance file

● Points to a standard Swing Action

Page 15: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Filesystems API

● FileObjects: Abstraction over java.io.File– “Files” may not be on disk

● XML● Remote (FTP, NFS)● Database, etc.

– Support● Listening for changes● Ad-hoc “attributes” (key-value pairs)● Live in a FileSystem – a namespace

● Used for both config data + user's files

Page 16: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Filesystems – virtual files

Page 17: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

XML Filesystems – very virtual files

Page 18: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Layered Filesystem

Page 19: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

System (configuration) Filesystem

Page 20: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

A Tour of the System Filesystem

DEMO: Browsing the layer file and System FS

Page 21: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

DataObjects wrap Files

Page 22: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

DataSystems API

● DataObjects – wrap 1 or more FileObjects– “Typed” files – knows what the content is

● Different DataObject types for different MIME types– Programmatic access to file contents

● Structural or parsed representation of contents● Support for editing, etc.

● DataLoaders– Factories for DataObject– Recognize and claim FileObjects by extension or

contents

Page 23: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

DataSystems

Page 24: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Nodes API

● Presentation layer on top of DataObjects – add– Icon, display name, menu actions, properties, child

nodes● Generic hierarchy API● Displayed to user with the Explorer API– Tree, List, Combo, Menu, TreeTable and other

views● Don't have to represent files

Page 25: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

From Files to Nodes

Page 26: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Factory Relationships – Files to Nodes

Page 27: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Lookup Patterns

● “Glue” between disparate APIs● Common pattern: To ask an object for an

implementation of some interface– SomeObject.getLookup().lookup (SomeIFace.class);– SomeObject.getCookie (SomeIFace.class);

Page 28: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Lookup API

● A way to find objects (dependency injection)● Global singletons

● Lookup.getDefault().lookup (SomeInterface.class)

● Objects belonging to another object● node.getLookup().lookup (SomeInterface.class)● dataObject.getCookie (SomeInterface.class)

● Why lookup?● Lazy instantiation – create on demand● Evolution● Its hard to add/remove methods● Its easy to change what lives in an object's Lookup

Page 29: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Global Lookup Registration

● Instance file in system filesystem:<folder name=”services”>

<file name=”org-foo-mymodule-MyService.instance”/>

</folder>

● META-INF/services entry in jar:● A single file that names the interface implemented

● META-INF/services/org.openide.ErrorManager

● With a single line of text naming the implementation class● com.mycom.mymodule.MyErrorManagerImpl

Page 30: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

getLookup() vs. getCookie()

● Newer idiom● someobject.getLookup().lookup (SomeClass.class)

● Older idiom● someobject.getCookie (SomeClass.class)

● Principle difference● Lookup is more generic● Objects in a Lookup don't have to implement the marker

interface Node.Cookie

Page 31: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM Conference

Povray

Page 32: Developing Plug-Ins for NetBeans

NetBeansTM Software Day at 2005 JavaOneSM ConferenceNetBeansTM Software Day at 2005 JavaOneSM Conference

Developing Plug-Ins for NetBeans

Tim BoudreauStaff EngineerSun Microsystems