Forum Discussion
Tim_Arp_112576
Nimbostratus
Aug 12, 2004Handling returned parameters with SOAP and Java
Hi, I have been working on some code to basically mimic the b virtual command line. I'm trying to display the pool members status (up or down) . According to the SDK , the function is like this.
void get_member_active_states(
in SessionCredentials creds, <== CORBA Specific
in String pool_name,
in IPPortDefinition[] member_defs,
out MemberState[] member_states
);
ITCMLocalLB.Pool.wsdl
In all of the previous examples I have seen the desired result is return value. How do I retrieve out variables in soap this way.
My code goes like this
//get member stats
call.setMethodName("get_all_member_statistics");
resp = call.invoke(destURI, urn);
if (resp.generatedFault()){
Fault fault = resp.getFault();
throw new SOAPException(fault.getFaultCode(), fault.getFaultString());
} else {
MemberStatisticsEntry[] PoolMembers = (MemberStatisticsEntry[]) resp.getReturnValue().getValue();
for (int i=0; i < PoolMembers.length; i++) {
PoolParams.addElement(new Parameter("member_defs", IPPortDefinition.class,PoolMembers[i].getMember_definition(), null));
call.setParams(PoolParams);
call.setMethodName("get_member_active_states");
resp = call.invoke(destURI, urn);
//this is wrong below
MemberState[] PoolMemberState = (MemberState[]) resp.getReturnValue().getValue(); //this is wrong
String sAddress = PoolMembers[i].getMember_definition().getAddress();
long nPort = PoolMembers[i].getMember_definition().getPort();
long bits_in = PoolMembers[i].getStats().getThruput_stats().getBits_in();
long bits_out = PoolMembers[i].getStats().getThruput_stats().getBits_out();
long packets_in = PoolMembers[i].getStats().getThruput_stats().getPackets_in();
long packets_out = PoolMembers[i].getStats().getThruput_stats().getPackets_out();
long current_connection = PoolMembers[i].getStats().getConnection_stats().getCurrent_connections();
long maximum_connection = PoolMembers[i].getStats().getConnection_stats().getMaximum_connections();
long total_connection = PoolMembers[i].getStats().getConnection_stats().getTotal_connections();
out.println ("Member " + ((PoolMemberState[i].getActive_state())?"UP":"DOWN") + " {" + sAddress + ":" + nPort + "}
");
out.println ("\tbits (in, out) (" + bits_in + ", " + bits_out + ")");
out.println ("\tpackets (in, out) (" + packets_in + ", " + packets_out + ")");
out.println ("\tconnection (cur, max, tot) (" + current_connection + ", " + maximum_connection + ", " + total_connection + ")");
out.println ("
");
}
}
- The problem I see is that the method takes an array as input for the member_defs.
void get_member_active_states( in String pool_name, in IPPortDefinition [] member_defs, out MemberState[] member_states);
MemberStatisticsEntry[] PoolMembers = (MemberStatisticsEntry[]) resp.getReturnValue().getValue(); for (int i=0; i < PoolMembers.length; i++) { >> PoolParams.addElement(new Parameter("member_defs", IPPortDefinition.class,PoolMembers[i].getMember_definition(), null)); call.setParams(PoolParams); call.setMethodName("get_member_active_states"); resp = call.invoke(destURI, urn); //this is wrong below MemberState[] PoolMemberState = (MemberState[]) resp.getReturnValue().getValue(); //this is wrong
// Extract statistics return value MemberStatisticsEntry[] PoolMembers = (MemberStatisticsEntry[]) resp.getReturnValue().getValue(); // build input array long num_members = PoolMembers.length; IPPortDefinition [] member_defs = new IPPortDefinition[num_members]; for(int i=0; i { member_defs[i] = PoolMembers[i].getMember_definition(); } PoolParams.addElement(new Parameter("member_defs", IPPortDefinition[].class, member_defs, null)); call.setParams(PoolParams); call.setMethodName("get_member_active_states"); resp = call.invoke(deskURI, urn); // Extract return values...
- Tim_Arp_112576
Nimbostratus
I think I'm closer but I'm still getting a null pointer exception. - Tim_Arp_112576
Nimbostratus
I traced there error to the resp object I get - I can't test this right now but if memory serves me correctly I think this is one of the fun little quirks with Apache SOAP. I "think" that if there is no return value but there are out params, it makes the first outparam the return value accessible from resp.getReturnValue() and all subsequent out params accessible from the getParams() call starting at index 0.
- You need to use the getParams() method on the Response object. This is illustrated in the following sample apps in the SDK.
Response resp = call.invoke(...); Vector params = resp.getParams(); Parameter member_state_list_param = params.elementAt(0); MemberState[] member_state_list = (MemberState[])member_state_list_param.getValue(); -or- MemberState[] member_state_list = (memberState[])((Parameter)resp.getParams().elementAt(0)).getValue();<
- Great! I'm glad to be of some help. Like I said earlier, I believe the Apache SOAP toolkit will convert the first out param to the return value if the return value is void. Not sure the reason behind this but it looks like it does.
Recent Discussions
Related Content
DevCentral Quicklinks
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
Discover DevCentral Connects