samples/aserverinfo/src/org/apidesign/aserverinfo/AServerInfo.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:53:51 +0200
changeset 90 30a0c70c6579
child 91 3280450405a0
permissions -rw-r--r--
AServerInfo projectized, except the final advice to create the "clonning factory"
     1 package org.apidesign.aserverinfo;
     2 
     3 import java.net.URL;
     4 import java.util.concurrent.Callable;
     5 import org.openide.util.Exceptions;
     6 import org.openide.util.Lookup;
     7 
     8 public final class AServerInfo {
     9     private final Callable<String> name;
    10     private final Callable<URL> url;
    11     private final Callable<Void> reset;
    12     private final Callable<Void> shutdown;
    13 
    14     public AServerInfo(Callable<String> name, Callable<URL> url, Callable<Void> reset, Callable<Void> s) {
    15         this.name = name;
    16         this.url = url;
    17         this.reset = reset;
    18         this.shutdown = s;
    19     }
    20     
    21     public String getName() {
    22         return call(name, "noname");
    23     }
    24     
    25     public URL getURL() {
    26         return call(url, null);
    27     }
    28     
    29     public void reset() throws Exception {
    30         reset.call();
    31     }
    32     
    33     public void shutdown() throws Exception {
    34         shutdown.call();
    35     }
    36     
    37     
    38 
    39     private static <T> T call(Callable<T> name, T defValue) {
    40         try {
    41             return name.call();
    42         } catch (Exception ex) {
    43             return defValue;
    44         }
    45     }
    46 
    47     // BEGIN: aserverinfo.create
    48     public interface NameProvider {
    49         public String getName();
    50     }
    51     public interface URLProvider {
    52         public URL getURL();
    53     }
    54     public interface ResetHandler {
    55         public void reset();
    56     }
    57     
    58     public static AServerInfo create(final Lookup interfaces) 
    59     // END: aserverinfo.create
    60     {
    61         Callable<String> nameP = new Callable<String>() {
    62             public String call() throws Exception {
    63                 NameProvider p = interfaces.lookup(NameProvider.class);
    64                 return p == null ? "noname" : p.getName();
    65             }
    66         };
    67         Callable<URL> urlP = new Callable<URL>() {
    68             public URL call() throws Exception {
    69                 URLProvider p = interfaces.lookup(URLProvider.class);
    70                 return p == null ? null : p.getURL();
    71             }
    72         };
    73         Callable<Void> resetP = new Callable<Void>() {
    74             public Void call() throws Exception {
    75                 ResetHandler h = interfaces.lookup(ResetHandler.class);
    76                 if (h != null) {
    77                     h.reset();
    78                 }
    79                 return null;
    80             }
    81         };
    82         
    83         return new AServerInfo(nameP, urlP, resetP, null);
    84     }
    85     
    86     // BEGIN: aserverinfo.regularcreate
    87     public static AServerInfo create(NameProvider nameProvider, URLProvider urlProvider, ResetHandler reset)
    88     // END: aserverinfo.regularcreate
    89     {
    90         return create(nameProvider, urlProvider, reset, null);
    91     }
    92     
    93     // BEGIN: aserverinfo.regularcreate.withshutdown
    94     /** @since 2.0 */
    95     public interface ShutdownHandler {
    96         public void shutdown();
    97     }
    98     
    99     /** @since 2.0 */
   100     public static AServerInfo create(NameProvider nameProvider, URLProvider urlProvider, ResetHandler reset, ShutdownHandler shutdown)
   101     // END: aserverinfo.regularcreate.withshutdown
   102     {
   103         final NameProvider np = nameProvider;
   104         final URLProvider up = urlProvider;
   105         final ResetHandler h = reset;
   106         final ShutdownHandler s = shutdown;
   107         
   108         Callable<String> nameP = new Callable<String>() {
   109             public String call() throws Exception {
   110                 return np == null ? "noname" : np.getName();
   111             }
   112         };
   113         Callable<URL> urlP = new Callable<URL>() {
   114             public URL call() throws Exception {
   115                 return up == null ? null : up.getURL();
   116             }
   117         };
   118         Callable<Void> resetP = new Callable<Void>() {
   119             public Void call() throws Exception {
   120                 if (h != null) {
   121                     h.reset();
   122                 }
   123                 return null;
   124             }
   125         };
   126         Callable<Void> shutP = new Callable<Void>() {
   127             public Void call() throws Exception {
   128                 if (s != null) {
   129                     s.shutdown();
   130                 }
   131                 return null;
   132             }
   133         };
   134         
   135         return new AServerInfo(nameP, urlP, resetP, shutP);
   136     }
   137     
   138     
   139     
   140 }