/* Copyright (c) 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.appengine.demos.jdoexamples; import javax.jdo.JDOObjectNotFoundException; import javax.jdo.PersistenceManager; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; public class NamedCounterUtils { public static Key getKeyForName(String name) { return KeyFactory.createKey(NamedCounter.class.getSimpleName(), name); } public static NamedCounter getByName(String name) { PersistenceManager pm = PMF.get().getPersistenceManager(); NamedCounter counter = null; try { counter = pm.getObjectById(NamedCounter.class, KeyFactory.keyToString(getKeyForName(name))); } catch (JDOObjectNotFoundException e) { counter = new NamedCounter(name); } return counter; } public static int addAndGet(String name, int delta) { PersistenceManager pm = PMF.get().getPersistenceManager(); NamedCounter counter = null; try { // Detach the persisted objects after changes are commited since we // access members after the transaction is commited. Without this // setting, the counter members could be wiped after the transaction is // closed. pm.setDetachAllOnCommit(true); pm.currentTransaction().begin(); try { counter = pm.getObjectById(NamedCounter.class, KeyFactory.keyToString(getKeyForName(name))); counter.add(delta); } catch (JDOObjectNotFoundException e) { counter = new NamedCounter(name); // Only need this make persistent call here, since any counter // already retrieved using JDO will be marked as persistent once // we increment the counter; JDO will automatically write it to // the Datastore on commit. counter.add(delta); pm.makePersistent(counter); } pm.currentTransaction().commit(); } finally { if (pm.currentTransaction().isActive()) { pm.currentTransaction().rollback(); } } return counter.getCount(); } public static void reset(String name) { PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.currentTransaction().begin(); try { NamedCounter counter = pm.getObjectById(NamedCounter.class, KeyFactory.keyToString(getKeyForName(name))); pm.deletePersistent(counter); } catch (JDOObjectNotFoundException e) { // Object isn't there, so ignore it. return; } pm.currentTransaction().commit(); } finally { if (pm.currentTransaction().isActive()) { pm.currentTransaction().rollback(); } } } }