Skip to content

Commit 514fd17

Browse files
Flossyclaude
andcommitted
Rename project: jclassloader → classloader-java
Breaking Changes: - Repository: jclassloader → classloader-java - Artifact: jclassloader → classloader-java - Package: org.flossware.jclassloader → org.flossware.classloader - Version: bumped to 2.0 This is a MAJOR version bump due to breaking changes. Migration Guide: - Update dependency artifactId: jclassloader → classloader-java - Update imports: org.flossware.jclassloader → org.flossware.classloader - Update version to 2.0 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent e65b989 commit 514fd17

92 files changed

Lines changed: 1883 additions & 512 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.editorconfig

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# EditorConfig for FlossWare Java projects
2+
# Copy this file to the root of each project
3+
# See https://editorconfig.org
4+
5+
root = true
6+
7+
[*]
8+
charset = utf-8
9+
end_of_line = lf
10+
insert_final_newline = true
11+
trim_trailing_whitespace = true
12+
13+
[*.java]
14+
indent_style = space
15+
indent_size = 4
16+
max_line_length = 120
17+
18+
[*.xml]
19+
indent_style = space
20+
indent_size = 4
21+
22+
[*.{yml,yaml}]
23+
indent_style = space
24+
indent_size = 2
25+
26+
[*.properties]
27+
indent_style = space
28+
indent_size = 4
29+
30+
[*.md]
31+
trim_trailing_whitespace = false
32+
max_line_length = off

README.md

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,16 @@ A flexible Java ClassLoader that can load classes from 34+ transport protocols w
4141
```xml
4242
<dependency>
4343
<groupId>org.flossware</groupId>
44-
<artifactId>jclassloader</artifactId>
44+
<artifactId>classloader-java</artifactId>
4545
<version>1.1</version>
4646
</dependency>
4747
```
4848

4949
### Building from Source
5050

5151
```bash
52-
git clone https://github.com/FlossWare/jclassloader.git
53-
cd jclassloader
52+
git clone https://github.com/FlossWare/classloader-java.git
53+
cd classloader-java
5454
mvn clean install
5555
```
5656

@@ -59,7 +59,7 @@ mvn clean install
5959
### Basic Local Class Loading
6060

6161
```java
62-
import org.flossware.jclassloader.JClassLoader;
62+
import org.flossware.classloader-java.JClassLoader;
6363

6464
JClassLoader loader = JClassLoader.builder()
6565
.addLocalSource("/path/to/classes")
@@ -83,7 +83,7 @@ Class<?> myClass = loader.loadClass("com.example.MyClass");
8383
### Remote Class Loading with Authentication
8484

8585
```java
86-
import org.flossware.jclassloader.AuthConfig;
86+
import org.flossware.classloader-java.AuthConfig;
8787

8888
// Basic Authentication
8989
AuthConfig basicAuth = AuthConfig.basic("username", "password");
@@ -122,7 +122,7 @@ JClassLoader ftpsLoader = JClassLoader.builder()
122122
#### Loading from Nexus Raw Repository
123123

124124
```java
125-
import org.flossware.jclassloader.AuthConfig;
125+
import org.flossware.classloader-java.AuthConfig;
126126

127127
// Public Nexus raw repository
128128
JClassLoader loader = JClassLoader.builder()
@@ -141,8 +141,8 @@ JClassLoader authLoader = JClassLoader.builder()
141141
Load classes from JAR files stored as Maven artifacts:
142142

143143
```java
144-
import org.flossware.jclassloader.MavenNexusClassSource;
145-
import org.flossware.jclassloader.MavenArtifact;
144+
import org.flossware.classloader-java.MavenNexusClassSource;
145+
import org.flossware.classloader-java.MavenArtifact;
146146

147147
// Create a Maven Nexus source with specific artifacts
148148
MavenNexusClassSource nexusSource = MavenNexusClassSource.builder()
@@ -187,7 +187,7 @@ MavenNexusClassSource tokenSource = MavenNexusClassSource.builder()
187187
#### Working with Maven Artifacts
188188

189189
```java
190-
import org.flossware.jclassloader.MavenArtifact;
190+
import org.flossware.classloader-java.MavenArtifact;
191191

192192
// Parse Maven coordinates
193193
MavenArtifact artifact = MavenArtifact.parse("org.example:my-lib:1.0.0");
@@ -205,9 +205,9 @@ String path = artifact.toPath(); // org/example/my-lib/1.0.0/my-lib-1.0.0.jar
205205
### Using Cache
206206

207207
```java
208-
import org.flossware.jclassloader.cache.FileSystemCache;
208+
import org.flossware.classloader-java.cache.FileSystemCache;
209209

