Skip to content

Commit 0446508

Browse files
Flossyclaude
andcommitted
fix: reduce deep nesting from 83 to 51 statements through method extraction
Reduces deeply nested statements by 39% (from 83 to 51) by: 1. Extract nesting reduction in ClassLoaderCleanupUtil: - Split clearThreadLocals() into 5 focused methods to reduce nesting - Extract cleanupThreadLocalsForMatchingThreads() to eliminate nested if-statements - clearThreadLocalTable(), clearThreadLocalTableEntries(), clearThreadLocalEntryIfNeeded() all reduce nesting through early returns and guard clauses 2. Refactor AuthHelper to eliminate nested validation: - Extract configureBasicAuth() and configureBearerAuth() private methods - Use switch statement to dispatch instead of nesting validation inside switch cases 3. Extract JAR handling in NexusClassSource: - Create findAndExtractClassFromJar() to eliminate nested while loops - Create extractClassDataFromJarEntry() to handle inner loop and size validation 4. Simplify RetryPolicy retry logic: - Extract performBackoffDelay() method to reduce nesting in execute() - Use early continue with inverted guard clause 5. Apply guard clause in DatabaseClassSource: - Replace if-then-else with guard clause (early throw) to reduce nesting Impact: - Deep nesting statements reduced from 83 to 51 (39% improvement) - Cyclomatic complexity reduced through smaller, focused methods - Code maintainability and testability improved - Methods now follow single responsibility principle Fixes issue #251 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 3d1c89b commit 0446508

35 files changed

