Skip to content

Commit 957551f

Browse files
committed
core: Opaque: Convert to interface, remove Serializable
... and provide a default implementation inline. This enables certain objects to function as Opaque keys directly. Serializability is not required by the current code, so let's remove it. If required, a new subclass can add support for it. Related: #149 Signed-off-by: Christian Kohlschütter <[email protected]>
1 parent da8f898 commit 957551f

File tree

1 file changed

+55
-45
lines changed

1 file changed

+55
-45
lines changed

core/src/main/java/org/dcache/nfs/util/Opaque.java

Lines changed: 55 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,68 +19,78 @@
1919
*/
2020
package org.dcache.nfs.util;
2121

22-
import java.io.Serializable;
2322
import java.util.Arrays;
2423
import java.util.Base64;
2524

26-
import com.google.common.io.BaseEncoding;
27-
2825
/**
29-
* A helper class for opaque data manipulations. Enabled opaque date to be used as a key in {@link java.util.Collection}
26+
* Describes something that can be used as a key in {@link java.util.Map} and that can be converted to a {@code byte[]}
27+
* and a Base64 string representation.
3028
*/
31-
public class Opaque implements Serializable {
29+
public interface Opaque {
30+
public static Opaque forBytes(byte[] bytes) {
31+
return new OpaqueImpl(bytes.clone());
32+
}
3233

33-
private static final long serialVersionUID = 1532238396149112674L;
34+
byte[] asBytes();
3435

35-
private final byte[] _opaque;
36-
private String base64 = null;
36+
String getBase64();
3737

38-
public static Opaque forBytes(byte[] bytes) {
39-
return new Opaque(bytes.clone());
40-
}
38+
@Override
39+
int hashCode();
4140

42-
private Opaque(byte[] opaque) {
43-
_opaque = opaque;
44-
}
41+
@Override
42+
boolean equals(Object o);
4543

46-
public byte[] asBytes() {
47-
return _opaque.clone();
48-
}
44+
final class OpaqueImpl implements Opaque {
45+
private final byte[] _opaque;
46+
private String base64 = null;
4947

50-
public String getBase64() {
51-
if (base64 == null) {
52-
base64 = Base64.getEncoder().withoutPadding().encodeToString(_opaque);
48+
private OpaqueImpl(byte[] opaque) {
49+
_opaque = opaque;
5350
}
54-
return base64;
55-
}
5651

57-
@Override
58-
public int hashCode() {
59-
return Arrays.hashCode(_opaque);
60-
}
52+
@Override
53+
public byte[] asBytes() {
54+
return _opaque.clone();
55+
}
6156

62-
@Override
63-
public boolean equals(Object o) {
64-
if (o == this) {
65-
return true;
57+
@Override
58+
public String getBase64() {
59+
if (base64 == null) {
60+
base64 = Base64.getEncoder().withoutPadding().encodeToString(_opaque);
61+
}
62+
return base64;
6663
}
67-
if (!(o instanceof Opaque)) {
68-
return false;
64+
65+
@Override
66+
public int hashCode() {
67+
return Arrays.hashCode(_opaque);
6968
}
7069

71-
return Arrays.equals(_opaque, ((Opaque) o)._opaque);
72-
}
70+
@Override
71+
public boolean equals(Object o) {
72+
if (o == this) {
73+
return true;
74+
}
75+
if (!(o instanceof Opaque)) {
76+
return false;
77+
}
7378

74-
/**
75-
* Returns a (potentially non-stable) debug string.
76-
*
77-
* @see #getBase64()
78-
*/
79-
@Deprecated
80-
@Override
81-
public String toString() {
82-
StringBuilder sb = new StringBuilder();
83-
sb.append('[').append(BaseEncoding.base16().lowerCase().encode(_opaque)).append(']');
84-
return sb.toString();
79+
if (o instanceof OpaqueImpl) {
80+
return Arrays.equals(_opaque, ((OpaqueImpl) o)._opaque);
81+
} else {
82+
return Arrays.equals(_opaque, ((Opaque) o).asBytes());
83+
}
84+
}
85+
86+
/**
87+
* Returns a (potentially non-stable) debug string.
88+
*
89+
* @see #getBase64()
90+
*/
91+
@Override
92+
public String toString() {
93+
return super.toString() + "[" + getBase64() + "]";
94+
}
8595
}
8696
}

0 commit comments

Comments
 (0)