Skip to content

Commit 00a8c84

Browse files
authored
Merge pull request #287 from scalecube/feature/issue-283-cluster-codec-artifact
WIP: Issue 283 - cluster codec artifact
2 parents ff60305 + 2809ea4 commit 00a8c84

File tree

40 files changed

+727
-216
lines changed

40 files changed

+727
-216
lines changed

cluster-api/src/main/java/io/scalecube/cluster/Cluster.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public interface Cluster {
7474
<T> Optional<T> metadata();
7575

7676
/**
77-
* Returns cluster member metadata by given member with default metadata type.
77+
* Returns cluster member metadata by given member.
7878
*
7979
* @param member cluster member
8080
* @return cluster member metadata

cluster-api/src/main/java/io/scalecube/cluster/ClusterConfig.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.scalecube.cluster.fdetector.FailureDetectorConfig;
44
import io.scalecube.cluster.gossip.GossipConfig;
55
import io.scalecube.cluster.membership.MembershipConfig;
6+
import io.scalecube.cluster.metadata.MetadataCodec;
67
import io.scalecube.cluster.metadata.MetadataDecoder;
78
import io.scalecube.cluster.metadata.MetadataEncoder;
89
import io.scalecube.cluster.transport.api.TransportConfig;
@@ -32,6 +33,7 @@ public final class ClusterConfig implements Cloneable {
3233

3334
private Object metadata;
3435
private int metadataTimeout = DEFAULT_METADATA_TIMEOUT;
36+
private MetadataCodec metadataCodec = MetadataCodec.INSTANCE;
3537
private MetadataEncoder metadataEncoder = MetadataEncoder.INSTANCE;
3638
private MetadataDecoder metadataDecoder = MetadataDecoder.INSTANCE;
3739

@@ -93,7 +95,7 @@ public <T> T metadata() {
9395
}
9496

9597
/**
96-
* Sets a metadata.
98+
* Setter for metadata.
9799
*
98100
* @param metadata metadata
99101
* @return new {@code ClusterConfig} instance
@@ -109,7 +111,7 @@ public int metadataTimeout() {
109111
}
110112

111113
/**
112-
* Sets a metadataTimeout.
114+
* Setter for metadataTimeout.
113115
*
114116
* @param metadataTimeout metadata timeout
115117
* @return new {@code ClusterConfig} instance
@@ -120,32 +122,62 @@ public ClusterConfig metadataTimeout(int metadataTimeout) {
120122
return c;
121123
}
122124

125+
public MetadataCodec metadataCodec() {
126+
return metadataCodec;
127+
}
128+
129+
/**
130+
* Setter for metadataCodec.
131+
*
132+
* @param metadataCodec metadata codec
133+
* @return new {@code ClusterConfig} instance
134+
*/
135+
public ClusterConfig metadataCodec(MetadataCodec metadataCodec) {
136+
ClusterConfig c = clone();
137+
c.metadataCodec = metadataCodec;
138+
return c;
139+
}
140+
141+
/**
142+
* Deprecated since {@code 2.4.10} in favor of {@link MetadataCodec}.
143+
*
144+
* @return metadataEncoder
145+
*/
146+
@Deprecated
123147
public MetadataEncoder metadataEncoder() {
124148
return metadataEncoder;
125149
}
126150

127151
/**
128-
* Sets a metadataEncoder.
152+
* Setter for metadataEncoder. Deprecated since {@code 2.4.10} in favor of {@link MetadataCodec}.
129153
*
130154
* @param metadataEncoder metadata encoder
131155
* @return new {@code ClusterConfig} instance
132156
*/
157+
@Deprecated
133158
public ClusterConfig metadataEncoder(MetadataEncoder metadataEncoder) {
134159
ClusterConfig c = clone();
135160
c.metadataEncoder = metadataEncoder;
136161
return c;
137162
}
138163

164+
/**
165+
* Deprecated since {@code 2.4.10} in favor of {@link MetadataCodec}.
166+
*
167+
* @return metadataDecoder
168+
*/
169+
@Deprecated
139170
public MetadataDecoder metadataDecoder() {
140171
return metadataDecoder;
141172
}
142173

143174
/**
144-
* Sets a metadataDecoder.
175+
* Setter for metadataDecoder. Deprecated since {@code 2.4.10} in favor of {@link MetadataCodec}.
145176
*
146177
* @param metadataDecoder metadata decoder
147178
* @return new {@code ClusterConfig} instance
148179
*/
180+
@Deprecated
149181
public ClusterConfig metadataDecoder(MetadataDecoder metadataDecoder) {
150182
ClusterConfig c = clone();
151183
c.metadataDecoder = metadataDecoder;
@@ -354,6 +386,7 @@ public String toString() {
354386
return new StringJoiner(", ", ClusterConfig.class.getSimpleName() + "[", "]")
355387
.add("metadata=" + metadataAsString())
356388
.add("metadataTimeout=" + metadataTimeout)
389+
.add("metadataCodec=" + metadataCodec)
357390
.add("metadataEncoder=" + metadataEncoder)
358391
.add("metadataDecoder=" + metadataDecoder)
359392
.add("memberAlias='" + memberAlias + "'")

cluster-api/src/main/java/io/scalecube/cluster/Member.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
package io.scalecube.cluster;
22

33
import io.scalecube.net.Address;
4+
import java.io.Externalizable;
5+
import java.io.IOException;
6+
import java.io.ObjectInput;
7+
import java.io.ObjectOutput;
48
import java.util.Objects;
59
import java.util.UUID;
610

711
/**
812
* Cluster member which represents node in the cluster and contains its id and address. This class
913
* is essentially immutable.
1014
*/
11-
public final class Member {
15+
public final class Member implements Externalizable {
16+
17+
private static final long serialVersionUID = 1L;
1218

1319
private String id;
1420
private String alias;
1521
private Address address;
1622

17-
/** Instantiates empty member for deserialization purpose. */
18-
Member() {}
23+
public Member() {}
1924

2025
/**
2126
* Constructor.
@@ -63,6 +68,33 @@ public int hashCode() {
6368
return Objects.hash(id, address);
6469
}
6570

71+
@Override
72+
public void writeExternal(ObjectOutput out) throws IOException {
73+
// id
74+
out.writeUTF(id);
75+
// alias
76+
boolean aliasNotNull = alias != null;
77+
out.writeBoolean(aliasNotNull);
78+
if (aliasNotNull) {
79+
out.writeUTF(alias);
80+
}
81+
// address
82+
out.writeUTF(address.toString());
83+
}
84+
85+
@Override
86+
public void readExternal(ObjectInput in) throws IOException {
87+
// id
88+
id = in.readUTF();
89+
// alias
90+
boolean aliasNotNull = in.readBoolean();
91+
if (aliasNotNull) {
92+
alias = in.readUTF();
93+
}
94+
// address
95+
address = Address.from(in.readUTF());
96+
}
97+
6698
@Override
6799
public String toString() {
68100
if (alias == null) {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.scalecube.cluster.metadata;
2+
3+
import java.io.ByteArrayInputStream;
4+
import java.io.ByteArrayOutputStream;
5+
import java.io.ObjectInputStream;
6+
import java.io.ObjectOutputStream;
7+
import java.nio.ByteBuffer;
8+
import reactor.core.Exceptions;
9+
10+
public class JdkMetadataCodec implements MetadataCodec {
11+
12+
@Override
13+
public Object deserialize(ByteBuffer buffer) {
14+
byte[] bytes = buffer.array();
15+
try (ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
16+
return is.readObject();
17+
} catch (Exception e) {
18+
throw Exceptions.propagate(e);
19+
}
20+
}
21+
22+
@Override
23+
public ByteBuffer serialize(Object metadata) {
24+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
25+
try (ObjectOutputStream os = new ObjectOutputStream(baos)) {
26+
os.writeObject(metadata);
27+
os.flush();
28+
return ByteBuffer.wrap(baos.toByteArray());
29+
} catch (Exception e) {
30+
throw Exceptions.propagate(e);
31+
}
32+
}
33+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.scalecube.cluster.metadata;
2+
3+
import io.scalecube.utils.ServiceLoaderUtil;
4+
import java.nio.ByteBuffer;
5+
6+
/** Contains methods for metadata serializing/deserializing logic. */
7+
public interface MetadataCodec {
8+
9+
MetadataCodec INSTANCE =
10+
ServiceLoaderUtil.findFirst(MetadataCodec.class).orElseGet(JdkMetadataCodec::new);
11+
12+
/**
13+
* Deserializes metadata from buffer.
14+
*
15+
* @param buffer metadata buffer; if {@code buffer} is empty then returned result shall be null.
16+
* @return metadata object from metadata buffer or null
17+
*/
18+
Object deserialize(ByteBuffer buffer);
19+
20+
/**
21+
* Serializes given metadata into buffer.
22+
*
23+
* @param metadata metadata object (optional); if {@code metadata} is null then returned result
24+
* may be null or empty buffer.
25+
* @return buffer or null
26+
*/
27+
ByteBuffer serialize(Object metadata);
28+
}

cluster-api/src/main/java/io/scalecube/cluster/metadata/MetadataDecoder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
import io.scalecube.utils.ServiceLoaderUtil;
44
import java.nio.ByteBuffer;
55

6+
/**
7+
* MetadataDecoder. <br>
8+
* Deprecated since {@code 2.4.10} in favor of {@link MetadataCodec}.
9+
*/
10+
@Deprecated
611
@FunctionalInterface
712
public interface MetadataDecoder {
813

cluster-api/src/main/java/io/scalecube/cluster/metadata/MetadataEncoder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
import java.nio.ByteBuffer;
55
import reactor.util.annotation.Nullable;
66

7+
/**
8+
* MetadataEncoder. <br>
9+
* Deprecated since {@code 2.4.10} in favor of {@link MetadataCodec}.
10+
*/
11+
@Deprecated
712
@FunctionalInterface
813
public interface MetadataEncoder {
914

cluster-testlib/pom.xml

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
34
<parent>
45
<artifactId>scalecube-cluster-parent</artifactId>
56
<groupId>io.scalecube</groupId>
@@ -21,14 +22,6 @@
2122
<artifactId>scalecube-cluster-api</artifactId>
2223
<version>${project.version}</version>
2324
</dependency>
24-
<dependency>
25-
<groupId>com.fasterxml.jackson.core</groupId>
26-
<artifactId>jackson-core</artifactId>
27-
</dependency>
28-
<dependency>
29-
<groupId>com.fasterxml.jackson.core</groupId>
30-
<artifactId>jackson-databind</artifactId>
31-
</dependency>
3225
</dependencies>
3326

3427
</project>

cluster-testlib/src/main/java/io/scalecube/cluster/metadata/SimpleMapMetadataCodec.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

cluster-testlib/src/main/java/io/scalecube/cluster/transport/JacksonMessageCodec.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

0 commit comments

Comments
 (0)