use of com.google.appengine.api.datastore.Text in project qi4j-sdk by Qi4j.
the class GaeEntityState method setPropertyValue.
@Override
public void setPropertyValue(QualifiedName stateName, Object newValue) {
System.out.println("setProperty( " + stateName + ", " + newValue + " )");
Object value = null;
if (newValue == null || ValueType.isPrimitiveValue(newValue)) {
value = newValue;
} else {
try {
value = valueSerialization.serialize(newValue);
} catch (ValueSerializationException e) {
String message = "\nqualifiedName: " + stateName + "\n stateName: " + stateName.name() + "\n class: " + newValue.getClass() + "\n value: " + value + "\n";
InternalError error = new InternalError(message);
error.initCause(e);
throw error;
}
}
if (value instanceof String) {
value = new Text((String) value);
}
entity.setUnindexedProperty(stateName.toURI(), value);
}
use of com.google.appengine.api.datastore.Text in project qi4j-sdk by Qi4j.
the class GaeEntityStoreMixin method entityStates.
@Override
public Input<Reader, IOException> entityStates() {
return new Input<Reader, IOException>() {
@Override
public <ReceiverThrowableType extends Throwable> void transferTo(Output<? super Reader, ReceiverThrowableType> output) throws IOException, ReceiverThrowableType {
Query query = new Query();
PreparedQuery preparedQuery = datastore.prepare(query);
final QueryResultIterable<Entity> iterable = preparedQuery.asQueryResultIterable();
output.receiveFrom(new Sender<Reader, IOException>() {
@Override
public <ReceiverThrowableType extends Throwable> void sendTo(Receiver<? super Reader, ReceiverThrowableType> receiver) throws ReceiverThrowableType, IOException {
for (Entity entity : iterable) {
Text serializedState = (Text) entity.getProperty("value");
receiver.receive(new StringReader(serializedState.getValue()));
}
}
});
}
};
}
use of com.google.appengine.api.datastore.Text in project siena by mandubian.
the class GaeNativeSerializer method embed.
public static void embed(Entity entity, String embeddingColumnName, Object embeddedObj, int level) {
// 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
continue;
}
} else if (fieldClass == BigDecimal.class) {
DecimalPrecision ann = f.getAnnotation(DecimalPrecision.class);
if (ann == null) {
propValue = ((BigDecimal) propValue).toPlainString();
} else {
switch(ann.storageType()) {
case DOUBLE:
propValue = ((BigDecimal) propValue).doubleValue();
break;
case STRING:
case NATIVE:
propValue = ((BigDecimal) propValue).toPlainString();
break;
}
}
} else // don't know if anyone will use it but it will work :)
if (Enum.class.isAssignableFrom(fieldClass)) {
propValue = propValue.toString();
} else if (ClassInfo.isModel(fieldClass)) {
// if it's a model and as there a no join, we can't fetch everything! So only the key is embedded
//GaeNativeSerializer.embed(entity, embeddingColumnName + "." + ClassInfo.getSingleColumnName(f), propValue, level + 1);
propValue = Util.readField(propValue, ClassInfo.getIdField(fieldClass));
}
}
Unindexed ui = f.getAnnotation(Unindexed.class);
if (ui == null) {
entity.setProperty(propName, propValue);
} else {
entity.setUnindexedProperty(propName, propValue);
}
}
}
Aggregations