Skip to content

Commit f8660aa

Browse files
committed
qwe
1 parent 728461d commit f8660aa

23 files changed

Lines changed: 607 additions & 22 deletions

File tree

modules/packed-incubator/packed-incubator-concurrent/src/main/java/app/packed/concurrent/job/ScTest2.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,18 @@
1515
*/
1616
package app.packed.concurrent.job;
1717

18+
import java.io.IOException;
1819
import java.util.concurrent.TimeUnit;
20+
import java.util.concurrent.atomic.AtomicLong;
1921

2022
import app.packed.application.App;
2123
import app.packed.application.ApplicationMirror;
2224
import app.packed.assembly.BaseAssembly;
2325
import app.packed.concurrent.DaemonJob;
2426
import app.packed.concurrent.DaemonJobContext;
2527
import app.packed.lifecycle.Stop;
28+
import app.packed.web.HttpContext;
29+
import app.packed.web.WebGet;
2630

2731
/**
2832
*
@@ -38,7 +42,7 @@ public static void main(String[] args) throws Exception {
3842
// });
3943

4044
App app = App.start(new ScTest2());
41-
Thread.sleep(3000);
45+
Thread.sleep(30000);
4246
app.stop();
4347
Thread.sleep(1000);
4448
System.out.println(app.state());
@@ -55,10 +59,18 @@ protected void build() {
5559

5660
public static class MuB {
5761

62+
private final AtomicLong al = new AtomicLong();
63+
64+
@WebGet(url = "/json")
65+
public void json(HttpContext ctx) throws IOException {
66+
ctx.response().write("{\"status\":\"" + al.get()+ "\"}", "application/json");
67+
}
68+
5869
@DaemonJob
5970
public void dae(ApplicationMirror am, DaemonJobContext sc) throws Exception {
6071
while (sc.awaitShutdown(1, TimeUnit.SECONDS)) {
6172
IO.println("Daemon " + am.allOperations().count());
73+
al.incrementAndGet();
6274
}
6375
}
6476

modules/packed-incubator/packed-incubator-web/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,19 @@
2222
</dependency>
2323
</dependencies>
2424

25+
<build>
26+
<plugins>
27+
<plugin>
28+
<groupId>org.apache.maven.plugins</groupId>
29+
<artifactId>maven-compiler-plugin</artifactId>
30+
<configuration>
31+
<compilerArgs>
32+
<arg>--add-modules</arg>
33+
<arg>jdk.httpserver</arg>
34+
</compilerArgs>
35+
</configuration>
36+
</plugin>
37+
</plugins>
38+
</build>
39+
2540
</project>

modules/packed-incubator/packed-incubator-web/src/main/java/app/packed/web/HttpContext.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,29 @@
1515
*/
1616
package app.packed.web;
1717

18+
import app.packed.bean.BeanTrigger.AutoInject;
19+
import app.packed.binding.Key;
1820
import app.packed.context.Context;
19-
21+
import internal.app.packed.bean.scanning.IntrospectorOnContextService;
22+
import internal.app.packed.extension.base.BaseExtensionBeanIntrospector;
2023
/**
21-
*
24+
* Context providing access to the HTTP request and response.
2225
*/
26+
@AutoInject(introspector = HttpContextBeanIntrospector.class, requiresContext = HttpContext.class)
2327
public interface HttpContext extends Context<WebExtension> {
2428

29+
/** Returns the current HTTP request. */
30+
HttpRequest request();
31+
32+
/** Returns the current HTTP response. */
33+
HttpResponse response();
34+
}
35+
36+
final class HttpContextBeanIntrospector extends BaseExtensionBeanIntrospector {
37+
38+
/** {@inheritDoc} */
39+
@Override
40+
public void onExtensionService(Key<?> key, IntrospectorOnContextService service) {
41+
service.binder().bindContext(HttpContext.class);
42+
}
2543
}

modules/packed-incubator/packed-incubator-web/src/main/java/app/packed/web/HttpRequest.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,47 @@
1515
*/
1616
package app.packed.web;
1717

