Search in sources :

Example 21 with Attribute

use of com.amazonaws.services.simpledb.model.Attribute in project siena by mandubian.

the class SdbNativeSerializer method unembed.

public static <T> T unembed(Class<T> clazz, String embeddingFieldName, List<Attribute> attrs) {
    if (clazz.isArray() || Collection.class.isAssignableFrom(clazz)) {
        throw new SienaException("can't serializer Array/Collection in native mode");
    }
    T obj = Util.createObjectInstance(clazz);
    try {
        Attribute theAttr;
        for (Field f : ClassInfo.getClassInfo(clazz).updateFields) {
            if (!ClassInfo.isEmbeddedNative(f)) {
                // doesn't try to analyze fields, just try to store it
                String attrName = getEmbeddedAttributeName(embeddingFieldName, f);
                theAttr = null;
                // searches attribute and if found, removes it from the list to reduce number of attributes
                for (Attribute attr : attrs) {
                    if (attrName.equals(attr.getName())) {
                        theAttr = attr;
                        attrs.remove(attr);
                        break;
                    }
                }
                if (theAttr != null) {
                    SdbMappingUtils.setFromString(obj, f, theAttr.getValue());
                }
            } else {
                Object value = SdbNativeSerializer.unembed(f.getType(), getEmbeddedAttributeName(embeddingFieldName, f), attrs);
                Util.setField(obj, f, value);
            }
        }
        return obj;
    } catch (Exception e) {
        throw new SienaException(e);
    }
}
Also used : Field(java.lang.reflect.Field) Attribute(com.amazonaws.services.simpledb.model.Attribute) ReplaceableAttribute(com.amazonaws.services.simpledb.model.ReplaceableAttribute) Collection(java.util.Collection) SienaException(siena.SienaException) IOException(java.io.IOException) SienaException(siena.SienaException)

Example 22 with Attribute

use of com.amazonaws.services.simpledb.model.Attribute in project simplejpa by appoxy.

the class Save method persistOnly.

