Author: fanningpj
Date: Thu Dec 18 17:20:26 2025
New Revision: 1930716
Log:
[XMLBEANS-662] Fallback to SHA-1 for base64/binary hashCode. Thanks to matoro.
This closes #26
Added:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaDigestableHolder.java
Modified:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaBase64Holder.java
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaHexBinaryHolder.java
Modified:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaBase64Holder.java
==============================================================================
---
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaBase64Holder.java
Thu Dec 18 17:12:36 2025 (r1930715)
+++
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaBase64Holder.java
Thu Dec 18 17:20:26 2025 (r1930716)
@@ -23,18 +23,14 @@ import org.apache.xmlbeans.impl.common.Q
import org.apache.xmlbeans.impl.common.ValidationContext;
import org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
-public abstract class JavaBase64Holder extends XmlObjectBase {
+public abstract class JavaBase64Holder extends JavaDigestableHolder {
public SchemaType schemaType() {
return BuiltinSchemaTypeSystem.ST_BASE_64_BINARY;
}
- protected byte[] _value;
-
// SIMPLE VALUE ACCESSORS BELOW -------------------------------------------
// gets raw text value
@@ -104,32 +100,4 @@ public abstract class JavaBase64Holder e
byte[] ival = ((XmlBase64Binary) i).getByteArrayValue();
return Arrays.equals(_value, ival);
}
-
- //because computing hashcode is expensive we'll cache it
- protected boolean _hashcached = false;
- protected int hashcode = 0;
- protected static final MessageDigest md5;
-
- static {
- try {
- md5 = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException e) {
- throw new IllegalStateException("Cannot find MD5 hash Algorithm");
- }
- }
-
- protected int value_hash_code() {
- if (_hashcached) {
- return hashcode;
- }
-
- _hashcached = true;
-
- if (_value == null) {
- return hashcode = 0;
- }
-
- byte[] res = md5.digest(_value);
- return hashcode = (res[0] << 24) | (res[1] << 16) | (res[2] << 8) |
res[3];
- }
}
Added:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaDigestableHolder.java
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaDigestableHolder.java
Thu Dec 18 17:20:26 2025 (r1930716)
@@ -0,0 +1,60 @@
+/* Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed 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.xmlbeans.impl.values;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Objects;
+import java.util.stream.Stream;
+
+abstract class JavaDigestableHolder extends XmlObjectBase {
+ protected byte[] _value;
+
+ //because computing hashcode is expensive we'll cache it
+ protected boolean _hashcached = false;
+ protected int hashcode = 0;
+ protected static final MessageDigest digest;
+
+ static {
+ digest = Stream.of("MD5", "SHA-1")
+ .map(algorithm -> {
+ try {
+ return MessageDigest.getInstance(algorithm);
+ }
+ catch (NoSuchAlgorithmException ex) {
+ return null;
+ }
+ })
+ .filter(Objects::nonNull)
+ .findFirst()
+ .orElseThrow(() -> new IllegalStateException("Cannot find any
suitable hash algorithm"));
+ }
+
+ protected int value_hash_code() {
+ if (_hashcached) {
+ return hashcode;
+ }
+
+ _hashcached = true;
+
+ if (_value == null) {
+ return hashcode = 0;
+ }
+
+ byte[] res = digest.digest(_value);
+ return hashcode = (res[0] << 24) | (res[1] << 16) | (res[2] << 8) |
res[3];
+ }
+}
Modified:
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaHexBinaryHolder.java
==============================================================================
---
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaHexBinaryHolder.java
Thu Dec 18 17:12:36 2025 (r1930715)
+++
xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/values/JavaHexBinaryHolder.java
Thu Dec 18 17:20:26 2025 (r1930716)
@@ -25,17 +25,13 @@ import org.apache.xmlbeans.impl.schema.B
import org.apache.xmlbeans.impl.util.HexBin;
import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
-public abstract class JavaHexBinaryHolder extends XmlObjectBase {
+public abstract class JavaHexBinaryHolder extends JavaDigestableHolder {
public SchemaType schemaType() {
return BuiltinSchemaTypeSystem.ST_HEX_BINARY;
}
- protected byte[] _value;
-
// SIMPLE VALUE ACCESSORS BELOW -------------------------------------------
// gets raw text value
@@ -107,33 +103,4 @@ public abstract class JavaHexBinaryHolde
byte[] ival = ((XmlHexBinary) i).getByteArrayValue();
return Arrays.equals(_value, ival);
}
-
- //because computing hashcode is expensive we'll cache it
- protected boolean _hashcached = false;
- protected int hashcode = 0;
- protected static final MessageDigest md5;
-
- static {
- try {
- md5 = MessageDigest.getInstance("MD5");
- } catch (NoSuchAlgorithmException e) {
- throw new IllegalStateException("Cannot find MD5 hash Algorithm");
- }
- }
-
- protected int value_hash_code() {
- if (_hashcached) {
- return hashcode;
- }
-
- _hashcached = true;
-
- if (_value == null) {
- return hashcode = 0;
- }
-
- byte[] res = md5.digest(_value);
- return hashcode = (res[0] << 24) | (res[1] << 16) | (res[2] << 8) |
res[3];
- }
-
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]