001 package com.khubla.pragmatach.plugin.ebean; 002 003 import java.io.Serializable; 004 import java.util.List; 005 import java.util.Set; 006 007 import javax.persistence.Entity; 008 009 import com.avaje.ebean.EbeanServer; 010 import com.avaje.ebean.EbeanServerFactory; 011 import com.avaje.ebean.Query; 012 import com.avaje.ebean.config.DataSourceConfig; 013 import com.avaje.ebean.config.ServerConfig; 014 import com.khubla.pragmatach.framework.api.PragmatachException; 015 import com.khubla.pragmatach.framework.application.Application; 016 import com.khubla.pragmatach.framework.dao.AbstractDAO; 017 import com.khubla.pragmatach.framework.scanner.AnnotationScanner; 018 019 /** 020 * @author tome 021 */ 022 public class EBeanDAO<T, I extends Serializable> extends AbstractDAO<T, I> { 023 /** 024 * create the EBean server 025 */ 026 private static EbeanServer getEBeanServer() { 027 try { 028 /* 029 * make the config 030 */ 031 final ServerConfig serverConfig = new ServerConfig(); 032 serverConfig.setDefaultServer(true); 033 serverConfig.setName("pragmatach"); 034 /* 035 * DDL options 036 */ 037 final String autoCreate = Application.getConfiguration().getParameter("ebean.autocreate"); 038 if (null != autoCreate) { 039 if (true == Boolean.parseBoolean(autoCreate)) { 040 serverConfig.setDdlGenerate(true); 041 serverConfig.setDdlRun(true); 042 } 043 } 044 final String dataSource = Application.getConfiguration().getParameter("ebean.datasource"); 045 if ((null != dataSource) && (dataSource.length() > 0)) { 046 serverConfig.setDataSourceJndiName(dataSource); 047 } else { 048 /* 049 * ebean datasource 050 */ 051 final DataSourceConfig dataSourceConfig = new DataSourceConfig(); 052 dataSourceConfig.setDriver(Application.getConfiguration().getParameter("ebean.driver")); 053 dataSourceConfig.setUsername(Application.getConfiguration().getParameter("ebean.username")); 054 dataSourceConfig.setPassword(Application.getConfiguration().getParameter("ebean.password")); 055 final String url = Application.getConfiguration().getParameter("ebean.url"); 056 if (null != url) { 057 dataSourceConfig.setUrl(url); 058 } else { 059 throw new Exception("ebean.url must be specified"); 060 } 061 serverConfig.setDataSourceConfig(dataSourceConfig); 062 } 063 /* 064 * add classes 065 */ 066 final Set<Class<?>> entityClasses = getEntityClasses(); 067 if (null != entityClasses) { 068 for (final Class<?> clazz : entityClasses) { 069 serverConfig.addClass(clazz); 070 } 071 } 072 /* 073 * the server 074 */ 075 return EbeanServerFactory.create(serverConfig); 076 } catch (final Exception e) { 077 throw new ExceptionInInitializerError(e); 078 } 079 } 080 081 /** 082 * the annotation scanner will have run; we can just query for annotated classes 083 */ 084 protected static Set<Class<?>> getEntityClasses() throws PragmatachException { 085 try { 086 return AnnotationScanner.getAllClasses(Entity.class); 087 } catch (final Exception e) { 088 throw new PragmatachException("Exception in getAnnotatedClasses", e); 089 } 090 } 091 092 /** 093 * EBean 094 */ 095 private static EbeanServer ebeanServer = getEBeanServer(); 096 /** 097 * the type 098 */ 099 private final Class<T> typeClazz; 100 /** 101 * the identifier 102 */ 103 private final Class<I> identifierClazz; 104 105 public EBeanDAO(Class<T> typeClazz, Class<I> identifierClazz) { 106 this.typeClazz = typeClazz; 107 this.identifierClazz = identifierClazz; 108 } 109 110 @Override 111 public long count() throws PragmatachException { 112 return this.find().findRowCount(); 113 } 114 115 /** 116 * delete 117 */ 118 public void delete(T t) throws PragmatachException { 119 try { 120 ebeanServer.delete(t); 121 } catch (final Exception e) { 122 throw new PragmatachException("Exception in delete", e); 123 } 124 } 125 126 /** 127 * delete 128 */ 129 public void deletebyId(I i) throws PragmatachException { 130 try { 131 ebeanServer.delete(typeClazz, i); 132 } catch (final Exception e) { 133 throw new PragmatachException("Exception in deletebyId", e); 134 } 135 } 136 137 /** 138 * find by fluent query 139 */ 140 public Query<T> find() throws PragmatachException { 141 return ebeanServer.find(this.typeClazz); 142 } 143 144 /** 145 * find by id 146 */ 147 public T findById(I i) throws PragmatachException { 148 try { 149 return ebeanServer.find(typeClazz, i); 150 } catch (final Exception e) { 151 throw new PragmatachException("Exception in findById", e); 152 } 153 } 154 155 /** 156 * findall 157 */ 158 public List<T> getAll() throws PragmatachException { 159 return ebeanServer.find(this.typeClazz).findList(); 160 } 161 162 @Override 163 public List<T> getAll(int start, int count) throws PragmatachException { 164 return this.find().setFirstRow(start).setMaxRows(count).findList(); 165 } 166 167 public Class<I> getIdentifierClazz() { 168 return identifierClazz; 169 } 170 171 public Class<T> getTypeClazz() { 172 return typeClazz; 173 } 174 175 public void reloadConfig() { 176 ebeanServer = getEBeanServer(); 177 } 178 179 /** 180 * save object 181 */ 182 public void save(T t) throws PragmatachException { 183 try { 184 ebeanServer.save(t); 185 } catch (final Exception e) { 186 throw new PragmatachException("Exception in save", e); 187 } 188 } 189 190 /** 191 * update object 192 */ 193 public void update(T t) throws PragmatachException { 194 try { 195 ebeanServer.update(t); 196 } catch (final Exception e) { 197 throw new PragmatachException("Exception in save", e); 198 } 199 } 200 }