diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index d82d48b..2c11dd4 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,4 @@ -#Tue Jan 25 13:36:57 CST 2011 +#Mon Jan 24 22:13:32 CST 2011 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 diff --git a/src/com/johnwayner/android/simplesoap/templates/ComplexType.vm b/src/com/johnwayner/android/simplesoap/templates/ComplexType.vm index 1629942..5853858 100644 --- a/src/com/johnwayner/android/simplesoap/templates/ComplexType.vm +++ b/src/com/johnwayner/android/simplesoap/templates/ComplexType.vm @@ -14,6 +14,12 @@ public class $type.name implements Serializable { ## create fields with getters and setters and SimpleXML annotations +#if( $type.fields.size() == 0 ) +## slap down a dummy field otherwise simplexml barfs. + @Element(required=false) + public Object dummy; +#else + #foreach( $field in $type.fields ) #if ($field.isList()) @ElementList(inline=true, required=false, entry="${field.name}") @@ -29,6 +35,7 @@ public class $type.name implements Serializable { } #end +#end ## create a constructor with all fields, if we have any fields @@ -49,5 +56,20 @@ public class $type.name implements Serializable { ## create empty constructor (this is required for simplexml) public $type.name () { } + +## create clone method + public $type.name clone($type.name target) { + $type.name clone; + if(null != target) + clone = target; + else + clone = new ${type.name}(); + +#foreach( $field in $type.fields ) + clone.$field.name = this.$field.name; +#end + + return clone; + } } \ No newline at end of file diff --git a/src/com/johnwayner/android/simplesoap/templates/MessageRequest.vm b/src/com/johnwayner/android/simplesoap/templates/MessageRequest.vm index ed1778f..313b4f4 100644 --- a/src/com/johnwayner/android/simplesoap/templates/MessageRequest.vm +++ b/src/com/johnwayner/android/simplesoap/templates/MessageRequest.vm @@ -1,5 +1,7 @@ package $package; +//This class is auto generated from a wsdl. Do not edit manually. + import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.Path; diff --git a/src/com/johnwayner/android/simplesoap/templates/MessageResponse.vm b/src/com/johnwayner/android/simplesoap/templates/MessageResponse.vm index b873a4e..456ca98 100644 --- a/src/com/johnwayner/android/simplesoap/templates/MessageResponse.vm +++ b/src/com/johnwayner/android/simplesoap/templates/MessageResponse.vm @@ -1,5 +1,7 @@ package $package; +//This class is auto generated from a wsdl. Do not edit manually. + import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.Path; diff --git a/src/com/johnwayner/android/simplesoap/templates/Service.vm b/src/com/johnwayner/android/simplesoap/templates/Service.vm index 2d90cc9..e239472 100644 --- a/src/com/johnwayner/android/simplesoap/templates/Service.vm +++ b/src/com/johnwayner/android/simplesoap/templates/Service.vm @@ -1,6 +1,10 @@ package $package; +//This class is auto generated from a wsdl. Do not edit manually. + import java.io.ByteArrayOutputStream; +import java.text.SimpleDateFormat; +import java.util.Date; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; @@ -11,34 +15,68 @@ import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister; +import org.simpleframework.xml.transform.Matcher; +import org.simpleframework.xml.transform.Transform; import ${typePackage}.*; import ${messagePackage}.*; +import android.util.Log; + + public class $serviceName { public static final String END_POINT = "$endPoint"; #foreach( $message in $messages ) - public static $message.outputType ${message.name}($message.inputType input) throws Exception { - HttpClient client = new DefaultHttpClient(); - HttpPost post = new HttpPost(END_POINT); - post.addHeader("Content-Type", "text/xml"); - - post.setEntity(getEntity(new ${message.name}Envelope(input))); - HttpResponse response = client.execute(post); - String content = IOUtils.toString(response.getEntity().getContent()); - ${message.outputType}Envelope res = new Persister().read(${message.outputType}Envelope.class, content); - return res.response; + public static $message.outputType ${message.name}($message.inputType input) { + try { + HttpClient client = new DefaultHttpClient(); + HttpPost post = new HttpPost(END_POINT); + post.addHeader("Content-Type", "text/xml"); + + post.setEntity(getEntity(new ${message.name}Envelope(input))); + HttpResponse response = client.execute(post); + String content = IOUtils.toString(response.getEntity().getContent()); + ${message.outputType}Envelope res = new Persister(new SOAPDateFormatMatcher()).read(${message.outputType}Envelope.class, content); + return res.response; + } catch(Exception e) { + Log.e("$serviceName", "Exception in ${message.name}.", e); + return null; + } } #end private static HttpEntity getEntity(Object o) throws Exception { ByteArrayOutputStream stream = new ByteArrayOutputStream(); - Serializer serializer = new Persister(); + Serializer serializer = new Persister(new SOAPDateFormatMatcher()); serializer.write(o, stream); ByteArrayEntity entity = new ByteArrayEntity(stream.toByteArray()); return entity; } + + //Helper transform since simplexml can't parse 8601 dates properly. + private static class SOAPDateFormatMatcher implements Matcher, Transform { + protected static final SimpleDateFormat SOAP_formatWithTZ = new SimpleDateFormat("yyyy-MM-dd"); + public Transform match(Class type) throws Exception { + if(type == Date.class) { + return this; + } + return null; + } + + public Date read(String value) throws Exception { + SOAP_formatWithTZ.setLenient(false); + value.replaceAll("-\\d\\d:\\d\\d", ""); //remove timezone. + Date ret = SOAP_formatWithTZ.parse(value); + return ret; + } + + public String write(Date value) throws Exception { + String valueStr = SOAP_formatWithTZ.format(value); + return valueStr; + } + + } }