Gerenimo java Mail & Sun's Java mail are different implementations of Java Mail spec. We can't use Sun's Java mail through Maven repositories due to licensing issues...
~Thilina
On 5/10/06, Stefan Vladov <[EMAIL PROTECTED]> wrote:
Hi,
sorry to bother you again with the same old stuff... my problem was the
javamail implementation... an exception of type ParseException is thrown
somewhere in
javax.mail.internet.ContentType#ContentType (String type)
, which is called by
public Attachments(InputStream inStream, String contentTypeString,
boolean fileCacheEnable, String attachmentRepoDir,
String fileThreshold)
in org.apache.axiom.attachments.Attachments,
called from TransportUtils and so on...
I wasn't able to debug javamail further to see the exact cause.
Anyway my question is: is MTOM in axis2 meant to work only with geronimo
mail implementation and if you are familiar with the issue, have you
come up with some workaround.
As I am totally unfamiliar with the differences between geronimo's and
sun's implementations I thought the problem might be in the registered
handlers in the mailcap-s of the jars, however now I saw that the code is
different althogh packages, classes and methods are the same :( .
geronimo source is looks like that:
public ContentType(String type)
throws ParseException
{
int slash = type.indexOf("/");
int semi = type.indexOf(";");
try
{
_major = type.substring(0, slash);
if(semi == -1)
{
_minor = type.substring(slash + 1);
} else
{
_minor = type.substring(slash + 1, semi);
_list = new ParameterList(type.substring(semi + 1));
}
}
catch(StringIndexOutOfBoundsException e)
{
throw new ParseException("Type invalid: " + type);
}
}
,whereas sun's javamail 1.4 as well as 1.3.1 are:
public ContentType(String s)
throws ParseException
{
HeaderTokenizer headertokenizer = new HeaderTokenizer(s,
"()<>@,;:\\\"\t []/?=");
HeaderTokenizer.Token token = headertokenizer.next();
if(token.getType() != -1)
throw new ParseException();
primaryType = token.getValue();
token = headertokenizer.next();
if((char)token.getType() != '/')
throw new ParseException();
token = headertokenizer.next();
if(token.getType() != -1)
throw new ParseException();
subType = token.getValue();
String s1 = headertokenizer.getRemainder();
if(s1 != null)
list = new ParameterList(s1);
}
Anyway I am serving the web services on Jetty embedded in an application
(which actually provides the services ) and I somehow don't want to switch
to geronimo's implementation, so please if somebody has been through this
HEEELP!
> I have fixed the SOAP version issue+ a potential content type issue
> recently.
> Are you using Sun's impl of Java Mail?
>
> Please try with the latest svn heads.. Even the latest Axis2 RC + Axiom
> RC would be fine..
>
> ~Thilina
>
>
> On 5/2/06, Stefan Vladov <[EMAIL PROTECTED]> wrote:
>>
>> Hi guys,
>>
>> This is probably a very stupid problem, however since I consider myself
>> a
>> newbie and I've been using web services for about 2-3 weeks the issue
>> has
>> turned out to be quite a bottleneck for me. So here is my problem: I was
>> trying to make the following scenario with apache axis2 0.95 - a client
>> requests a file from by providing a name and a web service sends it (the
>> file) as a binary attachment. However since things did not work I tried
>> rewriting the sample and I still have the same problem. My version that
>> is
>> quite similar to the original looks like that:
>>
>> public class MTOMClient
>> {
>> private static EndpointReference targetEPR = new
>> EndpointReference("http://localhost:8011/services/WSMTOMTest");
>> private static imageFileName = "some image name";
>>
>> public static void main (String[] args)
>> {
>> try
>> {
>> OMFactory fac = OMAbstractFactory.getOMFactory();
>> OMNamespace omNs = fac.createOMNamespace("http://blabla",
>> "bla");
>> OMElement method = fac.createOMElement("handle", omNs);
>> Image image;
>> image = new ImageIO().loadImage(new
>> FileInputStream(imagefilename));
>> ImageDataSource dataSource = new
>> ImageDataSource("calendar.jpg",image);
>> DataHandler dataHandler = new DataHandler(dataSource);
>> OMText textData = fac.createText(dataHandler, true);
>> OMElement imageElement = fac.createOMElement("imageElement",
>> omNs);
>> imageElement.addChild(textData);
>> method.addChild(imageElement);
>>
>> Options options = new Options();
>> options.setTo(targetEPR);
>> options.setSoapVersionURI(
>> SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
>> options.setTransportInProtocol(Constants.TRANSPORT_HTTP );
>> options.setProperty(Constants.Configuration.ENABLE_MTOM,
>> Constants.VALUE_TRUE);
>>
>> //Blocking invocation
>> ServiceClient serviceClient = new ServiceClient();
>> serviceClient.setOptions(options);
>> OMElement result = serviceClient.sendReceive(method);
>> StringWriter writer = new StringWriter();
>> result.serialize(XMLOutputFactory.newInstance
>> ().createXMLStreamWriter(writer));
>> writer.flush();
>>
>> System.out.println(writer.toString());
>> }
>> catch (Exception e)
>> {
>> e.printStackTrace();
>> }
>> }
>> }
>>
>> and I got the following exception: "Transport level information does not
>> match with SOAP Message namespace URI
>> at
>>
>> org.apache.ws.commons.soap.impl.builder.StAXSOAPModelBuilder.identifySOAPVersion
>> (StAXSOAPModelBuilder.java:123)..."
>>
>> which I believe was caused by the fact that the factory for the
>> soapenvelope was SOAP12Factory. The exception seems to be thrown on the
>> client side however tcpmon displays a nice request message and a
>> response
>> with AxisFault in it, which somehow confuses me :(! Since I didn't know
>> how to specify factory class name I changed the option of the client to
>> "SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI " and the exception changed
>> :)
>> to
>>
>> "org.apache.axis2.AxisFault: org.apache.axis2.AxisFault: Invalid Content
>> Type Field in the Mime Message; nested exception is:
>> org.apache.ws.commons.om.OMException: Invalid Content Type Field
>> in
>> the
>> Mime Message
>> at
>> org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest (
>> HTTPTransportUtils.java:295)
>> at org.apache.axis2.transport.http.AxisServlet.doPost(
>> AxisServlet.java:160)
>> ........"
>> which also is thrown I believe on the client side but still I see
>> request
>> and response in tcpmon. Now, my request message looks like that:
>>
>> POST /services/WSMTOMTest HTTP/1.1
>> User-Agent: Axis/2.0
>> Host: localhost:8011
>> Transfer-Encoding: chunked
>> Content-Type: multipart/related;
>> boundary=MIMEBoundaryurn:uuid:F91F6DFF8B9836261F11465870886181;
>> type="application/xop+xml";
>> start="< 0.urn:uuid:[EMAIL PROTECTED]>";
>> start-info="application/soap+xml"; charset=UTF-8;action=""
>>
>> 645
>> --MIMEBoundaryurn:uuid:F91F6DFF8B9836261F11465870886181
>> content-type:application/xop+xml; charset=UTF-8;
>> type="application/soap+xml";
>> content-transfer-encoding:binary
>> content-id:<0.urn:uuid:[EMAIL PROTECTED]>
>>
>> <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope
>> xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header
>> /><soapenv:Body><bla:handle
>> xmlns:bla=" http://blabla"><bla:imageElement><xop:Include
>> href="" href="mailto:1.urn:uuid:[EMAIL PROTECTED]">1.urn:uuid:[EMAIL PROTECTED] "
>> xmlns:xop="http://www.w3.org/2004/08/xop/include"
>> /></bla:imageElement></bla:handle></soapenv:Body></soapenv:Envelope>
>> --MIMEBoundaryurn:uuid:F91F6DFF8B9836261F11465870886181
>> content-id:<1.urn:uuid:[EMAIL PROTECTED] >
>> content-type:image/jpeg
>> content-transfer-encoding:binary
>>
>> -----binary data---------------
>>
>> --MIMEBoundaryurn:uuid:F91F6DFF8B9836261F11465870886181--
>> 0
>>
>> and the only difference that I noticed between this message and the one
>> of
>> the sample is the start-info property which was "text/xml" in the
>> original, as well as the "type" attributes of the mime parts... oh and
>> the
>> empty action. I'm using the standard axis2.xml configuration file,
>> nothing
>> extraordinary in the services.xml and the service is very simple too:
>>
>> public class WSMTOMTest
>> {
>>
>> public OMElement handle (OMElement request) throws AxisFault
>> {
>> try
>> {
>> SystemConfiguration sysConf =
>> SystemConfiguration.getRef();
>> OMFactory factory =
>> OMAbstractFactory.getOMFactory
>> ();
>> OMNamespace omNS = factory.createOMNamespace(
>> "http://"
>>
>> + SystemConfiguration.getLocalHostName()
>>
>> + ":"
>>
>> + sysConf.getPortFrontendHttp (),
>>
>> "rfidNS");
>> OMElement response =
>> factory.createOMElement("copyResponse",
>> omNS);
>>
>> OMElement imageEle = request.getFirstElement();
>> OMText binaryNode = (OMText) imageEle.getFirstOMChild();
>> binaryNode.setOptimize(true);
>>
>> //Extracting the data and saving
>> DataHandler actualDH;
>> actualDH = (DataHandler)binaryNode.getDataHandler();
>> Image actualObject = new
>> ImageIO().loadImage(actualDH.getDataSource()
>> .getInputStream());
>> FileOutputStream imageOutStream = new
>> FileOutputStream("D:\blabla.gif");
>> new ImageIO().saveImage("image/jpeg", actualObject,
>> imageOutStream);
>>
>> response.setText("success");
>> return response;
>> }
>> catch (Exception e)
>> {
>> throw new AxisFault (e.getMessage());
>> }
>> }
>> }
>>
>>
>> I really don't know what could possibly go wrong in that extremely
>> simple
>> case. I'm very sorry to bother u with such a long mail for such a stupid
>> thing but it drives me crazy... I've read everything in every mailing
>> list
>> that I found but no use. Please if someone had the same problem HELP :)
>>
>>
>
>
> --
> "May the SourcE be with u"
> http://webservices.apache.org/~thilina/
> http://thilinag.blogspot.com/
> http://www.bloglines.com/blog/Thilina
>
--
"May the SourcE be with u"
http://webservices.apache.org/~thilina/
http://thilinag.blogspot.com/ http://www.bloglines.com/blog/Thilina