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 // see http://singletons.apidesign.org
47 Iterator<DialogDisplayer> it = null;
48 it = ServiceLoader.load(DialogDisplayer.class).iterator();
49 return it != null && it.hasNext() ? it.next() : new Impl();
51 // END: singletons.injectable.serviceloader
53 // BEGIN: singletons.injectable.lookup
54 private static DialogDisplayer initializeLookup() {
55 DialogDisplayer def = Lookup.getDefault().lookup(DialogDisplayer.class);
56 return def != null ? def : new Impl();
58 // END: singletons.injectable.lookup