Package org.luke.ct.core

Source Code of org.luke.ct.core.DAOSupport

package org.luke.ct.core;

import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;

import org.luke.ct.model.BaseEntity;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

/**
* 以jdo方式實現的基礎數據類
*
* @since 2011/09/01 1.0
* @version 1.0
* @author kyle
*
* @param <T>
*          實體類 entity class
*/
public class DAOSupport<T extends BaseEntity> implements IDAO<T> {

  // 獲得當前T的類型
  protected Class<T> entityClass;// = GenericsUtil.getSuperClassGenricType(this.getClass());
  // 日誌對像
  private static final Logger log = Logger.getLogger(DAOSupport.class.getName());

  @SuppressWarnings("unchecked")
  public DAOSupport() {
    // 獲得當前T的類型
    this.entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  }

  /**
   * 添加實體
   */

  public void add(T entity) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    try {
      // 連同encodeKey一起存起來
      pm.makePersistent(entity);
      entity.setEncodedKey();
      pm.makePersistent(entity);
      log.info("add entity" + entity.getClass().getName());
    } catch (Exception e) {
      log.severe("添加實體 " + entity.getClass().getName() + " 時候出錯!");
      log.severe(e.getMessage());
    } finally {
      pm.close();
    }
  }

  /**
   * 刪除實體
   */

  public void delete(Key key) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    try {
      T delEntity = pm.getObjectById(entityClass, key);
      pm.deletePersistent(delEntity);
      log.info("delete entity" + entityClass.getName());
    } catch (Exception e) {
      log.severe("刪除實體 " + entityClass.getName() + "時候出錯!");
      log.severe(e.getMessage());
    } finally {
      pm.close();
    }
  }

  /**
   * 更新實體
   */

  public void modify(T entity) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    try {
      // 更新數據,直接調用makePersistent()方法的,要求實體類註解了如下
      // @PersistenceCapable(detachable="true")
      pm.makePersistent(entity);
      log.info("modify entity" + entityClass.getName());
    } catch (Exception e) {
      log.severe("更新實體 " + entity.getClass().getName() + "時候出錯!");
      log.severe(e.getMessage());
    } finally {
      pm.close();
    }
  }

  /**
   * @param filter
   *          查詢過濾條件
   * @param ordering
   *          查詢後排序條件
   * @param firstResult
   *          開始記錄
   * @param maxResult
   *          檢索結果的最大數量
   * @return 查詢處理好的數據
   * @author kyle
   */
  @SuppressWarnings("unchecked")
  public QueryResult<T> getPaginationData(String filter, String ordering, long firstResult, long maxResult) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    QueryResult<T> qr = new QueryResult<T>();
    try {
      Query query = GSQLUtil.getSelectSqlStr(pm, entityClass, filter, ordering, firstResult, maxResult);
      Object obj = query.execute();
      if (obj != null) {
        List<T> list = (List<T>) obj;
        qr.setResultList(list);
        // 不調用list.size()方法,那麼調用pm.close()後,再次使用list會出現Object Manager has been closed Exception
        list.size();
        Query queryCount = GSQLUtil.getSelectSqlStr(pm, entityClass, filter);
        List<T> l = (List<T>) queryCount.execute();
        qr.setTotalRecord(l.size());
      } else {
        qr.setResultList(new ArrayList<T>());
        qr.setTotalRecord((long) 0);
      }
      log.info("query entity" + entityClass.getName());
    } catch (Exception e) {
      log.severe("查詢時候出錯了!");
      log.severe(e.getMessage());
    } finally {
      pm.close();
    }
    return qr;
  }

  /**
   * @param filter
   *          查詢過濾條件
   * @param odering
   *          查詢後排序條件
   * @return 查詢處理好的數據
   * @author kyle
   */

  public QueryResult<T> getPaginationData(String filter, String ordering) {
    long min = -1;
    return getPaginationData(filter, ordering, min, min);
  }

  /**
   *
   * @param filter
   *          查詢過濾條件
   * @param firstResult
   *          開始記錄
   * @param maxResult
   *          檢索結果的最大數量
   * @return 查詢處理好的數據
   * @author kyle
   */

  public QueryResult<T> getPaginationData(String filter, long firstResult, long maxResult) {
    return getPaginationData(filter, null, firstResult, maxResult);
  }

  /**
   *
   * @param firstResult
   *          開始記錄
   * @param maxResult
   *          檢索結果的最大數量
   * @return 查詢處理好的數據
   * @author kyle
   */

  public QueryResult<T> getPaginationData(long firstResult, long maxResult) {
    return getPaginationData(null, null, firstResult, maxResult);
  }

  /**
   * @param filter
   *          查詢過濾條件
   * @return 查詢處理好的數據
   * @author kyle
   */

  public QueryResult<T> getPaginationData(String filter) {
    return getPaginationData(filter, null);
  }

  /**
   * @return 查詢處理好的數據
   * @author kyle
   */

  public QueryResult<T> getPaginationData() {
    return getPaginationData(null);
  }

  public T getDataByID(Key key) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    T entity = null;
    try {
      entity = (T) pm.getObjectById(entityClass, key);
      log.info("query entity" + entityClass.getName());
    } catch (Exception e) {
      log.severe("查詢時候出錯了!");
      log.severe(e.getMessage());
    } finally {
      pm.close();
    }
    return entity;
  }

  public T getDataByID(String encodeKey) {
    try {
      Key key = KeyFactory.stringToKey(encodeKey);
      return getDataByID(key);
    } catch (IllegalArgumentException e) {
      log.severe("encodeKey不合法!error:" + e.getMessage());
      return null;
    }
  }

  public T getDataByID(Long key) {
    try {
      Key k = KeyFactory.createKey(entityClass.getSimpleName(), key);
      return getDataByID(k);
    } catch (IllegalArgumentException e) {
      log.severe("Long Key不合法!error:" + e.getMessage());
      return null;
    }
  }

}
TOP

Related Classes of org.luke.ct.core.DAOSupport

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.