MCPcopy Index your code
hub / github.com/StubbornJava/StubbornJava

github.com/StubbornJava/StubbornJava @0.1.33

Chat with this repo
repository ↗ · DeepWiki ↗ · release 0.1.33 ↗ · + Follow
1,081 symbols 2,905 edges 173 files 287 documented · 27%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Release Follow @StubbornJava

StubbornJava

https://www.stubbornjava.com/

This is very much a work in progress and in the early stages. No code will be pushed to maven central or supported in any way currently. Feel free to clone and install locally. The website is built using all the methods described on the site and in the examples. There is no backing blog framework.

Quick Example (full example Simple REST server in Undertow)

public static void createUser(HttpServerExchange exchange) {
    User userInput = userRequests.user(exchange);
    User user = userDao.create(userInput.getEmail(), userInput.getRoles());
    if (null == user) {
        ApiHandlers.badRequest(exchange, String.format("User %s already exists.", userInput.getEmail()));
        return;
    }
    exchange.setStatusCode(StatusCodes.CREATED);
    Exchange.body().sendJson(exchange, user);
}

public static void getUser(HttpServerExchange exchange) {
    String email = userRequests.email(exchange);
    User user = userDao.get(email);
    if (null == user) {
        ApiHandlers.notFound(exchange, String.format("User %s not found.", email));
        return;
    }
    Exchange.body().sendJson(exchange, user);
}

public static final RoutingHandler ROUTES = new RoutingHandler()
    .get("/users/{email}", timed("getUser", UserRoutes::getUser))
    .post("/users", timed("createUser", UserRoutes::createUser))
    .get("/metrics", timed("metrics", CustomHandlers::metrics))
    .get("/health", timed("health", CustomHandlers::health))
    .setFallbackHandler(timed("notFound", RoutingHandlers::notFoundHandler));

public static final HttpHandler ROOT = CustomHandlers.exception(EXCEPTION_THROWER)
    .addExceptionHandler(ApiException.class, ApiHandlers::handleApiException)
    .addExceptionHandler(Throwable.class, ApiHandlers::serverError);

public static void main(String[] args) {
    SimpleServer server = SimpleServer.simpleServer(Middleware.common(ROOT));
    server.start();
}

Suggest a Topic

Check out issues to suggest topics, bug fixes, errors, or vote on issues. Reactions / comments may influence the order topics are added but no guarantees. Several topics will not be accepted here such as larger frameworks (Spring, Play, Jersey ...) as well as dependency injection. We will be more focused on rolling things yourself and solving practical problems. The coding style here may not fit with the norm but it should be very easy to convert any of the classes to be DI friendly.

Getting Started

A guide for building your own minimal embedded Java web server. A simple in order intro to a lot of uses cases for simple web development.

Dev Tools

HTML / CSS Themes and Templates for rapid prototyping

Libraries

SLF4J and Logback for Logging

SLF4J is fairly standard and we chose to use Logback as our underlying implementation.

Typesafe Config For Configuration

Typesafe config is a clean lightweight immutable configuration library. It offers several formats such as .properties, .yml, .json as well as a human friendly json super set. It handles configuration inheritance, includes, data types (string, boolean, int, long, double, durations, arrays, ...), variabe substitution and many more features. Typesafe Config examples

Jackson for JSON

Embedded Undertow Web Server

Undertow is a very fast low level non blocking web server written in Java. It is very lightweight and has a very clean API that should be relatively easy for anyone who knows HTTP to pick up. Most custom code will be in the form of an HttpHandler which is a simple interface that can be used in a variety of ways. * Writing Custom HttpHandlers * Url Routing in Undertow * Handling Exceptions in Undertow * Creating Middleware in Undertow * Simple REST server in Undertow * Virtual Hosting in Undertow * Webpack and npm with Java * Sharing routes and running multiple webservers in a single JVM * Configuring Security Headers in Undertow * Circuit Breaking HttpHandler

Metrics (Dropwizard Metrics, Grafana, Graphite)

OkHttp for HTTP Client

HikariCP for JDBC Connection Pooling

