package com.din.din.model.dao;
import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import com.din.din.model.dao.QuantityTypeDAO.MeasurementSystem;
import com.din.din.model.entities.KeyEntity;
import com.din.din.model.entities.Project;
import com.din.din.model.entities.Recipe;
import com.din.din.model.entities.Recipe.TimeMeasurement;
import com.din.din.model.entities.RecipeItem;
import com.din.din.model.util.EntityCachingManager;
import com.din.din.model.util.EntityCachingManager.CacheLoader;
import com.din.din.webapp.beans.util.BeanUtil;
import com.din.din.webapp.listeners.EMFListener;
import com.google.appengine.api.datastore.Text;
public class RecipeDAO extends GenericDAO {
public static List<Recipe> getRecipesByProject(Project project) {
return getRecipesByProject(null, project);
}
@SuppressWarnings("unchecked")
protected static List<Recipe> getRecipesByProject(EntityManager entityManager, Project project) {
boolean contained = false;
if(entityManager == null) {
entityManager = EMFListener.get();
contained = true;
}
List<Recipe> recipes = null;
EntityTransaction transaction = entityManager.getTransaction();
try {
if(!transaction.isActive()) {
contained = true;
transaction.begin();
}
String queryString = "select r from {0} r where project = :project";
Query q = entityManager.createQuery(MessageFormat.format(queryString, Recipe.class.getName()));
q.setParameter("project", project);
recipes = (List<Recipe>)q.getResultList();
for(Recipe recipe : recipes) {
recipe.setProject(project);
}
if(contained) {
transaction.commit();
}
} finally {
if(contained) {
// If transaction is active and we started it, it means we weren't able to commit it
if(transaction.isActive()) {
transaction.rollback();
}
entityManager.close();
}
}
return recipes;
}
public static void createDefaultRecipes(Project project, MeasurementSystem system, EntityCachingManager cache) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException {
createDefaultRecipes(null, project, system, cache);
}
protected static void createDefaultRecipes(EntityManager entityManager, Project project, MeasurementSystem system, EntityCachingManager cache) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException {
boolean contained = false;
if(entityManager == null) {
contained = true;
entityManager = EMFListener.get();
}
EntityTransaction transaction = entityManager.getTransaction();
try {
if(!transaction.isActive()) {
contained = true;
transaction.begin();
}
Recipe recipe = new Recipe();
if(system == MeasurementSystem.Imperial) {
recipe.setCategory(BeanUtil.getMessage("recipe.category.sandwiches"));
recipe.setTitle(BeanUtil.getMessage("recipe.classicBLT"));
recipe.setRecipeText(new Text(BeanUtil.getMessage("recipe.classicBLT.text")));
recipe.setServes(4);
recipe.setProject(project);
recipe = (Recipe)save(entityManager, recipe, cache);
} else {
recipe.setCategory(BeanUtil.getMessage("recipe.category.entrees"));
recipe.setTitle(BeanUtil.getMessage("recipe.potatoAndOnionOmelette"));
recipe.setRecipeText(new Text(BeanUtil.getMessage("recipe.potatoAndOnionOmelette.text")));
recipe.setServes(1);
recipe.setProject(project);
recipe.setCookingTime(new BigDecimal(10));
recipe.setCookingTimeMeasurement(TimeMeasurement.Minutes);
recipe = (Recipe)save(entityManager, recipe, cache);
}
RecipeItemDAO.createDefaultRecipeItems(entityManager, recipe, system, cache);
if(contained) {
transaction.commit();
}
} finally {
if(contained) {
if(transaction.isActive()) {
transaction.rollback();
}
entityManager.close();
}
}
}
public static void loadRecipeItems(final Recipe recipe, EntityCachingManager cache) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException {
List<KeyEntity> recipeItems = cache.getChildren(RecipeItem.class, "recipe", recipe, new CacheLoader<RecipeItem>() {
public List<RecipeItem> onCacheLoad() {
return RecipeItemDAO.getRecipeItemsByRecipe(recipe);
}
});
RecipeItem[] recipeItemArray = recipeItems.toArray(new RecipeItem[0]);
recipe.setRecipeItems(Arrays.asList(recipeItemArray));
}
}