Developing Plug-Ins for NetBeans

32
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

description

 

Transcript of Developing Plug-Ins for NetBeans

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