210-
FileSystemCache cache = new FileSystemCache("/tmp/jclassloader-cache");
210+
FileSystemCache cache = new FileSystemCache("/tmp/classloader-java-cache");
211211

212212
JClassLoader loader = JClassLoader.builder()
213213
.addRemoteSource("https://example.com/classes/")
@@ -258,7 +258,7 @@ Load classes from cloud storage providers using the [jcloudstorage](https://gith
258258
```java
259259
import org.flossware.cloud.storage.CloudStorageClient;
260260
import org.flossware.cloud.storage.S3CloudStorageClient;
261-
import org.flossware.jclassloader.CloudStorageClassSource;
261+
import org.flossware.classloader-java.CloudStorageClassSource;
262262

263263
// Create cloud storage client
264264
CloudStorageClient s3 = S3CloudStorageClient.builder()
@@ -303,7 +303,7 @@ Load classes via file transfer protocols using [jfiletransfer](https://github.co
303303
```java
304304
import org.flossware.filetransfer.FileTransferClient;
305305
import org.flossware.filetransfer.SftpFileTransferClient;
306-
import org.flossware.jclassloader.FileTransferClassSource;
306+
import org.flossware.classloader-java.FileTransferClassSource;
307307

308308
// SFTP example
309309
FileTransferClient sftp = SftpFileTransferClient.builder()
@@ -335,7 +335,7 @@ Load classes from messaging systems using [jmessaging](https://github.com/FlossW
335335
```java
336336
import org.flossware.messaging.MessageClient;
337337
import org.flossware.messaging.KafkaMessageClient;
338-
import org.flossware.jclassloader.MessageClientClassSource;
338+
import org.flossware.classloader-java.MessageClientClassSource;
339339

340340
// Kafka example
341341
MessageClient kafka = KafkaMessageClient.builder()
@@ -365,7 +365,7 @@ Load classes from containers using [jcontainer](https://github.com/FlossWare/jco
365365
```java
366366
import org.flossware.container.ContainerClient;
367367
import org.flossware.container.KubernetesContainerClient;
368-
import org.flossware.jclassloader.ContainerClientClassSource;
368+
import org.flossware.classloader-java.ContainerClientClassSource;
369369

370370
// Kubernetes ConfigMap example
371371
ContainerClient k8s = KubernetesContainerClient.builder()
@@ -394,7 +394,7 @@ Load classes from version control using [jvcs](https://github.com/FlossWare/jvcs
394394
```java
395395
import org.flossware.vcs.VcsClient;
396396
import org.flossware.vcs.GitVcsClient;
397-
import org.flossware.jclassloader.VcsClientClassSource;
397+
import org.flossware.classloader-java.VcsClientClassSource;
398398

399399
// Git repository example
400400
VcsClient git = GitVcsClient.builder()
@@ -488,7 +488,7 @@ JClassLoader verboseLoader = JClassLoader.builder()
488488
Track loaded classes and resources for cleanup (useful for hot-reload, plugin unloading, etc.):
489489

490490
```java
491-
import org.flossware.jclassloader.lifecycle.ResourceTrackingListener;
491+
import org.flossware.classloader-java.lifecycle.ResourceTrackingListener;
492492

493493
ResourceTrackingListener tracker = new ResourceTrackingListener();
494494

@@ -514,8 +514,8 @@ tracker.closeAllResources();
514514
Implement your own listener for custom monitoring:
515515

516516
```java
517-
import org.flossware.jclassloader.lifecycle.ClassLoaderLifecycleListener;
518-
import org.flossware.jclassloader.lifecycle.ClassLoadEvent;
517+
import org.flossware.classloader-java.lifecycle.ClassLoaderLifecycleListener;
518+
import org.flossware.classloader-java.lifecycle.ClassLoadEvent;
519519

520520
ClassLoaderLifecycleListener myListener = new ClassLoaderLifecycleListener() {
521521
@Override
@@ -613,7 +613,7 @@ JClassLoader has **463 comprehensive unit tests** achieving **46% instruction co
613613
-**Critical paths**: All main use cases and builder patterns extensively tested
614614

615615
**What is NOT fully tested (and why):**
616-
-**Example code** (0% coverage in `org.flossware.jclassloader.example`): These are demo applications, not production code. Testing them would verify example syntax, not library functionality.
616+
-**Example code** (0% coverage in `org.flossware.classloader-java.example`): These are demo applications, not production code. Testing them would verify example syntax, not library functionality.
617617
-**Deep integration scenarios** (66% coverage in messaging): Full integration tests with real Kafka, RabbitMQ, Redis, etc. would require running external infrastructure. We use mocks for unit tests and rely on real-world usage for integration validation.
618618
-**Error recovery edge cases**: Some network timeout paths, exotic authentication failures, and rare filesystem conditions are difficult to trigger reliably in unit tests.
619619
-**External system quirks**: Vendor-specific behaviors (Nexus API variations, messaging broker retry logic) are validated through manual testing and production usage.
@@ -626,13 +626,13 @@ JClassLoader has **463 comprehensive unit tests** achieving **46% instruction co
626626

627627
**Coverage by package:**
628628
```
629-
org.flossware.jclassloader (core) 53% ✅ Primary use cases
630-
org.flossware.jclassloader.cache 83% ✅ High reliability needed
631-
org.flossware.jclassloader.lifecycle 82% ✅ Critical for monitoring
632-
org.flossware.jclassloader.delegation 85% ✅ Core isolation feature
633-
org.flossware.jclassloader.protocol 100% ✅ Complete coverage
634-
org.flossware.jclassloader.messaging 66% ⚠️ Kafka/RabbitMQ mocked
635-
org.flossware.jclassloader.example 0% ❌ Demo code, not tested
629+
org.flossware.classloader-java (core) 53% ✅ Primary use cases
630+
org.flossware.classloader-java.cache 83% ✅ High reliability needed
631+
org.flossware.classloader-java.lifecycle 82% ✅ Critical for monitoring
632+
org.flossware.classloader-java.delegation 85% ✅ Core isolation feature
633+
org.flossware.classloader-java.protocol 100% ✅ Complete coverage
634+
org.flossware.classloader-java.messaging 66% ⚠️ Kafka/RabbitMQ mocked
635+
org.flossware.classloader-java.example 0% ❌ Demo code, not tested
636636
```
637637

638638
**Running coverage reports:**

dependency-check-suppressions.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.3.xsd">
3+
<!--
4+
OWASP Dependency Check Suppressions
5+
Add suppressions for known false positives with justification
6+
7+
Example:
8+
<suppress>
9+
<notes>False positive - not vulnerable in our usage</notes>
10+
<cve>CVE-2021-12345</cve>
11+
</suppress>
12+
-->
13+
</suppressions>

pmd-ruleset.xml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?xml version="1.0"?>
2+
<ruleset name="FlossWare PMD Rules"
3+
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
6+
7+
<description>FlossWare PMD Ruleset for code quality enforcement</description>
8+
9+
<!-- Best Practices -->
10+
<rule ref="category/java/bestpractices.xml">
11+
<exclude name="JUnitAssertionsShouldIncludeMessage"/>
12+
<exclude name="JUnitTestContainsTooManyAsserts"/>
13+
</rule>
14+
15+
<!-- Code Style -->
16+
<rule ref="category/java/codestyle.xml">
17+
<exclude name="AtLeastOneConstructor"/>
18+
<exclude name="CommentDefaultAccessModifier"/>
19+
<exclude name="OnlyOneReturn"/>
20+
<exclude name="LongVariable"/>
21+
<exclude name="ShortVariable"/>
22+
<exclude name="ShortClassName"/>
23+
</rule>
24+
25+
<!-- Prefer method chaining - detect unnecessary local variables -->
26+
<rule ref="category/java/codestyle.xml/UnnecessaryLocalBeforeReturn"/>
27+
<rule ref="category/java/bestpractices.xml/UnusedLocalVariable"/>
28+
29+
<!-- Design -->
30+
<rule ref="category/java/design.xml">
31+
<exclude name="LawOfDemeter"/>
32+
<exclude name="LoosePackageCoupling"/>
33+
</rule>
34+
<rule ref="category/java/design.xml/TooManyMethods">
35+
<properties>
36+
<property name="maxmethods" value="20"/>
37+
</properties>
38+
</rule>
39+
40+
<!-- Documentation -->
41+
<rule ref="category/java/documentation.xml">
42+
<exclude name="CommentRequired"/>
43+
<exclude name="CommentSize"/>
44+
</rule>
45+
46+
<!-- Error Prone -->
47+
<rule ref="category/java/errorprone.xml">
48+
<exclude name="BeanMembersShouldSerialize"/>
49+
<exclude name="DataflowAnomalyAnalysis"/>
50+
</rule>
51+
52+
<!-- Multithreading -->
53+
<rule ref="category/java/multithreading.xml"/>
54+
55+
<!-- Performance -->
56+
<rule ref="category/java/performance.xml"/>
57+
58+
<!-- Security -->
59+
<rule ref="category/java/security.xml"/>
60+
</ruleset>

0 commit comments

Comments
 (0)