mirror of
https://github.com/corda/corda.git
synced 2024-12-21 05:53:23 +00:00
Merge pull request #7602 from corda/shams-remove-too-generic-exception-rule
ENT-11263: Remove TooGenericExceptionCaught detekt rule
This commit is contained in:
commit
c9589d6ae3
@ -150,7 +150,6 @@ internal class RPCClientProxyHandler(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
private fun closeObservable(observable: UnicastSubject<Notification<*>>) {
|
||||
// Notify listeners of the observables that the connection is being terminated.
|
||||
try {
|
||||
@ -589,7 +588,6 @@ internal class RPCClientProxyHandler(
|
||||
}
|
||||
if (observableIds != null) {
|
||||
log.debug { "Reaping ${observableIds.size} observables" }
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
try {
|
||||
sendMessage(RPCApi.ClientToServer.ObservablesClosed(observableIds))
|
||||
} catch(ex: Exception) {
|
||||
|
@ -253,7 +253,6 @@ class FlowExternalAsyncOperationTest : AbstractFlowExternalOperationTest() {
|
||||
@StartableByRPC
|
||||
class FlowWithExternalAsyncOperationThatDirectlyAccessesServiceHubFailsRetry(party: Party) : FlowWithExternalProcess(party) {
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
@Suspendable
|
||||
override fun testCode(): Any {
|
||||
return await(ExternalAsyncOperation(serviceHub) { _, _ ->
|
||||
|
@ -293,7 +293,6 @@ class FlowExternalOperationTest : AbstractFlowExternalOperationTest() {
|
||||
@StartableByRPC
|
||||
class FlowWithExternalOperationThatDirectlyAccessesServiceHubFailsRetry(party: Party) : FlowWithExternalProcess(party) {
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
@Suspendable
|
||||
override fun testCode(): Any {
|
||||
try {
|
||||
|
@ -14,6 +14,7 @@ import java.io.InputStream
|
||||
import java.security.Provider
|
||||
import java.security.SecureRandom
|
||||
import java.security.SecureRandomSpi
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
/**
|
||||
* This has been migrated into a separate class so that it
|
||||
@ -29,23 +30,22 @@ val platformSecureRandom: () -> SecureRandom = when {
|
||||
}
|
||||
|
||||
class PlatformSecureRandomService(provider: Provider)
|
||||
: Provider.Service(provider, "SecureRandom", algorithm, PlatformSecureRandomSpi::javaClass.name, null, null) {
|
||||
: Provider.Service(provider, "SecureRandom", ALGORITHM, PlatformSecureRandomSpi::javaClass.name, null, null) {
|
||||
|
||||
companion object {
|
||||
const val algorithm = "CordaPRNG"
|
||||
const val ALGORITHM = "CordaPRNG"
|
||||
|
||||
private val logger = loggerFor<PlatformSecureRandomService>()
|
||||
}
|
||||
|
||||
private val instance: SecureRandomSpi = if (SystemUtils.IS_OS_LINUX) tryAndUseLinuxSecureRandomSpi() else PlatformSecureRandomSpi()
|
||||
|
||||
@Suppress("TooGenericExceptionCaught", "TooGenericExceptionThrown")
|
||||
private fun tryAndUseLinuxSecureRandomSpi(): SecureRandomSpi = try {
|
||||
LinuxSecureRandomSpi()
|
||||
} catch (e: Exception) {
|
||||
logger.error("Unable to initialise LinuxSecureRandomSpi. The exception logged with this message might assist with diagnosis." +
|
||||
" The process will now exit.", e)
|
||||
System.exit(1)
|
||||
throw RuntimeException("Never reached, but calms the compiler.")
|
||||
exitProcess(1)
|
||||
}
|
||||
|
||||
override fun newInstance(constructorParameter: Any?) = instance
|
||||
@ -63,7 +63,7 @@ private class PlatformSecureRandomSpi : SecureRandomSpi() {
|
||||
override fun engineGenerateSeed(numBytes: Int): ByteArray = secureRandom.generateSeed(numBytes)
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught", "TooGenericExceptionThrown")
|
||||
@Suppress("TooGenericExceptionThrown")
|
||||
private class LinuxSecureRandomSpi : SecureRandomSpi() {
|
||||
private fun openURandom(): InputStream {
|
||||
try {
|
||||
@ -91,5 +91,5 @@ private class LinuxSecureRandomSpi : SecureRandomSpi() {
|
||||
|
||||
// This is safe to share because of the underlying implementation of SecureRandomSpi
|
||||
private val sharedSecureRandom: SecureRandom by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||
SecureRandom.getInstance(PlatformSecureRandomService.algorithm)
|
||||
SecureRandom.getInstance(PlatformSecureRandomService.ALGORITHM)
|
||||
}
|
||||
|
@ -84,7 +84,6 @@ fun <ELEMENT> CordaFuture<out ELEMENT>.mapError(transform: (Throwable) -> Throwa
|
||||
* But if this future or the transform fails, the returned future's outcome is the same throwable.
|
||||
* In the case where this future fails, the transform is not invoked.
|
||||
*/
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
fun <V, W> CordaFuture<out V>.flatMap(transform: (V) -> CordaFuture<out W>): CordaFuture<W> = CordaFutureImpl<W>().also { result ->
|
||||
thenMatch(success@ {
|
||||
result.captureLater(try {
|
||||
@ -146,7 +145,6 @@ interface ValueOrException<in V> {
|
||||
fun captureLater(f: CordaFuture<out V>) = f.then { capture { f.getOrThrow() } }
|
||||
|
||||
/** Run the given block (in the foreground) and set this future to its outcome. */
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
fun capture(block: () -> V): Boolean {
|
||||
return set(try {
|
||||
block()
|
||||
@ -174,7 +172,6 @@ class CordaFutureImpl<V>(private val impl: CompletableFuture<V> = CompletableFut
|
||||
override fun setException(t: Throwable) = impl.completeExceptionally(t)
|
||||
override fun <W> then(callback: (CordaFuture<V>) -> W) = thenImpl(defaultLog, callback)
|
||||
/** For testing only. */
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
fun <W> thenImpl(log: Logger, callback: (CordaFuture<V>) -> W) {
|
||||
impl.whenComplete { _, _ ->
|
||||
try {
|
||||
|
@ -178,7 +178,6 @@ class TelemetryServiceImpl : SingletonSerializeAsToken(), TelemetryService {
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
inline fun <R> span(name: String, attributes: Map<String, String> = emptyMap(), flowLogic: FlowLogic<*>? = null, block: () -> R): R {
|
||||
val telemetryId = startSpan(name, attributes, flowLogic)
|
||||
try {
|
||||
@ -195,7 +194,7 @@ class TelemetryServiceImpl : SingletonSerializeAsToken(), TelemetryService {
|
||||
}
|
||||
|
||||
@CordaInternal
|
||||
@Suppress("LongParameterList", "TooGenericExceptionCaught")
|
||||
@Suppress("LongParameterList")
|
||||
inline fun <R> spanForFlow(name: String, attributes: Map<String, String>, flowLogic: FlowLogic<*>? = null, remoteSerializedTelemetry: SerializedTelemetry? = null, block: () -> R): R {
|
||||
val telemetryId = startSpanForFlow(name, attributes, flowLogic, remoteSerializedTelemetry)
|
||||
try {
|
||||
|
@ -440,7 +440,6 @@ private class Validator(private val ltx: LedgerTransaction, private val transact
|
||||
* Verify the given [LedgerTransaction]. This includes validating
|
||||
* its contents, as well as executing all of its smart contracts.
|
||||
*/
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
class TransactionVerifier(private val transactionClassLoader: ClassLoader) : Function<Supplier<LedgerTransaction>, Unit> {
|
||||
// Loads the contract class from the transactionClassLoader.
|
||||
private fun createContractClass(id: SecureHash, contractClassName: ContractClassName): Class<out Contract> {
|
||||
|
@ -33,7 +33,6 @@ class ResilientSubscriber<T>(actual: Subscriber<in T>) : SafeSubscriber<T>(actua
|
||||
* It only delegates to [SafeSubscriber.onError] if it wraps an [ActionSubscriber] which is
|
||||
* a leaf in an Subscribers' tree structure.
|
||||
*/
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
override fun onNext(t: T) {
|
||||
try {
|
||||
actual.onNext(t)
|
||||
@ -62,7 +61,6 @@ class ResilientSubscriber<T>(actual: Subscriber<in T>) : SafeSubscriber<T>(actua
|
||||
/**
|
||||
* Duplicate of [SafeSubscriber._onError]. However, it will not call [Subscriber.unsubscribe].
|
||||
*/
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
override fun _onError(e: Throwable) {
|
||||
@Suppress("DEPRECATION")
|
||||
RxJavaPlugins.getInstance().errorHandler.handleError(e)
|
||||
|
@ -8,8 +8,8 @@ import net.corda.core.contracts.TransactionVerificationException
|
||||
import net.corda.core.contracts.TransactionVerificationException.OverlappingAttachmentsException
|
||||
import net.corda.core.contracts.TransactionVerificationException.PackageOwnershipException
|
||||
import net.corda.core.crypto.SecureHash
|
||||
import net.corda.core.internal.JAVA_1_2_CLASS_FILE_FORMAT_MAJOR_VERSION
|
||||
import net.corda.core.internal.JAVA_17_CLASS_FILE_FORMAT_MAJOR_VERSION
|
||||
import net.corda.core.internal.JAVA_1_2_CLASS_FILE_FORMAT_MAJOR_VERSION
|
||||
import net.corda.core.internal.JarSignatureCollector
|
||||
import net.corda.core.internal.NamedCacheFactory
|
||||
import net.corda.core.internal.PlatformVersionSwitches
|
||||
@ -118,17 +118,12 @@ class AttachmentsClassLoader(attachments: List<Attachment>,
|
||||
// Reset the value to prevent Error due to a factory already defined
|
||||
factoryField.set(null, null)
|
||||
// Set our custom factory and wrap the current one into it
|
||||
URL.setURLStreamHandlerFactory(
|
||||
// Set the factory to a decorator
|
||||
object : URLStreamHandlerFactory {
|
||||
URL.setURLStreamHandlerFactory { protocol ->
|
||||
// route between our own and the pre-existing factory
|
||||
override fun createURLStreamHandler(protocol: String): URLStreamHandler? {
|
||||
return AttachmentURLStreamHandlerFactory.createURLStreamHandler(protocol)
|
||||
AttachmentURLStreamHandlerFactory.createURLStreamHandler(protocol)
|
||||
?: existingFactory.createURLStreamHandler(protocol)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -158,9 +153,7 @@ class AttachmentsClassLoader(attachments: List<Attachment>,
|
||||
checkAttachments(attachments)
|
||||
}
|
||||
|
||||
private class AttachmentHashContext(
|
||||
val txId: SecureHash,
|
||||
val buffer: ByteArray = ByteArray(DEFAULT_BUFFER_SIZE))
|
||||
private class AttachmentHashContext(val buffer: ByteArray = ByteArray(DEFAULT_BUFFER_SIZE))
|
||||
|
||||
private fun hash(inputStream : InputStream, ctx : AttachmentHashContext) : SecureHash.SHA256 {
|
||||
val md = MessageDigest.getInstance(SecureHash.SHA2_256)
|
||||
@ -189,7 +182,7 @@ class AttachmentsClassLoader(attachments: List<Attachment>,
|
||||
// This function attempts to strike a balance between security and usability when it comes to the no-overlap rule.
|
||||
// TODO - investigate potential exploits.
|
||||
private fun shouldCheckForNoOverlap(path: String, targetPlatformVersion: Int): Boolean {
|
||||
require(path.toLowerCase() == path)
|
||||
require(path.lowercase() == path)
|
||||
require(!path.contains('\\'))
|
||||
|
||||
return when {
|
||||
@ -234,7 +227,7 @@ class AttachmentsClassLoader(attachments: List<Attachment>,
|
||||
// claim their parts of the Java package namespace via registration with the zone operator.
|
||||
|
||||
val classLoaderEntries = mutableMapOf<String, SecureHash>()
|
||||
val ctx = AttachmentHashContext(sampleTxId)
|
||||
val ctx = AttachmentHashContext()
|
||||
for (attachment in attachments) {
|
||||
// We may have been given an attachment loaded from the database in which case, important info like
|
||||
// signers is already calculated.
|
||||
@ -270,7 +263,7 @@ class AttachmentsClassLoader(attachments: List<Attachment>,
|
||||
// filesystem tries to be case insensitive. This may break developers who attempt to use ProGuard.
|
||||
//
|
||||
// Also convert to Unix path separators as all resource/class lookups will expect this.
|
||||
val path = entry.name.toLowerCase(Locale.US).replace('\\', '/')
|
||||
val path = entry.name.lowercase(Locale.US).replace('\\', '/')
|
||||
|
||||
// Namespace ownership. We only check class files: resources are loaded relative to a JAR anyway.
|
||||
if (path.endsWith(".class")) {
|
||||
@ -285,7 +278,7 @@ class AttachmentsClassLoader(attachments: List<Attachment>,
|
||||
for ((namespace, pubkey) in params.packageOwnership) {
|
||||
// Note that due to the toLowerCase() call above, we'll be comparing against a lowercased
|
||||
// version of the ownership claim.
|
||||
val ns = namespace.toLowerCase(Locale.US)
|
||||
val ns = namespace.lowercase(Locale.US)
|
||||
// We need an additional . to avoid matching com.foo.Widget against com.foobar.Zap
|
||||
if (pkgName == ns || pkgName.startsWith("$ns.")) {
|
||||
if (pubkey !in signers)
|
||||
@ -358,7 +351,7 @@ object AttachmentsClassLoaderBuilder {
|
||||
val attachmentIds = attachments.mapTo(LinkedHashSet(), Attachment::id)
|
||||
|
||||
val cache = attachmentsClassLoaderCache ?: fallBackCache
|
||||
val cachedSerializationContext = cache.computeIfAbsent(AttachmentsClassLoaderKey(attachmentIds, params), Function { key ->
|
||||
val cachedSerializationContext = cache.computeIfAbsent(AttachmentsClassLoaderKey(attachmentIds, params)) { key ->
|
||||
// Create classloader and load serializers, whitelisted classes
|
||||
val transactionClassLoader = AttachmentsClassLoader(attachments, key.params, txId, isAttachmentTrusted, parent)
|
||||
val serializers = try {
|
||||
@ -380,9 +373,9 @@ object AttachmentsClassLoaderBuilder {
|
||||
.withWhitelist(whitelistedClasses)
|
||||
.withCustomSerializers(serializers)
|
||||
.withoutCarpenter()
|
||||
})
|
||||
}
|
||||
|
||||
val serializationContext = cachedSerializationContext.withProperties(mapOf<Any, Any>(
|
||||
val serializationContext = cachedSerializationContext.withProperties(mapOf(
|
||||
// Duplicate the SerializationContext from the cache and give
|
||||
// it these extra properties, just for this transaction.
|
||||
// However, keep a strong reference to the cached SerializationContext so we can
|
||||
@ -489,7 +482,6 @@ class AttachmentsClassLoaderCacheImpl(cacheFactory: NamedCacheFactory) : Singlet
|
||||
private val toBeClosed = ConcurrentHashMap.newKeySet<ToBeClosed>()
|
||||
private val expiryQueue = ReferenceQueue<SerializationContext>()
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
private fun purgeExpiryQueue() {
|
||||
// Close the AttachmentsClassLoader for every SerializationContext
|
||||
// that has already been garbage-collected.
|
||||
|
@ -290,7 +290,6 @@ private constructor(
|
||||
// upgraded attachments
|
||||
@CordaInternal
|
||||
@JvmSynthetic
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
internal fun loadUpgradedContract(className: ContractClassName, id: SecureHash, classLoader: ClassLoader): UpgradedContract<ContractState, *> {
|
||||
return try {
|
||||
loadClassOfType<UpgradedContract<ContractState, *>>(className, false, classLoader)
|
||||
|
@ -943,17 +943,17 @@ class CryptoUtilsTest {
|
||||
Security.removeProvider(CordaSecurityProvider.PROVIDER_NAME)
|
||||
// Try after removing CordaSecurityProvider.
|
||||
val secureRandomNotRegisteredCordaProvider = SecureRandom()
|
||||
assertNotEquals(PlatformSecureRandomService.algorithm, secureRandomNotRegisteredCordaProvider.algorithm)
|
||||
assertNotEquals(PlatformSecureRandomService.ALGORITHM, secureRandomNotRegisteredCordaProvider.algorithm)
|
||||
|
||||
// Now register CordaSecurityProvider as last Provider.
|
||||
Security.addProvider(CordaSecurityProvider())
|
||||
val secureRandomRegisteredLastCordaProvider = SecureRandom()
|
||||
assertNotEquals(PlatformSecureRandomService.algorithm, secureRandomRegisteredLastCordaProvider.algorithm)
|
||||
assertNotEquals(PlatformSecureRandomService.ALGORITHM, secureRandomRegisteredLastCordaProvider.algorithm)
|
||||
|
||||
// Remove Corda Provider again and add it as the first Provider entry.
|
||||
Security.removeProvider(CordaSecurityProvider.PROVIDER_NAME)
|
||||
Security.insertProviderAt(CordaSecurityProvider(), 1) // This is base-1.
|
||||
val secureRandomRegisteredFirstCordaProvider = SecureRandom()
|
||||
assertEquals(PlatformSecureRandomService.algorithm, secureRandomRegisteredFirstCordaProvider.algorithm)
|
||||
assertEquals(PlatformSecureRandomService.ALGORITHM, secureRandomRegisteredFirstCordaProvider.algorithm)
|
||||
}
|
||||
}
|
||||
|
@ -1393,179 +1393,6 @@
|
||||
<ID>ThrowsCount:TransactionVerifierServiceInternal.kt$Verifier$ private fun getUniqueContractAttachmentsByContract(): Map<ContractClassName, ContractAttachment></ID>
|
||||
<ID>ThrowsCount:TransactionVerifierServiceInternal.kt$Verifier$// Using basic graph theory, a full cycle of encumbered (co-dependent) states should exist to achieve bi-directional // encumbrances. This property is important to ensure that no states involved in an encumbrance-relationship // can be spent on their own. Briefly, if any of the states is having more than one encumbrance references by // other states, a full cycle detection will fail. As a result, all of the encumbered states must be present // as "from" and "to" only once (or zero times if no encumbrance takes place). For instance, // a -> b // c -> b and a -> b // b -> a b -> c // do not satisfy the bi-directionality (full cycle) property. // // In the first example "b" appears twice in encumbrance ("to") list and "c" exists in the encumbered ("from") list only. // Due the above, one could consume "a" and "b" in the same transaction and then, because "b" is already consumed, "c" cannot be spent. // // Similarly, the second example does not form a full cycle because "a" and "c" exist in one of the lists only. // As a result, one can consume "b" and "c" in the same transactions, which will make "a" impossible to be spent. // // On other hand the following are valid constructions: // a -> b a -> c // b -> c and c -> b // c -> a b -> a // and form a full cycle, meaning that the bi-directionality property is satisfied. private fun checkBidirectionalOutputEncumbrances(statesAndEncumbrance: List<Pair<Int, Int>>)</ID>
|
||||
<ID>ThrowsCount:WireTransaction.kt$WireTransaction.Companion$ @CordaInternal fun resolveStateRefBinaryComponent(stateRef: StateRef, services: ServicesForResolution): SerializedBytes<TransactionState<ContractState>>?</ID>
|
||||
<ID>TooGenericExceptionCaught:AMQPChannelHandler.kt$AMQPChannelHandler$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:AMQPExceptions.kt$th: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:AMQPTestUtils.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:AbstractNode.kt$AbstractNode$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:AbstractNode.kt$AbstractNode.<no name provided>$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:AbstractNode.kt$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:AbstractNodeTests.kt$ColdJVM.Companion$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:Amount.kt$Amount.Companion$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ArtemisRpcBroker.kt$ArtemisRpcBroker$th: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:AttachmentDemo.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:AttachmentLoadingTests.kt$AttachmentLoadingTests.ConsumeAndBroadcastResponderFlow$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:AttachmentVersionNumberMigration.kt$AttachmentVersionNumberMigration$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:AzureSmbVolume.kt$AzureSmbVolume$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:BCCryptoService.kt$BCCryptoService$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:BankOfCordaWebApi.kt$BankOfCordaWebApi$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:BlobInspector.kt$BlobInspector$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:BootstrapperView.kt$BootstrapperView$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:BrokerJaasLoginModule.kt$BrokerJaasLoginModule$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CertRole.kt$CertRole.Companion$ex: ArrayIndexOutOfBoundsException</ID>
|
||||
<ID>TooGenericExceptionCaught:CheckpointAgent.kt$CheckpointAgent.Companion$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CheckpointAgent.kt$CheckpointHook$throwable: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:CheckpointDumperImpl.kt$CheckpointDumperImpl$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CheckpointVerifier.kt$CheckpointVerifier$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CollectSignaturesFlow.kt$SignTransactionFlow$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ConcurrencyUtils.kt$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:ConfigUtilities.kt$e:Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ConnectionStateMachine.kt$ConnectionStateMachine$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ContractAttachmentSerializer.kt$ContractAttachmentSerializer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ContractUpgradeTransactions.kt$ContractUpgradeWireTransaction$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CordaAuthenticationPlugin.kt$CordaAuthenticationPlugin$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CordaClassResolver.kt$LoggingWhitelist.Companion$ioEx: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CordaPersistence.kt$CordaPersistence$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CordaRPCClientTest.kt$CordaRPCClientTest$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CordaRPCOpsImpl.kt$CordaRPCOpsImpl$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CordaServiceLifecycleFatalTests.kt$CordaServiceLifecycleFatalTests$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:CryptoUtilsTest.kt$CryptoUtilsTest$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DBNetworkParametersStorage.kt$DBNetworkParametersStorage$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DataUploadServlet.kt$DataUploadServlet$e: RuntimeException</ID>
|
||||
<ID>TooGenericExceptionCaught:DbMapDeadlockTest.kt$DbMapDeadlockTest$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DemoBenchView.kt$DemoBenchView$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DeserializationInput.kt$DeserializationInput$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DeserializeSimpleTypesTests.kt$DeserializeSimpleTypesTests$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DistributionMux.kt$DistributionMux$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DockerInstantiator.kt$DockerInstantiator$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DriverDSLImpl.kt$DriverDSLImpl$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:DriverDSLImpl.kt$DriverDSLImpl.Companion$th: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:DriverDSLImpl.kt$exception: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:DriverTests.kt$DriverTests$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ErrorHandling.kt$ErrorHandling.CheckpointAfterErrorFlow$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:EventProcessor.kt$EventProcessor$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Eventually.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Expect.kt$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Explorer.kt$Explorer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:FinanceJSONSupport.kt$CalendarDeserializer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:FlowHandle.kt$FlowProgressHandleImpl$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:FlowMessaging.kt$FlowMessagingImpl$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:FlowStackSnapshotTest.kt$FlowStackSnapshotTest$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:FlowStateMachineImpl.kt$FlowStateMachineImpl$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:FlowStateMachineImpl.kt$FlowStateMachineImpl$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:FutureMatchers.kt$<no name provided>$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:HibernateConfiguration.kt$HibernateConfiguration$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:HibernateQueryCriteriaParser.kt$HibernateQueryCriteriaParser$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:IRSDemo.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:IRSDemoTest.kt$IRSDemoTest.InterestRateSwapStateDeserializer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:InitialRegistrationCli.kt$InitialRegistration$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:InitialRegistrationCli.kt$InitialRegistration.Companion$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Injectors.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:InstallShellExtensionsParser.kt$ShellExtensionsGenerator$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:InteractiveShell.kt$InteractiveShell$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:InteractiveShell.kt$InteractiveShell$e: IndexOutOfBoundsException</ID>
|
||||
<ID>TooGenericExceptionCaught:InterestSwapRestAPI.kt$InterestRateSwapAPI$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:InternalMockNetwork.kt$InternalMockNetwork$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:InternalTestUtils.kt$<no name provided>$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:InternalUtils.kt$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:InternalUtils.kt$th: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:IssueCash.kt$IssueCash$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:JacksonSupport.kt$JacksonSupport.PartyDeserializer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:JacksonSupport.kt$JacksonSupport.PublicKeyDeserializer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:JacksonSupport.kt$JacksonSupport.SecureHashDeserializer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:JarScanningCordappLoader.kt$JarScanningCordappLoader$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Kryo.kt$ImmutableClassSerializer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:LedgerDSLInterpreter.kt$Verifies$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:LoadTest.kt$LoadTest$throwable: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:LoginView.kt$LoginView$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Main.kt$Main$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MerkleTransaction.kt$FilteredTransaction$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MigrationServicesForResolution.kt$MigrationServicesForResolution$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MockAttachmentStorage.kt$MockAttachmentStorage$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MockCryptoService.kt$MockCryptoService$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MockNodeMessagingService.kt$MockNodeMessagingService$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MultiRPCClient.kt$MultiRPCClient$ex: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:MyCustomNotaryService.kt$MyValidatingNotaryFlow$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NamedCacheTest.kt$NamedCacheTest$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NettyTestHandler.kt$NettyTestHandler$e: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:NetworkBootstrapper.kt$NetworkBootstrapper$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NetworkMapServer.kt$NetworkMapServer.InMemoryNetworkMapService$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NetworkMapUpdater.kt$NetworkMapUpdater$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NetworkMapUpdater.kt$NetworkMapUpdater.<no name provided>$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NetworkParameterOverridesSpec.kt$NetworkParameterOverridesSpec.PackageOwnershipSpec$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NetworkParametersReader.kt$NetworkParametersReader$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NetworkRegistrationHelper.kt$NetworkRegistrationHelper$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeController.kt$NodeController$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeInfoWatcher.kt$NodeInfoWatcher$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeInterestRates.kt$NodeInterestRates$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeMonitorModel.kt$NodeMonitorModel$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeProcess.kt$NodeProcess.Factory$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeRPC.kt$NodeRPC$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeRPC.kt$NodeRPC.<no name provided>$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeSchedulerService.kt$NodeSchedulerService$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeStartup.kt$NodeStartup$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeTerminalView.kt$NodeTerminalView$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeVaultService.kt$NodeVaultService$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NodeVaultServiceTest.kt$NodeVaultServiceTest$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NonValidatingNotaryFlow.kt$NonValidatingNotaryFlow$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NotaryServiceFlow.kt$NotaryServiceFlow$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:NotaryUtils.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ObjectDiffer.kt$ObjectDiffer$throwable: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:P2PMessagingClient.kt$P2PMessagingClient$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:PersistentUniquenessProvider.kt$PersistentUniquenessProvider$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ProfileController.kt$ProfileController$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:PropertyValidationTest.kt$PropertyValidationTest$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:QuasarInstrumentationHook.kt$QuasarInstrumentationHook$throwable: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:R3Pty.kt$R3Pty$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCApi.kt$RPCApi.ServerToClient.Companion$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCClient.kt$RPCClient$throwable: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCClientProxyHandler.kt$RPCClientProxyHandler$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCClientProxyHandler.kt$RPCClientProxyHandler$e: RuntimeException</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCPermissionResolver.kt$RPCPermissionResolver.InterfaceMethodMapCacheLoader$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCServer.kt$RPCServer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCServer.kt$RPCServer$exception: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCServer.kt$RPCServer$throwable: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCStabilityTests.kt$RPCStabilityTests$e2: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RPCStabilityTests.kt$RPCStabilityTests$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RandomFailingProxy.kt$RandomFailingProxy$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ReceiveTransactionFlow.kt$ReceiveTransactionFlow$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ReconnectingCordaRPCOps.kt$ReconnectingCordaRPCOps.ReconnectingRPCConnection$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ReconnectingObservable.kt$ReconnectingObservable.ReconnectingSubscriber$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:RpcServerObservableSerializerTests.kt$RpcServerObservableSerializerTests$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SSLHelper.kt$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SerializationOutputTests.kt$SerializationOutputTests$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:ShutdownManager.kt$ShutdownManager$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:SimpleAMQPClient.kt$SimpleAMQPClient$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SimpleMQClient.kt$SimpleMQClient$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:SingleThreadedStateMachineManager.kt$SingleThreadedStateMachineManager$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:StandaloneShell.kt$StandaloneShell$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:StandardConfigValueParsers.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:StringToMethodCallParser.kt$StringToMethodCallParser$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:TLSAuthenticationTests.kt$TLSAuthenticationTests$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ThrowableSerializer.kt$ThrowableSerializer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:TlsDiffAlgorithmsTest.kt$TlsDiffAlgorithmsTest$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:TlsDiffProtocolsTest.kt$TlsDiffProtocolsTest$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:TraderDemo.kt$TraderDemo$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:TransactionBuilder.kt$TransactionBuilder$e: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:TransactionSignatureTest.kt$TransactionSignatureTest$e: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:TransactionUtils.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:TransformTypes.kt$TransformTypes.Companion$e: IndexOutOfBoundsException</ID>
|
||||
<ID>TooGenericExceptionCaught:TransitionExecutorImpl.kt$TransitionExecutorImpl$exception: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:Try.kt$Try.Companion$t: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:UserValidationPlugin.kt$UserValidationPlugin$e: Throwable</ID>
|
||||
<ID>TooGenericExceptionCaught:Utils.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:V1NodeConfigurationSpec.kt$V1NodeConfigurationSpec$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ValidatingNotaryFlow.kt$ValidatingNotaryFlow$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:VaultStateMigration.kt$VaultStateIterator$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:VaultStateMigration.kt$VaultStateMigration$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:WebServer.kt$WebServer$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:WebServer.kt$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:WebServer.kt$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:WithMockNet.kt$WithMockNet.<no name provided>$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:X509EdDSAEngine.kt$X509EdDSAEngine$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:X509UtilitiesTest.kt$X509UtilitiesTest$ex: Exception</ID>
|
||||
<ID>TooGenericExceptionThrown:AMQPExceptionsTests.kt$AMQPExceptionsTests$throw Exception("FAILED")</ID>
|
||||
<ID>TooGenericExceptionThrown:AzureBackend.kt$AzureBackend.Companion$throw RuntimeException(e)</ID>
|
||||
<ID>TooGenericExceptionThrown:ClassLoadingUtilsTest.kt$ClassLoadingUtilsTest$throw RuntimeException()</ID>
|
||||
|
@ -77,17 +77,6 @@ empty-blocks:
|
||||
exceptions:
|
||||
active: true
|
||||
excludes: "**/buildSrc/**"
|
||||
TooGenericExceptionCaught:
|
||||
active: true
|
||||
exceptionNames:
|
||||
- ArrayIndexOutOfBoundsException
|
||||
- Error
|
||||
- Exception
|
||||
- IllegalMonitorStateException
|
||||
- NullPointerException
|
||||
- IndexOutOfBoundsException
|
||||
- RuntimeException
|
||||
- Throwable
|
||||
TooGenericExceptionThrown:
|
||||
active: true
|
||||
exceptionNames:
|
||||
|
@ -1,4 +1,3 @@
|
||||
@file:Suppress("TooGenericExceptionCaught") // needs to catch and handle/rethrow *all* exceptions in many places
|
||||
package net.corda.nodeapi.internal.bridging
|
||||
|
||||
import co.paralleluniverse.fibers.instrument.DontInstrument
|
||||
|
@ -1,4 +1,3 @@
|
||||
@file:Suppress("TooGenericExceptionCaught") // needs to catch and handle/rethrow *all* exceptions
|
||||
package net.corda.nodeapi.internal.bridging
|
||||
|
||||
import net.corda.core.identity.CordaX500Name
|
||||
@ -27,6 +26,7 @@ import rx.Observable
|
||||
import rx.subjects.PublishSubject
|
||||
import java.time.Duration
|
||||
import java.util.*
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
class BridgeControlListener(private val keyStore: CertificateStore,
|
||||
trustStore: CertificateStore,
|
||||
@ -142,7 +142,7 @@ class BridgeControlListener(private val keyStore: CertificateStore,
|
||||
val notifyMessage = data.deserialize<BridgeControl.BridgeToNodeSnapshotRequest>(context = SerializationDefaults.P2P_CONTEXT)
|
||||
if (notifyMessage.bridgeIdentity != bridgeId) {
|
||||
log.error("Fatal Error! Two bridges have been configured simultaneously! Check the enterpriseConfiguration.externalBridge status")
|
||||
System.exit(1)
|
||||
exitProcess(1)
|
||||
}
|
||||
} catch (ex: Exception) {
|
||||
log.error("Unable to process bridge notification message", ex)
|
||||
@ -204,7 +204,7 @@ class BridgeControlListener(private val keyStore: CertificateStore,
|
||||
is BridgeControl.NodeToBridgeSnapshot -> {
|
||||
if (!isConfigured(controlMessage.nodeIdentity)) {
|
||||
log.error("Fatal error! Bridge not configured with keystore for node with legal name ${controlMessage.nodeIdentity}.")
|
||||
System.exit(1)
|
||||
exitProcess(1)
|
||||
}
|
||||
if (!controlMessage.inboxQueues.all { validateInboxQueueName(it) }) {
|
||||
log.error("Invalid queue names in control message $controlMessage")
|
||||
|
@ -1,4 +1,4 @@
|
||||
@file:Suppress("MagicNumber", "TooGenericExceptionCaught")
|
||||
@file:Suppress("MagicNumber")
|
||||
|
||||
package net.corda.nodeapi.internal.crypto
|
||||
|
||||
|
@ -5,7 +5,6 @@ import com.github.benmanes.caffeine.cache.LoadingCache
|
||||
import net.corda.core.internal.readFully
|
||||
import net.corda.core.utilities.contextLogger
|
||||
import net.corda.core.utilities.debug
|
||||
import net.corda.core.utilities.contextLogger
|
||||
import net.corda.core.utilities.minutes
|
||||
import net.corda.core.utilities.seconds
|
||||
import net.corda.nodeapi.internal.crypto.X509CertificateFactory
|
||||
@ -21,7 +20,6 @@ import javax.security.auth.x500.X500Principal
|
||||
/**
|
||||
* [CrlSource] which downloads CRLs from the distribution points in the X509 certificate and caches them.
|
||||
*/
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
class CertDistPointCrlSource(cacheSize: Long = DEFAULT_CACHE_SIZE,
|
||||
cacheExpiry: Duration = DEFAULT_CACHE_EXPIRY,
|
||||
private val connectTimeout: Duration = DEFAULT_CONNECT_TIMEOUT,
|
||||
|
@ -33,7 +33,6 @@ class CordaRevocationChecker(private val crlSource: CrlSource,
|
||||
checkApprovedCRLs(cert, getCRLs(cert))
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
private fun getCRLs(cert: X509Certificate): Set<X509CRL> {
|
||||
val crls = try {
|
||||
crlSource.fetch(cert)
|
||||
|
@ -705,7 +705,6 @@ class StateMachineGeneralErrorHandlingTest : StateMachineErrorHandlingTest() {
|
||||
*
|
||||
* On shutdown this flow will still terminate correctly and not prevent the node from shutting down.
|
||||
*/
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
@Test(timeout = 300_000)
|
||||
fun `a dead flow can be shutdown`() {
|
||||
startDriver {
|
||||
|
@ -213,7 +213,6 @@ class ProtonWrapperTests {
|
||||
assertTrue(done)
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught") // Too generic exception thrown!
|
||||
@Test(timeout=300_000)
|
||||
fun `AMPQClient that fails to handshake with a server will retry the server`() {
|
||||
/*
|
||||
|
@ -42,7 +42,7 @@ import java.util.concurrent.Semaphore
|
||||
import javax.persistence.PersistenceException
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
@Suppress("TooGenericExceptionCaught", "TooGenericExceptionThrown")
|
||||
@Suppress("TooGenericExceptionThrown")
|
||||
class FlowEntityManagerTest : AbstractFlowEntityManagerTest() {
|
||||
|
||||
@Before
|
||||
|
@ -139,7 +139,7 @@ class FlowHospitalTest {
|
||||
|
||||
@Test(timeout = 300_000)
|
||||
fun `HospitalizeFlowException thrown`() {
|
||||
var observationCounter: Int = 0
|
||||
var observationCounter = 0
|
||||
StaffedFlowHospital.onFlowKeptForOvernightObservation.add { _, _ ->
|
||||
++observationCounter
|
||||
}
|
||||
@ -161,7 +161,7 @@ class FlowHospitalTest {
|
||||
|
||||
@Test(timeout = 300_000)
|
||||
fun `Custom exception wrapping HospitalizeFlowException thrown`() {
|
||||
var observationCounter: Int = 0
|
||||
var observationCounter = 0
|
||||
StaffedFlowHospital.onFlowKeptForOvernightObservation.add { _, _ ->
|
||||
++observationCounter
|
||||
}
|
||||
@ -183,7 +183,7 @@ class FlowHospitalTest {
|
||||
|
||||
@Test(timeout = 300_000)
|
||||
fun `Custom exception extending HospitalizeFlowException thrown`() {
|
||||
var observationCounter: Int = 0
|
||||
var observationCounter = 0
|
||||
StaffedFlowHospital.onFlowKeptForOvernightObservation.add { _, _ ->
|
||||
++observationCounter
|
||||
}
|
||||
@ -470,7 +470,7 @@ class FlowHospitalTest {
|
||||
|
||||
@Suspendable
|
||||
override fun call() {
|
||||
val throwable = hospitalizeFlowExceptionClass.newInstance()
|
||||
val throwable = hospitalizeFlowExceptionClass.getDeclaredConstructor().newInstance()
|
||||
(throwable as? Throwable)?.let {
|
||||
throw it
|
||||
}
|
||||
@ -561,7 +561,6 @@ class FlowHospitalTest {
|
||||
var exceptionSeenInUserFlow = false
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
@Suspendable
|
||||
override fun call() {
|
||||
val consumeError = session.receive<Boolean>().unwrap { it }
|
||||
|
@ -1237,7 +1237,6 @@ abstract class AbstractNode<S>(val configuration: NodeConfiguration,
|
||||
*/
|
||||
override fun jdbcSession(): Connection = RestrictedConnection(database.createSession(), services)
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
override fun <T : Any?> withEntityManager(block: EntityManager.() -> T): T {
|
||||
return database.transaction(useErrorHandler = false) {
|
||||
session.flush()
|
||||
|
@ -51,7 +51,6 @@ import net.corda.node.services.config.shouldStartLocalShell
|
||||
import net.corda.node.utilities.registration.NodeRegistrationException
|
||||
import net.corda.nodeapi.internal.JVMAgentUtilities
|
||||
import net.corda.nodeapi.internal.addShutdownHook
|
||||
import net.corda.nodeapi.internal.persistence.CouldNotCreateDataSourceException
|
||||
import net.corda.nodeapi.internal.persistence.DatabaseIncompatibleException
|
||||
import org.fusesource.jansi.Ansi
|
||||
import org.slf4j.bridge.SLF4JBridgeHandler
|
||||
@ -217,7 +216,7 @@ open class NodeStartup : NodeStartupLogging {
|
||||
if (requireCertificates && !canReadCertificatesDirectory(configuration.certificatesDirectory, configuration.devMode)) return ExitCodes.FAILURE
|
||||
|
||||
// Step 7. Configuring special serialisation requirements, i.e., bft-smart relies on Java serialization.
|
||||
if (attempt { banJavaSerialisation(configuration) }.doOnFailure(Consumer { error -> error.logAsUnexpected("Exception while configuring serialisation") }) !is Try.Success) return ExitCodes.FAILURE
|
||||
if (attempt { banJavaSerialisation(configuration) }.doOnFailure { error -> error.logAsUnexpected("Exception while configuring serialisation") } !is Try.Success) return ExitCodes.FAILURE
|
||||
|
||||
// Step 8. Any actions required before starting up the Corda network layer.
|
||||
if (attempt { preNetworkRegistration(configuration) }.doOnFailure(Consumer(::handleRegistrationError)) !is Try.Success) return ExitCodes.FAILURE
|
||||
@ -472,7 +471,6 @@ interface NodeStartupLogging {
|
||||
companion object {
|
||||
val logger by lazy { contextLogger() }
|
||||
val startupErrors = setOf(MultipleCordappsForFlowException::class, CheckpointIncompatibleException::class, AddressBindingException::class, NetworkParametersReader::class, DatabaseIncompatibleException::class)
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
val PRINT_ERRORS_TO_STD_ERR = try {
|
||||
System.getProperty("net.corda.node.printErrorsToStdErr") == "true"
|
||||
} catch (e: NullPointerException) {
|
||||
@ -515,7 +513,6 @@ interface NodeStartupLogging {
|
||||
when {
|
||||
error is ErrorCode<*> -> logger.report(error)
|
||||
error.isExpectedWhenStartingNode() -> error.logAsExpected()
|
||||
error is CouldNotCreateDataSourceException -> error.logAsUnexpected()
|
||||
error is Errors.NativeIoException && error.message?.contains("Address already in use") == true -> error.logAsExpected("One of the ports required by the Corda node is already in use.")
|
||||
error is Errors.NativeIoException && error.message?.contains("Can't assign requested address") == true -> error.logAsExpected("Exception during node startup. Check that addresses in node config resolve correctly.")
|
||||
error is UnresolvedAddressException -> error.logAsExpected("Exception during node startup. Check that addresses in node config resolve correctly.")
|
||||
@ -541,14 +538,14 @@ fun CliWrapperBase.initLogging(baseDirectory: Path): Boolean {
|
||||
try {
|
||||
logPath.safeSymbolicRead().createDirectories()
|
||||
} catch (e: IOException) {
|
||||
printError("Unable to create logging directory ${logPath.toString()}. Node will now shutdown.")
|
||||
printError("Unable to create logging directory $logPath. Node will now shutdown.")
|
||||
return false
|
||||
} catch (e: SecurityException) {
|
||||
printError("Current user is unable to access logging directory ${logPath.toString()}. Node will now shutdown.")
|
||||
printError("Current user is unable to access logging directory $logPath. Node will now shutdown.")
|
||||
return false
|
||||
}
|
||||
if (!logPath.isDirectory()) {
|
||||
printError("Unable to access logging directory ${logPath.toString()}. Node will now shutdown.")
|
||||
printError("Unable to access logging directory $logPath. Node will now shutdown.")
|
||||
return false
|
||||
}
|
||||
|
||||
|
@ -113,7 +113,6 @@ class ArtemisMessagingServer(private val config: NodeConfiguration,
|
||||
registerPostQueueDeletionCallback { address, qName -> log.debug { "Queue deleted: $qName for $address" } }
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
try {
|
||||
activeMQServer.startSynchronously()
|
||||
} catch (e: Throwable) {
|
||||
|
@ -10,7 +10,6 @@ import java.io.DataOutputStream
|
||||
import java.nio.ByteBuffer
|
||||
import java.time.Instant
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
@CordaSerializable
|
||||
data class HashedDistributionList(
|
||||
val senderStatesToRecord: StatesToRecord,
|
||||
@ -60,7 +59,7 @@ data class HashedDistributionList(
|
||||
fun unauthenticatedDeserialise(encryptedBytes: ByteArray, encryptionService: EncryptionService): PublicHeader {
|
||||
val additionalData = encryptionService.extractUnauthenticatedAdditionalData(encryptedBytes)
|
||||
requireNotNull(additionalData) { "Missing additional data field" }
|
||||
return deserialise(additionalData!!)
|
||||
return deserialise(additionalData)
|
||||
}
|
||||
|
||||
fun deserialise(bytes: ByteArray): PublicHeader {
|
||||
@ -91,7 +90,7 @@ data class HashedDistributionList(
|
||||
fun decrypt(encryptedBytes: ByteArray, encryptionService: EncryptionService): HashedDistributionList {
|
||||
val (plaintext, authenticatedAdditionalData) = encryptionService.decrypt(encryptedBytes)
|
||||
requireNotNull(authenticatedAdditionalData) { "Missing authenticated header" }
|
||||
val publicHeader = PublicHeader.deserialise(authenticatedAdditionalData!!)
|
||||
val publicHeader = PublicHeader.deserialise(authenticatedAdditionalData)
|
||||
val input = DataInputStream(plaintext.inputStream())
|
||||
try {
|
||||
val senderStatesToRecord = statesToRecordValues[input.readByte().toInt()]
|
||||
|
@ -52,7 +52,6 @@ class ArtemisRpcBroker internal constructor(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
override fun start() {
|
||||
logger.debug { "Artemis RPC broker is starting for: $addresses" }
|
||||
try {
|
||||
@ -90,7 +89,7 @@ class ArtemisRpcBroker internal constructor(
|
||||
val serverSecurityManager = createArtemisSecurityManager(serverConfiguration.loginListener)
|
||||
|
||||
return ActiveMQServerImpl(serverConfiguration, serverSecurityManager).apply {
|
||||
registerPostQueueDeletionCallback { address, qName -> logger.debug("Queue deleted: $qName for $address") }
|
||||
registerPostQueueDeletionCallback { address, qName -> logger.debug { "Queue deleted: $qName for $address" } }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -107,7 +107,6 @@ class CheckpointDumperImpl(private val checkpointStorage: CheckpointStorage, pri
|
||||
context: CheckpointSerializationContext,
|
||||
runId: StateMachineRunId,
|
||||
flowState: FlowState.Started) {
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
try {
|
||||
flowState.frozenFiber.checkpointDeserialize(context)
|
||||
} catch (e: Exception) {
|
||||
|
@ -112,7 +112,6 @@ internal class ActionExecutorImpl(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught") // this is fully intentional here, see comment in the catch clause
|
||||
@Suspendable
|
||||
private fun executeAcknowledgeMessages(action: Action.AcknowledgeMessages) {
|
||||
action.deduplicationHandlers.forEach {
|
||||
@ -231,7 +230,6 @@ internal class ActionExecutorImpl(
|
||||
action.currentState.run { numberOfCommits = checkpoint.checkpointState.numberOfCommits }
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
@Suspendable
|
||||
private fun executeAsyncOperation(fiber: FlowFiber, action: Action.ExecuteAsyncOperation) {
|
||||
try {
|
||||
|
@ -174,7 +174,6 @@ class FlowCreator(
|
||||
return Flow(flowStateMachineImpl, resultFuture)
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
private fun Checkpoint.getFiberFromCheckpoint(runId: StateMachineRunId, firstRestore: Boolean): FlowStateMachineImpl<*>? {
|
||||
try {
|
||||
return when(flowState) {
|
||||
|
@ -63,7 +63,6 @@ internal class FlowDefaultUncaughtExceptionHandler(
|
||||
scheduledExecutor.schedule({ setFlowToHospitalizedRescheduleOnFailure(id) }, 0, TimeUnit.SECONDS)
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
private fun setFlowToHospitalizedRescheduleOnFailure(id: StateMachineRunId) {
|
||||
try {
|
||||
innerState.withLock {
|
||||
|
@ -182,7 +182,7 @@ internal class SingleThreadedStateMachineManager(
|
||||
)
|
||||
|
||||
val (flows, pausedFlows) = restoreFlowsFromCheckpoints()
|
||||
metrics.register("Flows.InFlight", Gauge<Int> { innerState.flows.size })
|
||||
metrics.register("Flows.InFlight", Gauge { innerState.flows.size })
|
||||
|
||||
setFlowDefaultUncaughtExceptionHandler()
|
||||
|
||||
@ -633,7 +633,7 @@ internal class SingleThreadedStateMachineManager(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught", "ComplexMethod", "MaxLineLength") // this is fully intentional here, see comment in the catch clause
|
||||
@Suppress("ComplexMethod", "MaxLineLength") // this is fully intentional here, see comment in the catch clause
|
||||
override fun retryFlowFromSafePoint(currentState: StateMachineState) {
|
||||
currentState.cancelFutureIfRunning()
|
||||
// Get set of external events
|
||||
@ -973,7 +973,7 @@ internal class SingleThreadedStateMachineManager(
|
||||
}
|
||||
totalStartedFlows.inc()
|
||||
addAndStartFlow(flowId, flow)
|
||||
return startedFuture.map { flow.fiber as FlowStateMachine<A> }
|
||||
return startedFuture.map { flow.fiber }
|
||||
}
|
||||
|
||||
override fun scheduleFlowTimeout(flowId: StateMachineRunId) {
|
||||
@ -1228,7 +1228,7 @@ internal class SingleThreadedStateMachineManager(
|
||||
override val logic: Nothing? = null
|
||||
override val id: StateMachineRunId = id
|
||||
override val resultFuture: CordaFuture<Any?> = resultFuture
|
||||
override val clientId: String? = clientId
|
||||
override val clientId: String = clientId
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -131,7 +131,6 @@ class StartedFlowTransition(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
private fun sendAndReceiveTransition(flowIORequest: FlowIORequest.SendAndReceive): TransitionResult {
|
||||
val sessionIdToMessage = LinkedHashMap<SessionId, SerializedBytes<Any>>()
|
||||
val sessionIdToSession = LinkedHashMap<SessionId, FlowSessionImpl>()
|
||||
@ -195,7 +194,6 @@ class StartedFlowTransition(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
private fun receiveTransition(flowIORequest: FlowIORequest.Receive): TransitionResult {
|
||||
return builder {
|
||||
val sessionIdToSession = LinkedHashMap<SessionId, FlowSessionImpl>()
|
||||
@ -279,9 +277,7 @@ class StartedFlowTransition(
|
||||
var index = 0
|
||||
for (sourceSessionId in sessionIdToSession.keys) {
|
||||
val sessionState = checkpoint.checkpointState.sessions[sourceSessionId]
|
||||
if (sessionState == null) {
|
||||
return freshErrorTransition(CannotFindSessionException(sourceSessionId))
|
||||
}
|
||||
?: return freshErrorTransition(CannotFindSessionException(sourceSessionId))
|
||||
if (sessionState !is SessionState.Uninitiated) {
|
||||
continue
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ class TopLevelTransition(
|
||||
val log = contextLogger()
|
||||
}
|
||||
|
||||
@Suppress("ComplexMethod", "TooGenericExceptionCaught")
|
||||
@Suppress("ComplexMethod")
|
||||
override fun transition(): TransitionResult {
|
||||
return try {
|
||||
if (startingState.isKilled) {
|
||||
|
@ -47,7 +47,6 @@ import kotlin.io.path.createDirectories
|
||||
/**
|
||||
* Handle to the node's external verifier. The verifier process is started lazily on the first verification request.
|
||||
*/
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
class ExternalVerifierHandle(private val serviceHub: ServiceHubInternal) : AutoCloseable {
|
||||
companion object {
|
||||
private val log = contextLogger()
|
||||
|
@ -21,7 +21,6 @@ class JPANotaryService(
|
||||
?: throw IllegalArgumentException("Failed to register ${this::class.java}: notary configuration not present")
|
||||
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
override val uniquenessProvider = with(services) {
|
||||
val jpaNotaryConfig = try {
|
||||
notaryConfig.extraConfig?.parseAs() ?: JPANotaryConfiguration()
|
||||
|
@ -229,8 +229,7 @@ class JPAUniquenessProvider(
|
||||
var exceptionCaught: SQLException? = null
|
||||
while (retryCount <= config.maxDBTransactionRetryCount) {
|
||||
try {
|
||||
val res = block()
|
||||
return res
|
||||
return block()
|
||||
} catch (e: SQLException) {
|
||||
retryCount++
|
||||
Thread.sleep(backOff)
|
||||
@ -242,7 +241,7 @@ class JPAUniquenessProvider(
|
||||
}
|
||||
|
||||
private fun findAllConflicts(session: Session, requests: List<CommitRequest>): MutableMap<StateRef, StateConsumptionDetails> {
|
||||
log.info("Processing notarization requests with ${requests.sumBy { it.states.size }} input states and ${requests.sumBy { it.references.size }} references")
|
||||
log.info("Processing notarization requests with ${requests.sumOf { it.states.size }} input states and ${requests.sumOf { it.references.size }} references")
|
||||
|
||||
val allStates = requests.flatMap { it.states }
|
||||
val allReferences = requests.flatMap { it.references }
|
||||
@ -338,7 +337,6 @@ class JPAUniquenessProvider(
|
||||
return session.find(CommittedTransaction::class.java, txId.toString()) != null
|
||||
}
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
private fun processRequests(requests: List<CommitRequest>) {
|
||||
try {
|
||||
// Note that there is an additional retry mechanism within the transaction itself.
|
||||
|
@ -579,7 +579,6 @@ class FlowOperatorTests {
|
||||
private val expectedPayload: String,
|
||||
private val future: CompletableFuture<Unit>
|
||||
) : MessagingServiceSpy() {
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
override fun send(message: Message, target: MessageRecipients, sequenceKey: Any) {
|
||||
try {
|
||||
val sessionMessage = message.data.bytes.deserialize<InitialSessionMessage>()
|
||||
|
@ -36,25 +36,25 @@ object CreateStateFlow {
|
||||
}
|
||||
|
||||
fun errorTargetsToNum(vararg targets: ErrorTarget): Int {
|
||||
return targets.map { it.targetNumber }.sum()
|
||||
return targets.sumOf { it.targetNumber }
|
||||
}
|
||||
|
||||
private val targetMap = ErrorTarget.values().associateBy(ErrorTarget::targetNumber)
|
||||
|
||||
fun getServiceTarget(target: Int?): ErrorTarget {
|
||||
return target?.let { targetMap.getValue(((it/10000) % 1000)*10000) } ?: CreateStateFlow.ErrorTarget.NoError
|
||||
return target?.let { targetMap.getValue(((it/10000) % 1000)*10000) } ?: ErrorTarget.NoError
|
||||
}
|
||||
|
||||
fun getServiceExceptionHandlingTarget(target: Int?): ErrorTarget {
|
||||
return target?.let { targetMap.getValue(((it / 1000) % 10) * 1000) } ?: CreateStateFlow.ErrorTarget.NoError
|
||||
return target?.let { targetMap.getValue(((it / 1000) % 10) * 1000) } ?: ErrorTarget.NoError
|
||||
}
|
||||
|
||||
fun getTxTarget(target: Int?): ErrorTarget {
|
||||
return target?.let { targetMap.getValue(((it / 10) % 10) * 10) } ?: CreateStateFlow.ErrorTarget.NoError
|
||||
return target?.let { targetMap.getValue(((it / 10) % 10) * 10) } ?: ErrorTarget.NoError
|
||||
}
|
||||
|
||||
fun getFlowTarget(target: Int?): ErrorTarget {
|
||||
return target?.let { targetMap.getValue(((it / 100) % 10) * 100) } ?: CreateStateFlow.ErrorTarget.NoError
|
||||
return target?.let { targetMap.getValue(((it / 100) % 10) * 100) } ?: ErrorTarget.NoError
|
||||
}
|
||||
|
||||
@InitiatingFlow
|
||||
@ -73,7 +73,7 @@ object CreateStateFlow {
|
||||
val state = DbFailureContract.TestState(
|
||||
UniqueIdentifier(),
|
||||
listOf(ourIdentity),
|
||||
if (txTarget == CreateStateFlow.ErrorTarget.TxInvalidState) null else randomValue,
|
||||
if (txTarget == ErrorTarget.TxInvalidState) null else randomValue,
|
||||
errorTarget, ourIdentity
|
||||
)
|
||||
val txCommand = Command(DbFailureContract.Commands.Create(), ourIdentity.owningKey)
|
||||
@ -88,12 +88,11 @@ object CreateStateFlow {
|
||||
|
||||
val signedTx = serviceHub.signInitialTransaction(txBuilder)
|
||||
|
||||
@Suppress("TooGenericExceptionCaught") // this is fully intentional here, to allow twiddling with exceptions according to config
|
||||
try {
|
||||
logger.info("Test flow: recording transaction")
|
||||
serviceHub.recordTransactions(signedTx)
|
||||
} catch (t: Throwable) {
|
||||
if (getFlowTarget(errorTarget) == CreateStateFlow.ErrorTarget.FlowSwallowErrors) {
|
||||
if (getFlowTarget(errorTarget) == ErrorTarget.FlowSwallowErrors) {
|
||||
logger.info("Test flow: Swallowing all exception! Muahahaha!", t)
|
||||
} else {
|
||||
logger.info("Test flow: caught exception - rethrowing")
|
||||
|
@ -44,7 +44,6 @@ class DbListenerService(services: AppServiceHub) : SingletonSerializeAsToken() {
|
||||
|
||||
produced.forEach {
|
||||
val contractState = it.state.data as? DbFailureContract.TestState
|
||||
@Suppress("TooGenericExceptionCaught") // this is fully intentional here, to allow twiddling with exceptions
|
||||
try {
|
||||
when (CreateStateFlow.getServiceTarget(contractState?.errorTarget)) {
|
||||
CreateStateFlow.ErrorTarget.ServiceSqlSyntaxError -> {
|
||||
@ -161,7 +160,7 @@ class DbListenerService(services: AppServiceHub) : SingletonSerializeAsToken() {
|
||||
}
|
||||
|
||||
if (onError != null) {
|
||||
val onErrorWrapper: ((Throwable) -> Unit)? = {
|
||||
val onErrorWrapper: (Throwable) -> Unit = {
|
||||
onErrorVisited?.let {
|
||||
it(services.myInfo.legalIdentities.first())
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
@file:JvmName("TestUtils")
|
||||
@file:Suppress("TooGenericExceptionCaught", "MagicNumber", "ComplexMethod", "LongParameterList")
|
||||
@file:Suppress("MagicNumber", "ComplexMethod", "LongParameterList")
|
||||
|
||||
package net.corda.testing.core
|
||||
|
||||
|
@ -53,7 +53,7 @@ import java.util.Optional
|
||||
import kotlin.io.path.div
|
||||
import kotlin.io.path.listDirectoryEntries
|
||||
|
||||
@Suppress("TooGenericExceptionCaught", "MagicNumber")
|
||||
@Suppress("MagicNumber")
|
||||
class ExternalVerifier(
|
||||
private val baseDirectory: Path,
|
||||
private val fromNode: DataInputStream,
|
||||
|
@ -9,7 +9,6 @@ import java.nio.file.Path
|
||||
import kotlin.io.path.div
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
@Suppress("TooGenericExceptionCaught")
|
||||
object Main {
|
||||
private val log = loggerFor<Main>()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user