You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-user@axis.apache.org by ma...@9elements.com on 2007/09/17 14:44:45 UTC

prob, array of base64binary

hello users,

i've got a problem a still can't handle,
i want to send an array of base64binarys.

this is the way to my prob :

1. this is my java interface, the description of a service

public interface aService {
	public Person getPerson(int i);
	public int setPerson(Person p);
}
class Person {
	public String name;
	public int age;

	public int[] images;	// later i change to xmime:base64Binary
	public int[] someInts;
	public String[] someStrings;
}

2. i generate with java2wsdl
   output is 'aService_orig.wsdl'

3. change the wsdl :
   output is 'aService.wsdl'

3.1. set definitions
	xmlns:xmime="http://www.w3.org/2005/05/xmlmime"

3.2. set import
	<xs:import namespace="http://www.w3.org/2005/05/xmlmime"
		schemaLocation="xmime.xsd"/>

3.3. change type
	<xs:element maxOccurs="unbounded" minOccurs="0" name="images" nillable="true"
type="xs:int"/>
	to
	<xs:element maxOccurs="unbounded" minOccurs="0" name="images" nillable="true"
type="xmime:base64Binary"/>

4. then i generate c- and java- sources with wsdl2java/wsdl2c
	c-server : -ss -sd -d adb -u
	java-server : -ss -sd -g -d adb -u


5. first i build the java code

5.1 implementation of the skeleton, setResponse :

   public org.apache.ws.axis2.SetPersonResponse setPerson(
        org.apache.ws.axis2.SetPerson setPerson) {

        // get Person
        org.apache.ws.axis2.xsd.Person person = setPerson.getParam0();

        // get ints
        int[] ints = person.getSomeInts();
        System.out.println("count of ints : " + ints.length);
        for (int i=0; i<ints.length; i++) {
            System.out.println("no. " + i + " => " + ints[i]);
        }

        // get strings
        String[] strings = person.getSomeStrings();
        System.out.println("count of strings : " + strings.length);
        for (int i=0; i<strings.length; i++) {
            System.out.println("no. " + i + " => " + strings[i]);
        }

        // get b64bs
        org.w3.www._2005._05.xmlmime.Base64Binary[] b64bs = person.getImages();
        System.out.println("count of b64bs : " + b64bs.length);


		// response
		org.apache.ws.axis2.SetPersonResponse response = new
org.apache.ws.axis2.SetPersonResponse();
		response.set_return(12345);
		return response;
    }


5.2 implementation of the a little client-test :

	try {
		AServiceStub stub = new AServiceStub();
		SetPerson setPerson = new SetPerson();
		Person person = new Person();
		SetPersonResponse setPersonResponse = null;

		// set simple things
		person.setName("aName");
		person.setAge(123);

		//person.addImages()
		//person.addSomeStrings()
		// aber nicht addSomeInts() !!!


		// set ints
		int[] ints = new int[3];
		ints[0] = 1;
		ints[1] = 2;
		ints[2] = 3;
		person.setSomeInts(ints);


		// set strings
		String[] strings = new String[5];
		strings[0] = "str_1";
		strings[1] = "str_2";
		strings[2] = "str_3";
		strings[3] = "str_4";
		strings[4] = "str_5";
		person.setSomeStrings(strings);


		// set images
		Base64Binary[] b64bs = new Base64Binary[2];

		 // prepare base64bin
		File file = new File("X:\\_test\\test.jpg");
		FileDataSource fileDataSource = new FileDataSource(file);
		DataHandler dataHandler = new DataHandler(fileDataSource);
		Base64Binary b64bin = new Base64Binary();
		b64bin.setBase64Binary(dataHandler);

		b64bs[0] = b64bin;
		b64bs[1] = b64bin;
		person.setImages(b64bs);


		// set param
		setPerson.setParam0(person);

		// call the method
		setPersonResponse = stub.setPerson(setPerson);

		// response
		System.out.println("back : " + setPersonResponse.get_return() );
	} catch (AxisFault ex) {
		ex.printStackTrace();
	} catch (RemoteException ex) {
		ex.printStackTrace();
	}

	this works fine, output at serverside is :

	count of ints : 3
	no. 0 => 1
	no. 1 => 2
	no. 2 => 3
	count of strings : 5
	no. 0 => str_1
	no. 1 => str_2
	no. 2 => str_3
	no. 3 => str_4
	no. 4 => str_5
	count of b64bs : 2

	[i could even save the files to disk]

6. second step i want to communicate my java-test-program with
   the c-service, when i try to compile one error occours in
   'adb_base64Binary.c' error 176, element_qname, not defined
   i set it like qname : 'axutil_qname_t *element_qname = NULL;'
   ok, service compiles fine (i didn't implement anything else !)

7. my problem, occurs, when calling the c-service with my java-client,
   the server crashes, when trying to deserialize in
'adb_base64Binary_deserialize'

   here is the relevant stack :

   axutil.dll!axutil_string_get_buffer(const axutil_string * string=0x00031208,
const axutil_env * env=0x008f4328)  Zeile 228 + 0x3 Bytes	C
   axiom.dll!axiom_namespace_get_prefix(axiom_namespace *
om_namespace=0x008f65b0, const axutil_env * env=0x008f4328)  Zeile 202 + 0x10
Bytes	C
   axiom.dll!axiom_element_get_qname(axiom_element * om_element=0x00927840,
const axutil_env * env=0x008f4328, axiom_node * ele_node=0x00927800)  Zeile 906
+ 0xd Bytes	C
   aService.dll!adb_base64Binary_deserialize(adb_base64Binary *
_base64Binary=0x0095b628, const axutil_env * env=0x008f4328, axiom_node *
parent=0x00927800)  Zeile 169 + 0x14 Bytes	C
   aService.dll!adb_Person_deserialize(adb_Person * _Person=0x0095b3b8, const
axutil_env * env=0x008f4328, axiom_node * parent=0x008f6040)  Zeile 297 + 0x1e
Bytes	C
   aService.dll!adb_setPerson_deserialize(adb_setPerson * _setPerson=0x0095b168,
const axutil_env * env=0x008f4328, axiom_node * parent=0x008f5ce8)  Zeile 196 +
0x1b Bytes	C
   aService.dll!axis2_svc_skel_aService_invoke(axis2_svc_skeleton *
svc_skeleton=0x0095b098, const axutil_env * env=0x008f4328, axiom_node *
content_node=0x008f5ce8, axis2_msg_ctx * msg_ctx=0x0095ae90)  Zeile 187	C
   ...

   i don't know how to handle this - any ideas ?
   need more infos ?

mfg derMark