package eu.ttbox.androgister.domain.dao.order; import java.util.Calendar; import java.util.concurrent.atomic.AtomicLong; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import eu.ttbox.androgister.AndroGisterApplication; import eu.ttbox.androgister.domain.OrderDao; /** * Android Identifier {link http://android-developers.blogspot.fr/2011/03/identifying-app-installations.html} * @author jmorille * */ public class OrderIdGenerator { private final static String TAG = "OrderIdGenerator"; private final static String QUERY_SELECT_MAX_ORDER_NUMBER = "SELECT MAX(" + OrderDao.Properties.OrderNumber.columnName + ") AS max_id FROM " + OrderDao.TABLENAME // + " WHERE " + OrderDao.Properties.OrderDate.columnName + " >= %s and " + OrderDao.Properties.OrderDate.columnName + " < %s"; private AndroGisterApplication application; public OrderIdGenerator(Context context) { this.application = (AndroGisterApplication) context.getApplicationContext(); } public long getNextOrderNum(SQLiteDatabase db, long now) { // Compute Minighth date Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(now); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); long dateMidnight = cal.getTimeInMillis(); if (! getOrderIdSequence().isValidCache(dateMidnight)) { // Compute tomorow day cal.add(Calendar.DATE, 1); long tomorrow = cal.getTimeInMillis(); // Read for Db getDbMaxId(db, dateMidnight, tomorrow); } long nextOrderNum = getOrderIdSequence().incrementAndGet(); Log.i(TAG, String.format("Transform now %s to Date Mightnight %s => Max Number = %s", now, dateMidnight, nextOrderNum)); return nextOrderNum; } public OrderIdSequence getOrderIdSequence() { return application.getOrderIdSequence(); } public void invalidateCacheCounter() { getOrderIdSequence().invalidateCacheCounter(); } private long getDbMaxId(SQLiteDatabase db, long dateMightnight, long tomorrow) { // Do Database Request String query = String.format(QUERY_SELECT_MAX_ORDER_NUMBER, dateMightnight, tomorrow); Log.i(TAG, String.format("Check for max Order Number in range of %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS,%1$tL to Tomorrow %2$tY-%2$tm-%2$td %2$tH:%2$tM:%2$tS,%2$tL", dateMightnight, tomorrow)); Log.i(TAG, query); Cursor cursor = db.rawQuery(query, null); long id = 0; try { if (cursor.moveToFirst()) { do { id = cursor.getLong(0); } while (cursor.moveToNext()); } } finally { cursor.close(); } getOrderIdSequence().initCacheCounter(new AtomicLong(id), dateMightnight); return id; } }