Eugeny N Dzhurinsky wrote:
Hello there!

I noticed there's no way to define a service which accepts an InputStream and
returns an InputStream as a result (in fact it is possible to start such
service, but when a client calls the service - the XML error "Content is not
allowed in prolog" raises somewhere inside transformer:

org.apache.tuscany.sca.databinding.TransformationException: 
org.apache.tuscany.sca.databinding.TransformationException: 
javax.xml.transform.TransformerException: org.xml.sax.SAXParseException: 
Content is not allowed in prolog.
        at 
org.apache.tuscany.sca.databinding.xml.InputStream2Node.transform(InputStream2Node.java:48)
        at 
org.apache.tuscany.sca.databinding.xml.InputStream2Node.transform(InputStream2Node.java:37)
        at 
org.apache.tuscany.sca.databinding.DefaultTransformerExtensionPoint$LazyPullTransformer.transform(DefaultTransformerExtensionPoint.java:199)
        at 
org.apache.tuscany.sca.databinding.impl.MediatorImpl.mediate(MediatorImpl.java:73)
        at 
org.apache.tuscany.sca.core.databinding.transformers.Input2InputTransformer.transform(Input2InputTransformer.java:148)
        at 
org.apache.tuscany.sca.core.databinding.transformers.Input2InputTransformer.transform(Input2InputTransformer.java:43)
        at 
org.apache.tuscany.sca.databinding.impl.MediatorImpl.mediate(MediatorImpl.java:73)
        at 
org.apache.tuscany.sca.core.databinding.wire.DataTransformationInterceptor.transform(DataTransformationInterceptor.java:186)
        at 
org.apache.tuscany.sca.core.databinding.wire.DataTransformationInterceptor.invoke(DataTransformationInterceptor.java:76)
        at 
org.apache.tuscany.sca.core.invocation.JDKInvocationHandler.invoke(JDKInvocationHandler.java:286)
        at 
org.apache.tuscany.sca.core.invocation.JDKInvocationHandler.invoke(JDKInvocationHandler.java:154)
        at $Proxy8.handleImage(Unknown Source)
)

As a workaround I am passing and returning the arrays of bytes, however I
don't really like such approach. And I hope there's some way to provide custom
data binding for InputStream objects (stating them just a byte streams - not a
complex objects).

I am using WS-bindings, if that matters, and tuscany 1.2.

Could somebody please advice? May be using web services isn't a good idea to
pass and return a large BLOB for the service (image transformation in my
case)?

If this is going over Web services, the contents of the stream
would need to be transmitted on the wire as an array of bytes.
An InputStream can't be passed over Web services in its Java object
form.  Do you want to pass an InputStream in this case so that you
can avoid copying the same data multiple times during marshalling?
If so, it should be possible to write a custom data binding that
only does a single copy.

For a local (intra-JVM) invocation using the default binding, it
would be possible to write a custom data binding to pass an
InputStream as a Java object.  Is this relevant to your application
requirement?

  Simon

Reply via email to