1 package org.apidesign.singletons.api;
3 import java.util.Iterator;
4 import java.util.ServiceLoader;
5 import org.openide.util.Lookup;
7 // BEGIN: singletons.injectable.api
8 public abstract class DialogDisplayer {
9 protected DialogDisplayer() {
12 /** Ask user a question.
14 * @param query the text of the question
15 * @return true if user confirmed or false if declined
17 public abstract boolean yesOrNo(String query);
19 public static DialogDisplayer getDefault() {
22 // FINISH: singletons.injectable.api
25 // BEGIN: singletons.injectable.dummyimpl
26 private static final class Impl extends DialogDisplayer {
27 private static final DialogDisplayer DEFAULT = initialize();
30 public boolean yesOrNo(String query) {
31 System.err.printf("Saying no to '%s'\n", query);
34 // FINISH: singletons.injectable.dummyimpl
36 private static DialogDisplayer initialize() {
37 if (Boolean.getBoolean("singleton.jdk6")) {
38 return initializeServiceLoader();
40 return initializeLookup();
44 // BEGIN: singletons.injectable.serviceloader
45 private static DialogDisplayer initializeServiceLoader() {
46 Iterator<DialogDisplayer> it = null;
47 it = ServiceLoader.load(DialogDisplayer.class).iterator();
48 return it != null && it.hasNext() ? it.next() : new Impl();
50 // END: singletons.injectable.serviceloader
52 // BEGIN: singletons.injectable.lookup
53 private static DialogDisplayer initializeLookup() {
54 final Lookup lkp = Lookup.getDefault();
55 DialogDisplayer def = lkp.lookup(DialogDisplayer.class);
56 return def != null ? def : new Impl();
58 // END: singletons.injectable.lookup