package com.idega.core.persistence.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.logging.Logger; import javax.persistence.NoResultException; import javax.persistence.Query; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.idega.core.persistence.DaoFunctions; import com.idega.core.persistence.Param; import com.idega.util.CoreUtil; import com.idega.util.ListUtil; /** * @author <a href="mailto:civilis@idega.com">Vytautas Čivilis</a> * @version $Revision: 1.3 $ Last modified: $Date: 2009/05/22 04:55:13 $ by $Author: laddi $ */ @Service @Scope(BeanDefinition.SCOPE_SINGLETON) public class DaoFunctionsImpl implements DaoFunctions { private static final Logger logger = Logger.getLogger(DaoFunctionsImpl.class.getName()); private static final List<Class<?>> IMPLEMENTED_CONVERTERS = Collections.unmodifiableList(Arrays.asList(new Class<?>[] { Long.class, Integer.class, Float.class, Byte.class, Double.class, Short.class })); @Override @Transactional(readOnly = true) @SuppressWarnings("unchecked") public <Expected> List<Expected> getResultListByQuery(Query q, Class<Expected> expectedReturnType, Param... params) { if (params != null) for (Param param : params) { q.setParameter(param.getParamName(), param.getParamValue()); } final List<Expected> fresult; if (IMPLEMENTED_CONVERTERS.contains(expectedReturnType)) { fresult = getRealResults(q.getResultList(), expectedReturnType); } else { fresult = q.getResultList(); } return fresult; } @SuppressWarnings("unchecked") private <Exptected> List<Exptected> getRealResults(List<Object> results, Class<Exptected> expectedReturnType) { if (ListUtil.isEmpty(results)) return null; List<Exptected> realResults = new ArrayList<Exptected>(); for (Object result : results) { if (expectedReturnType.isInstance(result)) { realResults.add((Exptected) result); } else if (result instanceof Number) { Number number = (Number) result; if (expectedReturnType.equals(Long.class)) { // Long realResults.add((Exptected) Long .valueOf(number.longValue())); } else if (expectedReturnType.equals(Integer.class)) { // Integer realResults.add((Exptected) Integer.valueOf(number .intValue())); } else if (expectedReturnType.equals(Float.class)) { // Float realResults.add((Exptected) Float.valueOf(number .floatValue())); } else if (expectedReturnType.equals(Byte.class)) { // Byte realResults.add((Exptected) Byte .valueOf(number.byteValue())); } else if (expectedReturnType.equals(Double.class)) { // Double realResults.add((Exptected) Double.valueOf(number .doubleValue())); } else if (expectedReturnType.equals(Short.class)) { // Short realResults.add((Exptected) Short.valueOf(number .shortValue())); } } else { String message = "Can not convert " + result + " (" + result.getClass() + ") to: " + expectedReturnType + ": such converter is not implemented yet!"; logger.warning(message); CoreUtil.sendExceptionNotification(message, null); } } return ListUtil.isEmpty(realResults) ? null : realResults; } @Override @Transactional(readOnly = true, noRollbackFor = NoResultException.class) public <Expected> Expected getSingleResultByQuery(Query q, Class<Expected> expectedReturnType, Param... params) { if (params != null) for (Param param : params) { q.setParameter(param.getParamName(), param.getParamValue()); } @SuppressWarnings("unchecked") Expected result = (Expected) q.getSingleResult(); return result; } @Override @Transactional(readOnly = true) @SuppressWarnings("unchecked") public <Expected> List<Expected> getResultListByQuery(Query q, Class<Expected> expectedReturnType, Collection<Param> params) { if (params != null) for (Param param : params) { q.setParameter(param.getParamName(), param.getParamValue()); } final List<Expected> fresult; if (IMPLEMENTED_CONVERTERS.contains(expectedReturnType)) { fresult = getRealResults(q.getResultList(), expectedReturnType); } else { fresult = q.getResultList(); } return fresult; } }