1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/samples/singletons/src/org/apidesign/singletons/api/DialogDisplayer.java Wed Jan 27 18:30:57 2010 +0100
1.3 @@ -0,0 +1,60 @@
1.4 +package org.apidesign.singletons.api;
1.5 +
1.6 +import java.util.Iterator;
1.7 +import java.util.ServiceLoader;
1.8 +import org.openide.util.Lookup;
1.9 +
1.10 +// BEGIN: singletons.injectable.api
1.11 +public abstract class DialogDisplayer {
1.12 + protected DialogDisplayer() {
1.13 + }
1.14 +
1.15 + /** Ask user a question.
1.16 + *
1.17 + * @param query the text of the question
1.18 + * @return true if user confirmed or false if declined
1.19 + */
1.20 + public abstract boolean yesOrNo(String query);
1.21 +
1.22 + public static DialogDisplayer getDefault() {
1.23 + return Impl.DEFAULT;
1.24 + }
1.25 + // FINISH: singletons.injectable.api
1.26 +
1.27 +
1.28 + // BEGIN: singletons.injectable.dummyimpl
1.29 + private static final class Impl extends DialogDisplayer {
1.30 + private static final DialogDisplayer DEFAULT = initialize();
1.31 +
1.32 + @Override
1.33 + public boolean yesOrNo(String query) {
1.34 + System.err.printf("Saying no to '%s'\n", query);
1.35 + return false;
1.36 + }
1.37 + // FINISH: singletons.injectable.dummyimpl
1.38 +
1.39 + private static DialogDisplayer initialize() {
1.40 + if (Boolean.getBoolean("singleton.jdk6")) {
1.41 + return initializeServiceLoader();
1.42 + } else {
1.43 + return initializeLookup();
1.44 + }
1.45 + }
1.46 +
1.47 + // BEGIN: singletons.injectable.serviceloader
1.48 + private static DialogDisplayer initializeServiceLoader() {
1.49 + // see http://singletons.apidesign.org
1.50 + Iterator<DialogDisplayer> it = null;
1.51 + it = ServiceLoader.load(DialogDisplayer.class).iterator();
1.52 + return it != null && it.hasNext() ? it.next() : new Impl();
1.53 + }
1.54 + // END: singletons.injectable.serviceloader
1.55 +
1.56 + // BEGIN: singletons.injectable.lookup
1.57 + private static DialogDisplayer initializeLookup() {
1.58 + DialogDisplayer def = Lookup.getDefault().lookup(DialogDisplayer.class);
1.59 + return def != null ? def : new Impl();
1.60 + }
1.61 + // END: singletons.injectable.lookup
1.62 + }
1.63 +}