Search in sources :

Example 6 with Text

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);
}
Also used : ValueSerializationException(org.qi4j.api.value.ValueSerializationException) Text(com.google.appengine.api.datastore.Text)

Example 7 with Text

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()));
                    }
                }
            });
        }
    };
}
Also used : Entity(com.google.appengine.api.datastore.Entity) Query(com.google.appengine.api.datastore.Query) PreparedQuery(com.google.appengine.api.datastore.PreparedQuery) PreparedQuery(com.google.appengine.api.datastore.PreparedQuery) Reader(java.io.Reader) StringReader(java.io.StringReader) Text(com.google.appengine.api.datastore.Text) IOException(java.io.IOException) Input(org.qi4j.io.Input) Output(org.qi4j.io.Output) StringReader(java.io.StringReader)

Example 8 with Text

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);
        }
    }
}
Also used : Blob(com.google.appengine.api.datastore.Blob) DecimalPrecision(siena.core.DecimalPrecision) Text(com.google.appengine.api.datastore.Text) IOException(java.io.IOException) Field(java.lang.reflect.Field) Collection(java.util.Collection) SienaException(siena.SienaException) Embedded(siena.embed.Embedded)

Aggregations

Text (com.google.appengine.api.datastore.Text)8 IOException (java.io.IOException)3 Blob (com.google.appengine.api.datastore.Blob)2 Entity (com.google.appengine.api.datastore.Entity)2 Key (com.google.appengine.api.datastore.Key)2 StringReader (java.io.StringReader)2 Field (java.lang.reflect.Field)2 PersistenceManager (javax.jdo.PersistenceManager)2 ValueSerializationException (org.qi4j.api.value.ValueSerializationException)2 SienaException (siena.SienaException)2 DecimalPrecision (siena.core.DecimalPrecision)2 Embedded (siena.embed.Embedded)2 PreparedQuery (com.google.appengine.api.datastore.PreparedQuery)1 Query (com.google.appengine.api.datastore.Query)1 Reader (java.io.Reader)1 Writer (java.io.Writer)1 Collection (java.util.Collection)1 Transaction (javax.jdo.Transaction)1 JSONWriter (org.json.JSONWriter)1 ValueType (org.qi4j.api.type.ValueType)1