# HG changeset patch # User Jaroslav Tulach # Date 1226733560 -3600 # Node ID 0753acb192c7f9ac8ffffff871f5ccb81481e031 # Parent 4feb55fa3c91441c9b539f1a0f88b405d1d50381 Adding builder pattern diff -r 4feb55fa3c91 -r 0753acb192c7 samples/aserverinfo/src/org/apidesign/aserverinfo/builder/ServerConnector.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/aserverinfo/src/org/apidesign/aserverinfo/builder/ServerConnector.java Sat Nov 15 08:19:20 2008 +0100 @@ -0,0 +1,53 @@ +package org.apidesign.aserverinfo.builder; + +import org.apidesign.aserverinfo.spi.NameProvider; +import org.apidesign.aserverinfo.spi.ResetHandler; +import org.apidesign.aserverinfo.spi.URLProvider; +import java.net.URL; +import org.apidesign.aserverinfo.spi.ShutdownHandler; + +// BEGIN: aserverinfo.builder.api +public final class ServerConnector { + public String getName() { + return name == null ? "noname" : name.getName(); + } + + public URL getURL() { + return url == null ? null : url.getURL(); + } + + public void reset() { + if (reset != null) { + reset.reset(); + } + } + + /** Additional method for API clients not available from first version. + * @since 2.0 + */ + public void shutdown() { + if (shutdown != null) { + shutdown.shutdown(); + } + } +// FINISH: aserverinfo.builder.api + + // + // private part + // + + private final NameProvider name; + private final URLProvider url; + private final ResetHandler reset; + private final ShutdownHandler shutdown; + + ServerConnector( + NameProvider name, URLProvider url, + ResetHandler reset, ShutdownHandler shutdown + ) { + this.name = name; + this.url = url; + this.reset = reset; + this.shutdown = shutdown; + } +} diff -r 4feb55fa3c91 -r 0753acb192c7 samples/aserverinfo/src/org/apidesign/aserverinfo/builder/ServerInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/aserverinfo/src/org/apidesign/aserverinfo/builder/ServerInfo.java Sat Nov 15 08:19:20 2008 +0100 @@ -0,0 +1,67 @@ +package org.apidesign.aserverinfo.builder; + +import org.apidesign.aserverinfo.spi.NameProvider; +import org.apidesign.aserverinfo.spi.ResetHandler; +import org.apidesign.aserverinfo.spi.ShutdownHandler; +import org.apidesign.aserverinfo.spi.URLProvider; + +/** + * + * @author Jaroslav Tulach + */ +public class ServerInfo { + + // + // cumulative factory methods for the builder pattern + // + + // BEGIN: aserverinfo.builder.factory + public static ServerInfo empty() { + return new ServerInfo(null, null, null, null); + } + + public final ServerInfo nameProvider(NameProvider np) { + return new ServerInfo(np, this.url, this.reset, this.shutdown); + } + + public final ServerInfo urlProvider(URLProvider up) { + return new ServerInfo(this.name, up, this.reset, this.shutdown); + } + public final ServerInfo reset(ResetHandler h) { + return new ServerInfo(this.name, this.url, h, this.shutdown); + } + /** All one needs to do when there is a need to add new + * style of creation is to add new method for a builder. + * @param handler + * @return + * @since 2.0 + */ + public final ServerInfo shutdown(ShutdownHandler handler) { + return new ServerInfo(this.name, this.url, this.reset, handler); + } + + /** Creates the server connector based on current values in the + * info. Builder factory method. + * @return server connector + */ + public final ServerConnector connect() { + return new ServerConnector(name, url, reset, shutdown); + } + // END: aserverinfo.builder.factory + + private final NameProvider name; + private final URLProvider url; + private final ResetHandler reset; + private final ShutdownHandler shutdown; + + private ServerInfo( + NameProvider name, URLProvider url, + ResetHandler reset, ShutdownHandler shutdown + ) { + this.name = name; + this.url = url; + this.reset = reset; + this.shutdown = shutdown; + } + +} diff -r 4feb55fa3c91 -r 0753acb192c7 samples/aserverinfo/test/org/apidesign/aserverinfo/test/BuilderFactoryTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/aserverinfo/test/org/apidesign/aserverinfo/test/BuilderFactoryTest.java Sat Nov 15 08:19:20 2008 +0100 @@ -0,0 +1,92 @@ +package org.apidesign.aserverinfo.test; + +import java.net.MalformedURLException; +import java.net.URL; +import org.apidesign.aserverinfo.builder.ServerConnector; +import org.apidesign.aserverinfo.builder.ServerInfo; +import org.apidesign.aserverinfo.spi.NameProvider; +import org.apidesign.aserverinfo.spi.ResetHandler; +import org.apidesign.aserverinfo.spi.URLProvider; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; +import org.openide.util.Exceptions; + +public class BuilderFactoryTest { + + public BuilderFactoryTest() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void showUseOfCumulativeFactory() throws Exception { + Prov p = new Prov(); + NameProvider np = p; + URLProvider up = p; + ResetHandler res = p; + ServerConnector inf; + + // BEGIN: ServerConnector.cumulative.creation + inf = ServerInfo.empty() + .nameProvider(np).urlProvider(up).reset(res).connect(); + // END: ServerConnector.cumulative.creation + + assertEquals("API Design Server", inf.getName()); + assertEquals("http://www.apidesign.org", inf.getURL().toExternalForm()); + inf.reset(); + assertEquals("Once reset", 1, p.resets); + + } + + @Test + public void showVerboseUseOfCumulativeFactory() throws Exception { + Prov prov = new Prov(); + ServerConnector info; + + // BEGIN: ServerConnector.builder.creation.verbose + ServerInfo empty = ServerInfo.empty(); + ServerInfo name = empty.nameProvider(prov); + ServerInfo urlAndName = name.urlProvider(prov); + ServerInfo all = urlAndName.reset(prov); + info = all.connect(); + // END: ServerConnector.builder.creation.verbose + + assertEquals("API Design Server", info.getName()); + assertEquals("http://www.apidesign.org", info.getURL().toExternalForm()); + info.reset(); + assertEquals("Once reset", 1, prov.resets); + + } + + + private static class Prov implements NameProvider, URLProvider, ResetHandler { + int resets; + + public String getName() { + return "API Design Server"; + } + + public URL getURL() { + try { + return new URL("http://www.apidesign.org"); + } catch (MalformedURLException ex) { + Exceptions.printStackTrace(ex); + return null; + } + } + + public void reset() { + resets++; + } + + } + +} \ No newline at end of file diff -r 4feb55fa3c91 -r 0753acb192c7 samples/aserverinfo/test/org/apidesign/aserverinfo/test/CummulativeFactoryTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/aserverinfo/test/org/apidesign/aserverinfo/test/CummulativeFactoryTest.java Sat Nov 15 08:19:20 2008 +0100 @@ -0,0 +1,89 @@ +package org.apidesign.aserverinfo.test; + +import java.net.MalformedURLException; +import java.net.URL; +import org.apidesign.aserverinfo.cummulativefactory.ServerConnector; +import org.apidesign.aserverinfo.spi.NameProvider; +import org.apidesign.aserverinfo.spi.ResetHandler; +import org.apidesign.aserverinfo.spi.URLProvider; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; +import org.openide.util.Exceptions; + +public class CummulativeFactoryTest { + + public CummulativeFactoryTest() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void showUseOfCumulativeFactory() throws Exception { + Prov p = new Prov(); + NameProvider np = p; + URLProvider up = p; + ResetHandler res = p; + ServerConnector inf; + + // BEGIN: ServerConnector.cumulative.creation + inf = ServerConnector.empty().nameProvider(np).urlProvider(up).reset(res); + // END: ServerConnector.cumulative.creation + + assertEquals("API Design Server", inf.getName()); + assertEquals("http://www.apidesign.org", inf.getURL().toExternalForm()); + inf.reset(); + assertEquals("Once reset", 1, p.resets); + + } + + @Test + public void showVerboseUseOfCumulativeFactory() throws Exception { + Prov prov = new Prov(); + ServerConnector info; + + // BEGIN: ServerConnector.cumulative.creation.verbose + ServerConnector empty = ServerConnector.empty(); + ServerConnector name = empty.nameProvider(prov); + ServerConnector urlAndName = name.urlProvider(prov); + info = urlAndName.reset(prov); + // END: ServerConnector.cumulative.creation.verbose + + assertEquals("API Design Server", info.getName()); + assertEquals("http://www.apidesign.org", info.getURL().toExternalForm()); + info.reset(); + assertEquals("Once reset", 1, prov.resets); + + } + + + private static class Prov implements NameProvider, URLProvider, ResetHandler { + int resets; + + public String getName() { + return "API Design Server"; + } + + public URL getURL() { + try { + return new URL("http://www.apidesign.org"); + } catch (MalformedURLException ex) { + Exceptions.printStackTrace(ex); + return null; + } + } + + public void reset() { + resets++; + } + + } + +} \ No newline at end of file diff -r 4feb55fa3c91 -r 0753acb192c7 samples/aserverinfo/test/org/apidesign/aserverinfo/test/ServerConnectorTest.java --- a/samples/aserverinfo/test/org/apidesign/aserverinfo/test/ServerConnectorTest.java Sat Nov 15 06:57:15 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -package org.apidesign.aserverinfo.test; - -import java.net.MalformedURLException; -import java.net.URL; -import org.apidesign.aserverinfo.cummulativefactory.ServerConnector; -import org.apidesign.aserverinfo.spi.NameProvider; -import org.apidesign.aserverinfo.spi.ResetHandler; -import org.apidesign.aserverinfo.spi.URLProvider; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.*; -import org.openide.util.Exceptions; - -public class ServerConnectorTest { - - public ServerConnectorTest() { - } - - @Before - public void setUp() { - } - - @After - public void tearDown() { - } - - @Test - public void showUseOfCumulativeFactory() throws Exception { - Prov p = new Prov(); - NameProvider np = p; - URLProvider up = p; - ResetHandler res = p; - ServerConnector inf; - - // BEGIN: ServerConnector.cumulative.creation - inf = ServerConnector.empty().nameProvider(np).urlProvider(up).reset(res); - // END: ServerConnector.cumulative.creation - - assertEquals("API Design Server", inf.getName()); - assertEquals("http://www.apidesign.org", inf.getURL().toExternalForm()); - inf.reset(); - assertEquals("Once reset", 1, p.resets); - - } - - @Test - public void showVerboseUseOfCumulativeFactory() throws Exception { - Prov prov = new Prov(); - ServerConnector info; - - // BEGIN: ServerConnector.cumulative.creation.verbose - ServerConnector empty = ServerConnector.empty(); - ServerConnector name = empty.nameProvider(prov); - ServerConnector urlAndName = name.urlProvider(prov); - info = urlAndName.reset(prov); - // END: ServerConnector.cumulative.creation.verbose - - assertEquals("API Design Server", info.getName()); - assertEquals("http://www.apidesign.org", info.getURL().toExternalForm()); - info.reset(); - assertEquals("Once reset", 1, prov.resets); - - } - - - private static class Prov implements NameProvider, URLProvider, ResetHandler { - int resets; - - public String getName() { - return "API Design Server"; - } - - public URL getURL() { - try { - return new URL("http://www.apidesign.org"); - } catch (MalformedURLException ex) { - Exceptions.printStackTrace(ex); - return null; - } - } - - public void reset() { - resets++; - } - - } - -} \ No newline at end of file