Loading...
Loading...
Expert guidance for developing with the tinystruct Java framework. Use when working on the tinystruct codebase or any project built on tinystruct — including creating Application classes, @Action-mapped routes, unit tests, ActionRegistry, HTTP/CLI dual-mode handling, the built-in HTTP server, the event system, JSON with Builder/Builders, database persistence with AbstractData, POJO generation, Server-Sent Events (SSE), file uploads, and outbound HTTP networking.
npx skill4agent add affaan-m/ecc tinystruct-patternsmain()@ActionApplicationAbstractApplication@ActionContextBuilderBuildersAbstractDatagenerateURLRequestHTTPHandlerapplication.properties@ActionAbstractApplicationinit()ContextActionRegistryBuilderBuildersAbstractDatapublic class MyService extends AbstractApplication {
@Override
public void init() {
this.setTemplateRequired(false); // Disable .view lookup for data/API apps
}
@Override public String version() { return "1.0.0"; }
@Action("greet")
public String greet() {
return "Hello from tinystruct!";
}
// Path parameter: GET /?q=greet/James OR bin/dispatcher greet/James
@Action("greet")
public String greet(String name) {
return "Hello, " + name + "!";
}
}@Action(value = "login", mode = Mode.HTTP_POST)
public String doLogin(Request<?, ?> request) throws ApplicationException {
request.getSession().setAttribute("userId", "42");
return "Logged in";
}import org.tinystruct.data.component.Builder;
import org.tinystruct.data.component.Builders;
@Action("api/data")
public String getData() throws ApplicationException {
Builders dataList = new Builders();
Builder item = new Builder();
item.put("id", 1);
item.put("name", "James");
dataList.add(item);
Builder response = new Builder();
response.put("status", "success");
response.put("data", dataList);
return response.toString(); // {"status":"success","data":[{"id":1,"name":"James"}]}
}import org.tinystruct.http.SSEPushManager;
@Action("sse/connect")
public String connect() {
return "{\"type\":\"connect\",\"message\":\"Connected to SSE\"}";
}
// Push to a specific client
String sessionId = getContext().getId();
Builder msg = new Builder();
msg.put("text", "Hello, user!");
SSEPushManager.getInstance().push(sessionId, msg);
// Broadcast to all
// Broadcast to all
SSEPushManager.getInstance().broadcast(msg);import org.tinystruct.data.FileEntity;
@Action(value = "upload", mode = Mode.HTTP_POST)
public String upload(Request<?, ?> request) throws ApplicationException {
List<FileEntity> files = request.getAttachments();
if (files != null) {
for (FileEntity file : files) {
System.out.println("Uploaded: " + file.getFilename());
}
}
return "Upload OK";
}src/main/resources/application.properties# Database
driver=org.h2.Driver
database.url=jdbc:h2:~/mydb
database.user=sa
database.password=
# Server
default.home.page=hello
server.port=8080
# Locale
default.language=en_US
# Session (Redis for clustered environments)
# default.session.repository=org.tinystruct.http.RedisSessionRepository
# redis.host=127.0.0.1
# redis.port=6379String port = this.getConfiguration("server.port");| Symptom | Correct Pattern |
|---|---|
Importing | Use |
Using | Use |
| Call |
Annotating | Actions must be |
Hardcoding | Use |
Manual | Prefer the |
| Action not found at runtime | Ensure class is imported via |
| CLI arg not visible | Pass with |
| Two methods same path, wrong one fires | Set explicit |
init()init()setAction()@ActionMode@ActionCLIgetContext().getAttribute("--flag")CompletableFuture.runAsync()references/src/main/java/org/tinystruct/AbstractApplication.javasrc/main/java/org/tinystruct/system/annotation/Action.javasrc/main/java/org/tinystruct/application/ActionRegistry.javasrc/main/java/org/tinystruct/data/component/Builder.javasrc/main/java/org/tinystruct/data/component/Builders.javasrc/main/java/org/tinystruct/data/component/AbstractData.javasrc/main/java/org/tinystruct/data/Mapping.javasrc/main/java/org/tinystruct/data/tools/MySQLGenerator.javasrc/main/java/org/tinystruct/data/component/FieldType.javasrc/main/java/org/tinystruct/data/component/Condition.javasrc/main/java/org/tinystruct/http/SSEPushManager.javasrc/test/java/org/tinystruct/application/ActionRegistryTest.javasrc/test/java/org/tinystruct/system/HttpServerHttpModeTest.java