lilantha 2003/07/28 04:23:57
Modified: c/src/server/catalina AxisCppContentHandler.h AxisCppContentHandler.java AxisCppServlet.java libAxiscpp.cpp libAxiscpp.dsp libAxiscpp.h Log: update Revision Changes Path 1.2 +9 -4 xml-axis/c/src/server/catalina/AxisCppContentHandler.h Index: AxisCppContentHandler.h =================================================================== RCS file: /home/cvs/xml-axis/c/src/server/catalina/AxisCppContentHandler.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- AxisCppContentHandler.h 8 Jul 2003 13:31:40 -0000 1.1 +++ AxisCppContentHandler.h 28 Jul 2003 11:23:57 -0000 1.2 @@ -7,13 +7,18 @@ #ifdef __cplusplus extern "C" { #endif +/* Inaccessible static: DEBUG */ /* * Class: AxisCppContentHandler - * Method: Delegate - * Signature: ([CILjava/util/Vector;I)V + * Method: processContent + * Signature: (Ljava/lang/StringBuffer;ILjava/util/Vector;I)V */ -JNIEXPORT void JNICALL Java_AxisCppContentHandler_Delegate - (JNIEnv *, jclass, jcharArray, jint, jobject, jint); +JNIEXPORT void JNICALL Java_AxisCppContentHandler_processContent + (JNIEnv *, jclass, jbyteArray, jint, jobject, jint); + +JNIEXPORT jint JNICALL Java_OnLoad ( JavaVM *jvm, void *reserved); +JNIEXPORT void JNICALL Java_OnUnload ( JavaVM *jvm, void *reserved); + #ifdef __cplusplus } 1.3 +19 -9 xml-axis/c/src/server/catalina/AxisCppContentHandler.java Index: AxisCppContentHandler.java =================================================================== RCS file: /home/cvs/xml-axis/c/src/server/catalina/AxisCppContentHandler.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- AxisCppContentHandler.java 17 Jul 2003 13:11:19 -0000 1.2 +++ AxisCppContentHandler.java 28 Jul 2003 11:23:57 -0000 1.3 @@ -56,7 +56,7 @@ */ /* - * Axis C++ JNI delegator. + * Axis C++ JNI Content Handler. * * @author Lilantha Darshana ([EMAIL PROTECTED]) * @@ -68,33 +68,43 @@ public class AxisCppContentHandler { + private static final boolean DEBUG = Boolean.getBoolean("debug"); static { try { System.loadLibrary("libAxiscpp"); - System.out.println("* Native library loaded"); - } - catch (Throwable e) { + if(DEBUG) + System.out.println("* Native library 'libAxiscpp' loaded"); + + } catch (Throwable e) { e.printStackTrace(); } } - public static native void Delegate(char [] body, int bodySize, Vector headers, int headerCount); + public static native void processContent(byte [] body, int bodySize, Vector headers, int headerCount); public static void main(String [] args) { - String str = "Hello World"; - char [] pch = str.toCharArray(); + byte [] str = new String("Hello World").getBytes(); + Vector v = new Vector(); v.add("Name1"); v.add("Value1"); v.add("Name2"); v.add("Value2"); try{ - System.in.read(); + System.in.read(); + + AxisCppContentHandler.processContent(str, str.length, v, 2); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(str); + System.out.println(out.toString()); }catch(IOException ex){ + ex.printStackTrace(); } - AxisCppContentHandler.Delegate(pch, pch.length, v, 2); + + for(int i=0;i<v.size()/2;i++) + System.out.println(v.elementAt(i*2) + " : " + v.elementAt(i*2+1)); } } 1.2 +38 -19 xml-axis/c/src/server/catalina/AxisCppServlet.java Index: AxisCppServlet.java =================================================================== RCS file: /home/cvs/xml-axis/c/src/server/catalina/AxisCppServlet.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- AxisCppServlet.java 8 Jul 2003 13:31:40 -0000 1.1 +++ AxisCppServlet.java 28 Jul 2003 11:23:57 -0000 1.2 @@ -77,29 +77,48 @@ throws IOException, ServletException { int bodySize = request.getContentLength(); - char [] body = new char[bodySize+1]; - BufferedReader bodyReader = request.getReader(); - bodyReader.read(body, 0, bodySize); - body[bodySize] = '\0'; - - //String contentType = request.getContentType(); - int headerCount = 0; - Vector headers = new Vector(); - Enumeration names = request.getHeaderNames(); - while(names.hasMoreElements()) + PrintWriter pw = new PrintWriter(response.getWriter()); + response.setContentType("text/xml"); //change this according to the SOAP 1.2 + + if(0 != bodySize) { - headerCount++; - String headerName = (String) names.nextElement(); - headers.addElement(headerName);//Add the name - headers.addElement(request.getHeader(headerName)); //add the value + byte [] bodyContent = new byte[bodySize+1]; + ServletInputStream bodyReader = request.getInputStream(); + try{ + bodyReader.read(bodyContent, 0, bodySize); + } + catch(IOException ex) + { + pw.write("<error>"); + pw.write("bdy size: "+bodySize+" \nContent : "+ex.getMessage()); + pw.write("</error>"); + return; + } + + //String contentType = request.getContentType(); + int headerCount = 0; + Vector headers = new Vector(); + Enumeration names = request.getHeaderNames(); + while(names.hasMoreElements()) + { + headerCount++; + String headerName = (String) names.nextElement(); + headers.addElement(headerName);//Add the name + headers.addElement(request.getHeader(headerName)); //add the value + } + + if(bodySize > 0) + AxisCppContentHandler.processContent(bodyContent, bodyContent.length, + headers, headerCount); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(bodyContent); + pw.write(out.toString()); } - - if(bodySize > 0) - AxisCppContentHandler.Delegate(body, bodySize, headers, headerCount); //setup the response - response.setContentType("text/xml"); //change this according to the SOAP 1.2 - + pw.write("<error>"); + pw.write("Error - body content empty"); + pw.write("</error>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) 1.4 +119 -16 xml-axis/c/src/server/catalina/libAxiscpp.cpp Index: libAxiscpp.cpp =================================================================== RCS file: /home/cvs/xml-axis/c/src/server/catalina/libAxiscpp.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- libAxiscpp.cpp 17 Jul 2003 13:22:08 -0000 1.3 +++ libAxiscpp.cpp 28 Jul 2003 11:23:57 -0000 1.4 @@ -65,34 +65,63 @@ #include "libAxiscpp.h" #include "../../common/Packet.h" #include <new> +#include <exception> +#if defined (_DEBUG) + #include <iostream> + #define Trace(x) std::cout << x << std::endl; +#else + #define Trace(x) +#endif -JNIEXPORT void JNICALL Java_AxisCppContentHandler_Delegate - (JNIEnv *p_Env, jclass, jcharArray p_jBody, jint p_nBodySize, jobject p_jvHeaders, - jint p_nHeaderCount) + +JNIEXPORT void JNICALL Java_AxisCppContentHandler_processContent + (JNIEnv *p_Env, + jclass, + jbyteArray p_jBody, + jint p_nBodySize, + jobject p_jvHeaders, + jint p_nHeaderCount) { //TODO: populate soapstream with the headers & the body; // invoke to process the contents - soapstream* str = new soapstream; - str->trtype = APTHTTP; - str->so.http.ip_soap = new char[p_nBodySize*sizeof(jchar)]; - p_Env->GetCharArrayRegion(p_jBody, 0, p_nBodySize, (jchar*)str->so.http.ip_soap); - str->so.http.ip_soapcount = p_nBodySize; + HTTP_PACKET* pHttpPkt = new HTTP_PACKET; + pHttpPkt->pchContent = new char[p_nBodySize+1]; + + p_Env->GetByteArrayRegion(p_jBody, 0, p_nBodySize, (jbyte*)pHttpPkt->pchContent); + + Trace(pHttpPkt->pchContent); + + pHttpPkt->nContentLen = p_nBodySize; //set method name as a http header. - str->so.http.ip_headers = new header[p_nHeaderCount*2]; + pHttpPkt->pHeaders = new HTTP_HEADER[p_nHeaderCount]; JNIVector jvHeader(p_Env, p_jvHeaders); for(int i=0;i < p_nHeaderCount; i++) { - str->so.http.ip_headers[i].headername = jvHeader[i]; - str->so.http.ip_headers[i].headervalue = jvHeader[i+1]; + pHttpPkt->pHeaders[i].name = jvHeader[i*2]; + pHttpPkt->pHeaders[i].value = jvHeader[i*2+1]; + Trace(pHttpPkt->pHeaders[i].name ); + Trace(pHttpPkt->pHeaders[i].value); } - str->so.http.ip_headercount = p_nHeaderCount; - + pHttpPkt->nHeaderCount = p_nHeaderCount; + pHttpPkt->enMethod = POST; - delete [] str->so.http.ip_headers; - delete str; + jvHeader.clear(); + jvHeader.push_back("Name_p1"); // Name_p1 + jvHeader.push_back("Value_p1"); + jvHeader.push_back("Name_p2"); + jvHeader.push_back("Value_p2"); + + delete [] pHttpPkt->pchContent; + p_jBody = p_Env->NewByteArray(strlen(pHttpPkt->pchContent)+1); + p_Env->SetByteArrayRegion(p_jBody, 0, strlen(pHttpPkt->pchContent), + (jbyte*)pHttpPkt->pchContent); + + delete [] pHttpPkt->pHeaders; + delete [] pHttpPkt->pchContent; + delete pHttpPkt; } @@ -106,11 +135,24 @@ "java/lang/IllegalArgumentException", "p_jVector not a java.util.Vector object!"); - m_jmGet = p_Env->GetMethodID(clazz, "get", "(I)Ljava/lang/Object"); + m_jmGet = p_Env->GetMethodID(clazz, "get", "(I)Ljava/lang/Object;"); JNI_ASSERT(m_jmGet != NULL, "java/lang/NoSuchMethodError", "method 'public Object get(int index)' not found!"); + + m_jmAdd = p_Env->GetMethodID(clazz, "addElement", "(Ljava/lang/Object;)V"); + + JNI_ASSERT(m_jmGet != NULL, + "java/lang/NoSuchMethodError", + "method 'public void addElement(Object obj)' not found!"); + + m_jmClear = p_Env->GetMethodID(clazz, "clear", "()V"); + + JNI_ASSERT(m_jmGet != NULL, + "java/lang/NoSuchMethodError", + "method 'public void clear()' not found!"); + } ///Destructor JNIVector::~JNIVector() @@ -131,7 +173,68 @@ void JNIVector::push_back(const char* str) { + m_pEnv->CallVoidMethod(m_jVector, m_jmAdd, m_pEnv->NewStringUTF(str)); + if (m_pEnv->ExceptionOccurred()) + throw std::bad_exception("can't push_back"); //need to set up a exception +} + +void JNIVector::clear() +{ + m_pEnv->CallVoidMethod(m_jVector, m_jmClear); + if (m_pEnv->ExceptionOccurred()) + throw std::bad_exception("Can't clear the vector"); //need to set up a exception +} + + +/* +JNIString::JNIString(JNIEnv* p_Env, jstring p_jStr) throw(std::bad_alloc) + : m_pEnv(p_Env), m_jStr(p_jStr) +{ + m_pch = (m_jStr == NULL)? NULL : m_pEnv->GetStringUTFChars(m_jStr, NULL); + if (m_pEnv->ExceptionOccurred()) + throw std::bad_alloc(); +} + +JNIString::~JNIString() +{ + if (m_pch != NULL) + m_pEnv->ReleaseStringUTFChars(m_jStr, m_pch); +} +JNIString::operator const char* () const +{ + return m_pch; +} + +JNIString& JNIString::operator = (const char* p_pch) +{ + if (m_pch != NULL) + m_pEnv->ReleaseStringUTFChars(m_jStr, m_pch); + + m_pch = p_pch; + m_pch = (m_jStr == NULL)? NULL : m_pEnv->GetStringUTFChars(m_jStr, NULL); + if (m_pEnv->ExceptionOccurred()) + throw std::bad_alloc(); + return *this; +} + +jstring JNIString::getJNIString() +{ + return m_pEnv->NewStringUTF(m_pch); +} +*/ + + +JNIEXPORT jint JNICALL +JNI_OnLoad( JavaVM *jvm, void *reserved ) +{ + return JNI_VERSION_1_2; +} + + +JNIEXPORT void JNICALL +JNI_OnUnload( JavaVM *jvm, void *reserved ) +{ } 1.4 +1 -1 xml-axis/c/src/server/catalina/libAxiscpp.dsp Index: libAxiscpp.dsp =================================================================== RCS file: /home/cvs/xml-axis/c/src/server/catalina/libAxiscpp.dsp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- libAxiscpp.dsp 17 Jul 2003 13:16:23 -0000 1.3 +++ libAxiscpp.dsp 28 Jul 2003 11:23:57 -0000 1.4 @@ -63,7 +63,7 @@ # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" +# PROP Output_Dir ".\axiscpp\WEB-INF\classes" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBAXISCPP_EXPORTS" /YX /FD /GZ /c 1.3 +29 -0 xml-axis/c/src/server/catalina/libAxiscpp.h Index: libAxiscpp.h =================================================================== RCS file: /home/cvs/xml-axis/c/src/server/catalina/libAxiscpp.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- libAxiscpp.h 17 Jul 2003 13:22:08 -0000 1.2 +++ libAxiscpp.h 28 Jul 2003 11:23:57 -0000 1.3 @@ -75,6 +75,9 @@ #endif +#ifdef __cplusplus +extern "C" { +#endif static void jni_throw(JNIEnv* env, const char* exception, const char* msg) @@ -90,6 +93,10 @@ } +#ifdef __cplusplus +} +#endif + #define JNI_ASSERT(assert, name, msg) \ do \ { \ @@ -114,14 +121,36 @@ char* operator [] (int i) const; void push_back(const char* str); + void clear(); private: JNIEnv* m_pEnv; jobject m_jVector; jmethodID m_jmGet; + jmethodID m_jmClear; + jmethodID m_jmAdd; }; +/* + + +class JNIString +{ +public: + JNIStringBuffer(JNIEnv* p_Env, jobject p_jStr); + ~JNIStringBuffer(); + + operator const char* () const; + JNIStringBuffer& operator = (const char* p_pch); + jstring getJNIString(); +private: + + JNIEnv* m_pEnv; + jobject m_jStr; + const char* m_pch; +}; +*/ #endif //_AXIS_LIBAXISCPP_HPP