Lines changed: 1659 additions & 399 deletions
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
=== Catching Generic Exceptions ===
2+
src/main/java/org/flossware/classloader/objectstore/MinioClassSource.java:84: } catch (MinioException e) {
3+
src/main/java/org/flossware/classloader/objectstore/MinioClassSource.java:102: } catch (MinioException e) {
4+
src/main/java/org/flossware/classloader/delegation/CustomDelegation.java:44: } catch (ClassNotFoundException e) {
5+
src/main/java/org/flossware/classloader/delegation/CustomDelegation.java:51: } catch (ClassNotFoundException e) {
6+
src/main/java/org/flossware/classloader/delegation/ParentFirstDelegation.java:26: } catch (ClassNotFoundException e) {
7+
src/main/java/org/flossware/classloader/delegation/ParentLastDelegation.java:69: } catch (ClassNotFoundException e) {
8+
src/main/java/org/flossware/classloader/lifecycle/ResourceTrackingListener.java:98: } catch (RuntimeException e) {
9+
src/main/java/org/flossware/classloader/lifecycle/ResourceTrackingListener.java:100: } catch (Exception e) {
10+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:92: } catch (SecurityException e) {
11+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:121: } catch (NoSuchFieldException | SecurityException | IllegalAccessException e) {
12+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:243: } catch (javax.management.InstanceNotFoundException | javax.management.MBeanRegistrationException e) {
13+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:253: } catch (javax.management.MalformedObjectNameException | javax.management.ReflectionException e) {
14+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:287: } catch (NoSuchFieldException | SecurityException | IllegalAccessException e) {
15+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:314: } catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalAccessException e) {
16+
src/main/java/org/flossware/classloader/ChecksumValidator.java:56: } catch (NoSuchAlgorithmException e) {
17+
src/main/java/org/flossware/classloader/ClassLoaderEventDispatcher.java:28: } catch (RuntimeException e) {
18+
src/main/java/org/flossware/classloader/ClassLoaderEventDispatcher.java:39: } catch (RuntimeException e) {
19+
src/main/java/org/flossware/classloader/ClassLoaderEventDispatcher.java:50: } catch (RuntimeException e) {
20+
src/main/java/org/flossware/classloader/ClassLoaderEventDispatcher.java:61: } catch (RuntimeException e) {
21+
src/main/java/org/flossware/classloader/ClassLoaderEventDispatcher.java:72: } catch (RuntimeException e) {
22+
src/main/java/org/flossware/classloader/ClassLoaderEventDispatcher.java:83: } catch (RuntimeException e) {
23+
src/main/java/org/flossware/classloader/ClassLoaderResourceManager.java:50: } catch (RuntimeException e) {
24+
src/main/java/org/flossware/classloader/ClassLoaderResourceManager.java:52: } catch (Exception e) {
25+
src/main/java/org/flossware/classloader/ClassLoaderResourceManager.java:65: } catch (RuntimeException e) {
26+
src/main/java/org/flossware/classloader/ClassLoaderResourceManager.java:67: } catch (Exception e) {
27+
src/main/java/org/flossware/classloader/ClassLoaderResourceManager.java:76: } catch (RuntimeException e) {
28+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:139: } catch (SecurityException e) {
29+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:160: } catch (Throwable e) {
30+
src/main/java/org/flossware/classloader/RemoteClassSource.java:178: } catch (RuntimeException e) {
31+
src/main/java/org/flossware/classloader/RemoteJarClassSource.java:163: } catch (RuntimeException e) {
32+
src/main/java/org/flossware/classloader/RestApiClassSource.java:143: } catch (RuntimeException e) {
33+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:350: } catch (RuntimeException e) {
34+
src/main/java/org/flossware/classloader/NexusClassSource.java:217: } catch (RuntimeException e) {
35+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:234: } catch (ExecutionException e) {
36+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:244: } catch (CancellationException e) {
37+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:356: } catch (ExecutionException e) {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
=== Deep Nesting (>3 levels) ===
2+
src/main/java/org/flossware/classloader/cache/FileSystemCache.java:174:4.25 levels: .forEach(p -> deletePathSafely(p, errors));
3+
src/main/java/org/flossware/classloader/filesystem/HdfsClassSource.java:93:4 levels: if (totalRead < size) {
4+
src/main/java/org/flossware/classloader/objectstore/MinioClassSource.java:352:4 levels: this.port = 9000; // Default MinIO port for HTTP
5+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:238:4 levels: if (name.toString().contains(applicationId)) {
6+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:274:4 levels: if (hook.getName().contains(applicationId)) {
7+
src/main/java/org/flossware/classloader/util/ClassLoaderCleanupUtil.java:308:5 levels: if (cacheList instanceof Map) {
8+
src/main/java/org/flossware/classloader/ApplicationClassLoader.java:119:15.25 levels: this.useCache, this.bytecodeVerifier,
9+
src/main/java/org/flossware/classloader/ChecksumValidator.java:62:4 levels: String.format("Checksum mismatch for %s: expected %s, got %s",
10+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:43:6.75 levels: BytecodeVerifier bytecodeVerifier, ClassLoaderEventDispatcher eventDispatcher) {
11+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:64:4 levels: verifyBytecode(name, cachedData);
12+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:84:4 levels: if (classData != null) {
13+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:88:5 levels: verifyBytecode(name, classData);
14+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:90:5 levels: if (useCache && cache != null) {
15+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:138:4 levels: bytecodeVerifier.verify(name, classData);
16+
src/main/java/org/flossware/classloader/ClassLoadingCoordinator.java:141:5 levels: "Bytecode verification failed: " + name, e);
17+
src/main/java/org/flossware/classloader/MavenArtifact.java:61:4 levels: ". Expected format: groupId:artifactId:version[:classifier][:packaging]");
18+
src/main/java/org/flossware/classloader/MavenArtifact.java:174:3.75 levels: Objects.equals(artifactId, that.artifactId) &&
19+
src/main/java/org/flossware/classloader/MavenArtifact.java:176:3.75 levels: Objects.equals(classifier, that.classifier) &&
20+
src/main/java/org/flossware/classloader/RemoteClassSource.java:115:4 levels: if (connection instanceof HttpURLConnection) {
21+
src/main/java/org/flossware/classloader/RemoteClassSource.java:168:9 levels: " bytes (max: " + MAX_CLASS_SIZE + " bytes) for " + className);
22+
src/main/java/org/flossware/classloader/RemoteJarClassSource.java:115:4 levels: if (connection instanceof HttpURLConnection) {
23+
src/main/java/org/flossware/classloader/RemoteJarClassSource.java:240:4 levels: if (totalRead > maxSize) {
24+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:143:4 levels: String jarUrl = buildJarUrl(artifact);
25+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:144:4 levels: String artifactKey = artifact.toString();
26+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:145:4 levels: JarFile jarFile = ensureJarCached(artifactKey, jarUrl);
27+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:151:4 levels: String errorMsg = String.format("Artifact %s - %s",
28+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:152:5 levels: artifact.toString(), e.getMessage());
29+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:181:3.75 levels: artifacts.size() + ", auth=" + authConfig.getAuthType() + "]";
30+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:225:4 levels: jarFileCache.put(artifactKey, jarFile);
31+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:226:4 levels: jarPathCache.put(artifactKey, tempJarPath);
32+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:336:4 levels: if (totalRead > maxSize) {
33+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:438:5 levels: // Acquire each lock in sequence; the outer synchronized block on perArtifactLocks
34+
src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java:477:4 levels: exceptions.forEach(ex::addSuppressed);
35+
src/main/java/org/flossware/classloader/RetryPolicy.java:141:4 levels: if (attempt >= maxRetries) {
36+
src/main/java/org/flossware/classloader/RetryPolicy.java:145:4 levels: performBackoffDelay(attempt);
37+
src/main/java/org/flossware/classloader/NexusClassSource.java:198:4 levels: validateClassDataSize(totalBytes, sourceIdentifier);
38+
src/main/java/org/flossware/classloader/NexusClassSource.java:209:8 levels: " bytes (max: " + MAX_CLASS_SIZE + " bytes) for " + sourceIdentifier);
39+
src/main/java/org/flossware/classloader/NexusClassSource.java:283:4 levels: if (totalBytes > MAX_CLASS_SIZE) {
40+
src/main/java/org/flossware/classloader/DatabaseClassSource.java:104:4 levels: if (!rs.next()) {
41+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:147:5 levels: String jarUrl = buildJarUrl(artifact);
42+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:148:5 levels: String artifactKey = artifact.toString();
43+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:149:5 levels: JarFile jarFile = ensureJarCached(artifactKey, jarUrl);
44+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:154:5 levels: errorMessages.add(String.format("Artifact %s - %s", artifact.toString(), e.getMessage()));
45+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:160:4 levels: "Class not found in any of " + artifacts.size() + " configured Maven artifacts: " +
46+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:161:4 levels: className + "\nAttempted artifacts:\n - " + allErrors
47+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:186:4.75 levels: ", artifacts=" + artifacts.size() + ", auth=" + authConfig.getAuthType() + "]";
48+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:210:4 levels: jarPathCache.put(artifactKey, tempJarPath);
49+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:215:5 levels: jarPathCache.remove(artifactKey);
50+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:353:5 levels: if (task.isDone() && !task.isCancelled()) {
51+
src/main/java/org/flossware/classloader/MavenNexusClassSource.java:378:4 levels: exceptions.forEach(ex::addSuppressed);
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
=== God Classes (>500 lines) ===
2+
713 src/main/java/org/flossware/classloader/MavenRepositoryClassSource.java
3+
530 src/main/java/org/flossware/classloader/RestApiClassSource.java
4+
506 src/main/java/org/flossware/classloader/MavenNexusClassSource.java
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
=== Magic Numbers (Non-constant literals) ===

0 commit comments

Comments
 (0)