18+
import java.io.IOException;
19+
import java.net.URI;
20+
21+
import com.sun.net.httpserver.Headers;
22+
23+
import app.packed.bean.BeanTrigger.AutoInject;
24+
import app.packed.binding.Key;
25+
import app.packed.operation.Op1;
26+
import internal.app.packed.bean.scanning.IntrospectorOnContextService;
27+
import internal.app.packed.extension.base.BaseExtensionBeanIntrospector;
28+
1829
/**
19-
*
30+
* Represents an HTTP request.
2031
*/
21-
//@OnExtensionServiceBeanTrigger(extension = WebExtension.class, requiresContext = HttpContext.class)
32+
@AutoInject(introspector = HttpRequestBeanIntrospector.class, requiresContext = HttpContext.class)
2233
public interface HttpRequest {
2334

35+
/** Returns the request URI. */
36+
URI uri();
37+
38+
/** Returns the request method (GET, POST, etc.). */
39+
String method();
40+
41+
/** Returns a request header value. */
42+
String header(String name);
43+
44+
/** Returns all request headers. */
45+
Headers headers();
46+
47+
/** Returns a query parameter value. */
48+
String queryParam(String name);
49+
50+
/** Returns the request body as a string. */
51+
String body() throws IOException;
52+
}
53+
54+
final class HttpRequestBeanIntrospector extends BaseExtensionBeanIntrospector {
55+
56+
/** {@inheritDoc} */
57+
@Override
58+
public void onExtensionService(Key<?> key, IntrospectorOnContextService service) {
59+
service.binder().bindOp(new Op1<HttpContext, HttpRequest>(f->f.request()) {});
60+
}
2461
}

modules/packed-incubator/packed-incubator-web/src/main/java/app/packed/web/HttpResponse.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,38 @@
1515
*/
1616
package app.packed.web;
1717

18+
import java.io.IOException;
19+
20+
import app.packed.bean.BeanTrigger.AutoInject;
21+
import app.packed.binding.Key;
22+
import app.packed.operation.Op1;
23+
import internal.app.packed.bean.scanning.IntrospectorOnContextService;
24+
import internal.app.packed.extension.base.BaseExtensionBeanIntrospector;
25+
1826
/**
19-
*
27+
* Represents an HTTP response.
2028
*/
21-
//@OnExtensionServiceBeanTrigger(extension = WebExtension.class, requiresContext = HttpContext.class)
29+
@AutoInject(introspector = HttpResponseBeanIntrospector.class, requiresContext = HttpContext.class)
2230
public interface HttpResponse {
2331

32+
/** Sets a response header. */
33+
void header(String name, String value);
34+
35+
/** Sets the response status code. */
36+
void status(int code);
37+
38+
/** Writes the response body. */
39+
void write(String body) throws IOException;
40+
41+
/** Writes the response body with a specific content type. */
42+
void write(String body, String contentType) throws IOException;
2443
}
44+
45+
final class HttpResponseBeanIntrospector extends BaseExtensionBeanIntrospector {
46+
47+
/** {@inheritDoc} */
48+
@Override
49+
public void onExtensionService(Key<?> key, IntrospectorOnContextService service) {
50+
service.binder().bindOp(new Op1<HttpContext, HttpResponse>(f->f.response()) {});
51+
}
52+
}

modules/packed-incubator/packed-incubator-web/src/main/java/app/packed/web/WebGet.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import app.packed.bean.BeanIntrospector;
2525
import app.packed.bean.BeanTrigger.OnAnnotatedMethod;
2626
import internal.app.packed.extension.base.BaseExtensionBeanIntrospector;
27+
import internal.app.packed.web.WebGetOperationHandle;
2728

2829
@Target(ElementType.METHOD)
2930
@Retention(RetentionPolicy.RUNTIME)
@@ -38,7 +39,7 @@ final class WebGetBeanIntrospector extends BaseExtensionBeanIntrospector {
3839
/** {@inheritDoc} */
3940
@Override
4041
public void onAnnotatedMethod(Annotation annotation, BeanIntrospector.OnMethod method) {
41-
//TODO
42+
WebGetOperationHandle.onWebGetAnnotation(this, method, (WebGet) annotation);
4243
}
4344
}
4445

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright (c) 2026 Kasper Nielsen.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package app.packed.web;
17+
18+
import java.io.IOException;
19+
20+
import app.packed.application.App;
21+
import app.packed.assembly.BaseAssembly;
22+
23+
/**
24+
* Demo test for the web server functionality.
25+
*/
26+
public class WebTest extends BaseAssembly {
27+
28+
public static void main(String[] args) throws Exception {
29+
App app = App.start(new WebTest());
30+
31+
System.out.println("Server running on http://localhost:8080");
32+
System.out.println("Try: curl http://localhost:8080/json");
33+
System.out.println("Press Enter to stop...");
34+
35+
System.in.read();
36+
app.stop();
37+
}
38+
39+
@Override
40+
protected void build() {
41+
install(Handlers.class);
42+
}
43+
44+
public static class Handlers {
45+
46+
@WebGet(url = "/json")
47+
public void json(HttpResponse ctx) throws IOException {
48+
ctx.write("{\"status\":\"ok\"}", "application/json");
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)