xref: /unit/src/java/nxt_jni_Context.c (revision 1055:897871a939e3)
1977Smax.romanov@gmail.com 
2977Smax.romanov@gmail.com /*
3977Smax.romanov@gmail.com  * Copyright (C) NGINX, Inc.
4977Smax.romanov@gmail.com  */
5977Smax.romanov@gmail.com 
6977Smax.romanov@gmail.com #include <nxt_auto_config.h>
7977Smax.romanov@gmail.com 
8977Smax.romanov@gmail.com #include <nxt_unit.h>
9977Smax.romanov@gmail.com #include <jni.h>
10977Smax.romanov@gmail.com 
11977Smax.romanov@gmail.com #include "nxt_jni.h"
12977Smax.romanov@gmail.com #include "nxt_jni_Context.h"
13977Smax.romanov@gmail.com #include "nxt_jni_URLClassLoader.h"
14977Smax.romanov@gmail.com 
15977Smax.romanov@gmail.com 
16977Smax.romanov@gmail.com static jclass     nxt_java_Context_class;
17977Smax.romanov@gmail.com static jmethodID  nxt_java_Context_start;
18977Smax.romanov@gmail.com static jmethodID  nxt_java_Context_service;
19977Smax.romanov@gmail.com static jmethodID  nxt_java_Context_stop;
20977Smax.romanov@gmail.com 
21977Smax.romanov@gmail.com static void JNICALL nxt_java_Context_log(JNIEnv *env, jclass cls,
22977Smax.romanov@gmail.com     jlong ctx_ptr, jstring msg, jint msg_len);
23977Smax.romanov@gmail.com static void JNICALL nxt_java_Context_trace(JNIEnv *env, jclass cls,
24977Smax.romanov@gmail.com     jlong ctx_ptr, jstring msg, jint msg_len);
25977Smax.romanov@gmail.com 
26977Smax.romanov@gmail.com 
27977Smax.romanov@gmail.com int
nxt_java_initContext(JNIEnv * env,jobject cl)28977Smax.romanov@gmail.com nxt_java_initContext(JNIEnv *env, jobject cl)
29977Smax.romanov@gmail.com {
30977Smax.romanov@gmail.com     int     res;
31977Smax.romanov@gmail.com     jclass  cls;
32977Smax.romanov@gmail.com 
33977Smax.romanov@gmail.com     cls = nxt_java_loadClass(env, cl, "nginx.unit.Context");
34977Smax.romanov@gmail.com     if (cls == NULL) {
35977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "nginx.unit.Context not found");
36977Smax.romanov@gmail.com         return NXT_UNIT_ERROR;
37977Smax.romanov@gmail.com     }
38977Smax.romanov@gmail.com 
39977Smax.romanov@gmail.com     nxt_java_Context_class = (*env)->NewGlobalRef(env, cls);
40977Smax.romanov@gmail.com     (*env)->DeleteLocalRef(env, cls);
41977Smax.romanov@gmail.com     cls = nxt_java_Context_class;
42977Smax.romanov@gmail.com 
43977Smax.romanov@gmail.com     nxt_java_Context_start = (*env)->GetStaticMethodID(env, cls, "start",
44977Smax.romanov@gmail.com                      "(Ljava/lang/String;[Ljava/net/URL;)Lnginx/unit/Context;");
45977Smax.romanov@gmail.com     if (nxt_java_Context_start == NULL) {
46977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "nginx.unit.Context.start() not found");
47977Smax.romanov@gmail.com         goto failed;
48977Smax.romanov@gmail.com     }
49977Smax.romanov@gmail.com 
50977Smax.romanov@gmail.com     nxt_java_Context_service = (*env)->GetMethodID(env, cls, "service",
51977Smax.romanov@gmail.com             "(Lnginx/unit/Request;Lnginx/unit/Response;)V");
52977Smax.romanov@gmail.com     if (nxt_java_Context_service == NULL) {
53977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "nginx.unit.Context.service() not found");
54977Smax.romanov@gmail.com         goto failed;
55977Smax.romanov@gmail.com     }
56977Smax.romanov@gmail.com 
57977Smax.romanov@gmail.com     nxt_java_Context_stop = (*env)->GetMethodID(env, cls, "stop", "()V");
58*1055Smax.romanov@nginx.com     if (nxt_java_Context_stop == NULL) {
59977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "nginx.unit.Context.stop() not found");
60977Smax.romanov@gmail.com         goto failed;
61977Smax.romanov@gmail.com     }
62977Smax.romanov@gmail.com 
63977Smax.romanov@gmail.com     JNINativeMethod context_methods[] = {
64977Smax.romanov@gmail.com         { (char *) "log",
65977Smax.romanov@gmail.com           (char *) "(JLjava/lang/String;I)V",
66977Smax.romanov@gmail.com           nxt_java_Context_log },
67977Smax.romanov@gmail.com 
68977Smax.romanov@gmail.com         { (char *) "trace",
69977Smax.romanov@gmail.com           (char *) "(JLjava/lang/String;I)V",
70977Smax.romanov@gmail.com           nxt_java_Context_trace },
71977Smax.romanov@gmail.com 
72977Smax.romanov@gmail.com     };
73977Smax.romanov@gmail.com 
74977Smax.romanov@gmail.com     res = (*env)->RegisterNatives(env, nxt_java_Context_class,
75977Smax.romanov@gmail.com                                   context_methods,
76977Smax.romanov@gmail.com                                   sizeof(context_methods)
77977Smax.romanov@gmail.com                                       / sizeof(context_methods[0]));
78977Smax.romanov@gmail.com 
79977Smax.romanov@gmail.com     nxt_unit_debug(NULL, "registered Context methods: %d", res);
80977Smax.romanov@gmail.com 
81977Smax.romanov@gmail.com     if (res != 0) {
82977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "registering natives for Context failed");
83977Smax.romanov@gmail.com         goto failed;
84977Smax.romanov@gmail.com     }
85977Smax.romanov@gmail.com 
86977Smax.romanov@gmail.com     return NXT_UNIT_OK;
87977Smax.romanov@gmail.com 
88977Smax.romanov@gmail.com failed:
89977Smax.romanov@gmail.com 
90977Smax.romanov@gmail.com     (*env)->DeleteGlobalRef(env, cls);
91977Smax.romanov@gmail.com     return NXT_UNIT_ERROR;
92977Smax.romanov@gmail.com }
93977Smax.romanov@gmail.com 
94977Smax.romanov@gmail.com 
95977Smax.romanov@gmail.com jobject
nxt_java_startContext(JNIEnv * env,const char * webapp,jobject classpaths)96977Smax.romanov@gmail.com nxt_java_startContext(JNIEnv *env, const char *webapp, jobject classpaths)
97977Smax.romanov@gmail.com {
98977Smax.romanov@gmail.com     jstring webapp_str;
99977Smax.romanov@gmail.com 
100977Smax.romanov@gmail.com     webapp_str = (*env)->NewStringUTF(env, webapp);
101977Smax.romanov@gmail.com     if (webapp_str == NULL) {
102977Smax.romanov@gmail.com         return NULL;
103977Smax.romanov@gmail.com     }
104977Smax.romanov@gmail.com 
105977Smax.romanov@gmail.com     return (*env)->CallStaticObjectMethod(env, nxt_java_Context_class,
106977Smax.romanov@gmail.com                                           nxt_java_Context_start, webapp_str,
107977Smax.romanov@gmail.com                                           classpaths);
108977Smax.romanov@gmail.com }
109977Smax.romanov@gmail.com 
110977Smax.romanov@gmail.com 
111977Smax.romanov@gmail.com void
nxt_java_service(JNIEnv * env,jobject ctx,jobject jreq,jobject jresp)112977Smax.romanov@gmail.com nxt_java_service(JNIEnv *env, jobject ctx, jobject jreq, jobject jresp)
113977Smax.romanov@gmail.com {
114977Smax.romanov@gmail.com     (*env)->CallVoidMethod(env, ctx, nxt_java_Context_service, jreq, jresp);
115977Smax.romanov@gmail.com }
116977Smax.romanov@gmail.com 
117977Smax.romanov@gmail.com 
118977Smax.romanov@gmail.com void
nxt_java_stopContext(JNIEnv * env,jobject ctx)119977Smax.romanov@gmail.com nxt_java_stopContext(JNIEnv *env, jobject ctx)
120977Smax.romanov@gmail.com {
121977Smax.romanov@gmail.com     (*env)->CallVoidMethod(env, ctx, nxt_java_Context_stop);
122977Smax.romanov@gmail.com }
123977Smax.romanov@gmail.com 
124977Smax.romanov@gmail.com 
125977Smax.romanov@gmail.com static void JNICALL
nxt_java_Context_log(JNIEnv * env,jclass cls,jlong ctx_ptr,jstring msg,jint msg_len)126977Smax.romanov@gmail.com nxt_java_Context_log(JNIEnv *env, jclass cls, jlong ctx_ptr, jstring msg,
127977Smax.romanov@gmail.com     jint msg_len)
128977Smax.romanov@gmail.com {
129977Smax.romanov@gmail.com     const char      *msg_str;
130977Smax.romanov@gmail.com     nxt_unit_ctx_t  *ctx;
131977Smax.romanov@gmail.com 
132977Smax.romanov@gmail.com     ctx = nxt_jlong2ptr(ctx_ptr);
133977Smax.romanov@gmail.com 
134977Smax.romanov@gmail.com     msg_str = (*env)->GetStringUTFChars(env, msg, NULL);
135977Smax.romanov@gmail.com     if (msg_str == NULL) {
136977Smax.romanov@gmail.com         return;
137977Smax.romanov@gmail.com     }
138977Smax.romanov@gmail.com 
139977Smax.romanov@gmail.com     nxt_unit_log(ctx, NXT_UNIT_LOG_INFO, "%.*s", msg_len, msg_str);
140977Smax.romanov@gmail.com 
141977Smax.romanov@gmail.com     (*env)->ReleaseStringUTFChars(env, msg, msg_str);
142977Smax.romanov@gmail.com }
143977Smax.romanov@gmail.com 
144977Smax.romanov@gmail.com 
145977Smax.romanov@gmail.com static void JNICALL
nxt_java_Context_trace(JNIEnv * env,jclass cls,jlong ctx_ptr,jstring msg,jint msg_len)146977Smax.romanov@gmail.com nxt_java_Context_trace(JNIEnv *env, jclass cls, jlong ctx_ptr, jstring msg,
147977Smax.romanov@gmail.com     jint msg_len)
148977Smax.romanov@gmail.com {
149977Smax.romanov@gmail.com #if (NXT_DEBUG)
150977Smax.romanov@gmail.com     const char      *msg_str;
151977Smax.romanov@gmail.com     nxt_unit_ctx_t  *ctx;
152977Smax.romanov@gmail.com 
153977Smax.romanov@gmail.com     ctx = nxt_jlong2ptr(ctx_ptr);
154977Smax.romanov@gmail.com 
155977Smax.romanov@gmail.com     msg_str = (*env)->GetStringUTFChars(env, msg, NULL);
156977Smax.romanov@gmail.com     if (msg_str == NULL) {
157977Smax.romanov@gmail.com         return;
158977Smax.romanov@gmail.com     }
159977Smax.romanov@gmail.com 
160977Smax.romanov@gmail.com     nxt_unit_debug(ctx, "%.*s", msg_len, msg_str);
161977Smax.romanov@gmail.com 
162977Smax.romanov@gmail.com     (*env)->ReleaseStringUTFChars(env, msg, msg_str);
163977Smax.romanov@gmail.com #endif
164977Smax.romanov@gmail.com }
165