org.netbeans.modules.projectapi/1 1.45

org.netbeans.spi.project
Annotation Type ProjectServiceProvider


@Retention(value=SOURCE)
@Target(value={TYPE,METHOD})
public @interface ProjectServiceProvider

Like LookupProvider but registers a single object into a project's lookup. An annotated class must have one public constructor, which may take Project and/or Lookup parameters. An annotated factory method must have similar parameters.

public final class TestAction implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.err.println("===> running action");
        for (Project p : OpenProjects.getDefault().getOpenProjects()) {
            Service s = p.getLookup().lookup(Service.class);
            if (s != null) {
                System.err.println("===> got a service: " + s.m());
            } else {
                System.err.println("===> nothing for " + p);
            }
        }
    }
    public static abstract class Service {
        static {
            System.err.println("===> loading Service");
        }
        public abstract String m();
    }
    @ProjectServiceProvider(service=Service.class,
                            projectType="org-netbeans-modules-java-j2seproject")
    public static class ServiceImpl extends Service {
        static {
            System.err.println("===> loading ServiceImpl");
        }
        private final Project p;
        public ServiceImpl(Project p) {
            this.p = p;
            System.err.println("===> new ServiceImpl on " + p);
        }
        public String m() {
            return ProjectUtils.getInformation(p).getDisplayName();
        }
    }
}
 

To avoid deadlocks, stack overflows, and the like, an implementation accepting a Project in its constructor (or factory method) may not examine that project's lookup inside the constructor. It is fine to use the project lookup from other service methods called later, typically to find "sister" services (such as ProjectInformation in the example above). It is also safe to accept a Lookup in the constructor and examine its contents, since this is the "base lookup" supplied to LookupProviderSupport.createCompositeLookup(org.openide.util.Lookup, java.lang.String), which will not have other declaratively registered services anyway.

Since:
org.netbeans.modules.projectapi/1 1.23
See Also:
LookupProviderSupport.createCompositeLookup(org.openide.util.Lookup, java.lang.String)

Required Element Summary
 Class<?>[] service
          Service class(es) to be registered.
 
Optional Element Summary
 String[] projectType
          Token(s) denoting one or more project types, e.g.
 LookupProvider.Registration.ProjectType[] projectTypes
          Alternate registration of project types with positions.
 

Element Detail

service

public abstract Class<?>[] service
Service class(es) to be registered. The annotated class must be assignable to the service class(es).

projectType

public abstract String[] projectType
Token(s) denoting one or more project types, e.g. "org-netbeans-modules-java-j2seproject" LookupProviderSupport.createCompositeLookup(org.openide.util.Lookup, java.lang.String) may be used with the path Projects/TYPE/Lookup.

Default:
{}

projectTypes

public abstract LookupProvider.Registration.ProjectType[] projectTypes
Alternate registration of project types with positions. You must specify either this or projectType() (or both).

Default:
{}

org.netbeans.modules.projectapi/1 1.45

Built on May 24 2012.  |  Portions Copyright 1997-2012 Oracle. All rights reserved.