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