1*77e5bcceSSpandan DasFrom b5b548a4be9f1ced6f5599b62765216f9ab8af00 Mon Sep 17 00:00:00 2001 2*77e5bcceSSpandan DasFrom: Ecco Park <[email protected]> 3*77e5bcceSSpandan DasDate: Tue, 8 May 2018 13:44:14 -0700 4*77e5bcceSSpandan DasSubject: [PATCH 1/1] ksoap2 update 5*77e5bcceSSpandan Das 6*77e5bcceSSpandan DasChange-Id: Iace4c0f3cb31c9532c5fa0c44c2dc863bd81b23e 7*77e5bcceSSpandan DasSigned-off-by: Ecco Park <[email protected]> 8*77e5bcceSSpandan Das--- 9*77e5bcceSSpandan Das .../main/java/org/ksoap2/SoapEnvelope.java | 17 +- 10*77e5bcceSSpandan Das .../src/main/java/org/ksoap2/SoapFault12.java | 13 +- 11*77e5bcceSSpandan Das .../serialization/AttributeContainer.java | 128 +++++- 12*77e5bcceSSpandan Das .../java/org/ksoap2/serialization/DM.java | 57 ++- 13*77e5bcceSSpandan Das .../ksoap2/serialization/HasAttributes.java | 16 + 14*77e5bcceSSpandan Das .../ksoap2/serialization/HasInnerText.java | 17 + 15*77e5bcceSSpandan Das .../ksoap2/serialization/KvmSerializable.java | 25 +- 16*77e5bcceSSpandan Das .../org/ksoap2/serialization/Marshal.java | 3 +- 17*77e5bcceSSpandan Das .../ksoap2/serialization/MarshalBase64.java | 3 +- 18*77e5bcceSSpandan Das .../org/ksoap2/serialization/MarshalDate.java | 3 +- 19*77e5bcceSSpandan Das .../serialization/MarshalHashtable.java | 8 +- 20*77e5bcceSSpandan Das .../org/ksoap2/serialization/SoapObject.java | 340 +++++++++++++- 21*77e5bcceSSpandan Das .../ksoap2/serialization/SoapPrimitive.java | 20 +- 22*77e5bcceSSpandan Das .../SoapSerializationEnvelope.java | 419 ++++++++++++------ 23*77e5bcceSSpandan Das .../org/ksoap2/serialization/ValueWriter.java | 13 + 24*77e5bcceSSpandan Das .../ksoap2/transport/ServiceConnection.java | 13 +- 25*77e5bcceSSpandan Das .../java/org/ksoap2/transport/Transport.java | 131 ++++-- 26*77e5bcceSSpandan Das .../ksoap2/serialization/MarshalFloat.java | 3 +- 27*77e5bcceSSpandan Das .../transport/HttpResponseException.java | 60 +++ 28*77e5bcceSSpandan Das .../org/ksoap2/transport/HttpTransportSE.java | 348 +++++++-------- 29*77e5bcceSSpandan Das .../transport/HttpsServiceConnectionSE.java | 58 ++- 30*77e5bcceSSpandan Das .../ksoap2/transport/HttpsTransportSE.java | 81 ++-- 31*77e5bcceSSpandan Das .../transport/KeepAliveHttpsTransportSE.java | 20 +- 32*77e5bcceSSpandan Das .../ksoap2/transport/ServiceConnectionSE.java | 44 +- 33*77e5bcceSSpandan Das 24 files changed, 1298 insertions(+), 542 deletions(-) 34*77e5bcceSSpandan Das create mode 100644 ksoap2-base/src/main/java/org/ksoap2/serialization/HasAttributes.java 35*77e5bcceSSpandan Das create mode 100644 ksoap2-base/src/main/java/org/ksoap2/serialization/HasInnerText.java 36*77e5bcceSSpandan Das create mode 100644 ksoap2-base/src/main/java/org/ksoap2/serialization/ValueWriter.java 37*77e5bcceSSpandan Das create mode 100644 ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpResponseException.java 38*77e5bcceSSpandan Das 39*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java b/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java 40*77e5bcceSSpandan Dasindex 8a0b894..1c43656 100644 41*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java 42*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java 43*77e5bcceSSpandan Das@@ -54,10 +54,8 @@ public class SoapEnvelope { 44*77e5bcceSSpandan Das /** Namespace constant: http://www.w3.org/1999/XMLSchema */ 45*77e5bcceSSpandan Das public static final String XSI1999 = "http://www.w3.org/1999/XMLSchema-instance"; 46*77e5bcceSSpandan Das 47*77e5bcceSSpandan Das- //public static final String NS20 = "http://www.wi-fi-org/specifications/hotspot2dot0/spp/1.0/"; 48*77e5bcceSSpandan Das public static final String NS20 = "http://www.wi-fi.org/specifications/hotspot2dot0/v1.0/spp"; 49*77e5bcceSSpandan Das 50*77e5bcceSSpandan Das- //public static final String OMADM12 = "http://www.openmobilealliance.org/tech/DTD/dm_ddf-v1_2.dtd"; 51*77e5bcceSSpandan Das 52*77e5bcceSSpandan Das /** 53*77e5bcceSSpandan Das * Returns true for the string values "1" and "true", ignoring upper/lower 54*77e5bcceSSpandan Das@@ -105,9 +103,8 @@ public class SoapEnvelope { 55*77e5bcceSSpandan Das /** Xml Schema data namespace, set by the constructor */ 56*77e5bcceSSpandan Das public String xsd; 57*77e5bcceSSpandan Das 58*77e5bcceSSpandan Das- ///M: HS20 Add by Jungo 59*77e5bcceSSpandan Das+ // HS20 change 60*77e5bcceSSpandan Das public String ns; 61*77e5bcceSSpandan Das- public String omadm; 62*77e5bcceSSpandan Das 63*77e5bcceSSpandan Das /** 64*77e5bcceSSpandan Das * Initializes a SOAP Envelope. The version parameter must be set to one of 65*77e5bcceSSpandan Das@@ -129,10 +126,8 @@ public class SoapEnvelope { 66*77e5bcceSSpandan Das enc = SoapEnvelope.ENC2003; 67*77e5bcceSSpandan Das env = SoapEnvelope.ENV2003; 68*77e5bcceSSpandan Das } 69*77e5bcceSSpandan Das- 70*77e5bcceSSpandan Das+ // HS20 change 71*77e5bcceSSpandan Das ns = SoapEnvelope.NS20; 72*77e5bcceSSpandan Das- //omadm = SoapEnvelope.OMADM12; 73*77e5bcceSSpandan Das- 74*77e5bcceSSpandan Das } 75*77e5bcceSSpandan Das 76*77e5bcceSSpandan Das /** Parses the SOAP envelope from the given parser */ 77*77e5bcceSSpandan Das@@ -206,13 +201,9 @@ public class SoapEnvelope { 78*77e5bcceSSpandan Das * given XML writer. 79*77e5bcceSSpandan Das */ 80*77e5bcceSSpandan Das public void write(XmlSerializer writer) throws IOException { 81*77e5bcceSSpandan Das- ///M: HS20 modify by Jungo 82*77e5bcceSSpandan Das- //writer.setPrefix("i", xsi); 83*77e5bcceSSpandan Das- //writer.setPrefix("d", xsd); 84*77e5bcceSSpandan Das- //writer.setPrefix("c", enc); 85*77e5bcceSSpandan Das- writer.setPrefix("soap", env);//the prefix for namespace env in xml output 86*77e5bcceSSpandan Das+ // HS 2.0 changes 87*77e5bcceSSpandan Das+ writer.setPrefix("soap", env); //the prefix for namespace env in xml output 88*77e5bcceSSpandan Das writer.setPrefix("spp", ns); 89*77e5bcceSSpandan Das- //writer.setPrefix("omadm", omadm); 90*77e5bcceSSpandan Das 91*77e5bcceSSpandan Das writer.startTag(env, "Envelope"); 92*77e5bcceSSpandan Das writer.startTag(env, "Header"); 93*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/SoapFault12.java b/ksoap2-base/src/main/java/org/ksoap2/SoapFault12.java 94*77e5bcceSSpandan Dasindex 5667cb4..3f39147 100644 95*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/SoapFault12.java 96*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/SoapFault12.java 97*77e5bcceSSpandan Das@@ -72,27 +72,28 @@ public class SoapFault12 extends SoapFault { 98*77e5bcceSSpandan Das 99*77e5bcceSSpandan Das while (parser.nextTag() == XmlPullParser.START_TAG) { 100*77e5bcceSSpandan Das String name = parser.getName(); 101*77e5bcceSSpandan Das+ String namespace = parser.getNamespace(); 102*77e5bcceSSpandan Das parser.nextTag(); 103*77e5bcceSSpandan Das- if (name.equals("Code")) { 104*77e5bcceSSpandan Das+ if (name.toLowerCase().equals("Code".toLowerCase())) { 105*77e5bcceSSpandan Das this.Code = new Node(); 106*77e5bcceSSpandan Das this.Code.parse(parser); 107*77e5bcceSSpandan Das- } else if (name.equals("Reason")) { 108*77e5bcceSSpandan Das+ } else if (name.toLowerCase().equals("Reason".toLowerCase())) { 109*77e5bcceSSpandan Das this.Reason = new Node(); 110*77e5bcceSSpandan Das this.Reason.parse(parser); 111*77e5bcceSSpandan Das- } else if (name.equals("Node")) { 112*77e5bcceSSpandan Das+ } else if (name.toLowerCase().equals("Node".toLowerCase())) { 113*77e5bcceSSpandan Das this.Node = new Node(); 114*77e5bcceSSpandan Das this.Node.parse(parser); 115*77e5bcceSSpandan Das- } else if (name.equals("Role")) { 116*77e5bcceSSpandan Das+ } else if (name.toLowerCase().equals("Role".toLowerCase())) { 117*77e5bcceSSpandan Das this.Role = new Node(); 118*77e5bcceSSpandan Das this.Role.parse(parser); 119*77e5bcceSSpandan Das- } else if (name.equals("Detail")) { 120*77e5bcceSSpandan Das+ } else if (name.toLowerCase().equals("Detail".toLowerCase())) { 121*77e5bcceSSpandan Das this.Detail = new Node(); 122*77e5bcceSSpandan Das this.Detail.parse(parser); 123*77e5bcceSSpandan Das } else { 124*77e5bcceSSpandan Das throw new RuntimeException("unexpected tag:" + name); 125*77e5bcceSSpandan Das } 126*77e5bcceSSpandan Das 127*77e5bcceSSpandan Das- parser.require(XmlPullParser.END_TAG, SoapEnvelope.ENV2003, name); 128*77e5bcceSSpandan Das+ parser.require(XmlPullParser.END_TAG, namespace, name); 129*77e5bcceSSpandan Das } 130*77e5bcceSSpandan Das parser.require(XmlPullParser.END_TAG, SoapEnvelope.ENV2003, "Fault"); 131*77e5bcceSSpandan Das parser.nextTag(); 132*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/AttributeContainer.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/AttributeContainer.java 133*77e5bcceSSpandan Dasindex 6b83847..34d2723 100644 134*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/AttributeContainer.java 135*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/AttributeContainer.java 136*77e5bcceSSpandan Das@@ -3,8 +3,8 @@ package org.ksoap2.serialization; 137*77e5bcceSSpandan Das 138*77e5bcceSSpandan Das import java.util.Vector; 139*77e5bcceSSpandan Das 140*77e5bcceSSpandan Das-public class AttributeContainer { 141*77e5bcceSSpandan Das- private Vector attributes = new Vector(); 142*77e5bcceSSpandan Das+public class AttributeContainer implements HasAttributes{ 143*77e5bcceSSpandan Das+ protected Vector attributes = new Vector(); 144*77e5bcceSSpandan Das 145*77e5bcceSSpandan Das /** 146*77e5bcceSSpandan Das * Places AttributeInfo of desired attribute into a designated AttributeInfo object 147*77e5bcceSSpandan Das@@ -29,9 +29,9 @@ public class AttributeContainer { 148*77e5bcceSSpandan Das return ((AttributeInfo) attributes.elementAt(index)).getValue(); 149*77e5bcceSSpandan Das } 150*77e5bcceSSpandan Das 151*77e5bcceSSpandan Das- /** 152*77e5bcceSSpandan Das- * Get the attribute's toString value. 153*77e5bcceSSpandan Das- */ 154*77e5bcceSSpandan Das+ /** 155*77e5bcceSSpandan Das+ * Get the attribute's toString value. 156*77e5bcceSSpandan Das+ */ 157*77e5bcceSSpandan Das public String getAttributeAsString(int index) { 158*77e5bcceSSpandan Das AttributeInfo attributeInfo = (AttributeInfo) attributes.elementAt(index); 159*77e5bcceSSpandan Das return attributeInfo.getValue().toString(); 160*77e5bcceSSpandan Das@@ -51,6 +51,20 @@ public class AttributeContainer { 161*77e5bcceSSpandan Das } 162*77e5bcceSSpandan Das } 163*77e5bcceSSpandan Das 164*77e5bcceSSpandan Das+ /** 165*77e5bcceSSpandan Das+ * Get the attribute with the given name 166*77e5bcceSSpandan Das+ * 167*77e5bcceSSpandan Das+ * @throws RuntimeException if the attribute does not exist 168*77e5bcceSSpandan Das+ */ 169*77e5bcceSSpandan Das+ public Object getAttribute(String namespace,String name) { 170*77e5bcceSSpandan Das+ Integer i = attributeIndex(namespace,name); 171*77e5bcceSSpandan Das+ if (i != null) { 172*77e5bcceSSpandan Das+ return getAttribute(i.intValue()); 173*77e5bcceSSpandan Das+ } else { 174*77e5bcceSSpandan Das+ throw new RuntimeException("illegal property: " + name); 175*77e5bcceSSpandan Das+ } 176*77e5bcceSSpandan Das+ } 177*77e5bcceSSpandan Das+ 178*77e5bcceSSpandan Das /** 179*77e5bcceSSpandan Das * Get the toString value of the attribute with the given name. 180*77e5bcceSSpandan Das * 181*77e5bcceSSpandan Das@@ -65,6 +79,19 @@ public class AttributeContainer { 182*77e5bcceSSpandan Das } 183*77e5bcceSSpandan Das } 184*77e5bcceSSpandan Das 185*77e5bcceSSpandan Das+ /** 186*77e5bcceSSpandan Das+ * Get the toString value of the attribute with the given name. 187*77e5bcceSSpandan Das+ * 188*77e5bcceSSpandan Das+ * @throws RuntimeException if the attribute does not exist 189*77e5bcceSSpandan Das+ */ 190*77e5bcceSSpandan Das+ public String getAttributeAsString(String namespace,String name) { 191*77e5bcceSSpandan Das+ Integer i = attributeIndex(namespace,name); 192*77e5bcceSSpandan Das+ if (i != null) { 193*77e5bcceSSpandan Das+ return getAttribute(i.intValue()).toString(); 194*77e5bcceSSpandan Das+ } else { 195*77e5bcceSSpandan Das+ throw new RuntimeException("illegal property: " + name); 196*77e5bcceSSpandan Das+ } 197*77e5bcceSSpandan Das+ } 198*77e5bcceSSpandan Das /** 199*77e5bcceSSpandan Das * Knows whether the given attribute exists 200*77e5bcceSSpandan Das */ 201*77e5bcceSSpandan Das@@ -76,6 +103,16 @@ public class AttributeContainer { 202*77e5bcceSSpandan Das } 203*77e5bcceSSpandan Das } 204*77e5bcceSSpandan Das 205*77e5bcceSSpandan Das+ /** 206*77e5bcceSSpandan Das+ * Knows whether the given attribute exists 207*77e5bcceSSpandan Das+ */ 208*77e5bcceSSpandan Das+ public boolean hasAttribute(final String namespace,final String name) { 209*77e5bcceSSpandan Das+ if (attributeIndex(namespace,name) != null) { 210*77e5bcceSSpandan Das+ return true; 211*77e5bcceSSpandan Das+ } else { 212*77e5bcceSSpandan Das+ return false; 213*77e5bcceSSpandan Das+ } 214*77e5bcceSSpandan Das+ } 215*77e5bcceSSpandan Das /** 216*77e5bcceSSpandan Das * Get an attribute without chance of throwing an exception 217*77e5bcceSSpandan Das * 218*77e5bcceSSpandan Das@@ -91,6 +128,21 @@ public class AttributeContainer { 219*77e5bcceSSpandan Das } 220*77e5bcceSSpandan Das } 221*77e5bcceSSpandan Das 222*77e5bcceSSpandan Das+ /** 223*77e5bcceSSpandan Das+ * Get an attribute without chance of throwing an exception 224*77e5bcceSSpandan Das+ * 225*77e5bcceSSpandan Das+ * @param name the name of the attribute to retrieve 226*77e5bcceSSpandan Das+ * @return the value of the attribute if it exists; {@code null} if it does not exist 227*77e5bcceSSpandan Das+ */ 228*77e5bcceSSpandan Das+ public Object getAttributeSafely(String namespace,String name) { 229*77e5bcceSSpandan Das+ Integer i = attributeIndex(namespace,name); 230*77e5bcceSSpandan Das+ if (i != null) { 231*77e5bcceSSpandan Das+ return getAttribute(i.intValue()); 232*77e5bcceSSpandan Das+ } else { 233*77e5bcceSSpandan Das+ return null; 234*77e5bcceSSpandan Das+ } 235*77e5bcceSSpandan Das+ } 236*77e5bcceSSpandan Das+ 237*77e5bcceSSpandan Das /** 238*77e5bcceSSpandan Das * Get an attributes' toString value without chance of throwing an 239*77e5bcceSSpandan Das * exception. 240*77e5bcceSSpandan Das@@ -108,6 +160,23 @@ public class AttributeContainer { 241*77e5bcceSSpandan Das } 242*77e5bcceSSpandan Das } 243*77e5bcceSSpandan Das 244*77e5bcceSSpandan Das+ /** 245*77e5bcceSSpandan Das+ * Get an attributes' toString value without chance of throwing an 246*77e5bcceSSpandan Das+ * exception. 247*77e5bcceSSpandan Das+ 248*77e5bcceSSpandan Das+ * @param name 249*77e5bcceSSpandan Das+ * @return the value of the attribute,s toString method if it exists; "" 250*77e5bcceSSpandan Das+ * if it does not exist 251*77e5bcceSSpandan Das+ */ 252*77e5bcceSSpandan Das+ public Object getAttributeSafelyAsString(String namespace,String name) { 253*77e5bcceSSpandan Das+ Integer i = attributeIndex(namespace,name); 254*77e5bcceSSpandan Das+ if (i != null) { 255*77e5bcceSSpandan Das+ return getAttribute(i.intValue()).toString(); 256*77e5bcceSSpandan Das+ } else { 257*77e5bcceSSpandan Das+ return ""; 258*77e5bcceSSpandan Das+ } 259*77e5bcceSSpandan Das+ } 260*77e5bcceSSpandan Das+ 261*77e5bcceSSpandan Das private Integer attributeIndex(String name) { 262*77e5bcceSSpandan Das for (int i = 0; i < attributes.size(); i++) { 263*77e5bcceSSpandan Das if (name.equals(((AttributeInfo) attributes.elementAt(i)).getName())) { 264*77e5bcceSSpandan Das@@ -117,6 +186,16 @@ public class AttributeContainer { 265*77e5bcceSSpandan Das return null; 266*77e5bcceSSpandan Das } 267*77e5bcceSSpandan Das 268*77e5bcceSSpandan Das+ private Integer attributeIndex(String namespace,String name) { 269*77e5bcceSSpandan Das+ for (int i = 0; i < attributes.size(); i++) { 270*77e5bcceSSpandan Das+ AttributeInfo attrInfo=(AttributeInfo) attributes.elementAt(i); 271*77e5bcceSSpandan Das+ if (name.equals(attrInfo.getName()) && namespace.equals(attrInfo.getNamespace())) { 272*77e5bcceSSpandan Das+ return new Integer(i); 273*77e5bcceSSpandan Das+ } 274*77e5bcceSSpandan Das+ } 275*77e5bcceSSpandan Das+ return null; 276*77e5bcceSSpandan Das+ } 277*77e5bcceSSpandan Das+ 278*77e5bcceSSpandan Das /** 279*77e5bcceSSpandan Das * Returns the number of attributes 280*77e5bcceSSpandan Das * 281*77e5bcceSSpandan Das@@ -160,13 +239,25 @@ public class AttributeContainer { 282*77e5bcceSSpandan Das * @return {@code this} object. 283*77e5bcceSSpandan Das */ 284*77e5bcceSSpandan Das public void addAttribute(String name, Object value) { 285*77e5bcceSSpandan Das+ addAttribute(null,name,value); 286*77e5bcceSSpandan Das+ } 287*77e5bcceSSpandan Das+ 288*77e5bcceSSpandan Das+ /** 289*77e5bcceSSpandan Das+ * Adds a attribute (parameter) to the object. 290*77e5bcceSSpandan Das+ * 291*77e5bcceSSpandan Das+ * @param namespace The namespace of the attribute 292*77e5bcceSSpandan Das+ * @param name The name of the attribute 293*77e5bcceSSpandan Das+ * @param value the value of the attribute 294*77e5bcceSSpandan Das+ * @return {@code this} object. 295*77e5bcceSSpandan Das+ */ 296*77e5bcceSSpandan Das+ public void addAttribute(String namespace,String name, Object value) { 297*77e5bcceSSpandan Das AttributeInfo attributeInfo = new AttributeInfo(); 298*77e5bcceSSpandan Das attributeInfo.name = name; 299*77e5bcceSSpandan Das+ attributeInfo.namespace = namespace; 300*77e5bcceSSpandan Das attributeInfo.type = value == null ? PropertyInfo.OBJECT_CLASS : value.getClass(); 301*77e5bcceSSpandan Das attributeInfo.value = value; 302*77e5bcceSSpandan Das addAttribute(attributeInfo); 303*77e5bcceSSpandan Das } 304*77e5bcceSSpandan Das- 305*77e5bcceSSpandan Das /** 306*77e5bcceSSpandan Das * Add an attribute if the value is not null. 307*77e5bcceSSpandan Das * @param name 308*77e5bcceSSpandan Das@@ -178,6 +269,18 @@ public class AttributeContainer { 309*77e5bcceSSpandan Das } 310*77e5bcceSSpandan Das } 311*77e5bcceSSpandan Das 312*77e5bcceSSpandan Das+ /** 313*77e5bcceSSpandan Das+ * Add an attribute if the value is not null. 314*77e5bcceSSpandan Das+ * @param namespace The namespace of the attribute 315*77e5bcceSSpandan Das+ * @param name 316*77e5bcceSSpandan Das+ * @param value 317*77e5bcceSSpandan Das+ */ 318*77e5bcceSSpandan Das+ public void addAttributeIfValue(String namespace,String name, Object value) { 319*77e5bcceSSpandan Das+ if (value != null) { 320*77e5bcceSSpandan Das+ addAttribute(namespace,name, value); 321*77e5bcceSSpandan Das+ } 322*77e5bcceSSpandan Das+ } 323*77e5bcceSSpandan Das+ 324*77e5bcceSSpandan Das /** 325*77e5bcceSSpandan Das * Add a new attribute by providing an {@link AttributeInfo} object. {@code AttributeInfo} 326*77e5bcceSSpandan Das * contains all data about the attribute, including name and value.} 327*77e5bcceSSpandan Das@@ -198,4 +301,17 @@ public class AttributeContainer { 328*77e5bcceSSpandan Das attributes.addElement(attributeInfo); 329*77e5bcceSSpandan Das } 330*77e5bcceSSpandan Das } 331*77e5bcceSSpandan Das+ 332*77e5bcceSSpandan Das+ 333*77e5bcceSSpandan Das+ public void setAttribute(AttributeInfo info) { 334*77e5bcceSSpandan Das+ 335*77e5bcceSSpandan Das+ 336*77e5bcceSSpandan Das+ } 337*77e5bcceSSpandan Das+ 338*77e5bcceSSpandan Das+ 339*77e5bcceSSpandan Das+ public void getAttribute(int index, AttributeInfo info) { 340*77e5bcceSSpandan Das+ 341*77e5bcceSSpandan Das+ 342*77e5bcceSSpandan Das+ } 343*77e5bcceSSpandan Das+ 344*77e5bcceSSpandan Das } 345*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/DM.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/DM.java 346*77e5bcceSSpandan Dasindex 78d4449..255126e 100644 347*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/DM.java 348*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/DM.java 349*77e5bcceSSpandan Das@@ -20,9 +20,12 @@ 350*77e5bcceSSpandan Das 351*77e5bcceSSpandan Das package org.ksoap2.serialization; 352*77e5bcceSSpandan Das 353*77e5bcceSSpandan Das-import java.io.*; 354*77e5bcceSSpandan Das-import org.xmlpull.v1.*; 355*77e5bcceSSpandan Das-import org.ksoap2.*; 356*77e5bcceSSpandan Das+import java.io.IOException; 357*77e5bcceSSpandan Das+ 358*77e5bcceSSpandan Das+import org.ksoap2.SoapEnvelope; 359*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlPullParser; 360*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlPullParserException; 361*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlSerializer; 362*77e5bcceSSpandan Das 363*77e5bcceSSpandan Das /** 364*77e5bcceSSpandan Das * This class is not public, so save a few bytes by using a short class name (DM 365*77e5bcceSSpandan Das@@ -30,8 +33,7 @@ import org.ksoap2.*; 366*77e5bcceSSpandan Das */ 367*77e5bcceSSpandan Das class DM implements Marshal { 368*77e5bcceSSpandan Das 369*77e5bcceSSpandan Das- public Object readInstance(XmlPullParser parser, String namespace, String name, 370*77e5bcceSSpandan Das- PropertyInfo expected) 371*77e5bcceSSpandan Das+ public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo excepted) 372*77e5bcceSSpandan Das throws IOException, XmlPullParserException { 373*77e5bcceSSpandan Das String text = parser.nextText(); 374*77e5bcceSSpandan Das switch (name.charAt(0)) { 375*77e5bcceSSpandan Das@@ -49,9 +51,10 @@ class DM implements Marshal { 376*77e5bcceSSpandan Das } 377*77e5bcceSSpandan Das 378*77e5bcceSSpandan Das /** 379*77e5bcceSSpandan Das- * Write the instance out. In case it is an AttributeContainer write those our first though. 380*77e5bcceSSpandan Das- * @param writer 381*77e5bcceSSpandan Das- * the xml serializer. 382*77e5bcceSSpandan Das+ * Write the instance out. In case it is an AttributeContainer write those our first though. 383*77e5bcceSSpandan Das+ * If it HasAttributes then write the attributes and values. 384*77e5bcceSSpandan Das+ * 385*77e5bcceSSpandan Das+ * @param writer the xml serializer. 386*77e5bcceSSpandan Das * @param instance 387*77e5bcceSSpandan Das * @throws IOException 388*77e5bcceSSpandan Das */ 389*77e5bcceSSpandan Das@@ -62,11 +65,43 @@ class DM implements Marshal { 390*77e5bcceSSpandan Das for (int counter = 0; counter < cnt; counter++) { 391*77e5bcceSSpandan Das AttributeInfo attributeInfo = new AttributeInfo(); 392*77e5bcceSSpandan Das attributeContainer.getAttributeInfo(counter, attributeInfo); 393*77e5bcceSSpandan Das- writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(), 394*77e5bcceSSpandan Das- attributeInfo.getValue().toString()); 395*77e5bcceSSpandan Das+ try { 396*77e5bcceSSpandan Das+ attributeContainer.getAttribute(counter, attributeInfo); 397*77e5bcceSSpandan Das+ } catch (Exception e) { 398*77e5bcceSSpandan Das+ e.printStackTrace(); 399*77e5bcceSSpandan Das+ } 400*77e5bcceSSpandan Das+ if (attributeInfo.getValue() != null) { 401*77e5bcceSSpandan Das+ writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(), 402*77e5bcceSSpandan Das+ (attributeInfo.getValue() != null) ? attributeInfo.getValue().toString() : ""); 403*77e5bcceSSpandan Das+ } 404*77e5bcceSSpandan Das+ } 405*77e5bcceSSpandan Das+ } else if (instance instanceof HasAttributes) { 406*77e5bcceSSpandan Das+ HasAttributes soapObject = (HasAttributes) instance; 407*77e5bcceSSpandan Das+ int cnt = soapObject.getAttributeCount(); 408*77e5bcceSSpandan Das+ for (int counter = 0; counter < cnt; counter++) { 409*77e5bcceSSpandan Das+ AttributeInfo attributeInfo = new AttributeInfo(); 410*77e5bcceSSpandan Das+ soapObject.getAttributeInfo(counter, attributeInfo); 411*77e5bcceSSpandan Das+ try { 412*77e5bcceSSpandan Das+ soapObject.getAttribute(counter, attributeInfo); 413*77e5bcceSSpandan Das+ } catch (Exception e) { 414*77e5bcceSSpandan Das+ e.printStackTrace(); 415*77e5bcceSSpandan Das+ } 416*77e5bcceSSpandan Das+ if (attributeInfo.getValue() != null) { 417*77e5bcceSSpandan Das+ writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(), 418*77e5bcceSSpandan Das+ attributeInfo.getValue() != null ? attributeInfo.getValue().toString() : ""); 419*77e5bcceSSpandan Das+ } 420*77e5bcceSSpandan Das } 421*77e5bcceSSpandan Das } 422*77e5bcceSSpandan Das- writer.text(instance.toString()); 423*77e5bcceSSpandan Das+ 424*77e5bcceSSpandan Das+ if(instance instanceof ValueWriter) 425*77e5bcceSSpandan Das+ { 426*77e5bcceSSpandan Das+ ((ValueWriter)instance).write(writer); 427*77e5bcceSSpandan Das+ } 428*77e5bcceSSpandan Das+ else 429*77e5bcceSSpandan Das+ { 430*77e5bcceSSpandan Das+ writer.text(instance.toString()); 431*77e5bcceSSpandan Das+ } 432*77e5bcceSSpandan Das+ 433*77e5bcceSSpandan Das } 434*77e5bcceSSpandan Das 435*77e5bcceSSpandan Das public void register(SoapSerializationEnvelope cm) { 436*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/HasAttributes.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/HasAttributes.java 437*77e5bcceSSpandan Dasnew file mode 100644 438*77e5bcceSSpandan Dasindex 0000000..b513138 439*77e5bcceSSpandan Das--- /dev/null 440*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/HasAttributes.java 441*77e5bcceSSpandan Das@@ -0,0 +1,16 @@ 442*77e5bcceSSpandan Das+package org.ksoap2.serialization; 443*77e5bcceSSpandan Das+ 444*77e5bcceSSpandan Das+/** 445*77e5bcceSSpandan Das+ * Common inteface for classes which want to serialize attributes to outgoing soap message 446*77e5bcceSSpandan Das+ * 447*77e5bcceSSpandan Das+ * @author robocik 448*77e5bcceSSpandan Das+ */ 449*77e5bcceSSpandan Das+public interface HasAttributes { 450*77e5bcceSSpandan Das+ int getAttributeCount(); 451*77e5bcceSSpandan Das+ 452*77e5bcceSSpandan Das+ void getAttributeInfo(int index, AttributeInfo info); 453*77e5bcceSSpandan Das+ 454*77e5bcceSSpandan Das+ void getAttribute(int index, AttributeInfo info); 455*77e5bcceSSpandan Das+ 456*77e5bcceSSpandan Das+ void setAttribute(AttributeInfo info); 457*77e5bcceSSpandan Das+} 458*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/HasInnerText.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/HasInnerText.java 459*77e5bcceSSpandan Dasnew file mode 100644 460*77e5bcceSSpandan Dasindex 0000000..b35c35b 461*77e5bcceSSpandan Das--- /dev/null 462*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/HasInnerText.java 463*77e5bcceSSpandan Das@@ -0,0 +1,17 @@ 464*77e5bcceSSpandan Das+package org.ksoap2.serialization; 465*77e5bcceSSpandan Das+/** 466*77e5bcceSSpandan Das+ * Interface for classes requiring inner text of xml tags 467*77e5bcceSSpandan Das+ * 468*77e5bcceSSpandan Das+ * @author satansly 469*77e5bcceSSpandan Das+ */ 470*77e5bcceSSpandan Das+public interface HasInnerText { 471*77e5bcceSSpandan Das+ /** 472*77e5bcceSSpandan Das+ * Gets the inner text of xml tags 473*77e5bcceSSpandan Das+ */ 474*77e5bcceSSpandan Das+ Object getInnerText(); 475*77e5bcceSSpandan Das+ 476*77e5bcceSSpandan Das+ /** 477*77e5bcceSSpandan Das+ * @param s String to be set as inner text for an outgoing soap object 478*77e5bcceSSpandan Das+ */ 479*77e5bcceSSpandan Das+ void setInnerText(Object s); 480*77e5bcceSSpandan Das+} 481*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/KvmSerializable.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/KvmSerializable.java 482*77e5bcceSSpandan Dasindex bded0c0..09d7b32 100644 483*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/KvmSerializable.java 484*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/KvmSerializable.java 485*77e5bcceSSpandan Das@@ -39,31 +39,26 @@ public interface KvmSerializable { 486*77e5bcceSSpandan Das */ 487*77e5bcceSSpandan Das Object getProperty(int index); 488*77e5bcceSSpandan Das 489*77e5bcceSSpandan Das- /** 490*77e5bcceSSpandan Das- * @return the number of serializable properties 491*77e5bcceSSpandan Das+ /** 492*77e5bcceSSpandan Das+ * @return the number of serializable properties 493*77e5bcceSSpandan Das */ 494*77e5bcceSSpandan Das int getPropertyCount(); 495*77e5bcceSSpandan Das 496*77e5bcceSSpandan Das /** 497*77e5bcceSSpandan Das * Sets the property with the given index to the given value. 498*77e5bcceSSpandan Das- * 499*77e5bcceSSpandan Das- * @param index 500*77e5bcceSSpandan Das- * the index to be set 501*77e5bcceSSpandan Das- * @param value 502*77e5bcceSSpandan Das- * the value of the property 503*77e5bcceSSpandan Das+ * 504*77e5bcceSSpandan Das+ * @param index the index to be set 505*77e5bcceSSpandan Das+ * @param value the value of the property 506*77e5bcceSSpandan Das */ 507*77e5bcceSSpandan Das void setProperty(int index, Object value); 508*77e5bcceSSpandan Das 509*77e5bcceSSpandan Das /** 510*77e5bcceSSpandan Das * Fills the given property info record. 511*77e5bcceSSpandan Das- * 512*77e5bcceSSpandan Das- * @param index 513*77e5bcceSSpandan Das- * the index to be queried 514*77e5bcceSSpandan Das- * @param properties 515*77e5bcceSSpandan Das- * information about the (de)serializer. Not frequently used. 516*77e5bcceSSpandan Das- * @param info 517*77e5bcceSSpandan Das- * The return parameter, to be filled with information about the 518*77e5bcceSSpandan Das- * property with the given index. 519*77e5bcceSSpandan Das+ * 520*77e5bcceSSpandan Das+ * @param index the index to be queried 521*77e5bcceSSpandan Das+ * @param properties information about the (de)serializer. Not frequently used. 522*77e5bcceSSpandan Das+ * @param info The return parameter, to be filled with information about the 523*77e5bcceSSpandan Das+ * property with the given index. 524*77e5bcceSSpandan Das */ 525*77e5bcceSSpandan Das void getPropertyInfo(int index, Hashtable properties, PropertyInfo info); 526*77e5bcceSSpandan Das 527*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/Marshal.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/Marshal.java 528*77e5bcceSSpandan Dasindex cfa9d81..100f107 100644 529*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/Marshal.java 530*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/Marshal.java 531*77e5bcceSSpandan Das@@ -41,8 +41,7 @@ public interface Marshal { 532*77e5bcceSSpandan Das * the namespace. 533*77e5bcceSSpandan Das * @return the object read from the xml stream. 534*77e5bcceSSpandan Das */ 535*77e5bcceSSpandan Das- public Object readInstance(XmlPullParser parser, String namespace, String name, 536*77e5bcceSSpandan Das- PropertyInfo expected) 537*77e5bcceSSpandan Das+ public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected) 538*77e5bcceSSpandan Das throws IOException, XmlPullParserException; 539*77e5bcceSSpandan Das 540*77e5bcceSSpandan Das /** 541*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalBase64.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalBase64.java 542*77e5bcceSSpandan Dasindex 2f8420c..2239027 100644 543*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalBase64.java 544*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalBase64.java 545*77e5bcceSSpandan Das@@ -31,8 +31,7 @@ import org.xmlpull.v1.*; 546*77e5bcceSSpandan Das public class MarshalBase64 implements Marshal { 547*77e5bcceSSpandan Das public static Class BYTE_ARRAY_CLASS = new byte[0].getClass(); 548*77e5bcceSSpandan Das 549*77e5bcceSSpandan Das- public Object readInstance(XmlPullParser parser, String namespace, String name, 550*77e5bcceSSpandan Das- PropertyInfo expected) 551*77e5bcceSSpandan Das+ public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected) 552*77e5bcceSSpandan Das throws IOException, XmlPullParserException { 553*77e5bcceSSpandan Das return Base64.decode(parser.nextText()); 554*77e5bcceSSpandan Das } 555*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalDate.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalDate.java 556*77e5bcceSSpandan Dasindex 3e4fa06..489ba3b 100644 557*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalDate.java 558*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalDate.java 559*77e5bcceSSpandan Das@@ -31,8 +31,7 @@ import org.ksoap2.kobjects.isodate.*; 560*77e5bcceSSpandan Das public class MarshalDate implements Marshal { 561*77e5bcceSSpandan Das public static Class DATE_CLASS = new Date().getClass(); 562*77e5bcceSSpandan Das 563*77e5bcceSSpandan Das- public Object readInstance(XmlPullParser parser, String namespace, String name, 564*77e5bcceSSpandan Das- PropertyInfo expected) 565*77e5bcceSSpandan Das+ public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected) 566*77e5bcceSSpandan Das throws IOException, XmlPullParserException { 567*77e5bcceSSpandan Das return IsoDate.stringToDate(parser.nextText(), IsoDate.DATE_TIME); 568*77e5bcceSSpandan Das } 569*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalHashtable.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalHashtable.java 570*77e5bcceSSpandan Dasindex d2367e9..0c6b53e 100644 571*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalHashtable.java 572*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalHashtable.java 573*77e5bcceSSpandan Das@@ -46,8 +46,7 @@ public class MarshalHashtable implements Marshal { 574*77e5bcceSSpandan Das public static final Class HASHTABLE_CLASS = new Hashtable().getClass(); 575*77e5bcceSSpandan Das SoapSerializationEnvelope envelope; 576*77e5bcceSSpandan Das 577*77e5bcceSSpandan Das- public Object readInstance(XmlPullParser parser, String namespace, String name, 578*77e5bcceSSpandan Das- PropertyInfo expected) 579*77e5bcceSSpandan Das+ public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected) 580*77e5bcceSSpandan Das throws IOException, XmlPullParserException { 581*77e5bcceSSpandan Das Hashtable instance = new Hashtable(); 582*77e5bcceSSpandan Das String elementName = parser.getName(); 583*77e5bcceSSpandan Das@@ -81,7 +80,7 @@ public class MarshalHashtable implements Marshal { 584*77e5bcceSSpandan Das Object key = keys.nextElement(); 585*77e5bcceSSpandan Das item.setProperty(0, key); 586*77e5bcceSSpandan Das item.setProperty(1, h.get(key)); 587*77e5bcceSSpandan Das- envelope.writeObjectBody(writer, item); 588*77e5bcceSSpandan Das+ envelope.writeObjectBodyWithAttributes(writer, item); 589*77e5bcceSSpandan Das writer.endTag("", "item"); 590*77e5bcceSSpandan Das } 591*77e5bcceSSpandan Das } 592*77e5bcceSSpandan Das@@ -89,7 +88,6 @@ public class MarshalHashtable implements Marshal { 593*77e5bcceSSpandan Das class ItemSoapObject extends SoapObject { 594*77e5bcceSSpandan Das Hashtable h; 595*77e5bcceSSpandan Das int resolvedIndex = -1; 596*77e5bcceSSpandan Das- 597*77e5bcceSSpandan Das ItemSoapObject(Hashtable h) { 598*77e5bcceSSpandan Das super(null, null); 599*77e5bcceSSpandan Das this.h = h; 600*77e5bcceSSpandan Das@@ -107,7 +105,7 @@ public class MarshalHashtable implements Marshal { 601*77e5bcceSSpandan Das Object resolved = resolvedIndex == 0 ? getProperty(0) : getProperty(1); 602*77e5bcceSSpandan Das if (index == 0) { 603*77e5bcceSSpandan Das h.put(value, resolved); 604*77e5bcceSSpandan Das- } else { 605*77e5bcceSSpandan Das+ } else { 606*77e5bcceSSpandan Das h.put(resolved, value); 607*77e5bcceSSpandan Das } 608*77e5bcceSSpandan Das } 609*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapObject.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapObject.java 610*77e5bcceSSpandan Dasindex 24a1ffe..f11210a 100644 611*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapObject.java 612*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapObject.java 613*77e5bcceSSpandan Das@@ -38,7 +38,7 @@ import java.util.*; 614*77e5bcceSSpandan Das * KvmSerializable interface. 615*77e5bcceSSpandan Das */ 616*77e5bcceSSpandan Das 617*77e5bcceSSpandan Das-public class SoapObject extends AttributeContainer implements KvmSerializable { 618*77e5bcceSSpandan Das+public class SoapObject extends AttributeContainer implements KvmSerializable, HasInnerText { 619*77e5bcceSSpandan Das 620*77e5bcceSSpandan Das private static final String EMPTY_STRING = ""; 621*77e5bcceSSpandan Das /** 622*77e5bcceSSpandan Das@@ -54,6 +54,8 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 623*77e5bcceSSpandan Das */ 624*77e5bcceSSpandan Das protected Vector properties = new Vector(); 625*77e5bcceSSpandan Das 626*77e5bcceSSpandan Das+ protected Object innerText; 627*77e5bcceSSpandan Das+ 628*77e5bcceSSpandan Das // TODO: accessing properties and attributes would work much better if we 629*77e5bcceSSpandan Das // kept a list of known properties instead of iterating through the list 630*77e5bcceSSpandan Das // each time 631*77e5bcceSSpandan Das@@ -181,6 +183,230 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 632*77e5bcceSSpandan Das } 633*77e5bcceSSpandan Das } 634*77e5bcceSSpandan Das 635*77e5bcceSSpandan Das+ /** 636*77e5bcceSSpandan Das+ * Get the property with the given name 637*77e5bcceSSpandan Das+ * 638*77e5bcceSSpandan Das+ * return null 639*77e5bcceSSpandan Das+ * if the property does not exist 640*77e5bcceSSpandan Das+ */ 641*77e5bcceSSpandan Das+ public Object getProperty(String namespace,String name) { 642*77e5bcceSSpandan Das+ Integer index = propertyIndex(namespace,name); 643*77e5bcceSSpandan Das+ if (index != null) { 644*77e5bcceSSpandan Das+ return getProperty(index.intValue()); 645*77e5bcceSSpandan Das+ } 646*77e5bcceSSpandan Das+ else { 647*77e5bcceSSpandan Das+ throw new RuntimeException("illegal property: " + name); 648*77e5bcceSSpandan Das+ } 649*77e5bcceSSpandan Das+ } 650*77e5bcceSSpandan Das+ 651*77e5bcceSSpandan Das+ /** 652*77e5bcceSSpandan Das+ * Get a property using namespace and name without chance of throwing an exception 653*77e5bcceSSpandan Das+ * 654*77e5bcceSSpandan Das+ * @return the property if it exists; if not, {@link NullSoapObject} is 655*77e5bcceSSpandan Das+ * returned 656*77e5bcceSSpandan Das+ */ 657*77e5bcceSSpandan Das+ public Object getPropertyByNamespaceSafely(final String namespace, final String name) { 658*77e5bcceSSpandan Das+ Integer i = propertyIndex(namespace,name); 659*77e5bcceSSpandan Das+ if (i != null) { 660*77e5bcceSSpandan Das+ return getProperty(i.intValue()); 661*77e5bcceSSpandan Das+ } else { 662*77e5bcceSSpandan Das+ return new NullSoapObject(); 663*77e5bcceSSpandan Das+ } 664*77e5bcceSSpandan Das+ } 665*77e5bcceSSpandan Das+ 666*77e5bcceSSpandan Das+ /** 667*77e5bcceSSpandan Das+ * Get the toString value of a property without chance of throwing an 668*77e5bcceSSpandan Das+ * exception 669*77e5bcceSSpandan Das+ * 670*77e5bcceSSpandan Das+ * @return the string value of the property if it exists; if not, #EMPTY_STRING is 671*77e5bcceSSpandan Das+ * returned 672*77e5bcceSSpandan Das+ */ 673*77e5bcceSSpandan Das+ public String getPropertyByNamespaceSafelyAsString(final String namespace,final String name) { 674*77e5bcceSSpandan Das+ Integer i = propertyIndex(namespace,name); 675*77e5bcceSSpandan Das+ if (i != null) { 676*77e5bcceSSpandan Das+ Object foo = getProperty(i.intValue()); 677*77e5bcceSSpandan Das+ if (foo == null) { 678*77e5bcceSSpandan Das+ return EMPTY_STRING; 679*77e5bcceSSpandan Das+ } else { 680*77e5bcceSSpandan Das+ return foo.toString(); 681*77e5bcceSSpandan Das+ } 682*77e5bcceSSpandan Das+ } else { 683*77e5bcceSSpandan Das+ return EMPTY_STRING; 684*77e5bcceSSpandan Das+ } 685*77e5bcceSSpandan Das+ } 686*77e5bcceSSpandan Das+ 687*77e5bcceSSpandan Das+ /** 688*77e5bcceSSpandan Das+ * Get a property without chance of throwing an exception. An object can be 689*77e5bcceSSpandan Das+ * provided to this method; if the property is not found, this object will 690*77e5bcceSSpandan Das+ * be returned. 691*77e5bcceSSpandan Das+ * 692*77e5bcceSSpandan Das+ * @param defaultThing 693*77e5bcceSSpandan Das+ * the object to return if the property is not found 694*77e5bcceSSpandan Das+ * @return the property if it exists; defaultThing if the property does not 695*77e5bcceSSpandan Das+ * exist 696*77e5bcceSSpandan Das+ */ 697*77e5bcceSSpandan Das+ public Object getPropertySafely(final String namespace,final String name, final Object defaultThing) { 698*77e5bcceSSpandan Das+ Integer i = propertyIndex(namespace,name); 699*77e5bcceSSpandan Das+ if (i != null) { 700*77e5bcceSSpandan Das+ return getProperty(i.intValue()); 701*77e5bcceSSpandan Das+ } else { 702*77e5bcceSSpandan Das+ return defaultThing; 703*77e5bcceSSpandan Das+ } 704*77e5bcceSSpandan Das+ } 705*77e5bcceSSpandan Das+ 706*77e5bcceSSpandan Das+ /** 707*77e5bcceSSpandan Das+ * Get the toString value of a property without chance of throwing an 708*77e5bcceSSpandan Das+ * exception. An object can be provided to this method; if the property is 709*77e5bcceSSpandan Das+ * not found, this object's string representation will be returned. 710*77e5bcceSSpandan Das+ * 711*77e5bcceSSpandan Das+ * @param defaultThing 712*77e5bcceSSpandan Das+ * toString of the object to return if the property is not found 713*77e5bcceSSpandan Das+ * @return the property toString if it exists; defaultThing toString if the 714*77e5bcceSSpandan Das+ * property does not exist, if the defaultThing is null #EMPTY_STRING 715*77e5bcceSSpandan Das+ * is returned 716*77e5bcceSSpandan Das+ */ 717*77e5bcceSSpandan Das+ public String getPropertySafelyAsString(final String namespace,final String name, 718*77e5bcceSSpandan Das+ final Object defaultThing) { 719*77e5bcceSSpandan Das+ Integer i = propertyIndex(namespace,name); 720*77e5bcceSSpandan Das+ if (i != null) { 721*77e5bcceSSpandan Das+ Object property = getProperty(i.intValue()); 722*77e5bcceSSpandan Das+ if (property != null) { 723*77e5bcceSSpandan Das+ return property.toString(); 724*77e5bcceSSpandan Das+ } else { 725*77e5bcceSSpandan Das+ return EMPTY_STRING; 726*77e5bcceSSpandan Das+ } 727*77e5bcceSSpandan Das+ } else { 728*77e5bcceSSpandan Das+ if (defaultThing != null) { 729*77e5bcceSSpandan Das+ return defaultThing.toString(); 730*77e5bcceSSpandan Das+ } else { 731*77e5bcceSSpandan Das+ return EMPTY_STRING; 732*77e5bcceSSpandan Das+ } 733*77e5bcceSSpandan Das+ } 734*77e5bcceSSpandan Das+ } 735*77e5bcceSSpandan Das+ 736*77e5bcceSSpandan Das+ /** 737*77e5bcceSSpandan Das+ * Get the primitive property with the given name. 738*77e5bcceSSpandan Das+ * 739*77e5bcceSSpandan Das+ * @param name 740*77e5bcceSSpandan Das+ * @return PropertyInfo containing an empty string if property either complex or empty 741*77e5bcceSSpandan Das+ */ 742*77e5bcceSSpandan Das+ public Object getPrimitiveProperty(final String namespace,final String name){ 743*77e5bcceSSpandan Das+ Integer index = propertyIndex(namespace,name); 744*77e5bcceSSpandan Das+ if (index != null){ 745*77e5bcceSSpandan Das+ PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue()); 746*77e5bcceSSpandan Das+ if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){ 747*77e5bcceSSpandan Das+ return propertyInfo.getValue(); 748*77e5bcceSSpandan Das+ } else { 749*77e5bcceSSpandan Das+ propertyInfo = new PropertyInfo(); 750*77e5bcceSSpandan Das+ propertyInfo.setType(String.class); 751*77e5bcceSSpandan Das+ propertyInfo.setValue(EMPTY_STRING); 752*77e5bcceSSpandan Das+ propertyInfo.setName(name); 753*77e5bcceSSpandan Das+ propertyInfo.setNamespace(namespace); 754*77e5bcceSSpandan Das+ return (Object) propertyInfo.getValue(); 755*77e5bcceSSpandan Das+ } 756*77e5bcceSSpandan Das+ } else { 757*77e5bcceSSpandan Das+ throw new RuntimeException("illegal property: " + name); 758*77e5bcceSSpandan Das+ } 759*77e5bcceSSpandan Das+ } 760*77e5bcceSSpandan Das+ 761*77e5bcceSSpandan Das+ /** 762*77e5bcceSSpandan Das+ * Get the toString value of the primitive property with the given name. 763*77e5bcceSSpandan Das+ * Returns empty string if property either complex or empty 764*77e5bcceSSpandan Das+ * 765*77e5bcceSSpandan Das+ * @param name 766*77e5bcceSSpandan Das+ * @return the string value of the property 767*77e5bcceSSpandan Das+ */ 768*77e5bcceSSpandan Das+ public String getPrimitivePropertyAsString(final String namespace,final String name){ 769*77e5bcceSSpandan Das+ Integer index = propertyIndex(namespace,name); 770*77e5bcceSSpandan Das+ if (index != null){ 771*77e5bcceSSpandan Das+ PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue()); 772*77e5bcceSSpandan Das+ if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){ 773*77e5bcceSSpandan Das+ return propertyInfo.getValue().toString(); 774*77e5bcceSSpandan Das+ } else { 775*77e5bcceSSpandan Das+ return EMPTY_STRING; 776*77e5bcceSSpandan Das+ } 777*77e5bcceSSpandan Das+ } else { 778*77e5bcceSSpandan Das+ throw new RuntimeException("illegal property: " + name); 779*77e5bcceSSpandan Das+ } 780*77e5bcceSSpandan Das+ } 781*77e5bcceSSpandan Das+ 782*77e5bcceSSpandan Das+ /** 783*77e5bcceSSpandan Das+ * Get the toString value of a primitive property without chance of throwing an 784*77e5bcceSSpandan Das+ * exception 785*77e5bcceSSpandan Das+ * 786*77e5bcceSSpandan Das+ * @param name 787*77e5bcceSSpandan Das+ * @return the string value of the property if it exists and is primitive; if not, #EMPTY_STRING is 788*77e5bcceSSpandan Das+ * returned 789*77e5bcceSSpandan Das+ */ 790*77e5bcceSSpandan Das+ public Object getPrimitivePropertySafely(final String namespace,final String name) { 791*77e5bcceSSpandan Das+ Integer index = propertyIndex(namespace,name); 792*77e5bcceSSpandan Das+ if (index != null){ 793*77e5bcceSSpandan Das+ PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue()); 794*77e5bcceSSpandan Das+ if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){ 795*77e5bcceSSpandan Das+ return propertyInfo.getValue().toString(); 796*77e5bcceSSpandan Das+ } else { 797*77e5bcceSSpandan Das+ propertyInfo = new PropertyInfo(); 798*77e5bcceSSpandan Das+ propertyInfo.setType(String.class); 799*77e5bcceSSpandan Das+ propertyInfo.setValue(EMPTY_STRING); 800*77e5bcceSSpandan Das+ propertyInfo.setName(name); 801*77e5bcceSSpandan Das+ propertyInfo.setNamespace(namespace); 802*77e5bcceSSpandan Das+ return (Object) propertyInfo.getValue(); 803*77e5bcceSSpandan Das+ } 804*77e5bcceSSpandan Das+ } else { 805*77e5bcceSSpandan Das+ return new NullSoapObject(); 806*77e5bcceSSpandan Das+ } 807*77e5bcceSSpandan Das+ } 808*77e5bcceSSpandan Das+ 809*77e5bcceSSpandan Das+ /** 810*77e5bcceSSpandan Das+ * Get the toString value of a primitive property without chance of throwing an 811*77e5bcceSSpandan Das+ * exception 812*77e5bcceSSpandan Das+ * 813*77e5bcceSSpandan Das+ * @param name 814*77e5bcceSSpandan Das+ * @return the string value of the property if it exists and is primitive; if not, #EMPTY_STRING is 815*77e5bcceSSpandan Das+ * returned 816*77e5bcceSSpandan Das+ */ 817*77e5bcceSSpandan Das+ public String getPrimitivePropertySafelyAsString(final String namespace,final String name) { 818*77e5bcceSSpandan Das+ Integer index = propertyIndex(namespace,name); 819*77e5bcceSSpandan Das+ if (index != null){ 820*77e5bcceSSpandan Das+ PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue()); 821*77e5bcceSSpandan Das+ if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){ 822*77e5bcceSSpandan Das+ return propertyInfo.getValue().toString(); 823*77e5bcceSSpandan Das+ } else { 824*77e5bcceSSpandan Das+ return EMPTY_STRING; 825*77e5bcceSSpandan Das+ } 826*77e5bcceSSpandan Das+ } else { 827*77e5bcceSSpandan Das+ return EMPTY_STRING; 828*77e5bcceSSpandan Das+ } 829*77e5bcceSSpandan Das+ } 830*77e5bcceSSpandan Das+ 831*77e5bcceSSpandan Das+ /** 832*77e5bcceSSpandan Das+ * Knows whether the given property exists 833*77e5bcceSSpandan Das+ */ 834*77e5bcceSSpandan Das+ public boolean hasProperty(final String namespace,final String name) { 835*77e5bcceSSpandan Das+ if (propertyIndex(namespace,name) != null) { 836*77e5bcceSSpandan Das+ return true; 837*77e5bcceSSpandan Das+ } else { 838*77e5bcceSSpandan Das+ return false; 839*77e5bcceSSpandan Das+ } 840*77e5bcceSSpandan Das+ } 841*77e5bcceSSpandan Das+ 842*77e5bcceSSpandan Das+ /** 843*77e5bcceSSpandan Das+ * Get the toString value of the property. 844*77e5bcceSSpandan Das+ * 845*77e5bcceSSpandan Das+ * @param namespace 846*77e5bcceSSpandan Das+ * @param name 847*77e5bcceSSpandan Das+ * @return 848*77e5bcceSSpandan Das+ */ 849*77e5bcceSSpandan Das+ 850*77e5bcceSSpandan Das+ public String getPropertyAsString(String namespace,String name) { 851*77e5bcceSSpandan Das+ Integer index = propertyIndex(namespace,name); 852*77e5bcceSSpandan Das+ if (index != null) { 853*77e5bcceSSpandan Das+ return getProperty(index.intValue()).toString(); 854*77e5bcceSSpandan Das+ } else { 855*77e5bcceSSpandan Das+ throw new RuntimeException("illegal property: " + name); 856*77e5bcceSSpandan Das+ } 857*77e5bcceSSpandan Das+ } 858*77e5bcceSSpandan Das+ 859*77e5bcceSSpandan Das /** 860*77e5bcceSSpandan Das * Get the toString value of the property. 861*77e5bcceSSpandan Das * 862*77e5bcceSSpandan Das@@ -301,9 +527,9 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 863*77e5bcceSSpandan Das */ 864*77e5bcceSSpandan Das public Object getPrimitiveProperty(final String name) { 865*77e5bcceSSpandan Das Integer index = propertyIndex(name); 866*77e5bcceSSpandan Das- if (index != null) { 867*77e5bcceSSpandan Das+ if (index != null){ 868*77e5bcceSSpandan Das PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue()); 869*77e5bcceSSpandan Das- if (propertyInfo.getType() != SoapObject.class) { 870*77e5bcceSSpandan Das+ if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){ 871*77e5bcceSSpandan Das return propertyInfo.getValue(); 872*77e5bcceSSpandan Das } else { 873*77e5bcceSSpandan Das propertyInfo = new PropertyInfo(); 874*77e5bcceSSpandan Das@@ -326,9 +552,9 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 875*77e5bcceSSpandan Das */ 876*77e5bcceSSpandan Das public String getPrimitivePropertyAsString(final String name) { 877*77e5bcceSSpandan Das Integer index = propertyIndex(name); 878*77e5bcceSSpandan Das- if (index != null) { 879*77e5bcceSSpandan Das+ if (index != null){ 880*77e5bcceSSpandan Das PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue()); 881*77e5bcceSSpandan Das- if (propertyInfo.getType() != SoapObject.class) { 882*77e5bcceSSpandan Das+ if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){ 883*77e5bcceSSpandan Das return propertyInfo.getValue().toString(); 884*77e5bcceSSpandan Das } else { 885*77e5bcceSSpandan Das return EMPTY_STRING; 886*77e5bcceSSpandan Das@@ -348,9 +574,9 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 887*77e5bcceSSpandan Das */ 888*77e5bcceSSpandan Das public Object getPrimitivePropertySafely(final String name) { 889*77e5bcceSSpandan Das Integer index = propertyIndex(name); 890*77e5bcceSSpandan Das- if (index != null) { 891*77e5bcceSSpandan Das+ if (index != null){ 892*77e5bcceSSpandan Das PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue()); 893*77e5bcceSSpandan Das- if (propertyInfo.getType() != SoapObject.class) { 894*77e5bcceSSpandan Das+ if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){ 895*77e5bcceSSpandan Das return propertyInfo.getValue().toString(); 896*77e5bcceSSpandan Das } else { 897*77e5bcceSSpandan Das propertyInfo = new PropertyInfo(); 898*77e5bcceSSpandan Das@@ -374,9 +600,9 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 899*77e5bcceSSpandan Das */ 900*77e5bcceSSpandan Das public String getPrimitivePropertySafelyAsString(final String name) { 901*77e5bcceSSpandan Das Integer index = propertyIndex(name); 902*77e5bcceSSpandan Das- if (index != null) { 903*77e5bcceSSpandan Das+ if (index != null){ 904*77e5bcceSSpandan Das PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue()); 905*77e5bcceSSpandan Das- if (propertyInfo.getType() != SoapObject.class) { 906*77e5bcceSSpandan Das+ if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){ 907*77e5bcceSSpandan Das return propertyInfo.getValue().toString(); 908*77e5bcceSSpandan Das } else { 909*77e5bcceSSpandan Das return EMPTY_STRING; 910*77e5bcceSSpandan Das@@ -397,6 +623,18 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 911*77e5bcceSSpandan Das return null; 912*77e5bcceSSpandan Das } 913*77e5bcceSSpandan Das 914*77e5bcceSSpandan Das+ 915*77e5bcceSSpandan Das+ private Integer propertyIndex(String namespace,String name) { 916*77e5bcceSSpandan Das+ if (name != null && namespace!=null) { 917*77e5bcceSSpandan Das+ for (int i = 0; i < properties.size(); i++) { 918*77e5bcceSSpandan Das+ PropertyInfo info= (PropertyInfo) properties.elementAt(i); 919*77e5bcceSSpandan Das+ if (name.equals(info.getName()) && namespace.equals(info.getNamespace())) { 920*77e5bcceSSpandan Das+ return new Integer(i); 921*77e5bcceSSpandan Das+ } 922*77e5bcceSSpandan Das+ } 923*77e5bcceSSpandan Das+ } 924*77e5bcceSSpandan Das+ return null; 925*77e5bcceSSpandan Das+ } 926*77e5bcceSSpandan Das /** 927*77e5bcceSSpandan Das * Returns the number of properties 928*77e5bcceSSpandan Das * 929*77e5bcceSSpandan Das@@ -453,6 +691,17 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 930*77e5bcceSSpandan Das } 931*77e5bcceSSpandan Das } 932*77e5bcceSSpandan Das 933*77e5bcceSSpandan Das+ public PropertyInfo getPropertyInfo(int index) { 934*77e5bcceSSpandan Das+ Object element = properties.elementAt(index); 935*77e5bcceSSpandan Das+ if (element instanceof PropertyInfo) { 936*77e5bcceSSpandan Das+ PropertyInfo p = (PropertyInfo) element; 937*77e5bcceSSpandan Das+ return p; 938*77e5bcceSSpandan Das+ } else { 939*77e5bcceSSpandan Das+ // SoapObject 940*77e5bcceSSpandan Das+ return null; 941*77e5bcceSSpandan Das+ } 942*77e5bcceSSpandan Das+ } 943*77e5bcceSSpandan Das+ 944*77e5bcceSSpandan Das /** 945*77e5bcceSSpandan Das * Creates a new SoapObject based on this, allows usage of SoapObjects as 946*77e5bcceSSpandan Das * templates. One application is to set the expected return type of a soap 947*77e5bcceSSpandan Das@@ -466,17 +715,17 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 948*77e5bcceSSpandan Das Object prop = properties.elementAt(propIndex); 949*77e5bcceSSpandan Das if (prop instanceof PropertyInfo) { 950*77e5bcceSSpandan Das PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(propIndex); 951*77e5bcceSSpandan Das- PropertyInfo propertyInfoClonned = (PropertyInfo) propertyInfo.clone(); 952*77e5bcceSSpandan Das- o.addProperty(propertyInfoClonned); 953*77e5bcceSSpandan Das- } else if (prop instanceof SoapObject) { 954*77e5bcceSSpandan Das- o.addSoapObject(((SoapObject) prop).newInstance()); 955*77e5bcceSSpandan Das+ PropertyInfo propertyInfoClonned = (PropertyInfo)propertyInfo.clone(); 956*77e5bcceSSpandan Das+ o.addProperty( propertyInfoClonned ); 957*77e5bcceSSpandan Das+ } else if(prop instanceof SoapObject) { 958*77e5bcceSSpandan Das+ o.addSoapObject(((SoapObject)prop).newInstance()); 959*77e5bcceSSpandan Das } 960*77e5bcceSSpandan Das } 961*77e5bcceSSpandan Das for (int attribIndex = 0; attribIndex < getAttributeCount(); attribIndex++) { 962*77e5bcceSSpandan Das AttributeInfo newAI = new AttributeInfo(); 963*77e5bcceSSpandan Das getAttributeInfo(attribIndex, newAI); 964*77e5bcceSSpandan Das AttributeInfo attributeInfo = newAI; // (AttributeInfo) 965*77e5bcceSSpandan Das- // attributes.elementAt(attribIndex); 966*77e5bcceSSpandan Das+ // attributes.elementAt(attribIndex); 967*77e5bcceSSpandan Das o.addAttribute(attributeInfo); 968*77e5bcceSSpandan Das } 969*77e5bcceSSpandan Das return o; 970*77e5bcceSSpandan Das@@ -513,11 +762,49 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 971*77e5bcceSSpandan Das propertyInfo.type = value == null ? PropertyInfo.OBJECT_CLASS : value 972*77e5bcceSSpandan Das .getClass(); 973*77e5bcceSSpandan Das propertyInfo.value = value; 974*77e5bcceSSpandan Das+ return addProperty(propertyInfo); 975*77e5bcceSSpandan Das+ } 976*77e5bcceSSpandan Das+ 977*77e5bcceSSpandan Das+ /** 978*77e5bcceSSpandan Das+ * Adds a property (parameter) to the object. This is essentially a sub 979*77e5bcceSSpandan Das+ * element. 980*77e5bcceSSpandan Das+ * 981*77e5bcceSSpandan Das+ * @param namespace 982*77e5bcceSSpandan Das+ * The namespace of the property 983*77e5bcceSSpandan Das+ * @param name 984*77e5bcceSSpandan Das+ * The name of the property 985*77e5bcceSSpandan Das+ * @param value 986*77e5bcceSSpandan Das+ * the value of the property 987*77e5bcceSSpandan Das+ */ 988*77e5bcceSSpandan Das+ public SoapObject addProperty(String namespace,String name, Object value) { 989*77e5bcceSSpandan Das+ PropertyInfo propertyInfo = new PropertyInfo(); 990*77e5bcceSSpandan Das+ propertyInfo.name = name; 991*77e5bcceSSpandan Das propertyInfo.namespace = namespace; 992*77e5bcceSSpandan Das- ///M: HS20 modify by Jungo 993*77e5bcceSSpandan Das+ propertyInfo.type = value == null ? PropertyInfo.OBJECT_CLASS : value 994*77e5bcceSSpandan Das+ .getClass(); 995*77e5bcceSSpandan Das+ propertyInfo.value = value; 996*77e5bcceSSpandan Das return addProperty(propertyInfo); 997*77e5bcceSSpandan Das } 998*77e5bcceSSpandan Das 999*77e5bcceSSpandan Das+ /** 1000*77e5bcceSSpandan Das+ * Add a property only if the value is not null. 1001*77e5bcceSSpandan Das+ * 1002*77e5bcceSSpandan Das+ * @param namespace 1003*77e5bcceSSpandan Das+ * The namespace of the property 1004*77e5bcceSSpandan Das+ * @param name 1005*77e5bcceSSpandan Das+ * The name of the property 1006*77e5bcceSSpandan Das+ * @param value 1007*77e5bcceSSpandan Das+ * the value of the property 1008*77e5bcceSSpandan Das+ * @return 1009*77e5bcceSSpandan Das+ */ 1010*77e5bcceSSpandan Das+ public SoapObject addPropertyIfValue(String namespace,String name, Object value) { 1011*77e5bcceSSpandan Das+ if (value != null) { 1012*77e5bcceSSpandan Das+ return addProperty(namespace,name, value); 1013*77e5bcceSSpandan Das+ } else { 1014*77e5bcceSSpandan Das+ return this; 1015*77e5bcceSSpandan Das+ } 1016*77e5bcceSSpandan Das+ } 1017*77e5bcceSSpandan Das+ 1018*77e5bcceSSpandan Das /** 1019*77e5bcceSSpandan Das * Add a property only if the value is not null. 1020*77e5bcceSSpandan Das * 1021*77e5bcceSSpandan Das@@ -597,12 +884,12 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 1022*77e5bcceSSpandan Das StringBuffer buf = new StringBuffer(EMPTY_STRING + name + "{"); 1023*77e5bcceSSpandan Das for (int i = 0; i < getPropertyCount(); i++) { 1024*77e5bcceSSpandan Das Object prop = properties.elementAt(i); 1025*77e5bcceSSpandan Das- if (prop instanceof PropertyInfo) { 1026*77e5bcceSSpandan Das+ if(prop instanceof PropertyInfo) { 1027*77e5bcceSSpandan Das buf.append(EMPTY_STRING) 1028*77e5bcceSSpandan Das- .append(((PropertyInfo) prop).getName()) 1029*77e5bcceSSpandan Das- .append("=") 1030*77e5bcceSSpandan Das- .append(getProperty(i)) 1031*77e5bcceSSpandan Das- .append("; "); 1032*77e5bcceSSpandan Das+ .append(((PropertyInfo) prop).getName()) 1033*77e5bcceSSpandan Das+ .append("=") 1034*77e5bcceSSpandan Das+ .append(getProperty(i)) 1035*77e5bcceSSpandan Das+ .append("; "); 1036*77e5bcceSSpandan Das } else { 1037*77e5bcceSSpandan Das buf.append(((SoapObject) prop).toString()); 1038*77e5bcceSSpandan Das } 1039*77e5bcceSSpandan Das@@ -610,4 +897,17 @@ public class SoapObject extends AttributeContainer implements KvmSerializable { 1040*77e5bcceSSpandan Das buf.append("}"); 1041*77e5bcceSSpandan Das return buf.toString(); 1042*77e5bcceSSpandan Das } 1043*77e5bcceSSpandan Das+ public Object getInnerText() { 1044*77e5bcceSSpandan Das+ return innerText; 1045*77e5bcceSSpandan Das+ } 1046*77e5bcceSSpandan Das+ 1047*77e5bcceSSpandan Das+ public void setInnerText(Object innerText) 1048*77e5bcceSSpandan Das+ { 1049*77e5bcceSSpandan Das+ this.innerText=innerText; 1050*77e5bcceSSpandan Das+ } 1051*77e5bcceSSpandan Das+ 1052*77e5bcceSSpandan Das+ public void removePropertyInfo(Object info) 1053*77e5bcceSSpandan Das+ { 1054*77e5bcceSSpandan Das+ properties.remove(info); 1055*77e5bcceSSpandan Das+ } 1056*77e5bcceSSpandan Das } 1057*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapPrimitive.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapPrimitive.java 1058*77e5bcceSSpandan Dasindex d09f7a7..32fe333 100644 1059*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapPrimitive.java 1060*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapPrimitive.java 1061*77e5bcceSSpandan Das@@ -34,11 +34,14 @@ package org.ksoap2.serialization; 1062*77e5bcceSSpandan Das */ 1063*77e5bcceSSpandan Das 1064*77e5bcceSSpandan Das public class SoapPrimitive extends AttributeContainer { 1065*77e5bcceSSpandan Das- String namespace; 1066*77e5bcceSSpandan Das- String name; 1067*77e5bcceSSpandan Das- String value; 1068*77e5bcceSSpandan Das+ protected String namespace; 1069*77e5bcceSSpandan Das+ protected String name; 1070*77e5bcceSSpandan Das+ protected Object value; 1071*77e5bcceSSpandan Das 1072*77e5bcceSSpandan Das- public SoapPrimitive(String namespace, String name, String value) { 1073*77e5bcceSSpandan Das+ public static final Object NullSkip = new Object(); 1074*77e5bcceSSpandan Das+ public static final Object NullNilElement = new Object(); 1075*77e5bcceSSpandan Das+ 1076*77e5bcceSSpandan Das+ public SoapPrimitive(String namespace, String name, Object value) { 1077*77e5bcceSSpandan Das this.namespace = namespace; 1078*77e5bcceSSpandan Das this.name = name; 1079*77e5bcceSSpandan Das this.value = value; 1080*77e5bcceSSpandan Das@@ -50,7 +53,7 @@ public class SoapPrimitive extends AttributeContainer { 1081*77e5bcceSSpandan Das } 1082*77e5bcceSSpandan Das SoapPrimitive p = (SoapPrimitive) o; 1083*77e5bcceSSpandan Das boolean varsEqual = name.equals(p.name) 1084*77e5bcceSSpandan Das- && (namespace == null ? p.namespace == null : namespace.equals(p.namespace)) 1085*77e5bcceSSpandan Das+ && (namespace == null ? p.namespace == null:namespace.equals(p.namespace)) 1086*77e5bcceSSpandan Das && (value == null ? (p.value == null) : value.equals(p.value)); 1087*77e5bcceSSpandan Das return varsEqual && attributesAreEqual(p); 1088*77e5bcceSSpandan Das } 1089*77e5bcceSSpandan Das@@ -60,7 +63,7 @@ public class SoapPrimitive extends AttributeContainer { 1090*77e5bcceSSpandan Das } 1091*77e5bcceSSpandan Das 1092*77e5bcceSSpandan Das public String toString() { 1093*77e5bcceSSpandan Das- return value; 1094*77e5bcceSSpandan Das+ return value != null ? value.toString() : null; 1095*77e5bcceSSpandan Das } 1096*77e5bcceSSpandan Das 1097*77e5bcceSSpandan Das public String getNamespace() { 1098*77e5bcceSSpandan Das@@ -70,4 +73,9 @@ public class SoapPrimitive extends AttributeContainer { 1099*77e5bcceSSpandan Das public String getName() { 1100*77e5bcceSSpandan Das return name; 1101*77e5bcceSSpandan Das } 1102*77e5bcceSSpandan Das+ 1103*77e5bcceSSpandan Das+ public Object getValue() { 1104*77e5bcceSSpandan Das+ return value; 1105*77e5bcceSSpandan Das+ } 1106*77e5bcceSSpandan Das+ 1107*77e5bcceSSpandan Das } 1108*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapSerializationEnvelope.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapSerializationEnvelope.java 1109*77e5bcceSSpandan Dasindex dae09d2..ceeb3f4 100644 1110*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapSerializationEnvelope.java 1111*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapSerializationEnvelope.java 1112*77e5bcceSSpandan Das@@ -27,9 +27,9 @@ import org.xmlpull.v1.XmlPullParserException; 1113*77e5bcceSSpandan Das import org.xmlpull.v1.XmlSerializer; 1114*77e5bcceSSpandan Das 1115*77e5bcceSSpandan Das import java.io.IOException; 1116*77e5bcceSSpandan Das+import java.util.ArrayList; 1117*77e5bcceSSpandan Das import java.util.Hashtable; 1118*77e5bcceSSpandan Das import java.util.Vector; 1119*77e5bcceSSpandan Das-import java.io.ByteArrayOutputStream; 1120*77e5bcceSSpandan Das 1121*77e5bcceSSpandan Das import org.kxml2.io.*; 1122*77e5bcceSSpandan Das 1123*77e5bcceSSpandan Das@@ -43,29 +43,29 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1124*77e5bcceSSpandan Das protected static final int QNAME_TYPE = 1; 1125*77e5bcceSSpandan Das protected static final int QNAME_NAMESPACE = 0; 1126*77e5bcceSSpandan Das protected static final int QNAME_MARSHAL = 3; 1127*77e5bcceSSpandan Das+ protected static final String NULL_LABEL = "null"; 1128*77e5bcceSSpandan Das+ protected static final String NIL_LABEL = "nil"; 1129*77e5bcceSSpandan Das+ static final Marshal DEFAULT_MARSHAL = new DM(); 1130*77e5bcceSSpandan Das private static final String ANY_TYPE_LABEL = "anyType"; 1131*77e5bcceSSpandan Das private static final String ARRAY_MAPPING_NAME = "Array"; 1132*77e5bcceSSpandan Das- private static final String NULL_LABEL = "null"; 1133*77e5bcceSSpandan Das- private static final String NIL_LABEL = "nil"; 1134*77e5bcceSSpandan Das private static final String HREF_LABEL = "href"; 1135*77e5bcceSSpandan Das private static final String ID_LABEL = "id"; 1136*77e5bcceSSpandan Das private static final String ROOT_LABEL = "root"; 1137*77e5bcceSSpandan Das private static final String TYPE_LABEL = "type"; 1138*77e5bcceSSpandan Das private static final String ITEM_LABEL = "item"; 1139*77e5bcceSSpandan Das private static final String ARRAY_TYPE_LABEL = "arrayType"; 1140*77e5bcceSSpandan Das- static final Marshal DEFAULT_MARSHAL = new DM(); 1141*77e5bcceSSpandan Das public Hashtable properties = new Hashtable(); 1142*77e5bcceSSpandan Das- 1143*77e5bcceSSpandan Das- Hashtable idMap = new Hashtable(); 1144*77e5bcceSSpandan Das- Vector multiRef; // = new Vector(); 1145*77e5bcceSSpandan Das- 1146*77e5bcceSSpandan Das /** 1147*77e5bcceSSpandan Das * Set this variable to true if you don't want that type definitions for complex types/objects 1148*77e5bcceSSpandan Das * are automatically generated (with type "anyType") in the XML-Request, if you don't call the 1149*77e5bcceSSpandan Das * Method addMapping. This is needed by some Servers which have problems with these type-definitions. 1150*77e5bcceSSpandan Das */ 1151*77e5bcceSSpandan Das public boolean implicitTypes; 1152*77e5bcceSSpandan Das- 1153*77e5bcceSSpandan Das+ /** 1154*77e5bcceSSpandan Das+ * If set to true then all properties with null value will be skipped from the soap message. 1155*77e5bcceSSpandan Das+ * If false then null properties will be sent as <element nil="true" /> 1156*77e5bcceSSpandan Das+ */ 1157*77e5bcceSSpandan Das+ public boolean skipNullProperties; 1158*77e5bcceSSpandan Das /** 1159*77e5bcceSSpandan Das * Set this variable to true for compatibility with what seems to be the default encoding for 1160*77e5bcceSSpandan Das * .Net-Services. This feature is an extremely ugly hack. A much better option is to change the 1161*77e5bcceSSpandan Das@@ -96,9 +96,10 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1162*77e5bcceSSpandan Das * Set to true to add and ID and ROOT label to the envelope. Change to false for compatibility with WSDL. 1163*77e5bcceSSpandan Das */ 1164*77e5bcceSSpandan Das protected boolean addAdornments = true; 1165*77e5bcceSSpandan Das+ Hashtable idMap = new Hashtable(); 1166*77e5bcceSSpandan Das+ Vector multiRef; // = new Vector(); 1167*77e5bcceSSpandan Das 1168*77e5bcceSSpandan Das- public SoapSerializationEnvelope(int version) 1169*77e5bcceSSpandan Das- { 1170*77e5bcceSSpandan Das+ public SoapSerializationEnvelope(int version) { 1171*77e5bcceSSpandan Das super(version); 1172*77e5bcceSSpandan Das addMapping(enc, ARRAY_MAPPING_NAME, PropertyInfo.VECTOR_CLASS); 1173*77e5bcceSSpandan Das DEFAULT_MARSHAL.register(this); 1174*77e5bcceSSpandan Das@@ -107,23 +108,21 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1175*77e5bcceSSpandan Das /** 1176*77e5bcceSSpandan Das * @return the addAdornments 1177*77e5bcceSSpandan Das */ 1178*77e5bcceSSpandan Das- public boolean isAddAdornments() 1179*77e5bcceSSpandan Das- { 1180*77e5bcceSSpandan Das+ public boolean isAddAdornments() { 1181*77e5bcceSSpandan Das return addAdornments; 1182*77e5bcceSSpandan Das } 1183*77e5bcceSSpandan Das 1184*77e5bcceSSpandan Das /** 1185*77e5bcceSSpandan Das- * @param addAdornments 1186*77e5bcceSSpandan Das- * the addAdornments to set 1187*77e5bcceSSpandan Das+ * @param addAdornments the addAdornments to set 1188*77e5bcceSSpandan Das */ 1189*77e5bcceSSpandan Das- public void setAddAdornments(boolean addAdornments) 1190*77e5bcceSSpandan Das- { 1191*77e5bcceSSpandan Das+ public void setAddAdornments(boolean addAdornments) { 1192*77e5bcceSSpandan Das this.addAdornments = addAdornments; 1193*77e5bcceSSpandan Das } 1194*77e5bcceSSpandan Das 1195*77e5bcceSSpandan Das /** 1196*77e5bcceSSpandan Das * Set the bodyOut to be empty so that no un-needed xml is create. The null value for bodyOut will 1197*77e5bcceSSpandan Das * cause #writeBody to skip writing anything redundant. 1198*77e5bcceSSpandan Das+ * 1199*77e5bcceSSpandan Das * @param emptyBody 1200*77e5bcceSSpandan Das * @see "http://code.google.com/p/ksoap2-android/issues/detail?id=77" 1201*77e5bcceSSpandan Das */ 1202*77e5bcceSSpandan Das@@ -133,8 +132,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1203*77e5bcceSSpandan Das } 1204*77e5bcceSSpandan Das } 1205*77e5bcceSSpandan Das 1206*77e5bcceSSpandan Das- public void parseBody(XmlPullParser parser) throws IOException, XmlPullParserException 1207*77e5bcceSSpandan Das- { 1208*77e5bcceSSpandan Das+ public void parseBody(XmlPullParser parser) throws IOException, XmlPullParserException { 1209*77e5bcceSSpandan Das bodyIn = null; 1210*77e5bcceSSpandan Das parser.nextTag(); 1211*77e5bcceSSpandan Das if (parser.getEventType() == XmlPullParser.START_TAG && parser.getNamespace().equals(env) 1212*77e5bcceSSpandan Das@@ -161,10 +159,11 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1213*77e5bcceSSpandan Das } 1214*77e5bcceSSpandan Das } 1215*77e5bcceSSpandan Das 1216*77e5bcceSSpandan Das- /** Read a SoapObject. This extracts any attributes and then reads the object as a KvmSerializable. */ 1217*77e5bcceSSpandan Das+ /** 1218*77e5bcceSSpandan Das+ * Read a SoapObject. This extracts any attributes and then reads the object as a KvmSerializable. 1219*77e5bcceSSpandan Das+ */ 1220*77e5bcceSSpandan Das protected void readSerializable(XmlPullParser parser, SoapObject obj) throws IOException, 1221*77e5bcceSSpandan Das- XmlPullParserException 1222*77e5bcceSSpandan Das- { 1223*77e5bcceSSpandan Das+ XmlPullParserException { 1224*77e5bcceSSpandan Das for (int counter = 0; counter < parser.getAttributeCount(); counter++) { 1225*77e5bcceSSpandan Das String attributeName = parser.getAttributeName(counter); 1226*77e5bcceSSpandan Das String value = parser.getAttributeValue(counter); 1227*77e5bcceSSpandan Das@@ -173,11 +172,21 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1228*77e5bcceSSpandan Das readSerializable(parser, (KvmSerializable) obj); 1229*77e5bcceSSpandan Das } 1230*77e5bcceSSpandan Das 1231*77e5bcceSSpandan Das- /** Read a KvmSerializable. */ 1232*77e5bcceSSpandan Das+ /** 1233*77e5bcceSSpandan Das+ * Read a KvmSerializable. 1234*77e5bcceSSpandan Das+ */ 1235*77e5bcceSSpandan Das protected void readSerializable(XmlPullParser parser, KvmSerializable obj) throws IOException, 1236*77e5bcceSSpandan Das- XmlPullParserException 1237*77e5bcceSSpandan Das- { 1238*77e5bcceSSpandan Das- while (parser.nextTag() != XmlPullParser.END_TAG) { 1239*77e5bcceSSpandan Das+ XmlPullParserException { 1240*77e5bcceSSpandan Das+ int tag = 0; 1241*77e5bcceSSpandan Das+ try { 1242*77e5bcceSSpandan Das+ tag = parser.nextTag(); 1243*77e5bcceSSpandan Das+ } catch (XmlPullParserException e) { 1244*77e5bcceSSpandan Das+ if(obj instanceof HasInnerText){ 1245*77e5bcceSSpandan Das+ ((HasInnerText)obj).setInnerText((parser.getText() != null) ? parser.getText() : ""); 1246*77e5bcceSSpandan Das+ } 1247*77e5bcceSSpandan Das+ tag = parser.nextTag(); 1248*77e5bcceSSpandan Das+ } 1249*77e5bcceSSpandan Das+ while (tag != XmlPullParser.END_TAG) { 1250*77e5bcceSSpandan Das String name = parser.getName(); 1251*77e5bcceSSpandan Das if (!implicitTypes || !(obj instanceof SoapObject)) { 1252*77e5bcceSSpandan Das PropertyInfo info = new PropertyInfo(); 1253*77e5bcceSSpandan Das@@ -188,8 +197,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1254*77e5bcceSSpandan Das info.clear(); 1255*77e5bcceSSpandan Das obj.getPropertyInfo(i, properties, info); 1256*77e5bcceSSpandan Das 1257*77e5bcceSSpandan Das- if ((name.equals(info.name) && info.namespace == null) 1258*77e5bcceSSpandan Das- || 1259*77e5bcceSSpandan Das+ if ((name.equals(info.name) && info.namespace == null) || 1260*77e5bcceSSpandan Das (name.equals(info.name) && parser.getNamespace().equals(info.namespace))) { 1261*77e5bcceSSpandan Das propertyFound = true; 1262*77e5bcceSSpandan Das obj.setProperty(i, read(parser, obj, i, null, null, info)); 1263*77e5bcceSSpandan Das@@ -199,21 +207,42 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1264*77e5bcceSSpandan Das if (!propertyFound) { 1265*77e5bcceSSpandan Das if (avoidExceptionForUnknownProperty) { 1266*77e5bcceSSpandan Das // Dummy loop to read until corresponding END tag 1267*77e5bcceSSpandan Das- while (parser.next() != XmlPullParser.END_TAG 1268*77e5bcceSSpandan Das- || !name.equals(parser.getName())) { 1269*77e5bcceSSpandan Das+ while (parser.next() != XmlPullParser.END_TAG || !name.equals(parser.getName())) { 1270*77e5bcceSSpandan Das } 1271*77e5bcceSSpandan Das ; 1272*77e5bcceSSpandan Das } else { 1273*77e5bcceSSpandan Das throw new RuntimeException("Unknown Property: " + name); 1274*77e5bcceSSpandan Das } 1275*77e5bcceSSpandan Das+ } else { 1276*77e5bcceSSpandan Das+ if (obj instanceof HasAttributes) { 1277*77e5bcceSSpandan Das+ HasAttributes soapObject = (HasAttributes) obj; 1278*77e5bcceSSpandan Das+ int cnt = parser.getAttributeCount(); 1279*77e5bcceSSpandan Das+ for (int counter = 0; counter < cnt; counter++) { 1280*77e5bcceSSpandan Das+ AttributeInfo attributeInfo = new AttributeInfo(); 1281*77e5bcceSSpandan Das+ attributeInfo.setName(parser.getAttributeName(counter)); 1282*77e5bcceSSpandan Das+ attributeInfo.setValue(parser.getAttributeValue(counter)); 1283*77e5bcceSSpandan Das+ attributeInfo.setNamespace(parser.getAttributeNamespace(counter)); 1284*77e5bcceSSpandan Das+ attributeInfo.setType(parser.getAttributeType(counter)); 1285*77e5bcceSSpandan Das+ soapObject.setAttribute(attributeInfo); 1286*77e5bcceSSpandan Das+ 1287*77e5bcceSSpandan Das+ } 1288*77e5bcceSSpandan Das+ } 1289*77e5bcceSSpandan Das } 1290*77e5bcceSSpandan Das } else { 1291*77e5bcceSSpandan Das // I can only make this work for SoapObjects - hence the check above 1292*77e5bcceSSpandan Das // I don't understand namespaces well enough to know whether it is correct in the next line... 1293*77e5bcceSSpandan Das- ((SoapObject) obj).addProperty(parser.getName(), 1294*77e5bcceSSpandan Das- read(parser, obj, obj.getPropertyCount(), 1295*77e5bcceSSpandan Das- ((SoapObject) obj).getNamespace(), name, PropertyInfo.OBJECT_TYPE)); 1296*77e5bcceSSpandan Das+ ((SoapObject) obj).addProperty(parser.getName(), read(parser, obj, obj.getPropertyCount(), 1297*77e5bcceSSpandan Das+ ((SoapObject) obj).getNamespace(), name, PropertyInfo.OBJECT_TYPE)); 1298*77e5bcceSSpandan Das+ } 1299*77e5bcceSSpandan Das+ try { 1300*77e5bcceSSpandan Das+ tag = parser.nextTag(); 1301*77e5bcceSSpandan Das+ } catch (XmlPullParserException e) { 1302*77e5bcceSSpandan Das+ if(obj instanceof HasInnerText){ 1303*77e5bcceSSpandan Das+ ((HasInnerText)obj).setInnerText((parser.getText() != null) ? parser.getText() : ""); 1304*77e5bcceSSpandan Das+ } 1305*77e5bcceSSpandan Das+ tag = parser.nextTag(); 1306*77e5bcceSSpandan Das } 1307*77e5bcceSSpandan Das+ 1308*77e5bcceSSpandan Das } 1309*77e5bcceSSpandan Das parser.require(XmlPullParser.END_TAG, null, null); 1310*77e5bcceSSpandan Das } 1311*77e5bcceSSpandan Das@@ -278,9 +307,8 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1312*77e5bcceSSpandan Das } 1313*77e5bcceSSpandan Das 1314*77e5bcceSSpandan Das while (parser.getEventType() != XmlPullParser.END_TAG) { 1315*77e5bcceSSpandan Das- so.addProperty(parser.getName(), 1316*77e5bcceSSpandan Das- read(parser, so, so.getPropertyCount(), null, null, 1317*77e5bcceSSpandan Das- PropertyInfo.OBJECT_TYPE)); 1318*77e5bcceSSpandan Das+ so.addProperty(parser.getNamespace(),parser.getName(), read(parser, so, so.getPropertyCount(), 1319*77e5bcceSSpandan Das+ null, null, PropertyInfo.OBJECT_TYPE)); 1320*77e5bcceSSpandan Das parser.nextTag(); 1321*77e5bcceSSpandan Das } 1322*77e5bcceSSpandan Das result = so; 1323*77e5bcceSSpandan Das@@ -293,12 +321,15 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1324*77e5bcceSSpandan Das if (value == null) { 1325*77e5bcceSSpandan Das return dflt; 1326*77e5bcceSSpandan Das } 1327*77e5bcceSSpandan Das- return value.length() - start < 3 ? dflt : Integer.parseInt(value.substring(start + 1, 1328*77e5bcceSSpandan Das- value.length() - 1)); 1329*77e5bcceSSpandan Das+ try { 1330*77e5bcceSSpandan Das+ return value.length() - start < 3 ? dflt : Integer.parseInt(value.substring(start + 1, 1331*77e5bcceSSpandan Das+ value.length() - 1)); 1332*77e5bcceSSpandan Das+ } catch (Exception ex) { 1333*77e5bcceSSpandan Das+ return dflt; 1334*77e5bcceSSpandan Das+ } 1335*77e5bcceSSpandan Das } 1336*77e5bcceSSpandan Das 1337*77e5bcceSSpandan Das- protected void readVector(XmlPullParser parser, Vector v, PropertyInfo elementType) 1338*77e5bcceSSpandan Das- throws IOException, 1339*77e5bcceSSpandan Das+ protected void readVector(XmlPullParser parser, Vector v, PropertyInfo elementType) throws IOException, 1340*77e5bcceSSpandan Das XmlPullParserException { 1341*77e5bcceSSpandan Das String namespace = null; 1342*77e5bcceSSpandan Das String name = null; 1343*77e5bcceSSpandan Das@@ -337,14 +368,23 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1344*77e5bcceSSpandan Das parser.require(XmlPullParser.END_TAG, null, null); 1345*77e5bcceSSpandan Das } 1346*77e5bcceSSpandan Das 1347*77e5bcceSSpandan Das+ /** 1348*77e5bcceSSpandan Das+ * This method returns id from the href attribute value. 1349*77e5bcceSSpandan Das+ * By default we assume that href value looks like this: #id so we basically have to remove the first character. 1350*77e5bcceSSpandan Das+ * But in theory there could be a different value format, like cid:value, etc... 1351*77e5bcceSSpandan Das+ */ 1352*77e5bcceSSpandan Das+ protected String getIdFromHref(String hrefValue) { 1353*77e5bcceSSpandan Das+ return hrefValue.substring(1); 1354*77e5bcceSSpandan Das+ } 1355*77e5bcceSSpandan Das+ 1356*77e5bcceSSpandan Das /** 1357*77e5bcceSSpandan Das * Builds an object from the XML stream. This method is public for usage in conjuction with Marshal 1358*77e5bcceSSpandan Das * subclasses. Precondition: On the start tag of the object or property, so href can be read. 1359*77e5bcceSSpandan Das */ 1360*77e5bcceSSpandan Das 1361*77e5bcceSSpandan Das- public Object read(XmlPullParser parser, Object owner, int index, String namespace, 1362*77e5bcceSSpandan Das- String name, 1363*77e5bcceSSpandan Das- PropertyInfo expected) throws IOException, XmlPullParserException { 1364*77e5bcceSSpandan Das+ public Object read(XmlPullParser parser, Object owner, int index, String namespace, String name, 1365*77e5bcceSSpandan Das+ PropertyInfo expected) 1366*77e5bcceSSpandan Das+ throws IOException, XmlPullParserException { 1367*77e5bcceSSpandan Das String elementName = parser.getName(); 1368*77e5bcceSSpandan Das String href = parser.getAttributeValue(null, HREF_LABEL); 1369*77e5bcceSSpandan Das Object obj; 1370*77e5bcceSSpandan Das@@ -352,7 +392,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1371*77e5bcceSSpandan Das if (owner == null) { 1372*77e5bcceSSpandan Das throw new RuntimeException("href at root level?!?"); 1373*77e5bcceSSpandan Das } 1374*77e5bcceSSpandan Das- href = href.substring(1); 1375*77e5bcceSSpandan Das+ href = getIdFromHref(href); 1376*77e5bcceSSpandan Das obj = idMap.get(href); 1377*77e5bcceSSpandan Das if (obj == null || obj instanceof FwdRef) { 1378*77e5bcceSSpandan Das FwdRef f = new FwdRef(); 1379*77e5bcceSSpandan Das@@ -402,21 +442,8 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1380*77e5bcceSSpandan Das } 1381*77e5bcceSSpandan Das // finally, care about the id.... 1382*77e5bcceSSpandan Das if (id != null) { 1383*77e5bcceSSpandan Das- Object hlp = idMap.get(id); 1384*77e5bcceSSpandan Das- if (hlp instanceof FwdRef) { 1385*77e5bcceSSpandan Das- FwdRef f = (FwdRef) hlp; 1386*77e5bcceSSpandan Das- do { 1387*77e5bcceSSpandan Das- if (f.obj instanceof KvmSerializable) { 1388*77e5bcceSSpandan Das- ((KvmSerializable) f.obj).setProperty(f.index, obj); 1389*77e5bcceSSpandan Das- } else { 1390*77e5bcceSSpandan Das- ((Vector) f.obj).setElementAt(obj, f.index); 1391*77e5bcceSSpandan Das- } 1392*77e5bcceSSpandan Das- f = f.next; 1393*77e5bcceSSpandan Das- } while (f != null); 1394*77e5bcceSSpandan Das- } else if (hlp != null) { 1395*77e5bcceSSpandan Das- throw new RuntimeException("double ID"); 1396*77e5bcceSSpandan Das- } 1397*77e5bcceSSpandan Das- idMap.put(id, obj); 1398*77e5bcceSSpandan Das+ resolveReference(id, obj); 1399*77e5bcceSSpandan Das+ 1400*77e5bcceSSpandan Das } 1401*77e5bcceSSpandan Das } 1402*77e5bcceSSpandan Das 1403*77e5bcceSSpandan Das@@ -424,12 +451,30 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1404*77e5bcceSSpandan Das return obj; 1405*77e5bcceSSpandan Das } 1406*77e5bcceSSpandan Das 1407*77e5bcceSSpandan Das+ protected void resolveReference(String id, Object obj) { 1408*77e5bcceSSpandan Das+ Object hlp = idMap.get(id); 1409*77e5bcceSSpandan Das+ if (hlp instanceof FwdRef) { 1410*77e5bcceSSpandan Das+ FwdRef f = (FwdRef) hlp; 1411*77e5bcceSSpandan Das+ do { 1412*77e5bcceSSpandan Das+ if (f.obj instanceof KvmSerializable) { 1413*77e5bcceSSpandan Das+ ((KvmSerializable) f.obj).setProperty(f.index, obj); 1414*77e5bcceSSpandan Das+ } else { 1415*77e5bcceSSpandan Das+ ((Vector) f.obj).setElementAt(obj, f.index); 1416*77e5bcceSSpandan Das+ } 1417*77e5bcceSSpandan Das+ f = f.next; 1418*77e5bcceSSpandan Das+ } 1419*77e5bcceSSpandan Das+ while (f != null); 1420*77e5bcceSSpandan Das+ } else if (hlp != null) { 1421*77e5bcceSSpandan Das+ throw new RuntimeException("double ID"); 1422*77e5bcceSSpandan Das+ } 1423*77e5bcceSSpandan Das+ idMap.put(id, obj); 1424*77e5bcceSSpandan Das+ } 1425*77e5bcceSSpandan Das+ 1426*77e5bcceSSpandan Das /** 1427*77e5bcceSSpandan Das * Returns a new object read from the given parser. If no mapping is found, null is returned. This method 1428*77e5bcceSSpandan Das * is used by the SoapParser in order to convert the XML code to Java objects. 1429*77e5bcceSSpandan Das */ 1430*77e5bcceSSpandan Das- public Object readInstance(XmlPullParser parser, String namespace, String name, 1431*77e5bcceSSpandan Das- PropertyInfo expected) 1432*77e5bcceSSpandan Das+ public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected) 1433*77e5bcceSSpandan Das throws IOException, XmlPullParserException { 1434*77e5bcceSSpandan Das Object obj = qNameToClass.get(new SoapPrimitive(namespace, name, null)); 1435*77e5bcceSSpandan Das if (obj == null) { 1436*77e5bcceSSpandan Das@@ -448,10 +493,30 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1437*77e5bcceSSpandan Das throw new RuntimeException(e.toString()); 1438*77e5bcceSSpandan Das } 1439*77e5bcceSSpandan Das } 1440*77e5bcceSSpandan Das+ if (obj instanceof HasAttributes) { 1441*77e5bcceSSpandan Das+ HasAttributes soapObject = (HasAttributes) obj; 1442*77e5bcceSSpandan Das+ int cnt = parser.getAttributeCount(); 1443*77e5bcceSSpandan Das+ for (int counter = 0; counter < cnt; counter++) { 1444*77e5bcceSSpandan Das+ 1445*77e5bcceSSpandan Das+ AttributeInfo attributeInfo = new AttributeInfo(); 1446*77e5bcceSSpandan Das+ attributeInfo.setName(parser.getAttributeName(counter)); 1447*77e5bcceSSpandan Das+ attributeInfo.setValue(parser.getAttributeValue(counter)); 1448*77e5bcceSSpandan Das+ attributeInfo.setNamespace(parser.getAttributeNamespace(counter)); 1449*77e5bcceSSpandan Das+ attributeInfo.setType(parser.getAttributeType(counter)); 1450*77e5bcceSSpandan Das+ 1451*77e5bcceSSpandan Das+ soapObject.setAttribute(attributeInfo); 1452*77e5bcceSSpandan Das+ 1453*77e5bcceSSpandan Das+ } 1454*77e5bcceSSpandan Das+ } 1455*77e5bcceSSpandan Das+ 1456*77e5bcceSSpandan Das // ok, obj is now the instance, fill it.... 1457*77e5bcceSSpandan Das if (obj instanceof SoapObject) { 1458*77e5bcceSSpandan Das readSerializable(parser, (SoapObject) obj); 1459*77e5bcceSSpandan Das } else if (obj instanceof KvmSerializable) { 1460*77e5bcceSSpandan Das+ 1461*77e5bcceSSpandan Das+ if(obj instanceof HasInnerText){ 1462*77e5bcceSSpandan Das+ ((HasInnerText)obj).setInnerText((parser.getText() != null) ? parser.getText() : ""); 1463*77e5bcceSSpandan Das+ } 1464*77e5bcceSSpandan Das readSerializable(parser, (KvmSerializable) obj); 1465*77e5bcceSSpandan Das } else if (obj instanceof Vector) { 1466*77e5bcceSSpandan Das readVector(parser, (Vector) obj, expected.elementType); 1467*77e5bcceSSpandan Das@@ -476,15 +541,11 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1468*77e5bcceSSpandan Das } 1469*77e5bcceSSpandan Das if (type instanceof SoapObject) { 1470*77e5bcceSSpandan Das SoapObject so = (SoapObject) type; 1471*77e5bcceSSpandan Das- return new Object[] { 1472*77e5bcceSSpandan Das- so.getNamespace(), so.getName(), null, null 1473*77e5bcceSSpandan Das- }; 1474*77e5bcceSSpandan Das+ return new Object[]{so.getNamespace(), so.getName(), null, null}; 1475*77e5bcceSSpandan Das } 1476*77e5bcceSSpandan Das if (type instanceof SoapPrimitive) { 1477*77e5bcceSSpandan Das SoapPrimitive sp = (SoapPrimitive) type; 1478*77e5bcceSSpandan Das- return new Object[] { 1479*77e5bcceSSpandan Das- sp.getNamespace(), sp.getName(), null, DEFAULT_MARSHAL 1480*77e5bcceSSpandan Das- }; 1481*77e5bcceSSpandan Das+ return new Object[]{sp.getNamespace(), sp.getName(), null, DEFAULT_MARSHAL}; 1482*77e5bcceSSpandan Das } 1483*77e5bcceSSpandan Das if ((type instanceof Class) && type != PropertyInfo.OBJECT_CLASS) { 1484*77e5bcceSSpandan Das Object[] tmp = (Object[]) classToQName.get(((Class) type).getName()); 1485*77e5bcceSSpandan Das@@ -492,9 +553,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1486*77e5bcceSSpandan Das return tmp; 1487*77e5bcceSSpandan Das } 1488*77e5bcceSSpandan Das } 1489*77e5bcceSSpandan Das- return new Object[] { 1490*77e5bcceSSpandan Das- xsd, ANY_TYPE_LABEL, null, null 1491*77e5bcceSSpandan Das- }; 1492*77e5bcceSSpandan Das+ return new Object[]{xsd, ANY_TYPE_LABEL, null, null}; 1493*77e5bcceSSpandan Das } 1494*77e5bcceSSpandan Das 1495*77e5bcceSSpandan Das /** 1496*77e5bcceSSpandan Das@@ -503,11 +562,8 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1497*77e5bcceSSpandan Das */ 1498*77e5bcceSSpandan Das public void addMapping(String namespace, String name, Class clazz, Marshal marshal) { 1499*77e5bcceSSpandan Das qNameToClass 1500*77e5bcceSSpandan Das- .put(new SoapPrimitive(namespace, name, null), marshal == null ? (Object) clazz 1501*77e5bcceSSpandan Das- : marshal); 1502*77e5bcceSSpandan Das- classToQName.put(clazz.getName(), new Object[] { 1503*77e5bcceSSpandan Das- namespace, name, null, marshal 1504*77e5bcceSSpandan Das- }); 1505*77e5bcceSSpandan Das+ .put(new SoapPrimitive(namespace, name, null), marshal == null ? (Object) clazz : marshal); 1506*77e5bcceSSpandan Das+ classToQName.put(clazz.getName(), new Object[]{namespace, name, null, marshal}); 1507*77e5bcceSSpandan Das } 1508*77e5bcceSSpandan Das 1509*77e5bcceSSpandan Das /** 1510*77e5bcceSSpandan Das@@ -528,11 +584,14 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1511*77e5bcceSSpandan Das /** 1512*77e5bcceSSpandan Das * Response from the soap call. Pulls the object from the wrapper object and returns it. 1513*77e5bcceSSpandan Das * 1514*77e5bcceSSpandan Das- * @since 2.0.3 1515*77e5bcceSSpandan Das * @return response from the soap call. 1516*77e5bcceSSpandan Das * @throws SoapFault 1517*77e5bcceSSpandan Das+ * @since 2.0.3 1518*77e5bcceSSpandan Das */ 1519*77e5bcceSSpandan Das public Object getResponse() throws SoapFault { 1520*77e5bcceSSpandan Das+ if (bodyIn == null) { 1521*77e5bcceSSpandan Das+ return null; 1522*77e5bcceSSpandan Das+ } 1523*77e5bcceSSpandan Das if (bodyIn instanceof SoapFault) { 1524*77e5bcceSSpandan Das throw (SoapFault) bodyIn; 1525*77e5bcceSSpandan Das } 1526*77e5bcceSSpandan Das@@ -554,8 +613,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1527*77e5bcceSSpandan Das /** 1528*77e5bcceSSpandan Das * Serializes the request object to the given XmlSerliazer object 1529*77e5bcceSSpandan Das * 1530*77e5bcceSSpandan Das- * @param writer 1531*77e5bcceSSpandan Das- * XmlSerializer object to write the body into. 1532*77e5bcceSSpandan Das+ * @param writer XmlSerializer object to write the body into. 1533*77e5bcceSSpandan Das */ 1534*77e5bcceSSpandan Das public void writeBody(XmlSerializer writer) throws IOException { 1535*77e5bcceSSpandan Das // allow an empty body without any tags in it 1536*77e5bcceSSpandan Das@@ -564,36 +622,48 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1537*77e5bcceSSpandan Das multiRef = new Vector(); 1538*77e5bcceSSpandan Das multiRef.addElement(bodyOut); 1539*77e5bcceSSpandan Das Object[] qName = getInfo(null, bodyOut); 1540*77e5bcceSSpandan Das- writer.startTag((dotNet) ? "" : (String) qName[QNAME_NAMESPACE], 1541*77e5bcceSSpandan Das- (String) qName[QNAME_TYPE]); //<spp:sppPostDevData 1542*77e5bcceSSpandan Das- if (dotNet) { 1543*77e5bcceSSpandan Das- writer.attribute(null, "xmlns", (String) qName[QNAME_NAMESPACE]); 1544*77e5bcceSSpandan Das- } 1545*77e5bcceSSpandan Das+ 1546*77e5bcceSSpandan Das+ writer.startTag((dotNet) ? "" : (String) qName[QNAME_NAMESPACE], (String) qName[QNAME_TYPE]); 1547*77e5bcceSSpandan Das+ 1548*77e5bcceSSpandan Das+ if (dotNet) { 1549*77e5bcceSSpandan Das+ writer.attribute(null, "xmlns", (String) qName[QNAME_NAMESPACE]); 1550*77e5bcceSSpandan Das+ } 1551*77e5bcceSSpandan Das+ 1552*77e5bcceSSpandan Das if (addAdornments) { 1553*77e5bcceSSpandan Das writer.attribute(null, ID_LABEL, qName[2] == null ? ("o" + 0) : (String) qName[2]); 1554*77e5bcceSSpandan Das writer.attribute(enc, ROOT_LABEL, "1"); 1555*77e5bcceSSpandan Das } 1556*77e5bcceSSpandan Das- writeElement(writer, bodyOut, null, qName[QNAME_MARSHAL]); //.... 1557*77e5bcceSSpandan Das- writer.endTag((dotNet) ? "" : (String) qName[QNAME_NAMESPACE], 1558*77e5bcceSSpandan Das- (String) qName[QNAME_TYPE]);//</spp:sppPostDevData> 1559*77e5bcceSSpandan Das+ writeElement(writer, bodyOut, null, qName[QNAME_MARSHAL]); 1560*77e5bcceSSpandan Das+ writer.endTag((dotNet) ? "" : (String) qName[QNAME_NAMESPACE], (String) qName[QNAME_TYPE]); 1561*77e5bcceSSpandan Das } 1562*77e5bcceSSpandan Das } 1563*77e5bcceSSpandan Das 1564*77e5bcceSSpandan Das- /** 1565*77e5bcceSSpandan Das- * Writes the body of an SoapObject. This method write the attributes and then calls 1566*77e5bcceSSpandan Das- * "writeObjectBody (writer, (KvmSerializable)obj);" 1567*77e5bcceSSpandan Das- */ 1568*77e5bcceSSpandan Das- public void writeObjectBody(XmlSerializer writer, SoapObject obj) throws IOException { 1569*77e5bcceSSpandan Das- SoapObject soapObject = (SoapObject) obj; 1570*77e5bcceSSpandan Das+ private void writeAttributes(XmlSerializer writer, HasAttributes obj) throws IOException { 1571*77e5bcceSSpandan Das+ HasAttributes soapObject = (HasAttributes) obj; 1572*77e5bcceSSpandan Das int cnt = soapObject.getAttributeCount(); 1573*77e5bcceSSpandan Das for (int counter = 0; counter < cnt; counter++) { 1574*77e5bcceSSpandan Das AttributeInfo attributeInfo = new AttributeInfo(); 1575*77e5bcceSSpandan Das soapObject.getAttributeInfo(counter, attributeInfo); 1576*77e5bcceSSpandan Das- writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(), attributeInfo 1577*77e5bcceSSpandan Das- .getValue() 1578*77e5bcceSSpandan Das- .toString()); 1579*77e5bcceSSpandan Das+ soapObject.getAttribute(counter, attributeInfo); 1580*77e5bcceSSpandan Das+ if (attributeInfo.getValue() != null) { 1581*77e5bcceSSpandan Das+ writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(), 1582*77e5bcceSSpandan Das+ attributeInfo.getValue().toString()); 1583*77e5bcceSSpandan Das+ } 1584*77e5bcceSSpandan Das+ } 1585*77e5bcceSSpandan Das+ } 1586*77e5bcceSSpandan Das+ 1587*77e5bcceSSpandan Das+ public void writeArrayListBodyWithAttributes(XmlSerializer writer, KvmSerializable obj) throws IOException { 1588*77e5bcceSSpandan Das+ if (obj instanceof HasAttributes) { 1589*77e5bcceSSpandan Das+ writeAttributes(writer, (HasAttributes) obj); 1590*77e5bcceSSpandan Das } 1591*77e5bcceSSpandan Das- writeObjectBody(writer, (KvmSerializable) obj); 1592*77e5bcceSSpandan Das+ writeArrayListBody(writer, (ArrayList) obj); 1593*77e5bcceSSpandan Das+ } 1594*77e5bcceSSpandan Das+ 1595*77e5bcceSSpandan Das+ public void writeObjectBodyWithAttributes(XmlSerializer writer, KvmSerializable obj) throws IOException { 1596*77e5bcceSSpandan Das+ if (obj instanceof HasAttributes) { 1597*77e5bcceSSpandan Das+ writeAttributes(writer, (HasAttributes) obj); 1598*77e5bcceSSpandan Das+ } 1599*77e5bcceSSpandan Das+ writeObjectBody(writer, obj); 1600*77e5bcceSSpandan Das } 1601*77e5bcceSSpandan Das 1602*77e5bcceSSpandan Das /** 1603*77e5bcceSSpandan Das@@ -614,9 +684,12 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1604*77e5bcceSSpandan Das if (!(prop instanceof SoapObject)) { 1605*77e5bcceSSpandan Das // prop is a PropertyInfo 1606*77e5bcceSSpandan Das if ((propertyInfo.flags & PropertyInfo.TRANSIENT) == 0) { 1607*77e5bcceSSpandan Das- writer.startTag(propertyInfo.namespace, propertyInfo.name); 1608*77e5bcceSSpandan Das- writeProperty(writer, obj.getProperty(i), propertyInfo); 1609*77e5bcceSSpandan Das- writer.endTag(propertyInfo.namespace, propertyInfo.name); 1610*77e5bcceSSpandan Das+ Object objValue = obj.getProperty(i); 1611*77e5bcceSSpandan Das+ if ((prop != null || !skipNullProperties) && (objValue != SoapPrimitive.NullSkip)) { 1612*77e5bcceSSpandan Das+ writer.startTag(propertyInfo.namespace, propertyInfo.name); 1613*77e5bcceSSpandan Das+ writeProperty(writer, objValue, propertyInfo); 1614*77e5bcceSSpandan Das+ writer.endTag(propertyInfo.namespace, propertyInfo.name); 1615*77e5bcceSSpandan Das+ } 1616*77e5bcceSSpandan Das } 1617*77e5bcceSSpandan Das } else { 1618*77e5bcceSSpandan Das // prop is a SoapObject 1619*77e5bcceSSpandan Das@@ -633,46 +706,47 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1620*77e5bcceSSpandan Das name = (String) qName[QNAME_TYPE]; 1621*77e5bcceSSpandan Das } 1622*77e5bcceSSpandan Das 1623*77e5bcceSSpandan Das- // treat MO data as CDATA 1624*77e5bcceSSpandan Das- if (name.equals("DevInfo") || name.equals("DevDetail") 1625*77e5bcceSSpandan Das- || name.equals("PerProviderSubscription") || // format v4 1626*77e5bcceSSpandan Das- name.equals("MgmtTree") // format v6 1627*77e5bcceSSpandan Das- ) { 1628*77e5bcceSSpandan Das- ByteArrayOutputStream bos = new ByteArrayOutputStream(); 1629*77e5bcceSSpandan Das- XmlSerializer xw = new KXmlSerializer(); 1630*77e5bcceSSpandan Das- xw.setOutput(bos, "UTF-8"); 1631*77e5bcceSSpandan Das- xw.startTag((dotNet) ? "" : namespace, name); 1632*77e5bcceSSpandan Das- if (!implicitTypes) { 1633*77e5bcceSSpandan Das- String prefix = writer.getPrefix(namespace, true); 1634*77e5bcceSSpandan Das- writer.attribute(xsi, TYPE_LABEL, prefix + ":" + type); 1635*77e5bcceSSpandan Das- } 1636*77e5bcceSSpandan Das- writeObjectBody(xw, nestedSoap); 1637*77e5bcceSSpandan Das- xw.endTag((dotNet) ? "" : namespace, name); 1638*77e5bcceSSpandan Das- xw.flush(); 1639*77e5bcceSSpandan Das- //bos.write('\r'); 1640*77e5bcceSSpandan Das- //bos.write('\n'); 1641*77e5bcceSSpandan Das- bos.flush(); 1642*77e5bcceSSpandan Das- writer.cdsect(bos.toString()); 1643*77e5bcceSSpandan Das+ // prefer the namespace from the property info 1644*77e5bcceSSpandan Das+ if (propertyInfo.namespace != null && propertyInfo.namespace.length() > 0) { 1645*77e5bcceSSpandan Das+ namespace = propertyInfo.namespace; 1646*77e5bcceSSpandan Das+ } else { 1647*77e5bcceSSpandan Das+ namespace = (String) qName[QNAME_NAMESPACE]; 1648*77e5bcceSSpandan Das+ } 1649*77e5bcceSSpandan Das+ 1650*77e5bcceSSpandan Das+ writer.startTag(namespace, name); 1651*77e5bcceSSpandan Das+ if (!implicitTypes) { 1652*77e5bcceSSpandan Das+ String prefix = writer.getPrefix(namespace, true); 1653*77e5bcceSSpandan Das+ writer.attribute(xsi, TYPE_LABEL, prefix + ":" + type); 1654*77e5bcceSSpandan Das+ } 1655*77e5bcceSSpandan Das+ writeObjectBodyWithAttributes(writer, nestedSoap); 1656*77e5bcceSSpandan Das+ writer.endTag(namespace, name); 1657*77e5bcceSSpandan Das+ } 1658*77e5bcceSSpandan Das+ } 1659*77e5bcceSSpandan Das+ writeInnerText(writer, obj); 1660*77e5bcceSSpandan Das+ 1661*77e5bcceSSpandan Das+ } 1662*77e5bcceSSpandan Das+ 1663*77e5bcceSSpandan Das+ private void writeInnerText(XmlSerializer writer, KvmSerializable obj) throws IOException { 1664*77e5bcceSSpandan Das+ if(obj instanceof HasInnerText){ 1665*77e5bcceSSpandan Das+ 1666*77e5bcceSSpandan Das+ Object value=((HasInnerText)obj).getInnerText(); 1667*77e5bcceSSpandan Das+ if (value != null) { 1668*77e5bcceSSpandan Das+ if(value instanceof ValueWriter) 1669*77e5bcceSSpandan Das+ { 1670*77e5bcceSSpandan Das+ ((ValueWriter)value).write(writer); 1671*77e5bcceSSpandan Das } 1672*77e5bcceSSpandan Das else 1673*77e5bcceSSpandan Das { 1674*77e5bcceSSpandan Das- writer.startTag((dotNet) ? "" : namespace, name); 1675*77e5bcceSSpandan Das- if (!implicitTypes) { 1676*77e5bcceSSpandan Das- String prefix = writer.getPrefix(namespace, true); 1677*77e5bcceSSpandan Das- writer.attribute(xsi, TYPE_LABEL, prefix + ":" + type); 1678*77e5bcceSSpandan Das- } 1679*77e5bcceSSpandan Das- writeObjectBody(writer, nestedSoap); 1680*77e5bcceSSpandan Das- writer.endTag((dotNet) ? "" : namespace, name); 1681*77e5bcceSSpandan Das+ writer.cdsect(value.toString()); 1682*77e5bcceSSpandan Das } 1683*77e5bcceSSpandan Das+ 1684*77e5bcceSSpandan Das } 1685*77e5bcceSSpandan Das } 1686*77e5bcceSSpandan Das } 1687*77e5bcceSSpandan Das 1688*77e5bcceSSpandan Das- protected void writeProperty(XmlSerializer writer, Object obj, PropertyInfo type) 1689*77e5bcceSSpandan Das- throws IOException { 1690*77e5bcceSSpandan Das- if (obj == null) { 1691*77e5bcceSSpandan Das- ///M: Modify for HS20 1692*77e5bcceSSpandan Das- //writer.attribute(xsi, version >= VER12 ? NIL_LABEL : NULL_LABEL, "true"); 1693*77e5bcceSSpandan Das+ protected void writeProperty(XmlSerializer writer, Object obj, PropertyInfo type) throws IOException { 1694*77e5bcceSSpandan Das+ if (obj == null || obj == SoapPrimitive.NullNilElement) { 1695*77e5bcceSSpandan Das+ writer.attribute(xsi, version >= VER12 ? NIL_LABEL : NULL_LABEL, "true"); 1696*77e5bcceSSpandan Das return; 1697*77e5bcceSSpandan Das } 1698*77e5bcceSSpandan Das Object[] qName = getInfo(null, obj); 1699*77e5bcceSSpandan Das@@ -692,15 +766,19 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1700*77e5bcceSSpandan Das } 1701*77e5bcceSSpandan Das } 1702*77e5bcceSSpandan Das 1703*77e5bcceSSpandan Das- private void writeElement(XmlSerializer writer, Object element, PropertyInfo type, 1704*77e5bcceSSpandan Das- Object marshal) 1705*77e5bcceSSpandan Das+ protected void writeElement(XmlSerializer writer, Object element, PropertyInfo type, Object marshal) 1706*77e5bcceSSpandan Das throws IOException { 1707*77e5bcceSSpandan Das if (marshal != null) { 1708*77e5bcceSSpandan Das ((Marshal) marshal).writeInstance(writer, element); 1709*77e5bcceSSpandan Das- } else if (element instanceof SoapObject) { 1710*77e5bcceSSpandan Das- writeObjectBody(writer, (SoapObject) element); 1711*77e5bcceSSpandan Das- } else if (element instanceof KvmSerializable) { 1712*77e5bcceSSpandan Das- writeObjectBody(writer, (KvmSerializable) element); 1713*77e5bcceSSpandan Das+ } else if (element instanceof KvmSerializable || element == SoapPrimitive.NullNilElement 1714*77e5bcceSSpandan Das+ || element == SoapPrimitive.NullSkip) { 1715*77e5bcceSSpandan Das+ if (element instanceof ArrayList) { 1716*77e5bcceSSpandan Das+ writeArrayListBodyWithAttributes(writer, (KvmSerializable) element); 1717*77e5bcceSSpandan Das+ } else { 1718*77e5bcceSSpandan Das+ writeObjectBodyWithAttributes(writer, (KvmSerializable) element); 1719*77e5bcceSSpandan Das+ } 1720*77e5bcceSSpandan Das+ } else if (element instanceof HasAttributes) { 1721*77e5bcceSSpandan Das+ writeAttributes(writer, (HasAttributes) element); 1722*77e5bcceSSpandan Das } else if (element instanceof Vector) { 1723*77e5bcceSSpandan Das writeVectorBody(writer, (Vector) element, type.elementType); 1724*77e5bcceSSpandan Das } else { 1725*77e5bcceSSpandan Das@@ -708,6 +786,65 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1726*77e5bcceSSpandan Das } 1727*77e5bcceSSpandan Das } 1728*77e5bcceSSpandan Das 1729*77e5bcceSSpandan Das+ protected void writeArrayListBody(XmlSerializer writer, ArrayList list) 1730*77e5bcceSSpandan Das+ throws IOException { 1731*77e5bcceSSpandan Das+ KvmSerializable obj = (KvmSerializable) list; 1732*77e5bcceSSpandan Das+ int cnt = list.size(); 1733*77e5bcceSSpandan Das+ PropertyInfo propertyInfo = new PropertyInfo(); 1734*77e5bcceSSpandan Das+ String namespace; 1735*77e5bcceSSpandan Das+ String name; 1736*77e5bcceSSpandan Das+ String type; 1737*77e5bcceSSpandan Das+ for (int i = 0; i < cnt; i++) { 1738*77e5bcceSSpandan Das+ // get the property 1739*77e5bcceSSpandan Das+ Object prop = obj.getProperty(i); 1740*77e5bcceSSpandan Das+ // and importantly also get the property info which holds the name potentially! 1741*77e5bcceSSpandan Das+ obj.getPropertyInfo(i, properties, propertyInfo); 1742*77e5bcceSSpandan Das+ 1743*77e5bcceSSpandan Das+ if (!(prop instanceof SoapObject)) { 1744*77e5bcceSSpandan Das+ // prop is a PropertyInfo 1745*77e5bcceSSpandan Das+ if ((propertyInfo.flags & PropertyInfo.TRANSIENT) == 0) { 1746*77e5bcceSSpandan Das+ Object objValue = obj.getProperty(i); 1747*77e5bcceSSpandan Das+ if ((prop != null || !skipNullProperties) && (objValue != SoapPrimitive.NullSkip)) { 1748*77e5bcceSSpandan Das+ writer.startTag(propertyInfo.namespace, propertyInfo.name); 1749*77e5bcceSSpandan Das+ writeProperty(writer, objValue, propertyInfo); 1750*77e5bcceSSpandan Das+ writer.endTag(propertyInfo.namespace, propertyInfo.name); 1751*77e5bcceSSpandan Das+ } 1752*77e5bcceSSpandan Das+ } 1753*77e5bcceSSpandan Das+ } else { 1754*77e5bcceSSpandan Das+ 1755*77e5bcceSSpandan Das+ // prop is a SoapObject 1756*77e5bcceSSpandan Das+ SoapObject nestedSoap = (SoapObject) prop; 1757*77e5bcceSSpandan Das+ // lets get the info from the soap object itself 1758*77e5bcceSSpandan Das+ Object[] qName = getInfo(null, nestedSoap); 1759*77e5bcceSSpandan Das+ namespace = (String) qName[QNAME_NAMESPACE]; 1760*77e5bcceSSpandan Das+ type = (String) qName[QNAME_TYPE]; 1761*77e5bcceSSpandan Das+ 1762*77e5bcceSSpandan Das+ // prefer the name from the property info 1763*77e5bcceSSpandan Das+ if (propertyInfo.name != null && propertyInfo.name.length() > 0) { 1764*77e5bcceSSpandan Das+ name = propertyInfo.name; 1765*77e5bcceSSpandan Das+ } else { 1766*77e5bcceSSpandan Das+ name = (String) qName[QNAME_TYPE]; 1767*77e5bcceSSpandan Das+ } 1768*77e5bcceSSpandan Das+ 1769*77e5bcceSSpandan Das+ // prefer the namespace from the property info 1770*77e5bcceSSpandan Das+ if (propertyInfo.namespace != null && propertyInfo.namespace.length() > 0) { 1771*77e5bcceSSpandan Das+ namespace = propertyInfo.namespace; 1772*77e5bcceSSpandan Das+ } else { 1773*77e5bcceSSpandan Das+ namespace = (String) qName[QNAME_NAMESPACE]; 1774*77e5bcceSSpandan Das+ } 1775*77e5bcceSSpandan Das+ 1776*77e5bcceSSpandan Das+ writer.startTag(namespace, name); 1777*77e5bcceSSpandan Das+ if (!implicitTypes) { 1778*77e5bcceSSpandan Das+ String prefix = writer.getPrefix(namespace, true); 1779*77e5bcceSSpandan Das+ writer.attribute(xsi, TYPE_LABEL, prefix + ":" + type); 1780*77e5bcceSSpandan Das+ } 1781*77e5bcceSSpandan Das+ writeObjectBodyWithAttributes(writer, nestedSoap); 1782*77e5bcceSSpandan Das+ writer.endTag(namespace, name); 1783*77e5bcceSSpandan Das+ } 1784*77e5bcceSSpandan Das+ } 1785*77e5bcceSSpandan Das+ writeInnerText(writer, obj); 1786*77e5bcceSSpandan Das+ } 1787*77e5bcceSSpandan Das+ 1788*77e5bcceSSpandan Das protected void writeVectorBody(XmlSerializer writer, Vector vector, PropertyInfo elementType) 1789*77e5bcceSSpandan Das throws IOException { 1790*77e5bcceSSpandan Das String itemsTagName = ITEM_LABEL; 1791*77e5bcceSSpandan Das@@ -727,9 +864,13 @@ public class SoapSerializationEnvelope extends SoapEnvelope 1792*77e5bcceSSpandan Das 1793*77e5bcceSSpandan Das // This removes the arrayType attribute from the xml for arrays(required for most .Net services to work) 1794*77e5bcceSSpandan Das if (!implicitTypes) { 1795*77e5bcceSSpandan Das- writer.attribute(enc, ARRAY_TYPE_LABEL, writer.getPrefix((String) arrType[0], false) 1796*77e5bcceSSpandan Das- + ":" 1797*77e5bcceSSpandan Das+ writer.attribute(enc, ARRAY_TYPE_LABEL, writer.getPrefix((String) arrType[0], false) + ":" 1798*77e5bcceSSpandan Das + arrType[1] + "[" + cnt + "]"); 1799*77e5bcceSSpandan Das+ } else { 1800*77e5bcceSSpandan Das+ // Get the namespace from mappings if available when arrayType is removed for .Net 1801*77e5bcceSSpandan Das+ if (itemsNamespace == null) { 1802*77e5bcceSSpandan Das+ itemsNamespace = (String) arrType[0]; 1803*77e5bcceSSpandan Das+ } 1804*77e5bcceSSpandan Das } 1805*77e5bcceSSpandan Das 1806*77e5bcceSSpandan Das boolean skipped = false; 1807*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/ValueWriter.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/ValueWriter.java 1808*77e5bcceSSpandan Dasnew file mode 100644 1809*77e5bcceSSpandan Dasindex 0000000..fdbaa21 1810*77e5bcceSSpandan Das--- /dev/null 1811*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/ValueWriter.java 1812*77e5bcceSSpandan Das@@ -0,0 +1,13 @@ 1813*77e5bcceSSpandan Das+package org.ksoap2.serialization; 1814*77e5bcceSSpandan Das+ 1815*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlSerializer; 1816*77e5bcceSSpandan Das+ 1817*77e5bcceSSpandan Das+import java.io.IOException; 1818*77e5bcceSSpandan Das+ 1819*77e5bcceSSpandan Das+/** 1820*77e5bcceSSpandan Das+ * Created by robocik on 2015-09-25. 1821*77e5bcceSSpandan Das+ */ 1822*77e5bcceSSpandan Das+public interface ValueWriter 1823*77e5bcceSSpandan Das+{ 1824*77e5bcceSSpandan Das+ void write(XmlSerializer writer) throws IOException; 1825*77e5bcceSSpandan Das+} 1826*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/transport/ServiceConnection.java b/ksoap2-base/src/main/java/org/ksoap2/transport/ServiceConnection.java 1827*77e5bcceSSpandan Dasindex 8e14ee7..9dd3837 100644 1828*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/transport/ServiceConnection.java 1829*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/transport/ServiceConnection.java 1830*77e5bcceSSpandan Das@@ -21,8 +21,10 @@ 1831*77e5bcceSSpandan Das 1832*77e5bcceSSpandan Das package org.ksoap2.transport; 1833*77e5bcceSSpandan Das 1834*77e5bcceSSpandan Das+import java.io.IOException; 1835*77e5bcceSSpandan Das+import java.io.InputStream; 1836*77e5bcceSSpandan Das+import java.io.OutputStream; 1837*77e5bcceSSpandan Das import java.util.List; 1838*77e5bcceSSpandan Das-import java.io.*; 1839*77e5bcceSSpandan Das 1840*77e5bcceSSpandan Das /** 1841*77e5bcceSSpandan Das * Interface to allow the abstraction of the raw transport information 1842*77e5bcceSSpandan Das@@ -58,6 +60,13 @@ public interface ServiceConnection { 1843*77e5bcceSSpandan Das */ 1844*77e5bcceSSpandan Das public List getResponseProperties() throws IOException; 1845*77e5bcceSSpandan Das 1846*77e5bcceSSpandan Das+ /** 1847*77e5bcceSSpandan Das+ * Returns the numerical HTTP status to the caller 1848*77e5bcceSSpandan Das+ * @return an integer status value 1849*77e5bcceSSpandan Das+ * @throws IOException 1850*77e5bcceSSpandan Das+ */ 1851*77e5bcceSSpandan Das+ public int getResponseCode() throws IOException; 1852*77e5bcceSSpandan Das+ 1853*77e5bcceSSpandan Das /** 1854*77e5bcceSSpandan Das * Set properties on the outgoing connection. 1855*77e5bcceSSpandan Das * 1856*77e5bcceSSpandan Das@@ -88,6 +97,8 @@ public interface ServiceConnection { 1857*77e5bcceSSpandan Das **/ 1858*77e5bcceSSpandan Das public void setFixedLengthStreamingMode(int contentLength); 1859*77e5bcceSSpandan Das 1860*77e5bcceSSpandan Das+ public void setChunkedStreamingMode(); 1861*77e5bcceSSpandan Das+ 1862*77e5bcceSSpandan Das /** 1863*77e5bcceSSpandan Das * Open and return the outputStream to the endpoint. 1864*77e5bcceSSpandan Das * 1865*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/transport/Transport.java b/ksoap2-base/src/main/java/org/ksoap2/transport/Transport.java 1866*77e5bcceSSpandan Dasindex b2f6587..2f3d523 100644 1867*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/transport/Transport.java 1868*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/transport/Transport.java 1869*77e5bcceSSpandan Das@@ -23,9 +23,13 @@ 1870*77e5bcceSSpandan Das 1871*77e5bcceSSpandan Das package org.ksoap2.transport; 1872*77e5bcceSSpandan Das 1873*77e5bcceSSpandan Das+import java.util.HashMap; 1874*77e5bcceSSpandan Das+import java.util.Iterator; 1875*77e5bcceSSpandan Das import java.util.List; 1876*77e5bcceSSpandan Das import java.io.*; 1877*77e5bcceSSpandan Das+import java.net.MalformedURLException; 1878*77e5bcceSSpandan Das import java.net.Proxy; 1879*77e5bcceSSpandan Das+import java.net.URL; 1880*77e5bcceSSpandan Das 1881*77e5bcceSSpandan Das import org.ksoap2.*; 1882*77e5bcceSSpandan Das import org.kxml2.io.*; 1883*77e5bcceSSpandan Das@@ -40,9 +44,9 @@ import org.xmlpull.v1.*; 1884*77e5bcceSSpandan Das abstract public class Transport { 1885*77e5bcceSSpandan Das 1886*77e5bcceSSpandan Das /** 1887*77e5bcceSSpandan Das- * Added to enable web service interactions on the emulator 1888*77e5bcceSSpandan Das- * to be debugged with Fiddler2 (Windows) but provides utility 1889*77e5bcceSSpandan Das- * for other proxy requirements. 1890*77e5bcceSSpandan Das+ * Added to enable web service interactions on the emulator to be debugged 1891*77e5bcceSSpandan Das+ * with Fiddler2 (Windows) but provides utility for other proxy 1892*77e5bcceSSpandan Das+ * requirements. 1893*77e5bcceSSpandan Das */ 1894*77e5bcceSSpandan Das protected Proxy proxy; 1895*77e5bcceSSpandan Das protected String url; 1896*77e5bcceSSpandan Das@@ -61,6 +65,12 @@ abstract public class Transport { 1897*77e5bcceSSpandan Das 1898*77e5bcceSSpandan Das private int bufferLength = ServiceConnection.DEFAULT_BUFFER_SIZE; 1899*77e5bcceSSpandan Das 1900*77e5bcceSSpandan Das+ private HashMap prefixes = new HashMap(); 1901*77e5bcceSSpandan Das+ 1902*77e5bcceSSpandan Das+ public HashMap getPrefixes() { 1903*77e5bcceSSpandan Das+ return prefixes; 1904*77e5bcceSSpandan Das+ } 1905*77e5bcceSSpandan Das+ 1906*77e5bcceSSpandan Das public Transport() { 1907*77e5bcceSSpandan Das } 1908*77e5bcceSSpandan Das 1909*77e5bcceSSpandan Das@@ -82,9 +92,12 @@ abstract public class Transport { 1910*77e5bcceSSpandan Das /** 1911*77e5bcceSSpandan Das * Construct the transport object 1912*77e5bcceSSpandan Das * 1913*77e5bcceSSpandan Das- * @param proxy Specifies the proxy server to use for 1914*77e5bcceSSpandan Das- * accessing the web service or <code>null</code> if a direct connection is available 1915*77e5bcceSSpandan Das- * @param url Specifies the web service url 1916*77e5bcceSSpandan Das+ * @param proxy 1917*77e5bcceSSpandan Das+ * Specifies the proxy server to use for accessing the web 1918*77e5bcceSSpandan Das+ * service or <code>null</code> if a direct connection is 1919*77e5bcceSSpandan Das+ * available 1920*77e5bcceSSpandan Das+ * @param url 1921*77e5bcceSSpandan Das+ * Specifies the web service url 1922*77e5bcceSSpandan Das * 1923*77e5bcceSSpandan Das */ 1924*77e5bcceSSpandan Das public Transport(Proxy proxy, String url) { 1925*77e5bcceSSpandan Das@@ -114,23 +127,30 @@ abstract public class Transport { 1926*77e5bcceSSpandan Das xp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); 1927*77e5bcceSSpandan Das xp.setInput(is, null); 1928*77e5bcceSSpandan Das envelope.parse(xp); 1929*77e5bcceSSpandan Das+ /* 1930*77e5bcceSSpandan Das+ * Fix memory leak when running on android in strict mode. Issue 133 1931*77e5bcceSSpandan Das+ */ 1932*77e5bcceSSpandan Das+ is.close(); 1933*77e5bcceSSpandan Das } 1934*77e5bcceSSpandan Das 1935*77e5bcceSSpandan Das /** 1936*77e5bcceSSpandan Das * Serializes the request. 1937*77e5bcceSSpandan Das */ 1938*77e5bcceSSpandan Das- protected byte[] createRequestData(SoapEnvelope envelope, String encoding) throws IOException { 1939*77e5bcceSSpandan Das- System.out.println("createRequestData"); 1940*77e5bcceSSpandan Das+ protected byte[] createRequestData(SoapEnvelope envelope, String encoding) 1941*77e5bcceSSpandan Das+ throws IOException { 1942*77e5bcceSSpandan Das ByteArrayOutputStream bos = new ByteArrayOutputStream(bufferLength); 1943*77e5bcceSSpandan Das byte result[] = null; 1944*77e5bcceSSpandan Das bos.write(xmlVersionTag.getBytes()); 1945*77e5bcceSSpandan Das- System.out.println("bos.write"); 1946*77e5bcceSSpandan Das XmlSerializer xw = new KXmlSerializer(); 1947*77e5bcceSSpandan Das- System.out.println("new KXmlSerializer"); 1948*77e5bcceSSpandan Das+ 1949*77e5bcceSSpandan Das+ final Iterator keysIter = prefixes.keySet().iterator(); 1950*77e5bcceSSpandan Das+ 1951*77e5bcceSSpandan Das xw.setOutput(bos, encoding); 1952*77e5bcceSSpandan Das- System.out.println("xw.setOutput"); 1953*77e5bcceSSpandan Das+ while (keysIter.hasNext()) { 1954*77e5bcceSSpandan Das+ String key = (String) keysIter.next(); 1955*77e5bcceSSpandan Das+ xw.setPrefix(key, (String) prefixes.get(key)); 1956*77e5bcceSSpandan Das+ } 1957*77e5bcceSSpandan Das envelope.write(xw); 1958*77e5bcceSSpandan Das- System.out.println("envelope.write"); 1959*77e5bcceSSpandan Das xw.flush(); 1960*77e5bcceSSpandan Das bos.write('\r'); 1961*77e5bcceSSpandan Das bos.write('\n'); 1962*77e5bcceSSpandan Das@@ -138,14 +158,14 @@ abstract public class Transport { 1963*77e5bcceSSpandan Das result = bos.toByteArray(); 1964*77e5bcceSSpandan Das xw = null; 1965*77e5bcceSSpandan Das bos = null; 1966*77e5bcceSSpandan Das- System.out.println("createRequestData end"); 1967*77e5bcceSSpandan Das return result; 1968*77e5bcceSSpandan Das } 1969*77e5bcceSSpandan Das 1970*77e5bcceSSpandan Das /** 1971*77e5bcceSSpandan Das * Serializes the request. 1972*77e5bcceSSpandan Das */ 1973*77e5bcceSSpandan Das- protected byte[] createRequestData(SoapEnvelope envelope) throws IOException { 1974*77e5bcceSSpandan Das+ protected byte[] createRequestData(SoapEnvelope envelope) 1975*77e5bcceSSpandan Das+ throws IOException { 1976*77e5bcceSSpandan Das return createRequestData(envelope, null); 1977*77e5bcceSSpandan Das } 1978*77e5bcceSSpandan Das 1979*77e5bcceSSpandan Das@@ -159,6 +179,12 @@ abstract public class Transport { 1980*77e5bcceSSpandan Das this.url = url; 1981*77e5bcceSSpandan Das } 1982*77e5bcceSSpandan Das 1983*77e5bcceSSpandan Das+ public String getUrl() 1984*77e5bcceSSpandan Das+ { 1985*77e5bcceSSpandan Das+ return url; 1986*77e5bcceSSpandan Das+ } 1987*77e5bcceSSpandan Das+ 1988*77e5bcceSSpandan Das+ 1989*77e5bcceSSpandan Das /** 1990*77e5bcceSSpandan Das * Sets the version tag for the outgoing soap call. Example <?xml 1991*77e5bcceSSpandan Das * version=\"1.0\" encoding=\"UTF-8\"?> 1992*77e5bcceSSpandan Das@@ -177,57 +203,94 @@ abstract public class Transport { 1993*77e5bcceSSpandan Das } 1994*77e5bcceSSpandan Das 1995*77e5bcceSSpandan Das /** 1996*77e5bcceSSpandan Das- * Perform a soap call with a given namespace and the given envelope providing 1997*77e5bcceSSpandan Das- * any extra headers that the user requires such as cookies. Headers that are 1998*77e5bcceSSpandan Das- * returned by the web service will be returned to the caller in the form of a 1999*77e5bcceSSpandan Das- * <code>List</code> of <code>HeaderProperty</code> instances. 2000*77e5bcceSSpandan Das+ * Perform a soap call with a given namespace and the given envelope 2001*77e5bcceSSpandan Das+ * providing any extra headers that the user requires such as cookies. 2002*77e5bcceSSpandan Das+ * Headers that are returned by the web service will be returned to the 2003*77e5bcceSSpandan Das+ * caller in the form of a <code>List</code> of <code>HeaderProperty</code> 2004*77e5bcceSSpandan Das+ * instances. 2005*77e5bcceSSpandan Das+ * 2006*77e5bcceSSpandan Das+ * @param soapAction 2007*77e5bcceSSpandan Das+ * the namespace with which to perform the call in. 2008*77e5bcceSSpandan Das+ * @param envelope 2009*77e5bcceSSpandan Das+ * the envelope the contains the information for the call. 2010*77e5bcceSSpandan Das+ * @param headers 2011*77e5bcceSSpandan Das+ * <code>List</code> of <code>HeaderProperty</code> headers to 2012*77e5bcceSSpandan Das+ * send with the SOAP request. 2013*77e5bcceSSpandan Das+ * 2014*77e5bcceSSpandan Das+ * @return Headers returned by the web service as a <code>List</code> of 2015*77e5bcceSSpandan Das+ * <code>HeaderProperty</code> instances. 2016*77e5bcceSSpandan Das+ */ 2017*77e5bcceSSpandan Das+ abstract public List call(String soapAction, SoapEnvelope envelope, 2018*77e5bcceSSpandan Das+ List headers) throws IOException, XmlPullParserException; 2019*77e5bcceSSpandan Das+ 2020*77e5bcceSSpandan Das+ /** 2021*77e5bcceSSpandan Das+ * Perform a soap call with a given namespace and the given envelope 2022*77e5bcceSSpandan Das+ * providing any extra headers that the user requires such as cookies. 2023*77e5bcceSSpandan Das+ * Headers that are returned by the web service will be returned to the 2024*77e5bcceSSpandan Das+ * caller in the form of a <code>List</code> of <code>HeaderProperty</code> 2025*77e5bcceSSpandan Das+ * instances. 2026*77e5bcceSSpandan Das * 2027*77e5bcceSSpandan Das- * @param targetNamespace 2028*77e5bcceSSpandan Das+ * @param soapAction 2029*77e5bcceSSpandan Das * the namespace with which to perform the call in. 2030*77e5bcceSSpandan Das * @param envelope 2031*77e5bcceSSpandan Das * the envelope the contains the information for the call. 2032*77e5bcceSSpandan Das * @param headers 2033*77e5bcceSSpandan Das- * <code>List</code> of <code>HeaderProperty</code> headers to send with the SOAP request. 2034*77e5bcceSSpandan Das+ * <code>List</code> of <code>HeaderProperty</code> headers to 2035*77e5bcceSSpandan Das+ * send with the SOAP request. 2036*77e5bcceSSpandan Das+ * @param outputFile 2037*77e5bcceSSpandan Das+ * a file to stream the response into rather than parsing it, 2038*77e5bcceSSpandan Das+ * streaming happens when file is not null 2039*77e5bcceSSpandan Das * 2040*77e5bcceSSpandan Das * @return Headers returned by the web service as a <code>List</code> of 2041*77e5bcceSSpandan Das- * <code>HeaderProperty</code> instances. 2042*77e5bcceSSpandan Das+ * <code>HeaderProperty</code> instances. 2043*77e5bcceSSpandan Das */ 2044*77e5bcceSSpandan Das- abstract public List call(String targetNamespace, SoapEnvelope envelope, List headers) 2045*77e5bcceSSpandan Das- throws IOException, XmlPullParserException; 2046*77e5bcceSSpandan Das+ abstract public List call(String soapAction, SoapEnvelope envelope, 2047*77e5bcceSSpandan Das+ List headers, File outputFile) throws IOException, 2048*77e5bcceSSpandan Das+ XmlPullParserException; 2049*77e5bcceSSpandan Das 2050*77e5bcceSSpandan Das /** 2051*77e5bcceSSpandan Das * Perform a soap call with a given namespace and the given envelope. 2052*77e5bcceSSpandan Das * 2053*77e5bcceSSpandan Das- * @param targetNamespace 2054*77e5bcceSSpandan Das+ * @param soapAction 2055*77e5bcceSSpandan Das * the namespace with which to perform the call in. 2056*77e5bcceSSpandan Das * @param envelope 2057*77e5bcceSSpandan Das * the envelope the contains the information for the call. 2058*77e5bcceSSpandan Das */ 2059*77e5bcceSSpandan Das- public void call(String targetNamespace, SoapEnvelope envelope) throws IOException, 2060*77e5bcceSSpandan Das- XmlPullParserException { 2061*77e5bcceSSpandan Das- call(targetNamespace, envelope, null); 2062*77e5bcceSSpandan Das+ public void call(String soapAction, SoapEnvelope envelope) 2063*77e5bcceSSpandan Das+ throws IOException, XmlPullParserException { 2064*77e5bcceSSpandan Das+ call(soapAction, envelope, null); 2065*77e5bcceSSpandan Das } 2066*77e5bcceSSpandan Das 2067*77e5bcceSSpandan Das /** 2068*77e5bcceSSpandan Das * Return the name of the host that is specified as the web service target 2069*77e5bcceSSpandan Das- * 2070*77e5bcceSSpandan Das+ * 2071*77e5bcceSSpandan Das * @return Host name 2072*77e5bcceSSpandan Das */ 2073*77e5bcceSSpandan Das- abstract public String getHost(); 2074*77e5bcceSSpandan Das+ public String getHost() throws MalformedURLException { 2075*77e5bcceSSpandan Das+ 2076*77e5bcceSSpandan Das+ return new URL(url).getHost(); 2077*77e5bcceSSpandan Das+ } 2078*77e5bcceSSpandan Das 2079*77e5bcceSSpandan Das /** 2080*77e5bcceSSpandan Das- * Return the port number of the host that is specified as the web service target 2081*77e5bcceSSpandan Das- * 2082*77e5bcceSSpandan Das+ * Return the port number of the host that is specified as the web service 2083*77e5bcceSSpandan Das+ * target 2084*77e5bcceSSpandan Das+ * 2085*77e5bcceSSpandan Das * @return Port number 2086*77e5bcceSSpandan Das */ 2087*77e5bcceSSpandan Das- abstract public int getPort(); 2088*77e5bcceSSpandan Das+ public int getPort() throws MalformedURLException { 2089*77e5bcceSSpandan Das+ 2090*77e5bcceSSpandan Das+ return new URL(url).getPort(); 2091*77e5bcceSSpandan Das+ } 2092*77e5bcceSSpandan Das 2093*77e5bcceSSpandan Das /** 2094*77e5bcceSSpandan Das * Return the path to the web service target 2095*77e5bcceSSpandan Das- * 2096*77e5bcceSSpandan Das+ * 2097*77e5bcceSSpandan Das * @return The URL's path 2098*77e5bcceSSpandan Das */ 2099*77e5bcceSSpandan Das- abstract public String getPath(); 2100*77e5bcceSSpandan Das+ public String getPath() throws MalformedURLException { 2101*77e5bcceSSpandan Das+ 2102*77e5bcceSSpandan Das+ return new URL(url).getPath(); 2103*77e5bcceSSpandan Das+ } 2104*77e5bcceSSpandan Das 2105*77e5bcceSSpandan Das abstract public ServiceConnection getServiceConnection() throws IOException; 2106*77e5bcceSSpandan Das } 2107*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/serialization/MarshalFloat.java b/ksoap2-j2se/src/main/java/org/ksoap2/serialization/MarshalFloat.java 2108*77e5bcceSSpandan Dasindex 71c8caa..61a5e2c 100644 2109*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/serialization/MarshalFloat.java 2110*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/serialization/MarshalFloat.java 2111*77e5bcceSSpandan Das@@ -27,8 +27,7 @@ import org.xmlpull.v1.*; 2112*77e5bcceSSpandan Das 2113*77e5bcceSSpandan Das public class MarshalFloat implements Marshal { 2114*77e5bcceSSpandan Das 2115*77e5bcceSSpandan Das- public Object readInstance(XmlPullParser parser, String namespace, String name, 2116*77e5bcceSSpandan Das- PropertyInfo propertyInfo) 2117*77e5bcceSSpandan Das+ public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo propertyInfo) 2118*77e5bcceSSpandan Das throws IOException, XmlPullParserException { 2119*77e5bcceSSpandan Das String stringValue = parser.nextText(); 2120*77e5bcceSSpandan Das Object result; 2121*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpResponseException.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpResponseException.java 2122*77e5bcceSSpandan Dasnew file mode 100644 2123*77e5bcceSSpandan Dasindex 0000000..f7fb866 2124*77e5bcceSSpandan Das--- /dev/null 2125*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpResponseException.java 2126*77e5bcceSSpandan Das@@ -0,0 +1,60 @@ 2127*77e5bcceSSpandan Das+package org.ksoap2.transport; 2128*77e5bcceSSpandan Das+ 2129*77e5bcceSSpandan Das+import java.io.IOException; 2130*77e5bcceSSpandan Das+import java.util.List; 2131*77e5bcceSSpandan Das+ 2132*77e5bcceSSpandan Das+/** 2133*77e5bcceSSpandan Das+ * HttpResponseException is an IOException that is to be thrown when a Http response code is different from 200. 2134*77e5bcceSSpandan Das+ * It allows for easier retrieval of the Http response code from the connection. 2135*77e5bcceSSpandan Das+ * 2136*77e5bcceSSpandan Das+ * @author Rui Pereira <[email protected]> 2137*77e5bcceSSpandan Das+ */ 2138*77e5bcceSSpandan Das+public class HttpResponseException extends IOException { 2139*77e5bcceSSpandan Das+ 2140*77e5bcceSSpandan Das+ private int statusCode; 2141*77e5bcceSSpandan Das+ private List responseHeaders; 2142*77e5bcceSSpandan Das+ 2143*77e5bcceSSpandan Das+ public HttpResponseException(int statusCode) { 2144*77e5bcceSSpandan Das+ super(); 2145*77e5bcceSSpandan Das+ this.statusCode = statusCode; 2146*77e5bcceSSpandan Das+ } 2147*77e5bcceSSpandan Das+ 2148*77e5bcceSSpandan Das+ public HttpResponseException(String detailMessage, int statusCode) { 2149*77e5bcceSSpandan Das+ super(detailMessage); 2150*77e5bcceSSpandan Das+ this.statusCode = statusCode; 2151*77e5bcceSSpandan Das+ } 2152*77e5bcceSSpandan Das+ 2153*77e5bcceSSpandan Das+ public HttpResponseException(String detailMessage, int statusCode,List responseHeaders) { 2154*77e5bcceSSpandan Das+ super(detailMessage); 2155*77e5bcceSSpandan Das+ this.statusCode = statusCode; 2156*77e5bcceSSpandan Das+ this.responseHeaders=responseHeaders; 2157*77e5bcceSSpandan Das+ } 2158*77e5bcceSSpandan Das+ 2159*77e5bcceSSpandan Das+ public HttpResponseException(String message, Throwable cause, int statusCode) { 2160*77e5bcceSSpandan Das+ super(message, cause); 2161*77e5bcceSSpandan Das+ this.statusCode = statusCode; 2162*77e5bcceSSpandan Das+ } 2163*77e5bcceSSpandan Das+ 2164*77e5bcceSSpandan Das+ public HttpResponseException(Throwable cause, int statusCode) { 2165*77e5bcceSSpandan Das+ super(cause); 2166*77e5bcceSSpandan Das+ this.statusCode = statusCode; 2167*77e5bcceSSpandan Das+ } 2168*77e5bcceSSpandan Das+ 2169*77e5bcceSSpandan Das+ /** 2170*77e5bcceSSpandan Das+ * Returns the unexpected Http response code 2171*77e5bcceSSpandan Das+ * 2172*77e5bcceSSpandan Das+ * @return response code 2173*77e5bcceSSpandan Das+ */ 2174*77e5bcceSSpandan Das+ public int getStatusCode() { 2175*77e5bcceSSpandan Das+ return statusCode; 2176*77e5bcceSSpandan Das+ } 2177*77e5bcceSSpandan Das+ 2178*77e5bcceSSpandan Das+ /** 2179*77e5bcceSSpandan Das+ * Returns all http headers from this response 2180*77e5bcceSSpandan Das+ * 2181*77e5bcceSSpandan Das+ * @return response code 2182*77e5bcceSSpandan Das+ */ 2183*77e5bcceSSpandan Das+ public List getResponseHeaders() { 2184*77e5bcceSSpandan Das+ return responseHeaders; 2185*77e5bcceSSpandan Das+ } 2186*77e5bcceSSpandan Das+} 2187*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java 2188*77e5bcceSSpandan Dasindex d92ac09..920ca60 100644 2189*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java 2190*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java 2191*77e5bcceSSpandan Das@@ -25,24 +25,21 @@ 2192*77e5bcceSSpandan Das 2193*77e5bcceSSpandan Das package org.ksoap2.transport; 2194*77e5bcceSSpandan Das 2195*77e5bcceSSpandan Das-import java.util.List; 2196*77e5bcceSSpandan Das-import java.util.zip.GZIPInputStream; 2197*77e5bcceSSpandan Das+import org.ksoap2.HeaderProperty; 2198*77e5bcceSSpandan Das+import org.ksoap2.SoapEnvelope; 2199*77e5bcceSSpandan Das+import org.ksoap2.serialization.*; 2200*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlPullParserException; 2201*77e5bcceSSpandan Das+ 2202*77e5bcceSSpandan Das import java.io.*; 2203*77e5bcceSSpandan Das-import java.net.MalformedURLException; 2204*77e5bcceSSpandan Das import java.net.Proxy; 2205*77e5bcceSSpandan Das-import java.net.URL; 2206*77e5bcceSSpandan Das- 2207*77e5bcceSSpandan Das-import org.ksoap2.*; 2208*77e5bcceSSpandan Das-import org.ksoap2.serialization.SoapSerializationEnvelope; 2209*77e5bcceSSpandan Das-import org.xmlpull.v1.*; 2210*77e5bcceSSpandan Das+import java.util.*; 2211*77e5bcceSSpandan Das+import java.util.zip.GZIPInputStream; 2212*77e5bcceSSpandan Das 2213*77e5bcceSSpandan Das /** 2214*77e5bcceSSpandan Das * A J2SE based HttpTransport layer. 2215*77e5bcceSSpandan Das */ 2216*77e5bcceSSpandan Das public class HttpTransportSE extends Transport { 2217*77e5bcceSSpandan Das 2218*77e5bcceSSpandan Das- private ServiceConnection serviceConnection; 2219*77e5bcceSSpandan Das- 2220*77e5bcceSSpandan Das /** 2221*77e5bcceSSpandan Das * Creates instance of HttpTransportSE with set url 2222*77e5bcceSSpandan Das * 2223*77e5bcceSSpandan Das@@ -107,249 +104,254 @@ public class HttpTransportSE extends Transport { 2224*77e5bcceSSpandan Das * the desired soapAction 2225*77e5bcceSSpandan Das * @param envelope 2226*77e5bcceSSpandan Das * the envelope containing the information for the soap call. 2227*77e5bcceSSpandan Das+ * @throws HttpResponseException 2228*77e5bcceSSpandan Das * @throws IOException 2229*77e5bcceSSpandan Das * @throws XmlPullParserException 2230*77e5bcceSSpandan Das */ 2231*77e5bcceSSpandan Das- public void call(String soapAction, SoapEnvelope envelope) throws IOException, 2232*77e5bcceSSpandan Das- XmlPullParserException { 2233*77e5bcceSSpandan Das- 2234*77e5bcceSSpandan Das+ public void call(String soapAction, SoapEnvelope envelope) 2235*77e5bcceSSpandan Das+ throws HttpResponseException, IOException, XmlPullParserException { 2236*77e5bcceSSpandan Das+ 2237*77e5bcceSSpandan Das call(soapAction, envelope, null); 2238*77e5bcceSSpandan Das } 2239*77e5bcceSSpandan Das 2240*77e5bcceSSpandan Das+ public List call(String soapAction, SoapEnvelope envelope, List headers) 2241*77e5bcceSSpandan Das+ throws HttpResponseException, IOException, XmlPullParserException { 2242*77e5bcceSSpandan Das+ return call(soapAction, envelope, headers, null); 2243*77e5bcceSSpandan Das+ } 2244*77e5bcceSSpandan Das+ 2245*77e5bcceSSpandan Das /** 2246*77e5bcceSSpandan Das- * 2247*77e5bcceSSpandan Das- * set the desired soapAction header field 2248*77e5bcceSSpandan Das- * 2249*77e5bcceSSpandan Das+ * Perform a soap call with a given namespace and the given envelope providing 2250*77e5bcceSSpandan Das+ * any extra headers that the user requires such as cookies. Headers that are 2251*77e5bcceSSpandan Das+ * returned by the web service will be returned to the caller in the form of a 2252*77e5bcceSSpandan Das+ * <code>List</code> of <code>HeaderProperty</code> instances. 2253*77e5bcceSSpandan Das+ * 2254*77e5bcceSSpandan Das * @param soapAction 2255*77e5bcceSSpandan Das- * the desired soapAction 2256*77e5bcceSSpandan Das+ * the namespace with which to perform the call in. 2257*77e5bcceSSpandan Das * @param envelope 2258*77e5bcceSSpandan Das- * the envelope containing the information for the soap call. 2259*77e5bcceSSpandan Das+ * the envelope the contains the information for the call. 2260*77e5bcceSSpandan Das * @param headers 2261*77e5bcceSSpandan Das- * a list of HeaderProperties to be http header properties when establishing the connection 2262*77e5bcceSSpandan Das+ * <code>List</code> of <code>HeaderProperty</code> headers to send with the SOAP request. 2263*77e5bcceSSpandan Das+ * @param outputFile 2264*77e5bcceSSpandan Das+ * a file to stream the response into rather than parsing it, streaming happens when file is not null 2265*77e5bcceSSpandan Das * 2266*77e5bcceSSpandan Das- * @return <code>CookieJar</code> with any cookies sent by the server 2267*77e5bcceSSpandan Das- * @throws IOException 2268*77e5bcceSSpandan Das- * @throws XmlPullParserException 2269*77e5bcceSSpandan Das+ * @return Headers returned by the web service as a <code>List</code> of 2270*77e5bcceSSpandan Das+ * <code>HeaderProperty</code> instances. 2271*77e5bcceSSpandan Das+ * 2272*77e5bcceSSpandan Das+ * @throws HttpResponseException 2273*77e5bcceSSpandan Das+ * an IOException when Http response code is different from 200 2274*77e5bcceSSpandan Das */ 2275*77e5bcceSSpandan Das- public List call(String soapAction, SoapEnvelope envelope, List headers) 2276*77e5bcceSSpandan Das- throws IOException, XmlPullParserException { 2277*77e5bcceSSpandan Das+ public List call(String soapAction, SoapEnvelope envelope, List headers, File outputFile) 2278*77e5bcceSSpandan Das+ throws HttpResponseException, IOException, XmlPullParserException { 2279*77e5bcceSSpandan Das 2280*77e5bcceSSpandan Das if (soapAction == null) { 2281*77e5bcceSSpandan Das soapAction = "\"\""; 2282*77e5bcceSSpandan Das } 2283*77e5bcceSSpandan Das 2284*77e5bcceSSpandan Das- System.out.println("call action:" + soapAction); 2285*77e5bcceSSpandan Das byte[] requestData = createRequestData(envelope, "UTF-8"); 2286*77e5bcceSSpandan Das 2287*77e5bcceSSpandan Das- if (requestData != null) { 2288*77e5bcceSSpandan Das- requestDump = debug ? new String(requestData) : null; 2289*77e5bcceSSpandan Das- } 2290*77e5bcceSSpandan Das- else { 2291*77e5bcceSSpandan Das- requestDump = null; 2292*77e5bcceSSpandan Das- } 2293*77e5bcceSSpandan Das+ requestDump = debug ? new String(requestData) : null; 2294*77e5bcceSSpandan Das responseDump = null; 2295*77e5bcceSSpandan Das- 2296*77e5bcceSSpandan Das- System.out.println("requestDump:" + requestDump); 2297*77e5bcceSSpandan Das+ System.out.println("requestDump: " + requestDump); 2298*77e5bcceSSpandan Das ServiceConnection connection = getServiceConnection(); 2299*77e5bcceSSpandan Das- System.out.println("connection:" + connection); 2300*77e5bcceSSpandan Das 2301*77e5bcceSSpandan Das connection.setRequestProperty("User-Agent", USER_AGENT); 2302*77e5bcceSSpandan Das // SOAPAction is not a valid header for VER12 so do not add 2303*77e5bcceSSpandan Das // it 2304*77e5bcceSSpandan Das // @see "http://code.google.com/p/ksoap2-android/issues/detail?id=67 2305*77e5bcceSSpandan Das- System.out.println("envelope:" + envelope); 2306*77e5bcceSSpandan Das- if (envelope != null) { 2307*77e5bcceSSpandan Das- if (envelope.version != SoapSerializationEnvelope.VER12) { 2308*77e5bcceSSpandan Das- connection.setRequestProperty("SOAPAction", soapAction); 2309*77e5bcceSSpandan Das- } 2310*77e5bcceSSpandan Das+ if (envelope.version != SoapSerializationEnvelope.VER12) { 2311*77e5bcceSSpandan Das+ connection.setRequestProperty("SOAPAction", soapAction); 2312*77e5bcceSSpandan Das+ } 2313*77e5bcceSSpandan Das 2314*77e5bcceSSpandan Das- if (envelope.version == SoapSerializationEnvelope.VER12) { 2315*77e5bcceSSpandan Das- connection.setRequestProperty("Content-Type", CONTENT_TYPE_SOAP_XML_CHARSET_UTF_8); 2316*77e5bcceSSpandan Das- } else { 2317*77e5bcceSSpandan Das- connection.setRequestProperty("Content-Type", CONTENT_TYPE_XML_CHARSET_UTF_8); 2318*77e5bcceSSpandan Das- } 2319*77e5bcceSSpandan Das+ if (envelope.version == SoapSerializationEnvelope.VER12) { 2320*77e5bcceSSpandan Das+ connection.setRequestProperty("Content-Type", CONTENT_TYPE_SOAP_XML_CHARSET_UTF_8); 2321*77e5bcceSSpandan Das+ } else { 2322*77e5bcceSSpandan Das+ connection.setRequestProperty("Content-Type", CONTENT_TYPE_XML_CHARSET_UTF_8); 2323*77e5bcceSSpandan Das+ } 2324*77e5bcceSSpandan Das 2325*77e5bcceSSpandan Das- connection.setRequestProperty("Connection", "close"); 2326*77e5bcceSSpandan Das- connection.setRequestProperty("Accept-Encoding", "gzip"); 2327*77e5bcceSSpandan Das- connection.setRequestProperty("Content-Length", "" + requestData.length); 2328*77e5bcceSSpandan Das+ // this seems to cause issues so we are removing it 2329*77e5bcceSSpandan Das+ //connection.setRequestProperty("Connection", "close"); 2330*77e5bcceSSpandan Das+ connection.setRequestProperty("Accept-Encoding", "gzip"); 2331*77e5bcceSSpandan Das 2332*77e5bcceSSpandan Das- //M: Retry for HTTP Authentication 2333*77e5bcceSSpandan Das- //connection.setFixedLengthStreamingMode(requestData.length); 2334*77e5bcceSSpandan Das 2335*77e5bcceSSpandan Das- // Pass the headers provided by the user along with the call 2336*77e5bcceSSpandan Das- if (headers != null) { 2337*77e5bcceSSpandan Das- for (int i = 0; i < headers.size(); i++) { 2338*77e5bcceSSpandan Das- HeaderProperty hp = (HeaderProperty) headers.get(i); 2339*77e5bcceSSpandan Das- connection.setRequestProperty(hp.getKey(), hp.getValue()); 2340*77e5bcceSSpandan Das- } 2341*77e5bcceSSpandan Das+ // Pass the headers provided by the user along with the call 2342*77e5bcceSSpandan Das+ if (headers != null) { 2343*77e5bcceSSpandan Das+ for (int i = 0; i < headers.size(); i++) { 2344*77e5bcceSSpandan Das+ HeaderProperty hp = (HeaderProperty) headers.get(i); 2345*77e5bcceSSpandan Das+ connection.setRequestProperty(hp.getKey(), hp.getValue()); 2346*77e5bcceSSpandan Das } 2347*77e5bcceSSpandan Das- 2348*77e5bcceSSpandan Das- connection.setRequestMethod("POST"); 2349*77e5bcceSSpandan Das- 2350*77e5bcceSSpandan Das- } 2351*77e5bcceSSpandan Das- else { 2352*77e5bcceSSpandan Das- connection.setRequestProperty("Connection", "close"); 2353*77e5bcceSSpandan Das- connection.setRequestProperty("Accept-Encoding", "gzip"); 2354*77e5bcceSSpandan Das- connection.setRequestMethod("GET"); 2355*77e5bcceSSpandan Das } 2356*77e5bcceSSpandan Das 2357*77e5bcceSSpandan Das- if (requestData != null) { 2358*77e5bcceSSpandan Das- OutputStream os = connection.openOutputStream(); 2359*77e5bcceSSpandan Das- 2360*77e5bcceSSpandan Das- os.write(requestData, 0, requestData.length); 2361*77e5bcceSSpandan Das- os.flush(); 2362*77e5bcceSSpandan Das- os.close(); 2363*77e5bcceSSpandan Das- requestData = null; 2364*77e5bcceSSpandan Das- } 2365*77e5bcceSSpandan Das- InputStream is; 2366*77e5bcceSSpandan Das+ connection.setRequestMethod("POST"); 2367*77e5bcceSSpandan Das+ sendData(requestData, connection,envelope); 2368*77e5bcceSSpandan Das+ requestData = null; 2369*77e5bcceSSpandan Das+ InputStream is = null; 2370*77e5bcceSSpandan Das List retHeaders = null; 2371*77e5bcceSSpandan Das+ byte[] buf = null; // To allow releasing the resource after used 2372*77e5bcceSSpandan Das+ int contentLength = 8192; // To determine the size of the response and adjust buffer size 2373*77e5bcceSSpandan Das boolean gZippedContent = false; 2374*77e5bcceSSpandan Das- boolean bcaCert = false; 2375*77e5bcceSSpandan Das+ boolean xmlContent = false; 2376*77e5bcceSSpandan Das+ int status = connection.getResponseCode(); 2377*77e5bcceSSpandan Das 2378*77e5bcceSSpandan Das try { 2379*77e5bcceSSpandan Das retHeaders = connection.getResponseProperties(); 2380*77e5bcceSSpandan Das- System.out.println("[HttpTransportSE] retHeaders = " + retHeaders); 2381*77e5bcceSSpandan Das+ 2382*77e5bcceSSpandan Das for (int i = 0; i < retHeaders.size(); i++) { 2383*77e5bcceSSpandan Das- HeaderProperty hp = (HeaderProperty) retHeaders.get(i); 2384*77e5bcceSSpandan Das+ HeaderProperty hp = (HeaderProperty)retHeaders.get(i); 2385*77e5bcceSSpandan Das // HTTP response code has null key 2386*77e5bcceSSpandan Das if (null == hp.getKey()) { 2387*77e5bcceSSpandan Das continue; 2388*77e5bcceSSpandan Das } 2389*77e5bcceSSpandan Das+ 2390*77e5bcceSSpandan Das+ // If we know the size of the response, we should use the size to initiate vars 2391*77e5bcceSSpandan Das+ if (hp.getKey().equalsIgnoreCase("content-length") ) { 2392*77e5bcceSSpandan Das+ if ( hp.getValue() != null ) { 2393*77e5bcceSSpandan Das+ try { 2394*77e5bcceSSpandan Das+ contentLength = Integer.parseInt( hp.getValue() ); 2395*77e5bcceSSpandan Das+ } catch ( NumberFormatException nfe ) { 2396*77e5bcceSSpandan Das+ contentLength = 8192; 2397*77e5bcceSSpandan Das+ } 2398*77e5bcceSSpandan Das+ } 2399*77e5bcceSSpandan Das+ } 2400*77e5bcceSSpandan Das+ 2401*77e5bcceSSpandan Das+ 2402*77e5bcceSSpandan Das+ // Check the content-type header to see if we're getting back XML, in case of a 2403*77e5bcceSSpandan Das+ // SOAP fault on 500 codes 2404*77e5bcceSSpandan Das+ if (hp.getKey().equalsIgnoreCase("Content-Type") 2405*77e5bcceSSpandan Das+ && hp.getValue().contains("xml")) { 2406*77e5bcceSSpandan Das+ xmlContent = true; 2407*77e5bcceSSpandan Das+ } 2408*77e5bcceSSpandan Das+ 2409*77e5bcceSSpandan Das+ 2410*77e5bcceSSpandan Das // ignoring case since users found that all smaller case is used on some server 2411*77e5bcceSSpandan Das // and even if it is wrong according to spec, we rather have it work.. 2412*77e5bcceSSpandan Das if (hp.getKey().equalsIgnoreCase("Content-Encoding") 2413*77e5bcceSSpandan Das- && hp.getValue().equalsIgnoreCase("gzip")) { 2414*77e5bcceSSpandan Das+ && hp.getValue().equalsIgnoreCase("gzip")) { 2415*77e5bcceSSpandan Das gZippedContent = true; 2416*77e5bcceSSpandan Das } 2417*77e5bcceSSpandan Das } 2418*77e5bcceSSpandan Das- if (gZippedContent) { 2419*77e5bcceSSpandan Das- is = getUnZippedInputStream(connection.openInputStream()); 2420*77e5bcceSSpandan Das- } else { 2421*77e5bcceSSpandan Das- is = connection.openInputStream(); 2422*77e5bcceSSpandan Das- } 2423*77e5bcceSSpandan Das- } catch (IOException e) { 2424*77e5bcceSSpandan Das- if (gZippedContent) { 2425*77e5bcceSSpandan Das- is = getUnZippedInputStream(connection.getErrorStream()); 2426*77e5bcceSSpandan Das- } else { 2427*77e5bcceSSpandan Das- is = connection.getErrorStream(); 2428*77e5bcceSSpandan Das- } 2429*77e5bcceSSpandan Das 2430*77e5bcceSSpandan Das- if (is == null) { 2431*77e5bcceSSpandan Das- connection.disconnect(); 2432*77e5bcceSSpandan Das- throw (e); 2433*77e5bcceSSpandan Das+ //first check the response code.... 2434*77e5bcceSSpandan Das+ if (status != 200 && status != 202) { 2435*77e5bcceSSpandan Das+ //202 is a correct status returned by WCF OneWay operation 2436*77e5bcceSSpandan Das+ throw new HttpResponseException("HTTP request failed, HTTP status: " + status, status,retHeaders); 2437*77e5bcceSSpandan Das } 2438*77e5bcceSSpandan Das- } 2439*77e5bcceSSpandan Das- 2440*77e5bcceSSpandan Das- if (debug) { 2441*77e5bcceSSpandan Das- ByteArrayOutputStream bos = new ByteArrayOutputStream(); 2442*77e5bcceSSpandan Das- byte[] buf = new byte[8192]; 2443*77e5bcceSSpandan Das 2444*77e5bcceSSpandan Das- while (true) { 2445*77e5bcceSSpandan Das- int rd = is.read(buf, 0, 8192); 2446*77e5bcceSSpandan Das- if (rd == -1) { 2447*77e5bcceSSpandan Das- break; 2448*77e5bcceSSpandan Das+ if (contentLength > 0) { 2449*77e5bcceSSpandan Das+ if (gZippedContent) { 2450*77e5bcceSSpandan Das+ is = getUnZippedInputStream( 2451*77e5bcceSSpandan Das+ new BufferedInputStream(connection.openInputStream(),contentLength)); 2452*77e5bcceSSpandan Das+ } else { 2453*77e5bcceSSpandan Das+ is = new BufferedInputStream(connection.openInputStream(),contentLength); 2454*77e5bcceSSpandan Das+ } 2455*77e5bcceSSpandan Das+ } 2456*77e5bcceSSpandan Das+ } catch (IOException e) { 2457*77e5bcceSSpandan Das+ if (contentLength > 0) { 2458*77e5bcceSSpandan Das+ if(gZippedContent) { 2459*77e5bcceSSpandan Das+ is = getUnZippedInputStream( 2460*77e5bcceSSpandan Das+ new BufferedInputStream(connection.getErrorStream(),contentLength)); 2461*77e5bcceSSpandan Das+ } else { 2462*77e5bcceSSpandan Das+ is = new BufferedInputStream(connection.getErrorStream(),contentLength); 2463*77e5bcceSSpandan Das } 2464*77e5bcceSSpandan Das- bos.write(buf, 0, rd); 2465*77e5bcceSSpandan Das } 2466*77e5bcceSSpandan Das 2467*77e5bcceSSpandan Das- bos.flush(); 2468*77e5bcceSSpandan Das- buf = bos.toByteArray(); 2469*77e5bcceSSpandan Das+ if ( e instanceof HttpResponseException) { 2470*77e5bcceSSpandan Das+ if (!xmlContent) { 2471*77e5bcceSSpandan Das+ if (debug && is != null) { 2472*77e5bcceSSpandan Das+ //go ahead and read the error stream into the debug buffers/file if needed. 2473*77e5bcceSSpandan Das+ readDebug(is, contentLength, outputFile); 2474*77e5bcceSSpandan Das+ } 2475*77e5bcceSSpandan Das 2476*77e5bcceSSpandan Das- responseDump = new String(buf); 2477*77e5bcceSSpandan Das+ //we never want to drop through to attempting to parse the HTTP error stream as a SOAP response. 2478*77e5bcceSSpandan Das+ connection.disconnect(); 2479*77e5bcceSSpandan Das+ throw e; 2480*77e5bcceSSpandan Das+ } 2481*77e5bcceSSpandan Das+ } 2482*77e5bcceSSpandan Das+ } 2483*77e5bcceSSpandan Das 2484*77e5bcceSSpandan Das- System.out.println("responseDump:" + responseDump); 2485*77e5bcceSSpandan Das- is.close(); 2486*77e5bcceSSpandan Das- is = new ByteArrayInputStream(buf); 2487*77e5bcceSSpandan Das+ if (debug) { 2488*77e5bcceSSpandan Das+ is = readDebug(is, contentLength, outputFile); 2489*77e5bcceSSpandan Das } 2490*77e5bcceSSpandan Das 2491*77e5bcceSSpandan Das- if (envelope != null) { 2492*77e5bcceSSpandan Das- parseResponse(envelope, is); 2493*77e5bcceSSpandan Das+ if(is!=null) 2494*77e5bcceSSpandan Das+ { 2495*77e5bcceSSpandan Das+ parseResponse(envelope, is,retHeaders); 2496*77e5bcceSSpandan Das } 2497*77e5bcceSSpandan Das 2498*77e5bcceSSpandan Das+ // release all resources 2499*77e5bcceSSpandan Das+ // input stream is will be released inside parseResponse 2500*77e5bcceSSpandan Das+ is = null; 2501*77e5bcceSSpandan Das+ buf = null; 2502*77e5bcceSSpandan Das+ //This fixes Issue 173 read my explanation here: https://code.google.com/p/ksoap2-android/issues/detail?id=173 2503*77e5bcceSSpandan Das+ connection.disconnect(); 2504*77e5bcceSSpandan Das+ connection = null; 2505*77e5bcceSSpandan Das return retHeaders; 2506*77e5bcceSSpandan Das } 2507*77e5bcceSSpandan Das 2508*77e5bcceSSpandan Das- private InputStream getUnZippedInputStream(InputStream inputStream) throws IOException { 2509*77e5bcceSSpandan Das- /* workaround for Android 2.3 2510*77e5bcceSSpandan Das- (see http://stackoverflow.com/questions/5131016/) 2511*77e5bcceSSpandan Das- */ 2512*77e5bcceSSpandan Das- try { 2513*77e5bcceSSpandan Das- return (GZIPInputStream) inputStream; 2514*77e5bcceSSpandan Das- } catch (ClassCastException e) { 2515*77e5bcceSSpandan Das- return new GZIPInputStream(inputStream); 2516*77e5bcceSSpandan Das- } 2517*77e5bcceSSpandan Das- } 2518*77e5bcceSSpandan Das+ protected void sendData(byte[] requestData, ServiceConnection connection, SoapEnvelope envelope) 2519*77e5bcceSSpandan Das+ throws IOException 2520*77e5bcceSSpandan Das+ { 2521*77e5bcceSSpandan Das+ connection.setRequestProperty("Content-Length", "" + requestData.length); 2522*77e5bcceSSpandan Das+ connection.setFixedLengthStreamingMode(requestData.length); 2523*77e5bcceSSpandan Das 2524*77e5bcceSSpandan Das- public ServiceConnection getServiceConnection() throws IOException { 2525*77e5bcceSSpandan Das- if (serviceConnection == null) { 2526*77e5bcceSSpandan Das- System.out.println("new ServiceConnectionSE:" + proxy + " " + url + " " + timeout); 2527*77e5bcceSSpandan Das- serviceConnection = new ServiceConnectionSE(proxy, url, timeout); 2528*77e5bcceSSpandan Das- } 2529*77e5bcceSSpandan Das- return serviceConnection; 2530*77e5bcceSSpandan Das+ OutputStream os = connection.openOutputStream(); 2531*77e5bcceSSpandan Das+ os.write(requestData, 0, requestData.length); 2532*77e5bcceSSpandan Das+ os.flush(); 2533*77e5bcceSSpandan Das+ os.close(); 2534*77e5bcceSSpandan Das } 2535*77e5bcceSSpandan Das 2536*77e5bcceSSpandan Das- public String getHost() { 2537*77e5bcceSSpandan Das- 2538*77e5bcceSSpandan Das- String retVal = null; 2539*77e5bcceSSpandan Das- 2540*77e5bcceSSpandan Das- try { 2541*77e5bcceSSpandan Das- retVal = new URL(url).getHost(); 2542*77e5bcceSSpandan Das- } catch (MalformedURLException e) { 2543*77e5bcceSSpandan Das- e.printStackTrace(); 2544*77e5bcceSSpandan Das- } 2545*77e5bcceSSpandan Das- 2546*77e5bcceSSpandan Das- return retVal; 2547*77e5bcceSSpandan Das+ protected void parseResponse(SoapEnvelope envelope, InputStream is,List returnedHeaders) 2548*77e5bcceSSpandan Das+ throws XmlPullParserException, IOException 2549*77e5bcceSSpandan Das+ { 2550*77e5bcceSSpandan Das+ parseResponse(envelope, is); 2551*77e5bcceSSpandan Das } 2552*77e5bcceSSpandan Das 2553*77e5bcceSSpandan Das- public int getPort() { 2554*77e5bcceSSpandan Das- 2555*77e5bcceSSpandan Das- int retVal = -1; 2556*77e5bcceSSpandan Das 2557*77e5bcceSSpandan Das- try { 2558*77e5bcceSSpandan Das- retVal = new URL(url).getPort(); 2559*77e5bcceSSpandan Das- } catch (MalformedURLException e) { 2560*77e5bcceSSpandan Das- e.printStackTrace(); 2561*77e5bcceSSpandan Das+ private InputStream readDebug(InputStream is, int contentLength, File outputFile) throws IOException { 2562*77e5bcceSSpandan Das+ OutputStream bos; 2563*77e5bcceSSpandan Das+ if (outputFile != null) { 2564*77e5bcceSSpandan Das+ bos = new FileOutputStream(outputFile); 2565*77e5bcceSSpandan Das+ } else { 2566*77e5bcceSSpandan Das+ // If known use the size if not use default value 2567*77e5bcceSSpandan Das+ bos = new ByteArrayOutputStream( (contentLength > 0 ) ? contentLength : 256*1024); 2568*77e5bcceSSpandan Das } 2569*77e5bcceSSpandan Das 2570*77e5bcceSSpandan Das- return retVal; 2571*77e5bcceSSpandan Das- } 2572*77e5bcceSSpandan Das- 2573*77e5bcceSSpandan Das- public String getPath() { 2574*77e5bcceSSpandan Das- 2575*77e5bcceSSpandan Das- String retVal = null; 2576*77e5bcceSSpandan Das+ byte[] buf = new byte[256]; 2577*77e5bcceSSpandan Das 2578*77e5bcceSSpandan Das- try { 2579*77e5bcceSSpandan Das- retVal = new URL(url).getPath(); 2580*77e5bcceSSpandan Das- } catch (MalformedURLException e) { 2581*77e5bcceSSpandan Das- e.printStackTrace(); 2582*77e5bcceSSpandan Das+ while (true) { 2583*77e5bcceSSpandan Das+ int rd = is.read(buf, 0, 256); 2584*77e5bcceSSpandan Das+ if (rd == -1) { 2585*77e5bcceSSpandan Das+ break; 2586*77e5bcceSSpandan Das+ } 2587*77e5bcceSSpandan Das+ bos.write(buf, 0, rd); 2588*77e5bcceSSpandan Das } 2589*77e5bcceSSpandan Das 2590*77e5bcceSSpandan Das- return retVal; 2591*77e5bcceSSpandan Das- } 2592*77e5bcceSSpandan Das- 2593*77e5bcceSSpandan Das- public String getQuery() { 2594*77e5bcceSSpandan Das- 2595*77e5bcceSSpandan Das- String retVal = null; 2596*77e5bcceSSpandan Das- 2597*77e5bcceSSpandan Das- try { 2598*77e5bcceSSpandan Das- retVal = new URL(url).getQuery(); 2599*77e5bcceSSpandan Das- } catch (MalformedURLException e) { 2600*77e5bcceSSpandan Das- e.printStackTrace(); 2601*77e5bcceSSpandan Das+ bos.flush(); 2602*77e5bcceSSpandan Das+ if (bos instanceof ByteArrayOutputStream) { 2603*77e5bcceSSpandan Das+ buf = ((ByteArrayOutputStream) bos).toByteArray(); 2604*77e5bcceSSpandan Das+ } 2605*77e5bcceSSpandan Das+ bos = null; 2606*77e5bcceSSpandan Das+ responseDump = new String(buf); 2607*77e5bcceSSpandan Das+ is.close(); 2608*77e5bcceSSpandan Das+ System.out.println("responseDump: " + requestDump); 2609*77e5bcceSSpandan Das+ if (outputFile != null) { 2610*77e5bcceSSpandan Das+ return new FileInputStream(outputFile); 2611*77e5bcceSSpandan Das+ } else { 2612*77e5bcceSSpandan Das+ return new ByteArrayInputStream(buf); 2613*77e5bcceSSpandan Das } 2614*77e5bcceSSpandan Das- 2615*77e5bcceSSpandan Das- return retVal; 2616*77e5bcceSSpandan Das } 2617*77e5bcceSSpandan Das 2618*77e5bcceSSpandan Das- /** 2619*77e5bcceSSpandan Das- * @hide 2620*77e5bcceSSpandan Das- */ 2621*77e5bcceSSpandan Das- public byte[] getRequestData(SoapEnvelope envelope, String encoding) { 2622*77e5bcceSSpandan Das+ private InputStream getUnZippedInputStream(InputStream inputStream) throws IOException { 2623*77e5bcceSSpandan Das+ /* workaround for Android 2.3 2624*77e5bcceSSpandan Das+ (see http://stackoverflow.com/questions/5131016/) 2625*77e5bcceSSpandan Das+ */ 2626*77e5bcceSSpandan Das try { 2627*77e5bcceSSpandan Das- return createRequestData(envelope, encoding); 2628*77e5bcceSSpandan Das- } catch (Exception e) { 2629*77e5bcceSSpandan Das- e.printStackTrace(); 2630*77e5bcceSSpandan Das+ return (GZIPInputStream) inputStream; 2631*77e5bcceSSpandan Das+ } catch (ClassCastException e) { 2632*77e5bcceSSpandan Das+ return new GZIPInputStream(inputStream); 2633*77e5bcceSSpandan Das } 2634*77e5bcceSSpandan Das+ } 2635*77e5bcceSSpandan Das 2636*77e5bcceSSpandan Das- return null; 2637*77e5bcceSSpandan Das+ public ServiceConnection getServiceConnection() throws IOException { 2638*77e5bcceSSpandan Das+ return new ServiceConnectionSE(proxy, url, timeout); 2639*77e5bcceSSpandan Das } 2640*77e5bcceSSpandan Das } 2641*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsServiceConnectionSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsServiceConnectionSE.java 2642*77e5bcceSSpandan Dasindex 9ad9ba9..376c7d8 100644 2643*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsServiceConnectionSE.java 2644*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsServiceConnectionSE.java 2645*77e5bcceSSpandan Das@@ -1,21 +1,16 @@ 2646*77e5bcceSSpandan Das 2647*77e5bcceSSpandan Das package org.ksoap2.transport; 2648*77e5bcceSSpandan Das 2649*77e5bcceSSpandan Das+import org.ksoap2.HeaderProperty; 2650*77e5bcceSSpandan Das+ 2651*77e5bcceSSpandan Das+import javax.net.ssl.HttpsURLConnection; 2652*77e5bcceSSpandan Das+import javax.net.ssl.SSLSocketFactory; 2653*77e5bcceSSpandan Das import java.io.IOException; 2654*77e5bcceSSpandan Das import java.io.InputStream; 2655*77e5bcceSSpandan Das import java.io.OutputStream; 2656*77e5bcceSSpandan Das+import java.net.Proxy; 2657*77e5bcceSSpandan Das import java.net.URL; 2658*77e5bcceSSpandan Das-import java.util.Iterator; 2659*77e5bcceSSpandan Das-import java.util.LinkedList; 2660*77e5bcceSSpandan Das-import java.util.Map; 2661*77e5bcceSSpandan Das-import java.util.List; 2662*77e5bcceSSpandan Das-import java.util.Set; 2663*77e5bcceSSpandan Das- 2664*77e5bcceSSpandan Das-import javax.net.ssl.HostnameVerifier; 2665*77e5bcceSSpandan Das-import javax.net.ssl.SSLSocketFactory; 2666*77e5bcceSSpandan Das-import javax.net.ssl.HttpsURLConnection; 2667*77e5bcceSSpandan Das-//import com.android.okhttp.internal.http.HttpsURLConnectionImpl; 2668*77e5bcceSSpandan Das-import org.ksoap2.HeaderProperty; 2669*77e5bcceSSpandan Das+import java.util.*; 2670*77e5bcceSSpandan Das 2671*77e5bcceSSpandan Das /** 2672*77e5bcceSSpandan Das * HttpsServiceConnectionSE is a service connection that uses a https url connection and requires explicit setting of 2673*77e5bcceSSpandan Das@@ -49,10 +44,29 @@ public class HttpsServiceConnectionSE implements ServiceConnection { 2674*77e5bcceSSpandan Das * @param timeout the timeout for the connection in milliseconds 2675*77e5bcceSSpandan Das * @throws IOException 2676*77e5bcceSSpandan Das */ 2677*77e5bcceSSpandan Das- public HttpsServiceConnectionSE(String host, int port, String file, 2678*77e5bcceSSpandan Das- int timeout) throws IOException { 2679*77e5bcceSSpandan Das- connection = (HttpsURLConnection) new URL(HttpsTransportSE.PROTOCOL, host, port, file) 2680*77e5bcceSSpandan Das- .openConnection(); 2681*77e5bcceSSpandan Das+ public HttpsServiceConnectionSE(String host, int port, String file, int timeout) throws IOException { 2682*77e5bcceSSpandan Das+ this(null, host, port, file, timeout); 2683*77e5bcceSSpandan Das+ } 2684*77e5bcceSSpandan Das+ 2685*77e5bcceSSpandan Das+ /** 2686*77e5bcceSSpandan Das+ * Create the transport with the supplied parameters. 2687*77e5bcceSSpandan Das+ * @param proxy proxy server to use 2688*77e5bcceSSpandan Das+ * @param host the name of the host e.g. webservices.somewhere.com 2689*77e5bcceSSpandan Das+ * @param port the http port to connect on 2690*77e5bcceSSpandan Das+ * @param file the path to the file on the webserver that represents the 2691*77e5bcceSSpandan Das+ * webservice e.g. /api/services/myservice.jsp 2692*77e5bcceSSpandan Das+ * @param timeout the timeout for the connection in milliseconds 2693*77e5bcceSSpandan Das+ * @throws IOException 2694*77e5bcceSSpandan Das+ */ 2695*77e5bcceSSpandan Das+ public HttpsServiceConnectionSE(Proxy proxy, String host, int port, String file, int timeout) throws IOException { 2696*77e5bcceSSpandan Das+ 2697*77e5bcceSSpandan Das+ if (proxy == null) { 2698*77e5bcceSSpandan Das+ connection = (HttpsURLConnection) new URL(HttpsTransportSE.PROTOCOL, host, port, file).openConnection(); 2699*77e5bcceSSpandan Das+ } else { 2700*77e5bcceSSpandan Das+ connection = 2701*77e5bcceSSpandan Das+ (HttpsURLConnection) new URL(HttpsTransportSE.PROTOCOL, host, port, file).openConnection(proxy); 2702*77e5bcceSSpandan Das+ } 2703*77e5bcceSSpandan Das+ 2704*77e5bcceSSpandan Das updateConnectionParameters(timeout); 2705*77e5bcceSSpandan Das } 2706*77e5bcceSSpandan Das 2707*77e5bcceSSpandan Das@@ -89,6 +103,10 @@ public class HttpsServiceConnectionSE implements ServiceConnection { 2708*77e5bcceSSpandan Das return retList; 2709*77e5bcceSSpandan Das } 2710*77e5bcceSSpandan Das 2711*77e5bcceSSpandan Das+ public int getResponseCode() throws IOException { 2712*77e5bcceSSpandan Das+ return connection.getResponseCode(); 2713*77e5bcceSSpandan Das+ } 2714*77e5bcceSSpandan Das+ 2715*77e5bcceSSpandan Das public void setRequestProperty(String key, String value) { 2716*77e5bcceSSpandan Das connection.setRequestProperty(key, value); 2717*77e5bcceSSpandan Das } 2718*77e5bcceSSpandan Das@@ -101,6 +119,11 @@ public class HttpsServiceConnectionSE implements ServiceConnection { 2719*77e5bcceSSpandan Das connection.setFixedLengthStreamingMode(contentLength); 2720*77e5bcceSSpandan Das } 2721*77e5bcceSSpandan Das 2722*77e5bcceSSpandan Das+ public void setChunkedStreamingMode() { 2723*77e5bcceSSpandan Das+ connection.setChunkedStreamingMode(0); 2724*77e5bcceSSpandan Das+ } 2725*77e5bcceSSpandan Das+ 2726*77e5bcceSSpandan Das+ 2727*77e5bcceSSpandan Das public OutputStream openOutputStream() throws IOException { 2728*77e5bcceSSpandan Das return connection.getOutputStream(); 2729*77e5bcceSSpandan Das } 2730*77e5bcceSSpandan Das@@ -128,9 +151,4 @@ public class HttpsServiceConnectionSE implements ServiceConnection { 2731*77e5bcceSSpandan Das public void setSSLSocketFactory(SSLSocketFactory sf) { 2732*77e5bcceSSpandan Das connection.setSSLSocketFactory(sf); 2733*77e5bcceSSpandan Das } 2734*77e5bcceSSpandan Das- 2735*77e5bcceSSpandan Das- public void setHostnameVerifier(HostnameVerifier v) { 2736*77e5bcceSSpandan Das- connection.setHostnameVerifier(v); 2737*77e5bcceSSpandan Das- } 2738*77e5bcceSSpandan Das- 2739*77e5bcceSSpandan Das } 2740*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java 2741*77e5bcceSSpandan Dasindex d220ac9..a7d7023 100644 2742*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java 2743*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java 2744*77e5bcceSSpandan Das@@ -1,8 +1,8 @@ 2745*77e5bcceSSpandan Das- 2746*77e5bcceSSpandan Das package org.ksoap2.transport; 2747*77e5bcceSSpandan Das 2748*77e5bcceSSpandan Das import java.io.IOException; 2749*77e5bcceSSpandan Das import java.net.MalformedURLException; 2750*77e5bcceSSpandan Das+import java.net.Proxy; 2751*77e5bcceSSpandan Das import java.net.URL; 2752*77e5bcceSSpandan Das 2753*77e5bcceSSpandan Das /** 2754*77e5bcceSSpandan Das@@ -14,17 +14,31 @@ import java.net.URL; 2755*77e5bcceSSpandan Das public class HttpsTransportSE extends HttpTransportSE { 2756*77e5bcceSSpandan Das 2757*77e5bcceSSpandan Das static final String PROTOCOL = "https"; 2758*77e5bcceSSpandan Das+ private static final String PROTOCOL_FULL = PROTOCOL + "://"; 2759*77e5bcceSSpandan Das+ 2760*77e5bcceSSpandan Das+ //connection instance, used for setting the SSLSocketFactory 2761*77e5bcceSSpandan Das+ private HttpsServiceConnectionSE connection; 2762*77e5bcceSSpandan Das 2763*77e5bcceSSpandan Das- private ServiceConnection serviceConnection = null; 2764*77e5bcceSSpandan Das- private final String host; 2765*77e5bcceSSpandan Das- private final int port; 2766*77e5bcceSSpandan Das- private final String file; 2767*77e5bcceSSpandan Das- private final int timeout; 2768*77e5bcceSSpandan Das+ protected final String host; 2769*77e5bcceSSpandan Das+ protected final int port; 2770*77e5bcceSSpandan Das+ protected final String file; 2771*77e5bcceSSpandan Das 2772*77e5bcceSSpandan Das- public HttpsTransportSE(String host, int port, String file, int timeout) { 2773*77e5bcceSSpandan Das- super(HttpsTransportSE.PROTOCOL + "://" + host + ":" + port + file); 2774*77e5bcceSSpandan Das- System.out.println("Establistion connection to: " + HttpsTransportSE.PROTOCOL + "://" 2775*77e5bcceSSpandan Das- + host + ":" + port + file); 2776*77e5bcceSSpandan Das+ public HttpsTransportSE (String host, int port, String file, int timeout) { 2777*77e5bcceSSpandan Das+ super(HttpsTransportSE.PROTOCOL_FULL + host + ":" + port + file, timeout); 2778*77e5bcceSSpandan Das+ this.host = host; 2779*77e5bcceSSpandan Das+ this.port = port; 2780*77e5bcceSSpandan Das+ this.file = file; 2781*77e5bcceSSpandan Das+ } 2782*77e5bcceSSpandan Das+ 2783*77e5bcceSSpandan Das+ /** 2784*77e5bcceSSpandan Das+ * Creates instance of HttpTransportSE with set url and defines a 2785*77e5bcceSSpandan Das+ * proxy server to use to access it 2786*77e5bcceSSpandan Das+ * 2787*77e5bcceSSpandan Das+ * @param proxy 2788*77e5bcceSSpandan Das+ * Proxy information or <code>null</code> for direct access 2789*77e5bcceSSpandan Das+ */ 2790*77e5bcceSSpandan Das+ public HttpsTransportSE(Proxy proxy, String host, int port, String file, int timeout) { 2791*77e5bcceSSpandan Das+ super(proxy, HttpsTransportSE.PROTOCOL_FULL + host + ":" + port + file); 2792*77e5bcceSSpandan Das this.host = host; 2793*77e5bcceSSpandan Das this.port = port; 2794*77e5bcceSSpandan Das this.file = file; 2795*77e5bcceSSpandan Das@@ -37,48 +51,11 @@ public class HttpsTransportSE extends HttpTransportSE { 2796*77e5bcceSSpandan Das */ 2797*77e5bcceSSpandan Das public ServiceConnection getServiceConnection() throws IOException 2798*77e5bcceSSpandan Das { 2799*77e5bcceSSpandan Das- if (serviceConnection == null) { 2800*77e5bcceSSpandan Das- serviceConnection = new HttpsServiceConnectionSE(host, port, file, timeout); 2801*77e5bcceSSpandan Das- } 2802*77e5bcceSSpandan Das- return serviceConnection; 2803*77e5bcceSSpandan Das- } 2804*77e5bcceSSpandan Das- 2805*77e5bcceSSpandan Das- public String getHost() { 2806*77e5bcceSSpandan Das- 2807*77e5bcceSSpandan Das- String retVal = null; 2808*77e5bcceSSpandan Das- 2809*77e5bcceSSpandan Das- try { 2810*77e5bcceSSpandan Das- retVal = new URL(url).getHost(); 2811*77e5bcceSSpandan Das- } catch (MalformedURLException e) { 2812*77e5bcceSSpandan Das- e.printStackTrace(); 2813*77e5bcceSSpandan Das+ if(connection != null) { 2814*77e5bcceSSpandan Das+ return connection; 2815*77e5bcceSSpandan Das+ } else { 2816*77e5bcceSSpandan Das+ connection = new HttpsServiceConnectionSE(proxy, host, port, file, timeout); 2817*77e5bcceSSpandan Das+ return connection; 2818*77e5bcceSSpandan Das } 2819*77e5bcceSSpandan Das- 2820*77e5bcceSSpandan Das- return retVal; 2821*77e5bcceSSpandan Das- } 2822*77e5bcceSSpandan Das- 2823*77e5bcceSSpandan Das- public int getPort() { 2824*77e5bcceSSpandan Das- 2825*77e5bcceSSpandan Das- int retVal = -1; 2826*77e5bcceSSpandan Das- 2827*77e5bcceSSpandan Das- try { 2828*77e5bcceSSpandan Das- retVal = new URL(url).getPort(); 2829*77e5bcceSSpandan Das- } catch (MalformedURLException e) { 2830*77e5bcceSSpandan Das- e.printStackTrace(); 2831*77e5bcceSSpandan Das- } 2832*77e5bcceSSpandan Das- 2833*77e5bcceSSpandan Das- return retVal; 2834*77e5bcceSSpandan Das- } 2835*77e5bcceSSpandan Das- 2836*77e5bcceSSpandan Das- public String getPath() { 2837*77e5bcceSSpandan Das- 2838*77e5bcceSSpandan Das- String retVal = null; 2839*77e5bcceSSpandan Das- 2840*77e5bcceSSpandan Das- try { 2841*77e5bcceSSpandan Das- retVal = new URL(url).getPath(); 2842*77e5bcceSSpandan Das- } catch (MalformedURLException e) { 2843*77e5bcceSSpandan Das- e.printStackTrace(); 2844*77e5bcceSSpandan Das- } 2845*77e5bcceSSpandan Das- 2846*77e5bcceSSpandan Das- return retVal; 2847*77e5bcceSSpandan Das } 2848*77e5bcceSSpandan Das } 2849*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/KeepAliveHttpsTransportSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/KeepAliveHttpsTransportSE.java 2850*77e5bcceSSpandan Dasindex 287fed1..65ba582 100644 2851*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/KeepAliveHttpsTransportSE.java 2852*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/KeepAliveHttpsTransportSE.java 2853*77e5bcceSSpandan Das@@ -24,18 +24,8 @@ import java.io.IOException; 2854*77e5bcceSSpandan Das */ 2855*77e5bcceSSpandan Das public class KeepAliveHttpsTransportSE extends HttpsTransportSE 2856*77e5bcceSSpandan Das { 2857*77e5bcceSSpandan Das- private final String host; 2858*77e5bcceSSpandan Das- private final int port; 2859*77e5bcceSSpandan Das- private final String file; 2860*77e5bcceSSpandan Das- private final int timeout; 2861*77e5bcceSSpandan Das- private ServiceConnection serviceConnection; 2862*77e5bcceSSpandan Das- 2863*77e5bcceSSpandan Das- public KeepAliveHttpsTransportSE(String host, int port, String file, int timeout) { 2864*77e5bcceSSpandan Das+ public KeepAliveHttpsTransportSE (String host, int port, String file, int timeout) { 2865*77e5bcceSSpandan Das super(host, port, file, timeout); 2866*77e5bcceSSpandan Das- this.host = host; 2867*77e5bcceSSpandan Das- this.port = port; 2868*77e5bcceSSpandan Das- this.file = file; 2869*77e5bcceSSpandan Das- this.timeout = timeout; 2870*77e5bcceSSpandan Das } 2871*77e5bcceSSpandan Das 2872*77e5bcceSSpandan Das /** 2873*77e5bcceSSpandan Das@@ -47,11 +37,9 @@ public class KeepAliveHttpsTransportSE extends HttpsTransportSE 2874*77e5bcceSSpandan Das //@Override 2875*77e5bcceSSpandan Das public ServiceConnection getServiceConnection() throws IOException 2876*77e5bcceSSpandan Das { 2877*77e5bcceSSpandan Das- if (serviceConnection == null) { 2878*77e5bcceSSpandan Das- serviceConnection = new HttpsServiceConnectionSEIgnoringConnectionClose(host, port, 2879*77e5bcceSSpandan Das- file, timeout); 2880*77e5bcceSSpandan Das- serviceConnection.setRequestProperty("Connection", "keep-alive"); 2881*77e5bcceSSpandan Das- } 2882*77e5bcceSSpandan Das+ ServiceConnection serviceConnection = 2883*77e5bcceSSpandan Das+ new HttpsServiceConnectionSEIgnoringConnectionClose(host, port, file, timeout); 2884*77e5bcceSSpandan Das+ serviceConnection.setRequestProperty("Connection", "keep-alive"); 2885*77e5bcceSSpandan Das return serviceConnection; 2886*77e5bcceSSpandan Das } 2887*77e5bcceSSpandan Das 2888*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/ServiceConnectionSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/ServiceConnectionSE.java 2889*77e5bcceSSpandan Dasindex 029ee9a..bfdfe11 100644 2890*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/ServiceConnectionSE.java 2891*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/ServiceConnectionSE.java 2892*77e5bcceSSpandan Das@@ -21,16 +21,16 @@ 2893*77e5bcceSSpandan Das 2894*77e5bcceSSpandan Das package org.ksoap2.transport; 2895*77e5bcceSSpandan Das 2896*77e5bcceSSpandan Das-import java.io.*; 2897*77e5bcceSSpandan Das-import java.net.*; 2898*77e5bcceSSpandan Das-import java.util.Iterator; 2899*77e5bcceSSpandan Das-import java.util.LinkedList; 2900*77e5bcceSSpandan Das-import java.util.List; 2901*77e5bcceSSpandan Das-import java.util.Map; 2902*77e5bcceSSpandan Das-import java.util.Set; 2903*77e5bcceSSpandan Das- 2904*77e5bcceSSpandan Das import org.ksoap2.HeaderProperty; 2905*77e5bcceSSpandan Das 2906*77e5bcceSSpandan Das+import java.io.IOException; 2907*77e5bcceSSpandan Das+import java.io.InputStream; 2908*77e5bcceSSpandan Das+import java.io.OutputStream; 2909*77e5bcceSSpandan Das+import java.net.HttpURLConnection; 2910*77e5bcceSSpandan Das+import java.net.Proxy; 2911*77e5bcceSSpandan Das+import java.net.URL; 2912*77e5bcceSSpandan Das+import java.util.*; 2913*77e5bcceSSpandan Das+ 2914*77e5bcceSSpandan Das /** 2915*77e5bcceSSpandan Das * Connection for J2SE environments. 2916*77e5bcceSSpandan Das */ 2917*77e5bcceSSpandan Das@@ -80,23 +80,29 @@ public class ServiceConnectionSE implements ServiceConnection { 2918*77e5bcceSSpandan Das connection.disconnect(); 2919*77e5bcceSSpandan Das } 2920*77e5bcceSSpandan Das 2921*77e5bcceSSpandan Das- public List getResponseProperties() { 2922*77e5bcceSSpandan Das- Map properties = connection.getHeaderFields(); 2923*77e5bcceSSpandan Das- Set keys = properties.keySet(); 2924*77e5bcceSSpandan Das+ public List getResponseProperties() throws IOException { 2925*77e5bcceSSpandan Das List retList = new LinkedList(); 2926*77e5bcceSSpandan Das 2927*77e5bcceSSpandan Das- for (Iterator i = keys.iterator(); i.hasNext();) { 2928*77e5bcceSSpandan Das- String key = (String) i.next(); 2929*77e5bcceSSpandan Das- List values = (List) properties.get(key); 2930*77e5bcceSSpandan Das- 2931*77e5bcceSSpandan Das- for (int j = 0; j < values.size(); j++) { 2932*77e5bcceSSpandan Das- retList.add(new HeaderProperty(key, (String) values.get(j))); 2933*77e5bcceSSpandan Das+ Map properties = connection.getHeaderFields(); 2934*77e5bcceSSpandan Das+ if(properties != null) { 2935*77e5bcceSSpandan Das+ Set keys = properties.keySet(); 2936*77e5bcceSSpandan Das+ for (Iterator i = keys.iterator(); i.hasNext();) { 2937*77e5bcceSSpandan Das+ String key = (String) i.next(); 2938*77e5bcceSSpandan Das+ List values = (List) properties.get(key); 2939*77e5bcceSSpandan Das+ 2940*77e5bcceSSpandan Das+ for (int j = 0; j < values.size(); j++) { 2941*77e5bcceSSpandan Das+ retList.add(new HeaderProperty(key, (String) values.get(j))); 2942*77e5bcceSSpandan Das+ } 2943*77e5bcceSSpandan Das } 2944*77e5bcceSSpandan Das } 2945*77e5bcceSSpandan Das 2946*77e5bcceSSpandan Das return retList; 2947*77e5bcceSSpandan Das } 2948*77e5bcceSSpandan Das 2949*77e5bcceSSpandan Das+ public int getResponseCode() throws IOException { 2950*77e5bcceSSpandan Das+ return connection.getResponseCode(); 2951*77e5bcceSSpandan Das+ } 2952*77e5bcceSSpandan Das+ 2953*77e5bcceSSpandan Das public void setRequestProperty(String string, String soapAction) { 2954*77e5bcceSSpandan Das connection.setRequestProperty(string, soapAction); 2955*77e5bcceSSpandan Das } 2956*77e5bcceSSpandan Das@@ -116,6 +122,10 @@ public class ServiceConnectionSE implements ServiceConnection { 2957*77e5bcceSSpandan Das connection.setFixedLengthStreamingMode(contentLength); 2958*77e5bcceSSpandan Das } 2959*77e5bcceSSpandan Das 2960*77e5bcceSSpandan Das+ public void setChunkedStreamingMode() { 2961*77e5bcceSSpandan Das+ connection.setChunkedStreamingMode(0); 2962*77e5bcceSSpandan Das+ } 2963*77e5bcceSSpandan Das+ 2964*77e5bcceSSpandan Das public OutputStream openOutputStream() throws IOException { 2965*77e5bcceSSpandan Das return connection.getOutputStream(); 2966*77e5bcceSSpandan Das } 2967*77e5bcceSSpandan Das-- 2968*77e5bcceSSpandan Das2.17.0.441.gb46fe60e1d-goog 2969*77e5bcceSSpandan Das 2970