ENT-1565: Remove Guava code from core. (#3569)

Remove Guava code from core.
Note that forcing this project to use Guava `$guava_version` throughout breaks SimmValuationTest.
This commit is contained in:
Chris Rankin 2018-07-12 14:52:44 +01:00 committed by GitHub
parent 12174fdaae
commit 7f42a9b48c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 11 deletions

View File

@ -17,8 +17,6 @@ configurations {
dependencies { dependencies {
compileOnly project(':core') compileOnly project(':core')
compileOnly "com.google.guava:guava:$guava_version"
compileOnly "$quasar_group:quasar-core:$quasar_version:jdk8"
// Configure these by hand. It should be a minimal subset of core's dependencies, // Configure these by hand. It should be a minimal subset of core's dependencies,
// and without any obviously non-deterministic ones such as Hibernate. // and without any obviously non-deterministic ones such as Hibernate.
@ -28,7 +26,6 @@ dependencies {
runtimeLibraries "org.bouncycastle:bcprov-jdk15on:$bouncycastle_version" runtimeLibraries "org.bouncycastle:bcprov-jdk15on:$bouncycastle_version"
runtimeLibraries "org.bouncycastle:bcpkix-jdk15on:$bouncycastle_version" runtimeLibraries "org.bouncycastle:bcpkix-jdk15on:$bouncycastle_version"
runtimeLibraries "com.google.code.findbugs:jsr305:$jsr305_version" runtimeLibraries "com.google.code.findbugs:jsr305:$jsr305_version"
runtimeLibraries "com.google.guava:guava:$guava_version"
runtimeLibraries "net.i2p.crypto:eddsa:$eddsa_version" runtimeLibraries "net.i2p.crypto:eddsa:$eddsa_version"
runtimeLibraries "org.slf4j:slf4j-api:$slf4j_version" runtimeLibraries "org.slf4j:slf4j-api:$slf4j_version"
} }

View File

@ -1,6 +1,5 @@
package net.corda.core.identity package net.corda.core.identity
import com.google.common.collect.ImmutableSet
import net.corda.core.KeepForDJVM import net.corda.core.KeepForDJVM
import net.corda.core.internal.LegalNameValidator import net.corda.core.internal.LegalNameValidator
import net.corda.core.internal.toAttributesMap import net.corda.core.internal.toAttributesMap
@ -79,7 +78,7 @@ data class CordaX500Name(val commonName: String?,
const val MAX_LENGTH_COMMON_NAME = 64 const val MAX_LENGTH_COMMON_NAME = 64
private val supportedAttributes = setOf(BCStyle.O, BCStyle.C, BCStyle.L, BCStyle.CN, BCStyle.ST, BCStyle.OU) private val supportedAttributes = setOf(BCStyle.O, BCStyle.C, BCStyle.L, BCStyle.CN, BCStyle.ST, BCStyle.OU)
private val countryCodes: Set<String> = ImmutableSet.copyOf(Locale.getISOCountries() + unspecifiedCountry) private val countryCodes: Set<String> = setOf(*Locale.getISOCountries(), unspecifiedCountry)
@JvmStatic @JvmStatic
fun build(principal: X500Principal): CordaX500Name { fun build(principal: X500Principal): CordaX500Name {

View File

@ -2,8 +2,6 @@
@file:KeepForDJVM @file:KeepForDJVM
package net.corda.core.internal package net.corda.core.internal
import com.google.common.hash.Hashing
import com.google.common.hash.HashingInputStream
import net.corda.core.DeleteForDJVM import net.corda.core.DeleteForDJVM
import net.corda.core.KeepForDJVM import net.corda.core.KeepForDJVM
import net.corda.core.cordapp.Cordapp import net.corda.core.cordapp.Cordapp
@ -43,6 +41,7 @@ import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
import java.security.KeyPair import java.security.KeyPair
import java.security.MessageDigest
import java.security.PrivateKey import java.security.PrivateKey
import java.security.PublicKey import java.security.PublicKey
import java.security.cert.* import java.security.cert.*
@ -132,9 +131,16 @@ fun InputStream.readFully(): ByteArray = use { it.readBytes() }
/** Calculate the hash of the remaining bytes in this input stream. The stream is closed at the end. */ /** Calculate the hash of the remaining bytes in this input stream. The stream is closed at the end. */
fun InputStream.hash(): SecureHash { fun InputStream.hash(): SecureHash {
return use { return use {
val his = HashingInputStream(Hashing.sha256(), it) val md = MessageDigest.getInstance("SHA-256")
his.copyTo(NullOutputStream) // To avoid reading in the entire stream into memory just write out the bytes to /dev/null val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
SecureHash.SHA256(his.hash().asBytes()) while (true) {
val count = it.read(buffer)
if (count == -1) {
break
}
md.update(buffer, 0, count)
}
SecureHash.SHA256(md.digest())
} }
} }

View File

@ -1,9 +1,11 @@
package net.corda.core.internal package net.corda.core.internal
import net.corda.core.contracts.TimeWindow import net.corda.core.contracts.TimeWindow
import net.corda.core.crypto.SecureHash
import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThat
import org.junit.Assert.assertArrayEquals import org.junit.Assert.assertArrayEquals
import org.junit.Test import org.junit.Test
import java.util.*
import java.util.stream.IntStream import java.util.stream.IntStream
import java.util.stream.Stream import java.util.stream.Stream
import kotlin.test.assertEquals import kotlin.test.assertEquals
@ -99,6 +101,19 @@ open class InternalUtilsTest {
assertThat(PrivateClass::class.java.kotlinObjectInstance).isNull() assertThat(PrivateClass::class.java.kotlinObjectInstance).isNull()
} }
@Test
fun `test SHA-256 hash for InputStream`() {
val contents = arrayOfJunk(DEFAULT_BUFFER_SIZE * 2 + DEFAULT_BUFFER_SIZE / 2)
assertThat(contents.inputStream().hash())
.isEqualTo(SecureHash.parse("A4759E7AA20338328866A2EA17EAF8C7FE4EC6BBE3BB71CEE7DF7C0461B3C22F"))
}
private fun arrayOfJunk(size: Int) = ByteArray(size).apply {
for (i in 0 until size) {
this[i] = (i and 0xFF).toByte()
}
}
object PublicObject object PublicObject
private object PrivateObject private object PrivateObject
protected object ProtectedObject protected object ProtectedObject

View File

@ -17,13 +17,13 @@ configurations {
dependencies { dependencies {
compileOnly project(':serialization') compileOnly project(':serialization')
compileOnly "$quasar_group:quasar-core:$quasar_version:jdk8"
// Configure these by hand. It should be a minimal subset of dependencies, // Configure these by hand. It should be a minimal subset of dependencies,
// and without any obviously non-deterministic ones such as Hibernate. // and without any obviously non-deterministic ones such as Hibernate.
runtimeLibraries project(path: ':core-deterministic', configuration: 'runtimeArtifacts') runtimeLibraries project(path: ':core-deterministic', configuration: 'runtimeArtifacts')
runtimeLibraries "org.apache.qpid:proton-j:$protonj_version" runtimeLibraries "org.apache.qpid:proton-j:$protonj_version"
runtimeLibraries "org.iq80.snappy:snappy:$snappy_version" runtimeLibraries "org.iq80.snappy:snappy:$snappy_version"
runtimeLibraries "com.google.guava:guava:$guava_version"
} }
jar { jar {