All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.pelle.mango.db.dao.BaseVODAO Maven / Gradle / Ivy

The newest version!
package io.pelle.mango.db.dao;

import io.pelle.mango.client.base.vo.IBaseEntity;
import io.pelle.mango.client.base.vo.IBaseVO;
import io.pelle.mango.client.base.vo.IVOEntity;
import io.pelle.mango.client.base.vo.query.CountQuery;
import io.pelle.mango.client.base.vo.query.SelectQuery;
import io.pelle.mango.db.query.ServerCountQuery;
import io.pelle.mango.db.util.DBUtil;
import io.pelle.mango.db.util.EntityVOMapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.Collections2;

@Component
public class BaseVODAO extends BaseDAO {

	@Autowired(required = false)
	private List voDaoDecorators = new ArrayList();

	@Autowired
	private IBaseEntityDAO baseEntityDAO;

	@SuppressWarnings("unchecked")
	@Override
	public  T create(T baseVO) {

		// if (baseVO instanceof IHasMetadata) {
		// ((IHasMetadata) baseVO).getMetadata().disableLoadChecking();
		// }

		IBaseEntity baseEntity = DBUtil.convertVOToEntityClass(baseVO);

		baseEntity = baseEntityDAO.create(baseEntity);

		T result = (T) DBUtil.convertEntityToVO(baseEntity);
		decorateVO(result);

		return result;
	}

	@SuppressWarnings("unchecked")
	@Override
	public  T read(long id, Class voClass) {

		Class entityClass = EntityVOMapper.getInstance().getMappedEntityClass(voClass);
		IBaseEntity baseEntity = baseEntityDAO.read(id, entityClass);

		return (T) DBUtil.convertEntityToVO(baseEntity);
	}

	@Override
	public  void deleteAll(Class voClass) {
		Class entityClass = EntityVOMapper.getInstance().getMappedEntityClass(voClass);
		baseEntityDAO.deleteAll(entityClass);
	}

	@SuppressWarnings("unchecked")
	@Override
	public  T save(T baseVO) {
		IBaseEntity baseEntity = DBUtil.convertVOToEntityClass(baseVO);

		baseEntity = baseEntityDAO.save(baseEntity);

		T result = (T) DBUtil.convertEntityToVO(baseEntity);
		decorateVO(result);

		return result;

	}

	@Override
	public  void delete(T baseVO) {
		IBaseEntity baseEntity = DBUtil.convertVOToEntityClass(baseVO);
		baseEntityDAO.delete(baseEntity);
	}

	@Override
	public  Optional read(SelectQuery selectQuery) {
		List result = filter(selectQuery);

		if (result.size() == 1) {
			return Optional.of(result.get(0));
		} else {
			return Optional. absent();
		}
	}

	@Override
	public  List filter(SelectQuery selectQuery) {

		List entityResult = (List) getResultListInternal(selectQuery, entityManager);

		final Map, Set> loadAssociations = DBUtil.getLoadAssociations(selectQuery);

		return new ArrayList<>(Collections2.transform(entityResult, new Function() {
			@Override
			public T apply(IBaseEntity baseEntity) {
				@SuppressWarnings("unchecked")
				T baseVO = (T) DBUtil.convertEntityToVO(baseEntity, loadAssociations);
				decorateVO(baseVO);
				return baseVO;
			}
		}));
	}

	@Override
	@SuppressWarnings("unchecked")
	public  List getAll(Class voClass) {
		Class entityClass = EntityVOMapper.getInstance().getMappedEntityClass(voClass);
		return (List) baseEntityDAO.getAll(entityClass);
	}

	@Override
	public  long count(CountQuery countQuery) {
		return (long) entityManager.createQuery(ServerCountQuery.adapt(countQuery).getJPQL(EntityVOMapper.getInstance())).getSingleResult();
	}

	@Override
	public  List searchByNaturalKey(Class entityClass, String naturalKey) {
		return filter(DBUtil.getNaturalKeyQuery(entityClass, naturalKey));
	}

	@Override
	public  void delete(Class voClass, long id) {
		Class entityClass = EntityVOMapper.getInstance().getMappedEntityClass(voClass);
		baseEntityDAO.delete(entityClass, id);
	}

	@Override
	public  long count(Class voClass) {
		Class entityClass = EntityVOMapper.getInstance().getMappedEntityClass(voClass);
		return baseEntityDAO.count(entityClass);
	}

	private void decorateVO(IBaseVO vo) {
		for (IVODAODecorator voDaoDecorator : this.voDaoDecorators) {
			if (voDaoDecorator.supports(vo.getClass())) {
				voDaoDecorator.decorateVO(vo);
			}
		}
	}

	@Override
	public  T getNewVO(String className, Map properties) {

		Class voClass = EntityVOMapper.getInstance().getVOClass(className);
		Class entityClass = EntityVOMapper.getInstance().getMappedEntityClass(voClass);

		IBaseEntity entity = baseEntityDAO.getNewVO(entityClass.getName(), properties);

		T result = DBUtil. convertEntityToVO(entity);

		decorateVO(result);

		return result;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy