samples/aserverinfo/src/org/apidesign/aserverinfo/AServerInfo.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:53:57 +0200
changeset 91 3280450405a0
parent 90 30a0c70c6579
child 92 f6e64df4f962
permissions -rw-r--r--
review2: Note about Tune and DVB Central. Finished example with AServerInfo
     1 package org.apidesign.aserverinfo;
     2 
     3 import java.net.URL;
     4 import java.util.concurrent.Callable;
     5 import org.openide.util.Lookup;
     6 
     7 public final class AServerInfo {
     8     private final Callable<String> name;
     9     private final Callable<URL> url;
    10     private final Callable<Void> reset;
    11     private final Callable<Void> shutdown;
    12 
    13     private AServerInfo(Callable<String> name, Callable<URL> url, Callable<Void> reset, Callable<Void> s) {
    14         this.name = name;
    15         this.url = url;
    16         this.reset = reset;
    17         this.shutdown = s;
    18     }
    19     
    20     //
    21     // API for clients
    22     //
    23     
    24     public String getName() {
    25         return call(name, "noname");
    26     }
    27     
    28     public URL getURL() {
    29         return call(url, null);
    30     }
    31     
    32     public void reset() throws Exception {
    33         if (reset != null) {
    34             reset.call();
    35         }
    36     }
    37     
    38     public void shutdown() throws Exception {
    39         if (shutdown != null) {
    40             shutdown.call();
    41         }
    42     }
    43 
    44     //
    45     // factories
    46     //
    47 
    48     // BEGIN: aserverinfo.create
    49     public interface NameProvider {
    50         public String getName();
    51     }
    52     public interface URLProvider {
    53         public URL getURL();
    54     }
    55     public interface ResetHandler {
    56         public void reset();
    57     }
    58     
    59     public static AServerInfo create(final Lookup interfaces) 
    60     // END: aserverinfo.create
    61     {
    62         Callable<String> nameP = new Callable<String>() {
    63             public String call() throws Exception {
    64                 NameProvider p = interfaces.lookup(NameProvider.class);
    65                 return p == null ? "noname" : p.getName();
    66             }
    67         };
    68         Callable<URL> urlP = new Callable<URL>() {
    69             public URL call() throws Exception {
    70                 URLProvider p = interfaces.lookup(URLProvider.class);
    71                 return p == null ? null : p.getURL();
    72             }
    73         };
    74         Callable<Void> resetP = new Callable<Void>() {
    75             public Void call() throws Exception {
    76                 ResetHandler h = interfaces.lookup(ResetHandler.class);
    77                 if (h != null) {
    78                     h.reset();
    79                 }
    80                 return null;
    81             }
    82         };
    83         
    84         return new AServerInfo(nameP, urlP, resetP, null);
    85     }
    86     
    87     // BEGIN: aserverinfo.regularcreate
    88     public static AServerInfo create(NameProvider nameProvider, URLProvider urlProvider, ResetHandler reset)
    89     // END: aserverinfo.regularcreate
    90     {
    91         return create(nameProvider, urlProvider, reset, null);
    92     }
    93     
    94     // BEGIN: aserverinfo.regularcreate.withshutdown
    95     /** @since 2.0 */
    96     public interface ShutdownHandler {
    97         public void shutdown();
    98     }
    99     
   100     /** @since 2.0 */
   101     public static AServerInfo create(NameProvider nameProvider, URLProvider urlProvider, ResetHandler reset, ShutdownHandler shutdown)
   102     // END: aserverinfo.regularcreate.withshutdown
   103     {
   104         final NameProvider np = nameProvider;
   105         final URLProvider up = urlProvider;
   106         final ResetHandler h = reset;
   107         final ShutdownHandler s = shutdown;
   108         
   109         Callable<String> nameP = new Callable<String>() {
   110             public String call() throws Exception {
   111                 return np == null ? "noname" : np.getName();
   112             }
   113         };
   114         Callable<URL> urlP = new Callable<URL>() {
   115             public URL call() throws Exception {
   116                 return up == null ? null : up.getURL();
   117             }
   118         };
   119         Callable<Void> resetP = new Callable<Void>() {
   120             public Void call() throws Exception {
   121                 if (h != null) {
   122                     h.reset();
   123                 }
   124                 return null;
   125             }
   126         };
   127         Callable<Void> shutP = new Callable<Void>() {
   128             public Void call() throws Exception {
   129                 if (s != null) {
   130                     s.shutdown();
   131                 }
   132                 return null;
   133             }
   134         };
   135         
   136         return new AServerInfo(nameP, urlP, resetP, shutP);
   137     }
   138 
   139     //
   140     // cumulative factory methods
   141     //
   142     
   143     // BEGIN: aserverinfo.cumulative.factory
   144     public static AServerInfo empty() {
   145         return new AServerInfo(null, null, null, null);
   146     }
   147     
   148     public final AServerInfo nameProvider(final NameProvider np) {
   149         Callable<String> nameP = new Callable<String>() {
   150             public String call() throws Exception {
   151                 return np == null ? "noname" : np.getName();
   152             }
   153         };
   154         return new AServerInfo(nameP, this.url, this.reset, this.shutdown);
   155     }
   156     // END: aserverinfo.cumulative.empty
   157 
   158     public final AServerInfo urlProvider(final URLProvider up) {
   159         Callable<URL> urlP = new Callable<URL>() {
   160             public URL call() throws Exception {
   161                 return up == null ? null : up.getURL();
   162             }
   163         };
   164         return new AServerInfo(this.name, urlP, this.reset, this.shutdown);
   165     }
   166     public final AServerInfo reset(final ResetHandler h) {
   167         Callable<Void> resetP = new Callable<Void>() {
   168             public Void call() throws Exception {
   169                 if (h != null) {
   170                     h.reset();
   171                 }
   172                 return null;
   173             }
   174         };
   175         return new AServerInfo(this.name, this.url, resetP, this.shutdown);
   176     }
   177     public final AServerInfo shutdown(final ShutdownHandler s) {
   178         Callable<Void> shutP = new Callable<Void>() {
   179             public Void call() throws Exception {
   180                 if (s != null) {
   181                     s.shutdown();
   182                 }
   183                 return null;
   184             }
   185         };
   186         return new AServerInfo(this.name, this.url, this.reset, shutP);
   187     }
   188     
   189     //
   190     // Support implementations
   191     //
   192     
   193     private static <T> T call(Callable<T> name, T defValue) {
   194         try {
   195             return name.call();
   196         } catch (Exception ex) {
   197             return defValue;
   198         }
   199     }
   200 
   201     
   202 }