Example usage for org.hibernate.engine.spi CollectionEntry getSnapshot

List of usage examples for org.hibernate.engine.spi CollectionEntry getSnapshot

Introduction

In this page you can find the example usage for org.hibernate.engine.spi CollectionEntry getSnapshot.

Prototype

public Serializable getSnapshot() 

Source Link

Usage

From source file:br.gov.jfrj.siga.model.Objeto.java

License:Open Source License

private static void cascadeOrphans(Objeto base, PersistentCollection persistentCollection, boolean willBeSaved)
        throws UnexpectedException {
    SessionImpl session = ((SessionImpl) em().getDelegate());
    PersistenceContext pc = session.getPersistenceContext();
    CollectionEntry ce = pc.getCollectionEntry(persistentCollection);

    if (ce != null) {
        CollectionPersister cp = ce.getLoadedPersister();
        if (cp != null) {
            Type ct = cp.getElementType();
            if (ct instanceof EntityType) {
                EntityEntry entry = pc.getEntry(base);
                String entityName = entry.getEntityName();
                entityName = ((EntityType) ct).getAssociatedEntityName(session.getFactory());
                if (ce.getSnapshot() != null) {
                    Collection orphans = ce.getOrphans(entityName, persistentCollection);
                    for (Object o : orphans) {
                        saveAndCascadeIfObjeto(o, willBeSaved);
                    }/*from   w w  w  .j av a 2s.c o m*/
                }
            }
        }
    }
}

From source file:org.granite.tide.hibernate4.HibernateDataChangePublishListener.java

License:Open Source License

@SuppressWarnings("unchecked")
public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
    Object owner = event.getAffectedOwnerOrNull();
    if (DataPublishListener.handleExclude(owner))
        return;/*from  w ww .java  2 s  .c  om*/

    CollectionEntry collectionEntry = event.getSession().getPersistenceContext()
            .getCollectionEntry(event.getCollection());

    String propertyName = collectionEntry.getRole().substring(
            collectionEntry.getLoadedPersister().getOwnerEntityPersister().getEntityName().length() + 1);

    Object change = getChange(collectionEntry.getLoadedPersister().getOwnerEntityPersister(),
            event.getSession(), event.getAffectedOwnerEntityName(), event.getAffectedOwnerIdOrNull(), owner);
    if (change == null || !(change instanceof Change))
        return;

    PersistentCollection newColl = event.getCollection();
    Serializable oldColl = collectionEntry.getSnapshot();

    if (oldColl == null && newColl.hasQueuedOperations()) {
        List<Object[]> added = new ArrayList<Object[]>();
        List<Object[]> removed = new ArrayList<Object[]>();
        List<Object[]> updated = new ArrayList<Object[]>();

        List<?> queuedOperations = get(newColl, "operationQueue", List.class);
        for (Object op : queuedOperations) {
            // Great !!
            if (op.getClass().getName().endsWith("$Add")) {
                added.add(new Object[] { get(op, "index"), get(op, "value") });
            } else if (op.getClass().getName().endsWith("$SimpleAdd")) {
                added.add(new Object[] { null, get(op, "value") });
            } else if (op.getClass().getName().endsWith("$Put")) {
                added.add(new Object[] { get(op, "index"), get(op, "value") });
            } else if (op.getClass().getName().endsWith("$Remove")) {
                removed.add(new Object[] { get(op, "index"), get(op, "old") });
            } else if (op.getClass().getName().endsWith("$SimpleRemove")) {
                removed.add(new Object[] { null, get(op, "value") });
            } else if (op.getClass().getName().endsWith("$Set")) {
                updated.add(new Object[] { get(op, "index"), get(op, "value") });
            }
        }

        CollectionChange[] collChanges = new CollectionChange[added.size() + removed.size() + updated.size()];
        int idx = 0;
        for (Object[] obj : added)
            collChanges[idx++] = new CollectionChange(1, obj[0], obj[1]);

        for (Object[] obj : removed) {
            Object value = obj[1];
            if (value != null && value.getClass().isAnnotationPresent(Entity.class)) {
                org.granite.util.Entity e = new org.granite.util.Entity(value);
                value = new ChangeRef(e.getName(), (String) get(value, "uid"),
                        (Serializable) e.getIdentifier());
            }
            collChanges[idx++] = new CollectionChange(-1, obj[0], value);
        }

        for (Object[] obj : updated)
            collChanges[idx++] = new CollectionChange(0, obj[0], obj[1]);

        ((Change) change).addCollectionChanges(propertyName, collChanges);
    } else if (oldColl != null && newColl instanceof List<?>) {
        List<?> oldSnapshot = (List<?>) oldColl;
        List<?> newList = (List<?>) newColl;

        List<Object[]> ops = Utils.diffLists(oldSnapshot, newList);

        CollectionChange[] collChanges = new CollectionChange[ops.size()];
        int idx = 0;
        for (Object[] obj : ops)
            collChanges[idx++] = new CollectionChange((Integer) obj[0], obj[1], obj[2]);

        ((Change) change).addCollectionChanges(propertyName, collChanges);
    } else if (oldColl != null && newColl instanceof Collection<?>) {
        Map<?, ?> oldSnapshot = (Map<?, ?>) oldColl;

        Set<Object> added = new HashSet<Object>();
        added.addAll((Collection<?>) newColl);
        added.removeAll(new HashSet<Object>(oldSnapshot.keySet()));

        Set<Object> removed = new HashSet<Object>();
        removed.addAll(new HashSet<Object>(oldSnapshot.keySet()));
        removed.removeAll((Collection<?>) newColl);

        CollectionChange[] collChanges = new CollectionChange[added.size() + removed.size()];
        int idx = 0;
        for (Object obj : added)
            collChanges[idx++] = new CollectionChange(1, null, obj);

        for (Object obj : removed)
            collChanges[idx++] = new CollectionChange(-1, null, obj);

        ((Change) change).addCollectionChanges(propertyName, collChanges);
    } else if (oldColl != null && newColl instanceof Map<?, ?>) {
        Map<?, ?> oldSnapshot = (Map<?, ?>) oldColl;

        Set<Entry<Object, Object>> added = new HashSet<Entry<Object, Object>>();
        added.addAll(((Map<Object, Object>) newColl).entrySet());
        added.removeAll(new HashMap<Object, Object>(oldSnapshot).entrySet());

        Set<Entry<Object, Object>> removed = new HashSet<Entry<Object, Object>>();
        removed.addAll(new HashMap<Object, Object>(oldSnapshot).entrySet());
        removed.removeAll(((Map<Object, Object>) newColl).entrySet());

        CollectionChange[] collChanges = new CollectionChange[added.size() + removed.size()];
        int idx = 0;
        for (Entry<?, ?> me : added)
            collChanges[idx++] = new CollectionChange(1, me.getKey(), me.getValue());

        for (Entry<?, ?> me : removed)
            collChanges[idx++] = new CollectionChange(-1, me.getKey(), me.getValue());

        ((Change) change).addCollectionChanges(propertyName, collChanges);
    }
}