Java tutorial
/* This file is part of OpenMyEWB. OpenMyEWB is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenMyEWB is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenMyEWB. If not, see <http://www.gnu.org/licenses/>. OpenMyEWB is Copyright 2005-2009 Nicolas Kruchten (nicolas@kruchten.com), Francis Kung, Engineers Without Borders Canada, Michael Trauttmansdorff, Jon Fishbein, David Kadish */ package ca.myewb.build; import java.io.File; import java.util.Calendar; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; import ca.myewb.frame.Controller; import ca.myewb.frame.HibernateUtil; import ca.myewb.model.DailyStatsModel; import ca.myewb.model.GroupModel; import ca.myewb.model.PageModel; import ca.myewb.model.UserModel; public class CreateDb { public static void main(String[] args) { String postfix = args[0]; String action = args[1]; System.out.println("Using database: " + postfix); Logger.getLogger("ca.myewb").setLevel(Level.WARN); try { // Set up the database connection Class.forName("com.mysql.jdbc.Driver"); // Drop & re-create the database if needed if (action.equals("new")) { createDb(args[0]); } // Prepare for data manipulation HibernateUtil.createFactory(postfix); Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); // Do what's needed if (action.equals("new")) { insertData(); } controllerData(); // Finish up session.flush(); tx.commit(); HibernateUtil.closeSession(); } catch (Exception e) { System.err.print("Exception: " + e); e.printStackTrace(); System.exit(1); } Logger.getLogger("ca.myewb").setLevel(Level.DEBUG); } private static void createDb(String postfix) { try { System.out.println("Creating fresh database"); Configuration config = HibernateUtil.getConfiguration(postfix); // Set up the schema exporter utility SchemaExport sch = new SchemaExport(config); sch = sch.setDelimiter(";"); // Drop and re-create the database sch.drop(false, true); sch.create(false, true); } catch (Exception e) { System.err.print("Exception: " + e); e.printStackTrace(); } } private static void insertData() throws Exception, InstantiationException, IllegalAccessException, ClassNotFoundException { System.out.println("Inserting data"); Session session = HibernateUtil.currentSession(); // BASIC GROUPS { //must be first group! GroupModel g1 = GroupModel.newGroup(); g1.setName("Org"); g1.setShortname("Org"); g1.setDescription("The main announcement mailing list."); g1.setPostName("Anyone (on public front page)"); g1.setAdmin(true); g1.setVisible(true); g1.setPublic(false); session.save(g1); } { GroupModel g10 = GroupModel.newGroup(); g10.setName("Guest"); g10.setShortname("Guest"); g10.setDescription("The guest user"); g10.setAdmin(true); g10.setVisible(false); g10.setPublic(false); session.save(g10); } { GroupModel g2 = GroupModel.newGroup(); g2.setName("Users"); g2.setShortname("Users"); g2.setDescription("All registered users"); g2.setAdmin(true); g2.setVisible(false); g2.setPublic(false); session.save(g2); } //ADMIN LAYER { GroupModel g4 = GroupModel.newGroup(); g4.setName("Admin"); g4.setShortname("Admin"); g4.setDescription("System administrators"); g4.setPostName("All system administrators"); g4.setAdmin(true); g4.setVisible(false); g4.setPublic(false); session.save(g4); } { GroupModel g3 = GroupModel.newGroup(); g3.setName("NMT"); g3.setShortname("NMT"); g3.setDescription("NMT peoples"); g3.setPostName("All National Management Team members"); g3.setAdmin(true); g3.setVisible(false); g3.setPublic(false); session.save(g3); } //REGULAR MEMBERSHIP { GroupModel g6 = GroupModel.newGroup(); g6.setName("Regular"); g6.setShortname("Regular"); g6.setDescription("Global group for regular members"); g6.setPostName("All Regular Members"); g6.setAdmin(true); g6.setVisible(false); g6.setPublic(false); session.save(g6); } { GroupModel g7 = GroupModel.newGroup(); g7.setName("Associate"); g7.setShortname("Associate"); g7.setDescription("Global group for associate members"); g7.setPostName("All Associate Members"); g7.setAdmin(true); g7.setVisible(false); g7.setPublic(false); session.save(g7); } //CHAPTER MEMBERSHIP { GroupModel g8 = GroupModel.newGroup(); g8.setName("Chapter"); g8.setShortname("Chapter"); g8.setDescription("Everyone in a chapter"); g8.setPostName("Anyone in a chapter"); g8.setAdmin(true); g8.setVisible(false); g8.setPublic(false); session.save(g8); } { GroupModel g9 = GroupModel.newGroup(); g9.setName("NoChapter"); g9.setShortname("NoChapter"); g9.setDescription("Everyone not in a chapter"); g9.setPostName("Anyone not in a chapter"); g9.setAdmin(true); g9.setVisible(false); g9.setPublic(false); session.save(g9); } //DELETED STATES { GroupModel g11 = GroupModel.newGroup(); g11.setName("Deleted"); g11.setShortname("Deleted"); g11.setDescription("All deleted users"); g11.setAdmin(true); g11.setVisible(false); g11.setPublic(false); session.save(g11); } { GroupModel g14 = GroupModel.newGroup(); g14.setName("DeletedPosts"); g14.setShortname("DeletedPosts"); g14.setDescription("Group for deleted posts"); g14.setPostName("No one"); g14.setAdmin(true); g14.setVisible(false); g14.setPublic(false); session.save(g14); } //EXEC/NATL REP SYSTEM { GroupModel g5 = GroupModel.newGroup(); g5.setName("Chapter Executive Members (all chapters)"); g5.setShortname("Exec"); g5.setDescription("General executive mailing list (all chapters)."); g5.setPostName("All chapter executive members (any chapter)"); g5.setAdmin(true); g5.setVisible(true); g5.setPublic(false); session.save(g5); } { GroupModel g14 = GroupModel.newGroup(); g14.setName("Chapter National Reps (all chapters)"); g14.setShortname("NatlRep"); g14.setDescription("National Reps mailing list (all chapters)."); g14.setPostName("All chapter national reps (any chapter)"); g14.setAdmin(true); g14.setVisible(false); g14.setPublic(false); session.save(g14); } { GroupModel g15 = GroupModel.newGroup(); g15.setName("Student Chapter Exec"); g15.setShortname("UniChaptersExec"); g15.setDescription("General executive mailing list (student chapters)."); g15.setPostName("All student chapter executive members (any student chapter)"); g15.setAdmin(true); g15.setVisible(true); g15.setPublic(false); session.save(g15); } { GroupModel g16 = GroupModel.newGroup(); g16.setName("Professional Chapter Exec"); g16.setShortname("ProChaptersExec"); g16.setDescription("General executive mailing list (professional chapters)."); g16.setPostName("All professional chapter executive members (any professional chapter)"); g16.setAdmin(true); g16.setVisible(true); g16.setPublic(false); session.save(g16); } //APPLICATIONS SYSTEM { GroupModel g15 = GroupModel.newGroup(); g15.setName("OVs"); g15.setShortname("OVs"); g15.setDescription("All overseas volunteers"); g15.setAdmin(true); g15.setVisible(false); g15.setPublic(false); session.save(g15); } //NATIONAL REP LISTS { GroupModel g12 = GroupModel.newGroup(); g12.setName("Student Chapter Presidents"); g12.setShortname("UniPresidents"); g12.setDescription("Student Chapter Presidents' mailing list."); g12.setPostName("All student chapter presidents"); g12.setAdmin(true); g12.setVisible(true); g12.setPublic(false); g12.setNationalRepType('s'); session.save(g12); } { GroupModel g16 = GroupModel.newGroup(); g16.setName("Professional Chapter Presidents"); g16.setShortname("ProPresidents"); g16.setDescription("Professional Chapter Presidents' mailing list"); g16.setPostName("All professional chapter presidents"); g16.setAdmin(true); g16.setVisible(true); g16.setPublic(false); g16.setNationalRepType('p'); session.save(g16); } { GroupModel g13 = GroupModel.newGroup(); g13.setName("Finance National Reps"); g13.setShortname("Finance"); g13.setDescription("Finance National Reps' mailing list."); g13.setPostName("Any Finance National Rep"); g13.setAdmin(true); g13.setVisible(true); g13.setPublic(false); g13.setNationalRepType('b'); session.save(g13); } session.flush(); Calendar cal = Calendar.getInstance(); for (int i = 0; i < 30; i++) { DailyStatsModel.newDailyStats(cal.getTime()); cal.add(Calendar.DAY_OF_YEAR, 1); } /* * * USERS and ROLES * */ //guest user must be first! UserModel.createGuestUser(); // first admin user UserModel admin = UserModel.newAssociateSignUp(null, "sample@email.com", "Anonymous", "Administrator", "admin"); admin.upgradeToAdmin(); session.flush(); } private static void controllerData() throws InstantiationException, IllegalAccessException, ClassNotFoundException { /* Dynamically find & add all pages (controllers) * This is done by directory listing... a bit of a hack, * but good enough. * * This assumes the only files in controllers that aren't * pages are the CVS directories, and that directories are only * one level deep. */ System.out.println("Inserting controller data"); Session session = HibernateUtil.currentSession(); // Clear the perms table first. Iterator pages = session.createQuery("FROM PageModel").list().iterator(); while (pages.hasNext()) { ((PageModel) pages.next()).clearGroups(); } session.flush(); session.createQuery("DELETE PageModel").executeUpdate(); session.flush(); session.clear(); // And re-populate it File f = new File("WEB-INF/src/ca/myewb/controllers"); String[] dirs = f.list(); System.out.println("Using controllers directory " + f.getAbsolutePath()); for (String pkgName : dirs) { if (!pkgName.equals(".svn") && !pkgName.equals("common")) { String[] files = new File("WEB-INF/src/ca/myewb/controllers/" + pkgName).list(); for (String fileName : files) { if (!fileName.substring(0, 1).equals(".")) { File theFile = new File("WEB-INF/src/ca/myewb/controllers/" + pkgName + "/" + fileName); if (!theFile.isDirectory()) { fileName = fileName.substring(0, fileName.length() - 5); putPageInDatabase(session, pkgName, fileName); } else { String[] files2 = new File( "WEB-INF/src/ca/myewb/controllers/" + pkgName + "/" + fileName).list(); for (String fileName2 : files2) { if (!fileName2.substring(0, 1).equals(".")) { fileName2 = fileName2.substring(0, fileName2.length() - 5); putPageInDatabase(session, pkgName, fileName + "." + fileName2); } } } } } } } } private static void putPageInDatabase(Session session, String thePackage, String file) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Controller theController = (Controller) Class.forName("ca.myewb.controllers." + thePackage + "." + file) .newInstance(); PageModel p = PageModel.newPage(); p.setName(file); p.setOldName(theController.oldName()); p.setArea(thePackage); p.setDisplayName(theController.displayName()); p.setWeight(theController.weight()); session.save(p); Set groups = theController.defaultGroups(); Iterator it; if (groups != null) { it = groups.iterator(); boolean shouldAddAdmin = false; boolean shouldAddNMT = false; while (it.hasNext()) { String s = (String) it.next(); if (!s.equals("Guest") && !s.equals("Admin")) { shouldAddAdmin = true; } if (!s.equals("Guest") && !s.equals("NMT")) { shouldAddNMT = true; } List r = session.createQuery("FROM GroupModel WHERE shortname=?").setString(0, s).list(); GroupModel g = (GroupModel) r.get(0); g.addPage(p); session.flush(); } if (shouldAddAdmin) { List r = session.createQuery("FROM GroupModel WHERE shortname=?").setString(0, "Admin").list(); GroupModel g = (GroupModel) r.get(0); g.addPage(p); session.flush(); } if (shouldAddNMT) { List r = session.createQuery("FROM GroupModel WHERE shortname=?").setString(0, "NMT").list(); GroupModel g = (GroupModel) r.get(0); g.addPage(p); session.flush(); } } groups = theController.invisibleGroups(); if (groups != null) { it = groups.iterator(); boolean shouldAddAdmin = false; boolean shouldAddNMT = false; while (it.hasNext()) { String s = (String) it.next(); if (!s.equals("Guest") && !s.equals("Admin")) { shouldAddAdmin = true; } if (!s.equals("Guest") && !s.equals("NMT")) { shouldAddNMT = true; } List r = session.createQuery("FROM GroupModel WHERE shortname=?").setString(0, s).list(); GroupModel g = (GroupModel) r.get(0); g.addInvisiblePage(p); session.flush(); } if (shouldAddAdmin) { List r = session.createQuery("FROM GroupModel WHERE shortname=?").setString(0, "Admin").list(); GroupModel g = (GroupModel) r.get(0); g.addInvisiblePage(p); session.flush(); } if (shouldAddNMT) { List r = session.createQuery("FROM GroupModel WHERE shortname=?").setString(0, "NMT").list(); GroupModel g = (GroupModel) r.get(0); g.addInvisiblePage(p); session.flush(); } } } }