package play.modules.scaffold.generator; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import play.modules.scaffold.entity.Entity; import play.modules.scaffold.entity.PersistenceStrategy; public class DatabaseAccessScaffolding { public static List<String> additionalImportsFor(PersistenceStrategy strategy) { List<String> imports = new ArrayList<String>(); switch (strategy) { case PLAY_JPA: break; case PURE_JPA: imports.add("import play.db.jpa.JPA;"); break; case SIENA: imports.add("import siena.Model;"); break; } return imports; } public static String allFor(Class<?> clazz) { Entity entity = new Entity(clazz); return allFor(entity); } public static String allFor(Entity entity) { String query = null; switch (entity.getPersistenceStrategy()) { case PLAY_JPA: query = entity.getPackageName() + "." + entity.getName() + ".all().fetch()"; break; case PURE_JPA: query = "play.db.jpa.JPA.em().createQuery(\"from " + entity.getName() + "\").getResultList()"; break; case SIENA: query = "siena.Model.all(" + entity.getName() + ".class).fetch()"; break; } return query; } public static String findByIdFor(Entity entity) { return findByIdFor(entity, "id"); } public static String findByIdFor(Entity entity, String fieldName) { String stmt = null; switch (entity.getPersistenceStrategy()) { case PLAY_JPA: stmt = entity.getName() + ".findById(" + fieldName + ")"; break; case PURE_JPA: stmt = "JPA.em().find(" + entity.getModelType().getName() + ".class, " + fieldName + ")"; break; case SIENA: stmt = "Model.all(" + entity.getModelType().getName() + ".class).filter(\"" + entity.getIdField() + "\", " + fieldName + ").get()"; break; } return stmt; } public static String saveFor(Entity entity) { return saveFor(entity, StringUtils.uncapitalize(entity.getName())); } public static String saveFor(Entity entity, String fieldName) { String stmt = null; switch (entity.getPersistenceStrategy()) { case PLAY_JPA: stmt = fieldName + ".save()"; break; case PURE_JPA: stmt = "JPA.em().persist(" + fieldName + ")"; break; case SIENA: stmt = fieldName + ".insert()"; break; } return stmt; } public static String updateFor(Entity entity) { return updateFor(entity, StringUtils.uncapitalize(entity.getName())); } public static String updateFor(Entity entity, String fieldName) { String stmt = null; switch (entity.getPersistenceStrategy()) { case PLAY_JPA: stmt = fieldName + ".save()"; break; case PURE_JPA: stmt = "JPA.em().merge(" + fieldName + ")"; break; case SIENA: stmt = fieldName + ".update()"; break; } return stmt; } public static String deleteFor(Entity entity) { return deleteFor(entity, StringUtils.uncapitalize(entity.getName())); } public static String deleteFor(Entity entity, String fieldName) { String stmt = null; switch (entity.getPersistenceStrategy()) { case PLAY_JPA: stmt = fieldName + ".delete()"; break; case PURE_JPA: stmt = "JPA.em().remove(" + fieldName + ")"; break; case SIENA: stmt = fieldName + ".delete()"; break; } return stmt; } /** * Returns true if the persistence strategy employed for this entity * requires a transient object to be reattached, reassociated, or merged * with a new session before we can update or delete it. * * @return true if entity requires reassociation with the current database * session */ public static boolean requiresReattachFor(Entity entity) { boolean requiresReattach = false; switch (entity.getPersistenceStrategy()) { case PLAY_JPA: requiresReattach = true; break; } return requiresReattach; } public static String reattachFor(Entity entity) { return reattachFor(entity, StringUtils.uncapitalize(entity.getName())); } public static String reattachFor(Entity entity, String fieldName) { String stmt = null; switch (entity.getPersistenceStrategy()) { case PLAY_JPA: stmt = fieldName + ".merge()"; break; } return stmt; } }