Hi,
Can anybody help solve my problem?
Gunnar

Here is the testcode:

package appengine.test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

import javax.jdo.JDOHelper;
import javax.jdo.ObjectState;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;
import javax.jdo.spi.PersistenceCapable;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class ListordertestServlet extends HttpServlet {

        StringBuilder sb = new StringBuilder();

        public void doGet(HttpServletRequest req, HttpServletResponse resp)
                        throws IOException {
                sb = new StringBuilder();
                resp.setContentType("text/plain");
                deleteAll();
                MyEntity entity = persist();
                entity = add(entity, "one");
                query();
                entity = add(entity, "two");
                query();
                entity = add(entity, "three");
                query();
                entity = reorder(entity);
                query();
                resp.getWriter().println(sb.toString());
        }

        private MyEntity persist() {
                MyEntity entity = new MyEntity();
                // MyEntity detached = null;
                ArrayList<SubEntity> subEntities = new ArrayList<SubEntity>();
                entity.setMyList(subEntities);
                PersistenceManager pm = PMF.get().getPersistenceManager();
                Transaction tx = pm.currentTransaction();
                pm.setDetachAllOnCommit(true);
                try {
                        tx.begin();
                        pm.makePersistent(entity);
                        tx.commit();
                        // detached = pm.detachCopy(entity);
                        sb.append("persisted entity: " + entity.getId() + "\n");
                        // sb.append("detached object: " + detached + "\n");
                } catch (Exception e) {
                        printStackTrace(e);
                } finally {
                        if (tx.isActive())
                                tx.rollback();
                        pm.close();
                }
                // return detached;
                return entity;
        }

        private MyEntity add(MyEntity entity, String name) {
                // MyEntity detached = null;
                sb.append("before add " + entity.toString() + "\n");
                PersistenceManager pm = PMF.get().getPersistenceManager();
                Transaction tx = pm.currentTransaction();
                pm.setDetachAllOnCommit(true);
                try {
                        tx.begin();
                        final SubEntity subEntity = new SubEntity(name);
                        entity.getMyList().add(0,subEntity);
                        entity = pm.makePersistent(entity);
                        tx.commit();
                        // detached = pm.detachCopy(entity);
                        // pm.detachCopy(entity);
                        sb.append("added sub-entity " + name + "\n");
                        // sb.append("detached object: " + detached + "\n");
                        sb.append("after add: " + entity + "\n");
                } catch (Exception e) {
                        printStackTrace(e);
                } finally {
                        if (tx.isActive())
                                tx.rollback();
                        pm.close();
                }
                // return detached;
                return entity;
        }

        private MyEntity reorder(MyEntity entity) {
                // MyEntity detached = null;
                sb.append("before reorder " + entity.toString() + "\n");
                PersistenceManager pm = PMF.get().getPersistenceManager();
                Transaction tx = pm.currentTransaction();
                pm.setDetachAllOnCommit(true);
                try {
                        tx.begin();
                        ArrayList<SubEntity> myList = entity.getMyList();
                        SubEntity first = myList.remove(0);
                        myList.add(first);
                        entity = pm.makePersistent(entity);
                        tx.commit();
                        // detached = pm.detachCopy(entity);
                        // sb.append("detached object: " + detached + "\n");
                        sb.append("reordered object: " + entity + "\n");
                } catch (Exception e) {
                        printStackTrace(e);
                } finally {
                        if (tx.isActive())
                                tx.rollback();
                        pm.close();
                }
                // return detached;
                return entity;
        }

        @SuppressWarnings("unchecked")
        private void deleteAll() {
                PersistenceManager pm = PMF.get().getPersistenceManager();
                Query query = pm.newQuery(MyEntity.class);
                Transaction tx = pm.currentTransaction();
                try {
                        tx.begin();
                        List<MyEntity> results = (List<MyEntity>) 
query.execute();
                        if (results.iterator().hasNext()) {
                                pm.deletePersistentAll(results);
                        }
                        tx.commit();
                        sb.append("deleted all objects" + "\n");
                } catch (Exception e) {
                        printStackTrace(e);
                } finally {
                        if (tx.isActive())
                                tx.rollback();
                        query.closeAll();
                        pm.close();
                }
        }

        @SuppressWarnings("unchecked")
        private void query() {
                sb.append("query\n");
                PersistenceManager pm = PMF.get().getPersistenceManager();
                Query query = pm.newQuery(MyEntity.class);
                try {
                        List<MyEntity> results = (List<MyEntity>) 
query.execute();
                        if (results.iterator().hasNext()) {
                                for (MyEntity e : results) {
                                        sb.append(e + "\n");
                                        for (SubEntity s : e.getMyList()) {
                                                sb.append(s + "\n");
                                        }
                                        sb.append("-------------\n");
                                }
                        }
                } catch (Exception e) {
                        printStackTrace(e);
                } finally {
                        query.closeAll();
                        pm.close();
                }

        }

        private void printStackTrace(Exception e) {
                final ByteArrayOutputStream ba = new ByteArrayOutputStream();
                PrintStream ps = new PrintStream(ba);
                e.printStackTrace(ps);
                sb.append(ba.toString());
                e.printStackTrace();
        }

}

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to