protected void persistOnly(Object o, String id) throws AmazonClientException, IllegalAccessException, InvocationTargetException, IOException {
    long start = System.currentTimeMillis();
    em.invokeEntityListener(o, newObject ? PrePersist.class : PreUpdate.class);
    AnnotationInfo ai = em.getFactory().getAnnotationManager().getAnnotationInfo(o);
    UpdateCondition expected = null;
    PersistentProperty versionField = null;
    Long nextVersion = -1L;
    String domainName;
    if (ai.getRootClass() != null) {
        domainName = em.getOrCreateDomain(ai.getRootClass());
    } else {
        domainName = em.getOrCreateDomain(o.getClass());
    }
    // Item item = DomainHelper.findItemById(this.em.getSimpleDb(),
    // domainName, id);
    // now set attributes
    List<ReplaceableAttribute> attsToPut = new ArrayList<ReplaceableAttribute>();
    List<Attribute> attsToDelete = new ArrayList<Attribute>();
    if (ai.getDiscriminatorValue() != null) {
        attsToPut.add(new ReplaceableAttribute(EntityManagerFactoryImpl.DTYPE, ai.getDiscriminatorValue(), true));
    }
    LazyInterceptor interceptor = null;
    if (o instanceof Factory) {
        Factory factory = (Factory) o;
        /*
             * for (Callback callback2 : factory.getCallbacks()) {
             * if(logger.isLoggable(Level.FINER)) logger.finer("callback=" +
             * callback2); if (callback2 instanceof LazyInterceptor) {
             * interceptor = (LazyInterceptor) callback2; } }
             */
        interceptor = (LazyInterceptor) factory.getCallback(0);
    }
    for (PersistentProperty field : ai.getPersistentProperties()) {
        Object ob = field.getProperty(o);
        String columnName = field.getColumnName();
        if (ob == null) {
            attsToDelete.add(new Attribute(columnName, null));
            continue;
        }
        if (field.isForeignKeyRelationship()) {
            // store the id of this object
            if (Collection.class.isAssignableFrom(field.getRawClass())) {
                for (Object each : (Collection) ob) {
                    String id2 = em.getId(each);
                    attsToPut.add(new ReplaceableAttribute(columnName, id2, true));
                }
            } else {
                String id2 = em.getId(ob);
                attsToPut.add(new ReplaceableAttribute(columnName, id2, true));
                /* check if we should persist this */
                boolean persistRelationship = false;
                ManyToOne a = field.getGetter().getAnnotation(ManyToOne.class);
                if (a != null && null != a.cascade()) {
                    CascadeType[] cascadeType = a.cascade();
                    for (CascadeType type : cascadeType) {
                        if (CascadeType.ALL == type || CascadeType.PERSIST == type) {
                            persistRelationship = true;
                        }
                    }
                }
                if (persistRelationship) {
                    em.persist(ob);
                }
            }
        } else if (field.isVersioned()) {
            Long curVersion = Long.parseLong("" + ob);
            nextVersion = (1 + curVersion);
            attsToPut.add(new ReplaceableAttribute(columnName, em.padOrConvertIfRequired(nextVersion), true));
            if (curVersion > 0) {
                expected = new UpdateCondition(columnName, em.padOrConvertIfRequired(curVersion), true);
            } else {
                expected = new UpdateCondition().withName(columnName).withExists(false);
            }
            versionField = field;
        } else if (field.isInverseRelationship()) {
            // FORCING BI-DIRECTIONAL RIGHT NOW SO JUST IGNORE
            // ... except for cascading persistence down to all items in the
            // OneToMany collection
            /* check if we should persist this */
            boolean persistRelationship = false;
            OneToMany a = field.getGetter().getAnnotation(OneToMany.class);
            CascadeType[] cascadeType = a.cascade();
            for (CascadeType type : cascadeType) {
                if (CascadeType.ALL == type || CascadeType.PERSIST == type) {
                    persistRelationship = true;
                }
            }
            if (persistRelationship) {
                if (ob instanceof Collection) {
                    // shouldn't it?
                    for (Object _item : (Collection) ob) {
                        // persist each item in the collection
                        em.persist(_item);
                    }
                }
            }
        } else if (field.isLob()) {
            // store in s3
            AmazonS3 s3 = null;
            // todo: need to make sure we only store to S3 if it's changed,
            // too slow.
            logger.fine("putting lob to s3");
            long start3 = System.currentTimeMillis();
            s3 = em.getS3Service();
            String bucketName = em.getS3BucketName();
            String s3ObjectId = id + "-" + field.getFieldName();
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bos);
            out.writeObject(ob);
            byte[] contentBytes = bos.toByteArray();
            out.close();
            InputStream input = new ByteArrayInputStream(contentBytes);
            s3.putObject(bucketName, s3ObjectId, input, null);
            em.statsS3Put(System.currentTimeMillis() - start3);
            logger.finer("setting lobkeyattribute=" + columnName + " - " + s3ObjectId);
            attsToPut.add(new ReplaceableAttribute(columnName, s3ObjectId, true));
        } else if (field.getEnumType() != null) {
            String toSet = getEnumValue(field, o);
            attsToPut.add(new ReplaceableAttribute(columnName, toSet, true));
        } else if (field.isId()) {
            continue;
        } else if (Collection.class.isInstance(ob)) {
            for (Object each : ((Collection) ob)) {
                String toSet = each != null ? em.padOrConvertIfRequired(each) : "";
                // todo: throw an exception if this is going to exceed
                // maximum size, suggest using @Lob
                attsToPut.add(new ReplaceableAttribute(columnName, toSet, true));
            }
        } else {
            String toSet = ob != null ? em.padOrConvertIfRequired(ob) : "";
            // todo: throw an exception if this is going to exceed maximum
            // size, suggest using @Lob
            attsToPut.add(new ReplaceableAttribute(columnName, toSet, true));
        }
    }
    // Now finally send it for storage (If have attributes to add)
    long start2 = System.currentTimeMillis();
    long duration2;
    if (!attsToPut.isEmpty()) {
        this.em.getSimpleDb().putAttributes(new PutAttributesRequest().withDomainName(domainName).withItemName(id).withAttributes(attsToPut).withExpected(expected));
        duration2 = System.currentTimeMillis() - start2;
        if (logger.isLoggable(Level.FINE))
            logger.fine("putAttributes time=" + (duration2));
        em.statsAttsPut(attsToPut.size(), duration2);
        if (null != versionField)
            versionField.setProperty(o, nextVersion);
    }
    /*
         * Check for nulled attributes so we can send a delete call. Don't
         * delete attributes if this is a new object AND don't delete atts if
         * it's not dirty AND don't delete if no nulls were set (nulledField on
         * LazyInterceptor)
         */
    if (interceptor != null) {
        if (interceptor.getNulledFields() != null && interceptor.getNulledFields().size() > 0) {
            List<Attribute> attsToDelete2 = new ArrayList<Attribute>();
            for (String s : interceptor.getNulledFields().keySet()) {
                String columnName = ai.getPersistentProperty(s).getColumnName();
                attsToDelete2.add(new Attribute(columnName, null));
            }
            start2 = System.currentTimeMillis();
            this.em.getSimpleDb().deleteAttributes(new DeleteAttributesRequest().withDomainName(domainName).withItemName(id).withAttributes(attsToDelete2));
            // todo: what about lobs? need to delete from s3
            duration2 = System.currentTimeMillis() - start2;
            logger.fine("deleteAttributes time=" + (duration2));
            em.statsAttsDeleted(attsToDelete2.size(), duration2);
        } else {
            logger.fine("deleteAttributes time= no nulled fields, nothing to delete.");
        }
    } else {
        if (!newObject && attsToDelete.size() > 0) {
            // not enhanced, but still have to deal with deleted attributes
            start2 = System.currentTimeMillis();
            // for (ItemAttribute itemAttribute : attsToDelete) {
            // System.out.println("itemAttr=" + itemAttribute.getName() +
            // ": " + itemAttribute.getValue());
            // }
            this.em.getSimpleDb().deleteAttributes(new DeleteAttributesRequest().withDomainName(domainName).withItemName(id).withAttributes(attsToDelete));
            // todo: what about lobs? need to delete from s3
            duration2 = System.currentTimeMillis() - start2;
            logger.fine("deleteAttributes time=" + (duration2));
            em.statsAttsDeleted(attsToDelete.size(), duration2);
        }
    }
    if (interceptor != null) {
        // reset the interceptor since we're all synced with the db now
        interceptor.reset();
    }
    em.invokeEntityListener(o, newObject ? PostPersist.class : PostUpdate.class);
    if (logger.isLoggable(Level.FINE))
        logger.fine("persistOnly time=" + (System.currentTimeMillis() - start));
}
Also used : AmazonS3(com.amazonaws.services.s3.AmazonS3) Attribute(com.amazonaws.services.simpledb.model.Attribute) ReplaceableAttribute(com.amazonaws.services.simpledb.model.ReplaceableAttribute) ArrayList(java.util.ArrayList) Factory(net.sf.cglib.proxy.Factory) PersistentProperty(com.spaceprogram.simplejpa.PersistentProperty) ObjectOutputStream(java.io.ObjectOutputStream) ManyToOne(javax.persistence.ManyToOne) PreUpdate(javax.persistence.PreUpdate) ReplaceableAttribute(com.amazonaws.services.simpledb.model.ReplaceableAttribute) PostUpdate(javax.persistence.PostUpdate) PrePersist(javax.persistence.PrePersist) DeleteAttributesRequest(com.amazonaws.services.simpledb.model.DeleteAttributesRequest) LazyInterceptor(com.spaceprogram.simplejpa.LazyInterceptor) UpdateCondition(com.amazonaws.services.simpledb.model.UpdateCondition) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) PostPersist(javax.persistence.PostPersist) ByteArrayOutputStream(java.io.ByteArrayOutputStream) OneToMany(javax.persistence.OneToMany) ByteArrayInputStream(java.io.ByteArrayInputStream) CascadeType(javax.persistence.CascadeType) Collection(java.util.Collection) PutAttributesRequest(com.amazonaws.services.simpledb.model.PutAttributesRequest) AnnotationInfo(com.spaceprogram.simplejpa.AnnotationInfo)

