CURATOR-67 defer creation of serializer Instead of immediately creating a new JSONInstanceSerializer we can defer until build() is actually called. This lets users specify their own serializers and avoids issues where there may be version conflicts.
This closes #30 Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/c744c646 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/c744c646 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/c744c646 Branch: refs/heads/master Commit: c744c646b9ad66831ab771d2dab4a38535683959 Parents: f5767c8 Author: Mike Drob <[email protected]> Authored: Fri Aug 1 11:29:30 2014 -0500 Committer: Mike Drob <[email protected]> Committed: Mon Aug 4 08:50:03 2014 -0500 ---------------------------------------------------------------------- .../x/discovery/ServiceDiscoveryBuilder.java | 12 +++- .../discovery/TestServiceDiscoveryBuilder.java | 71 ++++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/c744c646/curator-x-discovery/src/main/java/org/apache/curator/x/discovery/ServiceDiscoveryBuilder.java ---------------------------------------------------------------------- diff --git a/curator-x-discovery/src/main/java/org/apache/curator/x/discovery/ServiceDiscoveryBuilder.java b/curator-x-discovery/src/main/java/org/apache/curator/x/discovery/ServiceDiscoveryBuilder.java index ab62004..2b972ca 100644 --- a/curator-x-discovery/src/main/java/org/apache/curator/x/discovery/ServiceDiscoveryBuilder.java +++ b/curator-x-discovery/src/main/java/org/apache/curator/x/discovery/ServiceDiscoveryBuilder.java @@ -29,9 +29,10 @@ public class ServiceDiscoveryBuilder<T> private String basePath; private InstanceSerializer<T> serializer; private ServiceInstance<T> thisInstance; + private Class<T> payloadClass; /** - * Return a new builder. The builder will be defaulted with a {@link JsonInstanceSerializer}. + * Return a new builder. * * @param payloadClass the class of the payload of your service instance (you can use {@link Void} * if your instances don't need a payload) @@ -39,16 +40,20 @@ public class ServiceDiscoveryBuilder<T> */ public static<T> ServiceDiscoveryBuilder<T> builder(Class<T> payloadClass) { - return new ServiceDiscoveryBuilder<T>(payloadClass).serializer(new JsonInstanceSerializer<T>(payloadClass)); + return new ServiceDiscoveryBuilder<T>(payloadClass); } /** - * Build a new service discovery with the currently set values + * Build a new service discovery with the currently set values. If not set, the builder will be + * defaulted with a {@link JsonInstanceSerializer}. * * @return new service discovery */ public ServiceDiscovery<T> build() { + if ( serializer == null ) { + serializer(new JsonInstanceSerializer<T>(payloadClass)); + } return new ServiceDiscoveryImpl<T>(client, basePath, serializer, thisInstance); } @@ -102,5 +107,6 @@ public class ServiceDiscoveryBuilder<T> ServiceDiscoveryBuilder(Class<T> payloadClass) { + this.payloadClass = payloadClass; } } http://git-wip-us.apache.org/repos/asf/curator/blob/c744c646/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestServiceDiscoveryBuilder.java ---------------------------------------------------------------------- diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestServiceDiscoveryBuilder.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestServiceDiscoveryBuilder.java new file mode 100644 index 0000000..68716ed --- /dev/null +++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestServiceDiscoveryBuilder.java @@ -0,0 +1,71 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.curator.x.discovery; + +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.retry.RetryOneTime; +import org.apache.curator.test.BaseClassForTests; +import org.apache.curator.x.discovery.ServiceDiscoveryBuilder; +import org.apache.curator.x.discovery.ServiceInstance; +import org.apache.curator.x.discovery.details.InstanceSerializer; +import org.apache.curator.x.discovery.details.JsonInstanceSerializer; +import org.apache.curator.x.discovery.details.ServiceDiscoveryImpl; +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class TestServiceDiscoveryBuilder extends BaseClassForTests +{ + @Test + public void testDefaultSerializer() throws Exception + { + CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); + ServiceDiscoveryBuilder<Object> builder = ServiceDiscoveryBuilder.builder(Object.class).client(client); + ServiceDiscoveryImpl<?> discovery = (ServiceDiscoveryImpl<?>) builder.basePath("/path").build(); + + Assert.assertNotNull(discovery.getSerializer(), "default serializer not set"); + Assert.assertTrue(discovery.getSerializer() instanceof JsonInstanceSerializer, "default serializer not JSON"); + } + + @Test + public void testSetSerializer() throws Exception + { + CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); + ServiceDiscoveryBuilder<Object> builder = ServiceDiscoveryBuilder.builder(Object.class).client(client); + builder.serializer(new InstanceSerializer<Object>() + { + @Override + public byte[] serialize(ServiceInstance<Object> instance) + { + return null; + } + + @Override + public ServiceInstance<Object> deserialize(byte[] bytes) + { + return null; + } + }); + + ServiceDiscoveryImpl<?> discovery = (ServiceDiscoveryImpl<?>) builder.basePath("/path").build(); + Assert.assertNotNull(discovery.getSerializer(), "default serializer not set"); + Assert.assertFalse(discovery.getSerializer() instanceof JsonInstanceSerializer, "set serializer is JSON"); + } +}
