package net.ftlines.blog.cdidemo.model;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.enterprise.event.Observes;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import net.ftlines.blog.cdidemo.jpa.EntityManagerFactoryCreatedEvent;
import org.hibernate.ejb.EntityManagerFactoryImpl;
import org.hibernate.impl.SessionFactoryImpl;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ModelInitializer {
private final String[] firstNames = { "Jacob", "Emily", "Michael", "Sarah", "Matthew", "Brianna", "Nicholas",
"Samantha", "Christopher", "Hailey", "Abner", "Abby", "Joshua", "Douglas", "Jack", "Keith", "Gerald", "Samuel",
"Willie", "Larry", "Jose", "Timothy", "Sandra", "Kathleen", "Pamela", "Virginia", "Debra", "Maria", "Linda" };
private final String[] lastNames = { "Smith", "Johnson", "Williams", "Jones", "Brown", "Donahue", "Bailey", "Rose",
"Allen", "Black", "Davis", "Clark", "Hall", "Lee", "Baker", "Gonzalez", "Nelson", "Moore", "Wilson", "Graham",
"Fisher", "Cruz", "Ortiz", "Gomez", "Murray" };
private final String[] teamNames = { "Raging Kickers", "Rocky Tigers", "Demolition Hawks", "Lightning Bulls" };
private final String[] positionNames = { "Designer", "Developer", "Tester" };
private static <T> T random(T[] values) {
return values[(int) (Math.random() * values.length)];
}
private static int random(int min, int max) {
return (int) (Math.random() * (double) (max - min)) + min;
}
public void initialize(@Observes EntityManagerFactoryCreatedEvent created) {
EntityManagerFactory emf = created.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
dumpSchema(em);
em.getTransaction().begin();
Position positions[] = new Position[positionNames.length];
for (int i = 0; i < positions.length; i++) {
Position p = new Position();
p.setName(positionNames[i]);
positions[i] = p;
em.persist(p);
}
Employee employees[] = new Employee[30];
for (int i = 0; i < employees.length; i++) {
Employee e = new Employee();
e.setFirstName(random(firstNames));
e.setLastName(random(lastNames));
String email = e.getFirstName() + "." + e.getLastName() + "@firm.com";
email = email.toLowerCase();
e.setEmail(email);
e.setHireDate(new Date(random(100, 111), random(0, 11), random(1, 28), 0, 0, 0));
employees[i] = e;
em.persist(e);
}
Team[] teams = new Team[teamNames.length];
for (int i = 0; i < teamNames.length; i++) {
Team t = new Team();
t.setName(teamNames[i]);
teams[i] = t;
em.persist(t);
}
List<Employee> outsiders = new ArrayList<Employee>(Arrays.asList(employees));
for (int i = 0; i < employees.length * 2 / 3; i++) {
Employee e = outsiders.get(random(0, outsiders.size() - 1));
outsiders.remove(e);
Team t = random(teams);
Position p = random(positions);
Member member = new Member();
member.setEmployee(e);
// member.setTeam(t);
member.setPosition(p);
member.setEffectiveDate(new Date(random(100, 111), random(0, 11), random(1, 28), 0, 0, 0));
t.getMembers().add(member);
}
em.getTransaction().commit();
}
private void dumpSchema(EntityManager em) {
try {
System.out.println("\n=========== SCHEMA =============\n");
Field exp = SessionFactoryImpl.class.getDeclaredField("schemaExport");
exp.setAccessible(true);
SchemaExport export = (SchemaExport) exp.get(((EntityManagerFactoryImpl) em.getEntityManagerFactory())
.getSessionFactory());
export.execute(true, false, false, true);
System.out.println("\n========== END SCHEMA ===========\n");
} catch (Exception e) {
e.printStackTrace();
}
}
}