Example 23 with Attribute

use of com.amazonaws.services.simpledb.model.Attribute in project simplejpa by appoxy.

the class AbstractQuery method getResultList.

public List getResultList() {
    // convert to amazon query
    AmazonQueryString amazonQuery;
    try {
        amazonQuery = createAmazonQuery();
    } catch (RuntimeException e) {
        throw e;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    if (amazonQuery == null) {
        return new ArrayList();
    }
    try {
        // String qToSend = amazonQuery != null ? amazonQuery.toString() : null;
        em.incrementQueryCount();
        if (amazonQuery.isCount()) {
            // String domainName = em.getDomainName(tClass);
            String nextToken = null;
            SelectResult qr;
            long count = 0;
            while ((qr = DomainHelper.selectItems(this.em.getSimpleDb(), amazonQuery.getValue(), nextToken)) != null) {
                Map<String, List<Attribute>> itemMap = new HashMap<String, List<Attribute>>();
                for (Item item : qr.getItems()) {
                    itemMap.put(item.getName(), item.getAttributes());
                }
                for (String id : itemMap.keySet()) {
                    List<Attribute> list = itemMap.get(id);
                    for (Attribute itemAttribute : list) {
                        if (itemAttribute.getName().equals("Count")) {
                            count += Long.parseLong(itemAttribute.getValue());
                        }
                    }
                }
                nextToken = qr.getNextToken();
                if (nextToken == null) {
                    break;
                }
            }
            return Arrays.asList(count);
        } else {
            LazyList ret = new LazyList(em, tClass, this);
            return ret;
        }
    } catch (NoSuchDomainException e) {
        // no need to throw here
        return new ArrayList();
    } catch (Exception e) {
        throw new PersistenceException(e);
    }
}
Also used : LazyList(com.spaceprogram.simplejpa.LazyList) Attribute(com.amazonaws.services.simpledb.model.Attribute) NoSuchDomainException(com.amazonaws.services.simpledb.model.NoSuchDomainException) NotImplementedException(org.apache.commons.lang.NotImplementedException) AmazonClientException(com.amazonaws.AmazonClientException) NoSuchDomainException(com.amazonaws.services.simpledb.model.NoSuchDomainException) SelectResult(com.amazonaws.services.simpledb.model.SelectResult) Item(com.amazonaws.services.simpledb.model.Item) LazyList(com.spaceprogram.simplejpa.LazyList)

Example 24 with Attribute

use of com.amazonaws.services.simpledb.model.Attribute in project simplejpa by appoxy.

the class EntityManagerSimpleJPA method putAndDelete.

private void putAndDelete(String domainName, String oldAttributeName, String newAttributeName, List<Item> items) throws AmazonClientException {
    AmazonSimpleDB db = factory.getSimpleDb();
    for (Item item : items) {
        GetAttributesResult getOldResults = db.getAttributes(new GetAttributesRequest().withDomainName(domainName).withConsistentRead(true).withItemName(item.getName()).withAttributeNames(oldAttributeName));
        List<Attribute> oldAtts = getOldResults.getAttributes();
        if (oldAtts.size() > 0) {
            Attribute oldAtt = oldAtts.get(0);
            List<ReplaceableAttribute> atts = new ArrayList<ReplaceableAttribute>();
            atts.add(new ReplaceableAttribute(newAttributeName, oldAtt.getValue(), true));
            db.putAttributes(new PutAttributesRequest().withDomainName(domainName).withItemName(item.getName()).withAttributes(atts));
            db.deleteAttributes(new DeleteAttributesRequest().withDomainName(domainName).withItemName(item.getName()).withAttributes(oldAtts));
        }
    }
}
Also used : Item(com.amazonaws.services.simpledb.model.Item) Attribute(com.amazonaws.services.simpledb.model.Attribute) ReplaceableAttribute(com.amazonaws.services.simpledb.model.ReplaceableAttribute) AmazonSimpleDB(com.amazonaws.services.simpledb.AmazonSimpleDB) PutAttributesRequest(com.amazonaws.services.simpledb.model.PutAttributesRequest) DeleteAttributesRequest(com.amazonaws.services.simpledb.model.DeleteAttributesRequest) GetAttributesRequest(com.amazonaws.services.simpledb.model.GetAttributesRequest) GetAttributesResult(com.amazonaws.services.simpledb.model.GetAttributesResult) ReplaceableAttribute(com.amazonaws.services.simpledb.model.ReplaceableAttribute)

Example 25 with Attribute

use of com.amazonaws.services.simpledb.model.Attribute in project simplejpa by appoxy.

the class ObjectBuilder method getForeignKeys.

private static Set<String> getForeignKeys(EntityManagerSimpleJPA em, PersistentProperty getter, String columnName, List<Attribute> atts) {
    String fkAttName = columnName != null ? columnName : NamingHelper.foreignKey(getter.getFieldName());
    HashSet<String> keys = new HashSet<String>(atts.size());
    for (Attribute att : atts) {
        if (att.getName().equals(fkAttName)) {
            keys.add(att.getValue());
        }
    }
    return keys;
}
Also used : Attribute(com.amazonaws.services.simpledb.model.Attribute)

Aggregations

Attribute (com.amazonaws.services.simpledb.model.Attribute)27 ReplaceableAttribute (com.amazonaws.services.simpledb.model.ReplaceableAttribute)18 Test (org.junit.Test)12 Item (com.amazonaws.services.simpledb.model.Item)8 UpdateCondition (com.amazonaws.services.simpledb.model.UpdateCondition)8 ArrayList (java.util.ArrayList)8 Exchange (org.apache.camel.Exchange)8 Processor (org.apache.camel.Processor)8 SelectResult (com.amazonaws.services.simpledb.model.SelectResult)5 LinkedList (java.util.LinkedList)3 DeleteAttributesRequest (com.amazonaws.services.simpledb.model.DeleteAttributesRequest)2 PutAttributesRequest (com.amazonaws.services.simpledb.model.PutAttributesRequest)2 SelectRequest (com.amazonaws.services.simpledb.model.SelectRequest)2 Field (java.lang.reflect.Field)2 Collection (java.util.Collection)2 HashMap (java.util.HashMap)2 List (java.util.List)2 AmazonClientException (com.amazonaws.AmazonClientException)1 AmazonS3 (com.amazonaws.services.s3.AmazonS3)1 AmazonSimpleDB (com.amazonaws.services.simpledb.AmazonSimpleDB)1