HikariCP is a very fast lightweight Java connection pool. The API and overall codebase is relatively small (A good thing) and highly optimized. It also does not cut corners for performance like many other Java connection pool implementations.

Uility Classes / Extras

Sites Built With This Method

Extension points exported contracts — how you extend this code

ContentTypeSenders (Interface)
(no doc)
stubbornjava-undertow/src/main/java/com/stubbornjava/undertow/exchange/ContentTypeSenders.java
Urls (Interface)
(no doc)
stubbornjava-common/src/main/java/com/stubbornjava/common/undertow/Urls.java
QueryParams (Interface)
(no doc)
stubbornjava-undertow/src/main/java/com/stubbornjava/undertow/exchange/QueryParams.java
JsonParser (Interface)
(no doc)
stubbornjava-common/src/main/java/com/stubbornjava/common/undertow/JsonParser.java
RedirectSenders (Interface)
(no doc)
stubbornjava-undertow/src/main/java/com/stubbornjava/undertow/exchange/RedirectSenders.java
Headers (Interface)
(no doc)
stubbornjava-common/src/main/java/com/stubbornjava/common/undertow/Headers.java
PathParams (Interface)
(no doc)
stubbornjava-undertow/src/main/java/com/stubbornjava/undertow/exchange/PathParams.java
BodyImpl (Interface)
(no doc)
stubbornjava-common/src/main/java/com/stubbornjava/common/undertow/Exchange.java

Core symbols most depended-on inside this repo

stubbornJava
called by 101
stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/FileReference.java
get
called by 82
stubbornjava-common/src/main/java/com/stubbornjava/common/Env.java
build
called by 67
stubbornjava-webapp/src/main/java/com/stubbornjava/webapp/github/GitHubApi.java
get
called by 67
stubbornjava-examples/src/main/java/com/stubbornjava/examples/undertow/rest/UserDao.java
body
called by 65
stubbornjava-common/src/main/java/com/stubbornjava/common/undertow/Exchange.java
serializer
called by 52
stubbornjava-common/src/main/java/com/stubbornjava/common/Json.java
toString
called by 49
stubbornjava-common/src/main/java/com/stubbornjava/common/Json.java
getLogger
called by 45
stubbornjava-common/src/main/java/com/stubbornjava/common/GraphiteHttpSender.java

Shape

Method 880
Class 171
Interface 15
Enum 13
Function 2

Languages

Java100%
TypeScript1%

Modules by API surface

stubbornjava-cms-server/src/generated/java/com/stubbornjava/cms/server/generated/tables/records/_FlywayRecord.java56 symbols
stubbornjava-cms-server/src/generated/java/com/stubbornjava/cms/server/generated/tables/records/PostRecord.java56 symbols
stubbornjava-cms-server/src/generated/java/com/stubbornjava/cms/server/generated/tables/records/UserRecord.java36 symbols
stubbornjava-cms-server/src/generated/java/com/stubbornjava/cms/server/generated/tables/records/PostTagRecord.java26 symbols
stubbornjava-undertow/src/main/java/com/stubbornjava/undertow/handlers/ContentSecurityPolicyHandler.java23 symbols
stubbornjava-cms-server/src/generated/java/com/stubbornjava/cms/server/generated/tables/records/AppRecord.java21 symbols
stubbornjava-common/src/main/java/com/stubbornjava/common/Configs.java20 symbols
stubbornjava-common/src/main/java/com/stubbornjava/common/Json.java18 symbols
stubbornjava-common/src/main/java/com/stubbornjava/common/Templating.java17 symbols
stubbornjava-common/src/test/java/com/stubbornjava/common/DeterministicObjectMapperTest.java16 symbols
stubbornjava-cms-server/src/generated/java/com/stubbornjava/cms/server/generated/tables/records/PostTagLinksRecord.java16 symbols
stubbornjava-common/src/main/java/com/stubbornjava/common/GraphiteHttpSender.java15 symbols

Datastores touched

(mysql)Database · 1 repos
sj_cmsDatabase · 1 repos

For agents

$ claude mcp add StubbornJava \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact