// the level prevents from stackoverflow in case of a circular ref
if(level > 2) return;
Class<?> clazz = embeddedObj.getClass();
if(clazz.isArray() || Collection.class.isAssignableFrom(clazz)){
throw new SienaException("can't serializer Array/Collection in native mode");
}
for (Field f : ClassInfo.getClassInfo(clazz).allFields) {
// doesn't try to analyze fields, just try to store it
Class<?> fieldClass = f.getType();
String propName = embeddingColumnName + "." + ClassInfo.getSingleColumnName(f);
Object propValue = Util.readField(embeddedObj, f);
if (propValue != null) {
if (fieldClass == Json.class) {
propValue = propValue.toString();
} else if (propValue instanceof String) {
String s = (String) propValue;
if (s.length() > 500)
propValue = new Text(s);
} else if (propValue instanceof byte[]) {
byte[] arr = (byte[]) propValue;
// GAE Blob doesn't accept more than 1MB
if (arr.length < 1000000)
propValue = new Blob(arr);
else
propValue = new Blob(Arrays.copyOf(arr, 1000000));
}
else if (ClassInfo.isEmbedded(f)) {
Embedded embed = f.getAnnotation(Embedded.class);
switch(embed.mode()){
case SERIALIZE_JSON:
propValue = JsonSerializer.serialize(propValue).toString();
String s = (String) propValue;
if (s.length() > 500)
propValue = new Text(s);
break;
case SERIALIZE_JAVA:
// this embedding mode doesn't manage @EmbedIgnores
try {
byte[] b = JavaSerializer.serialize(propValue);
// if length is less than 1Mb, can store in a blob else???
if(b.length <= 1000000){
propValue = new Blob(b);
}else{
throw new SienaException("object can be java serialized because it's too large >1mb");
}
}
catch(IOException ex) {
throw new SienaException(ex);
}
break;
case NATIVE:
GaeNativeSerializer.embed(entity, embeddingColumnName + "." + ClassInfo.getSingleColumnName(f), propValue, level+1);
// has set several new properties in entity so go to next field