review2: Note about Tune and DVB Central. Finished example with AServerInfo
1 package org.apidesign.aserverinfo;
4 import java.util.concurrent.Callable;
5 import org.openide.util.Lookup;
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;
13 private AServerInfo(Callable<String> name, Callable<URL> url, Callable<Void> reset, Callable<Void> s) {
24 public String getName() {
25 return call(name, "noname");
29 return call(url, null);
32 public void reset() throws Exception {
38 public void shutdown() throws Exception {
39 if (shutdown != null) {
48 // BEGIN: aserverinfo.create
49 public interface NameProvider {
50 public String getName();
52 public interface URLProvider {
55 public interface ResetHandler {
59 public static AServerInfo create(final Lookup interfaces)
60 // END: aserverinfo.create
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();
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();
74 Callable<Void> resetP = new Callable<Void>() {
75 public Void call() throws Exception {
76 ResetHandler h = interfaces.lookup(ResetHandler.class);
84 return new AServerInfo(nameP, urlP, resetP, null);
87 // BEGIN: aserverinfo.regularcreate
88 public static AServerInfo create(NameProvider nameProvider, URLProvider urlProvider, ResetHandler reset)
89 // END: aserverinfo.regularcreate
91 return create(nameProvider, urlProvider, reset, null);
94 // BEGIN: aserverinfo.regularcreate.withshutdown
96 public interface ShutdownHandler {
97 public void shutdown();
101 public static AServerInfo create(NameProvider nameProvider, URLProvider urlProvider, ResetHandler reset, ShutdownHandler shutdown)
102 // END: aserverinfo.regularcreate.withshutdown
104 final NameProvider np = nameProvider;
105 final URLProvider up = urlProvider;
106 final ResetHandler h = reset;
107 final ShutdownHandler s = shutdown;
109 Callable<String> nameP = new Callable<String>() {
110 public String call() throws Exception {
111 return np == null ? "noname" : np.getName();
114 Callable<URL> urlP = new Callable<URL>() {
115 public URL call() throws Exception {
116 return up == null ? null : up.getURL();
119 Callable<Void> resetP = new Callable<Void>() {
120 public Void call() throws Exception {
127 Callable<Void> shutP = new Callable<Void>() {
128 public Void call() throws Exception {
136 return new AServerInfo(nameP, urlP, resetP, shutP);
140 // cumulative factory methods
143 // BEGIN: aserverinfo.cumulative.factory
144 public static AServerInfo empty() {
145 return new AServerInfo(null, null, null, null);
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();
154 return new AServerInfo(nameP, this.url, this.reset, this.shutdown);
156 // END: aserverinfo.cumulative.empty
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();
164 return new AServerInfo(this.name, urlP, this.reset, this.shutdown);
166 public final AServerInfo reset(final ResetHandler h) {
167 Callable<Void> resetP = new Callable<Void>() {
168 public Void call() throws Exception {
175 return new AServerInfo(this.name, this.url, resetP, this.shutdown);
177 public final AServerInfo shutdown(final ShutdownHandler s) {
178 Callable<Void> shutP = new Callable<Void>() {
179 public Void call() throws Exception {
186 return new AServerInfo(this.name, this.url, this.reset, shutP);
190 // Support implementations
193 private static <T> T call(Callable<T> name, T defValue) {
196 } catch (Exception ex) {