snichol 2002/12/10 09:33:40
Modified: java/src/org/apache/soap/providers/com RPCProvider.java
java/docs changes.html
Log:
Submitted by: Leif Nilsson TACMa <[EMAIL PROTECTED]>
We send XML-files through Apache Soap.
There is a COM-server accessed via Apaches COMProvider.
The best way to send files as discussed is through attachments.
The only way I have figured out to do this via the ComProvider is to alter
the
org.apache.soap.providers.com.RPCProvider.java code.
I'm sure there is a better way but I will explain what I have done.
I have added an option for the COmProvider DeploymentDescriptor
(AttachString), which if present and set to true will cause
Strings returned from COM-servers to be packaged in a DataHandler object
using UTF-8 coding.
Scott Nichol added a few mods, including changing the option name to have
a leading Upper case character.
Revision Changes Path
1.3 +39 -15 xml-soap/java/src/org/apache/soap/providers/com/RPCProvider.java
Index: RPCProvider.java
===================================================================
RCS file:
/home/cvs/xml-soap/java/src/org/apache/soap/providers/com/RPCProvider.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- RPCProvider.java 12 Apr 2001 16:26:53 -0000 1.2
+++ RPCProvider.java 10 Dec 2002 17:33:40 -0000 1.3
@@ -56,17 +56,26 @@
*/
package org.apache.soap.providers.com;
-import java.io.* ;
-import java.util.* ;
-import java.text.MessageFormat;
-import javax.servlet.* ;
-import javax.servlet.http.* ;
-import org.apache.soap.* ;
-import org.apache.soap.rpc.* ;
-import org.apache.soap.server.* ;
-import org.apache.soap.util.* ;
+import java.io.*;
import java.lang.Math;
-
+import java.text.MessageFormat;
+import java.util.*;
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.servlet.*;
+import javax.servlet.http.*;
+import org.apache.soap.*;
+import org.apache.soap.encoding.soapenc.SoapEncUtils;
+import org.apache.soap.rpc.*;
+import org.apache.soap.server.*;
+import org.apache.soap.util.*;
+import org.apache.soap.util.mime.ByteArrayDataSource;
+
+/*
+ * @author jmsnell?
+ * @author dug
+ * @author Leif Nilsson TACMa ([EMAIL PROTECTED])
+ */
public class RPCProvider implements Provider
{
private DeploymentDescriptor dd ;
@@ -81,6 +90,7 @@
private ServletContext sc= null;
private String threadingModel= null;
private static boolean initLog= false;
+ private boolean attachString=false;
public void locate( DeploymentDescriptor dd,
Envelope env,
@@ -108,6 +118,7 @@
}
//This validates that the method name is listed in the deployment descriptor.
+ // TODO: use RPCRouter.validMessage
if (!MessageRouter.validMessage (dd, methodName)) {
String msg=
Log.msg(Log.ERROR, "msg.comprovider.badMethod", targetObjectURI, methodName);
@@ -142,10 +153,14 @@
progid= targetObjectURI;
}
- threadingModel= (String) props.get("threadmodel");
+ threadingModel= (String) props.get("threadmodel");
if( null == threadingModel) threadingModel= "MULTITHREADED";
Log.msg(Log.INFORMATION, "msg.comprovider.info.cominf", progid, threadingModel
);
+ // Should we send Strings as attachments ?
+ String attach = (String) props.get("AttachString");
+ attachString = (attach != null && SoapEncUtils.decodeBooleanValue(attach));
+
this.dd = dd ;
this.envelope = env ;
this.call = call ;
@@ -189,11 +204,20 @@
}catch( Exception e)
{
String msg= Log.msg(Log.ERROR, "msg.comprovider.error.nativeError",
e.toString());
- throw new SOAPException( Constants.FAULT_CODE_SERVER, msg);
+ throw new SOAPException(Constants.FAULT_CODE_SERVER, msg, e);
}
try {
Parameter pret= null;
- if(ret != null) pret= new Parameter(RPCConstants.ELEM_RETURN ,
ret.getClass(), ret, null);
+ if(ret != null) {
+ if (attachString && ret instanceof String) {
+ // We are about to return a String and they should be returned as
+ // attachments. Use a DataHandler object.
+ DataSource ds = new ByteArrayDataSource(((String)
ret).getBytes("UTF-8"), "application/octet-stream");
+ DataHandler dh = new DataHandler(ds);
+ ret = dh;
+ }
+ pret= new Parameter(RPCConstants.ELEM_RETURN , ret.getClass(), ret,
null);
+ }
vp=null; //dereference.
Response resp = new Response( targetObjectURI, // URI
call.getMethodName(), // Method
@@ -211,7 +235,7 @@
catch( Exception e ) {
String msg= Log.msg(Log.ERROR, "msg.comprovider.error.exp",
e.toString());
if ( e instanceof SOAPException ) throw (SOAPException ) e ;
- throw new SOAPException( Constants.FAULT_CODE_SERVER, msg );
+ throw new SOAPException( Constants.FAULT_CODE_SERVER, msg, e );
}
Log.msg(Log.SUCCESS, "msg.comprovider.ok", ret == null ? "*null*" :
ret.toString() );
@@ -316,7 +340,7 @@
else if(o instanceof java.lang.Long) //VT_R8
{ //COM has no long type so promote it to double which can contain it.
v[os+0] = 5; //VT_R8
- v[os+1] = 0;
+ v[os+1] = 0;
long x= Double.doubleToLongBits((double)(((Long)o).longValue()));
v[os+8]= (byte)x;
v[os+9]= (byte)((x>>>8) & 0xff);
1.53 +8 -5 xml-soap/java/docs/changes.html
Index: changes.html
===================================================================
RCS file: /home/cvs/xml-soap/java/docs/changes.html,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- changes.html 4 Dec 2002 03:33:01 -0000 1.52
+++ changes.html 10 Dec 2002 17:33:40 -0000 1.53
@@ -96,11 +96,14 @@
<li>Add client support for HTTP redirects.</li>
<li>Allow additional transport headers to be specified by client.</li>
<li>Add client support for one-way (as defined in WSDL) calls.</li>
- <li>Serialize method return values using their actual type rather than
- the declared type when the declared type is not a primitive. This may
- break existing services, e.g. where methods return subclasses of the
- declared return type, but a serializer is registered only for the
- declared return type.</li>
+ <li>Add the ability to serialize method return values using their actual
+ type rather than the declared type (polymorphism) on a per service basis
+ by specifying
+ <code><isd:option key="PolymorphicSerialization"
value="true"/></code>
+ within the <code>isd:provider</code> element in the deployment
descriptor.</li>
+ <li>Add the ability to return text attachments from COM-based services by
setting
+ <code><isd:option key="AttachString"
value="true"/></code>
+ within the <code>isd:provider</code> element in the deployment
descriptor.</li>
</ul>
</li>
</ul>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>