Skip to content

Commit

Permalink
- fixed date format difference in simplexml and soap(8601)
Browse files Browse the repository at this point in the history
- added clone to complex type
- added dummy value when no fields are present so simplexml will
  serialize.
  • Loading branch information
johnwayner committed Jan 28, 2011
1 parent 4726921 commit e505c64
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 12 deletions.
2 changes: 1 addition & 1 deletion .settings/org.eclipse.jdt.core.prefs
Original file line number Diff line number Diff line change
@@ -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
Expand Down
22 changes: 22 additions & 0 deletions src/com/johnwayner/android/simplesoap/templates/ComplexType.vm
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand All @@ -29,6 +35,7 @@ public class $type.name implements Serializable {
}

#end
#end

## create a constructor with all fields, if we have any fields

Expand All @@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
60 changes: 49 additions & 11 deletions src/com/johnwayner/android/simplesoap/templates/Service.vm
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Date> {
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;
}

}
}

0 comments on commit e505c64

Please sign in to comment.