package admin; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityTransaction; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import persistency.entities.Comment; import persistency.entities.LoggedUser; import persistency.entities.Session; import persistency.entities.Speaker; import persistency.entities.admin.EnabledFunctionality; import persistency.entities.feedback.Question; import persistency.entities.gamification.PointsCategory; import persistency.entities.gamification.PointsInstance; import persistency.entities.gamification.Rank; import persistency.exposed.CommentsExposedBasic; import persistency.exposed.EnabledFuncExposed; import persistency.exposed.LoggedUserExposed; import persistency.exposed.PointsCategoryExposed; import persistency.exposed.PointsExposed; import persistency.exposed.RanksExposed; import persistency.exposed.SessionExposedBasic; import persistency.exposed.SpeakerExposed; import persistency.exposed.feedback.QuestionExposed; import persistency.exposed.json.RankJson; import persistency.exposed.json.SessionJson; import service.rest.wrappers.SessionBasic; import utils.CodeGenerator; import utils.SecurityException; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; /** * Servlet implementation class InitDatabase */ public class InitDatabase extends HttpServlet { private static final String DATA_LOCATION = "configuration/"; private static final String SESSIONS_JSON_LOCATION = DATA_LOCATION+"sessions.json"; private static final String SPEAKERS_JSON_LOCATION = DATA_LOCATION+"speakers.json"; private static final String QUESTIONS_JSON_LOCATION = DATA_LOCATION+"questions.json"; private static final String RANKS_JSON_LOCATION = DATA_LOCATION+"ranks.json"; private static final String POINTS_CATEGORIES_LOCATION = DATA_LOCATION+"points_categories.json"; private Logger logger = LoggerFactory.getLogger(InitDatabase.class); private static final long serialVersionUID = 1L; private SpeakerExposed lue; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { securityCheck(request, response); logger.warn("Init Database in progress..."); if (request.getParameter("init") != null) { logger.warn("Full Init"); initSessions(request, response); initReadOnlyMode(request); initQuestions(request, false); initCodes(request); } else if (request.getParameter("reset_ratings") != null) { logger.warn("ratings reset"); response.getWriter().print("Ratings reset..."); LoggedUserExposed lue = new LoggedUserExposed(); List<LoggedUser> allPersons = lue.getAllPersons(); for (LoggedUser person : allPersons) { person.getSessionRatings().clear(); person.getSpeakerRatings().clear(); person.getPointsInstances().clear(); lue.updateEntity(person); } response.getWriter().print("[FAILED]"); } else if (request.getParameter("full_reset") != null) { logger.warn("ratings reset"); response.getWriter().print("Master Reset..."); LoggedUserExposed lue = new LoggedUserExposed(); List<LoggedUser> allPersons = lue.getAllPersons(); for (LoggedUser person : allPersons) { person.getSessionRatings().clear(); person.getSpeakerRatings().clear(); person.getLikedComments().clear(); person.getPointsInstances().clear(); lue.updateEntity(person); } clearPointsInstances(); response.getWriter().print("[OK]"); } else if (request.getParameter("reread") != null) { logger.warn("Reread session data"); mergeInfo(request, response); } else if (request.getParameter("reread_point_categs") != null) { logger.warn("reinit codes"); response.getWriter().print("Codes initializing..."); initGamificationCategories(request, true); // initPuzzleCodes(request); // initHandoutCodes(request); response.getWriter().print("[OK]"); } else if(request.getParameter("ranks") != null){ response.getWriter().print("Ranks initializing..."); initGamificationRanks(request, true); response.getWriter().print("[OK]"); } else if(request.getParameter("questions") != null){ initQuestions(request, true); } } catch (SecurityException e1) { logger.warn("Failed access to InitDatabase by " + e1.getMessage()); } } private void clearPointsInstances() { PointsCategoryExposed pce = new PointsCategoryExposed(); List<PointsCategory> list = pce.allCodes(); for (PointsCategory pointsCategory : list) { if(pointsCategory.isSelfGeneratingInstances()){ pointsCategory.getInstancesOfThisType().clear(); pce.updateEntity(pointsCategory); } } PointsExposed pe = new PointsExposed(); List<PointsInstance> allCodes = pe.allCodes(); for (PointsInstance pointsInstance : allCodes) { if(pointsInstance.getCategory().isSelfGeneratingInstances()){ pe.deleteEntity(pointsInstance); } } } private void securityCheck(HttpServletRequest request, HttpServletResponse response) throws SecurityException { // TODO Auto-generated method stub } private void initReadOnlyMode(HttpServletRequest request) { EnabledFunctionality e = new EnabledFunctionality(); e.setUserName("admin"); e.setEnabled(false); //FIXME set to true before deploying the real application EnabledFuncExposed ee = new EnabledFuncExposed(); ee.createEntity(e); } private void mergeInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("Rereading Database initializing..."); lue = SpeakerExposed.getInstance(); try { parseSessions(request, true); } catch (IOException e) { throw new ServletException(e); } catch (ParseException e) { throw new ServletException(e); } response.getWriter().print("[OK]"); } private void initSessions(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.getWriter().print("Database initializing..."); lue = SpeakerExposed.getInstance(); try { parseSessions(request, false); } catch (IOException e) { throw new ServletException(e); } catch (ParseException e) { throw new ServletException(e); } response.getWriter().println("[OK]"); } private void createSpeakers(List<Speaker> ps) { for (Speaker speaker : ps) { if(speaker != null){ System.out.println(speaker.toString()); lue.createEntity(speaker); } else { System.out.println("Speaker is null"); } } } public List<Session> parseSessions(HttpServletRequest request, boolean merge) throws IOException, ParseException { SessionExposedBasic ex = new SessionExposedBasic(); Gson g = new Gson(); final BufferedReader readerSpeakers = new BufferedReader(new InputStreamReader(request.getServletContext() .getResourceAsStream(SPEAKERS_JSON_LOCATION),"UTF-8")); final BufferedReader readerSessions = new BufferedReader(new InputStreamReader(request.getServletContext() .getResourceAsStream(SESSIONS_JSON_LOCATION),"UTF-8")); List<Speaker> speakers = g.fromJson(readerSpeakers, new TypeToken<List<Speaker>>(){}.getType()); createSpeakers(speakers); List<SessionJson> sessions = g.fromJson(readerSessions, new TypeToken<List<SessionJson>>(){}.getType()); List<Session> result = toSessionEntities(sessions, speakers); for (Session session : result) { if(merge){ Session newSession = ex.findSessionById(session.getId()+""); if(newSession != null){ ex.updateEntity(session); } else { ex.createEntity(session); } } else { ex.createEntity(session); } } return result; } private List<Session> toSessionEntities(List<SessionJson> sessions, List<Speaker> speakers) throws ParseException { List<Session> result = new ArrayList<Session>(); for (SessionJson session : sessions) { result.add(session.toEntity()); } return result; } public void initCodes(HttpServletRequest request) { initGamificationCategories(request, false); initSecretWords(); initGamificationRanks(request, false); } private void initGamificationRanks(HttpServletRequest request, boolean merge) { final BufferedReader rankTypes = new BufferedReader(new InputStreamReader(request.getServletContext() .getResourceAsStream(RANKS_JSON_LOCATION))); Gson g = new Gson(); List<RankJson> ranks = g.fromJson(rankTypes, new TypeToken<List<RankJson>>(){}.getType()); RanksExposed re = new RanksExposed(); for (RankJson rankJson : ranks) { Rank entity = rankJson.toEntity(); if(re.findRankById(entity.getRankPos()) != null){ re.updateEntity(entity); } else { re.createEntity(entity); } } } private void initGamificationCategories(HttpServletRequest request, boolean merge) { final BufferedReader pointTypes = new BufferedReader(new InputStreamReader(request.getServletContext() .getResourceAsStream(POINTS_CATEGORIES_LOCATION))); Gson g = new Gson(); List<PointsCategory> pointCategories = g.fromJson(pointTypes, new TypeToken<List<PointsCategory>>(){}.getType()); PointsCategoryExposed pce = new PointsCategoryExposed(); PointsExposed pe = new PointsExposed(); List<PointsInstance> allCodes = pe.allCodes(); for (PointsCategory category : pointCategories) { PointsCategory categoryDb = pce.findCategoryByShortName(category.getShortid()); if(categoryDb == null) { pce.createEntity(category); } else { if(merge){ updateCategory(category, categoryDb, pce); category = categoryDb; } } int size = category.getInstancesOfThisType() == null ? 0 : category.getInstancesOfThisType().size(); if(category.isCodeCategory() && size < category.getMaxNumberOfInstances()){ int max = category.getMaxNumberOfInstances(); List<String> codePossitions = category.getCompositeCodePossitions(); List<PointsInstance> pi; if(codePossitions != null && codePossitions.size()>0){ pi = CodeGenerator.generateCompsiteCodes(max, codePossitions, allCodes, category); } else { pi = CodeGenerator.generateCodes(max, allCodes, category); } System.out.println(pi); pe.persistEntities(pi); category.addInstances(pi); pce.updateEntity(category); allCodes.addAll(pi); } } } private void updateCategory(PointsCategory categoryJson, PointsCategory categoryDb, PointsCategoryExposed pce) { categoryDb.setAreCompositeCodes(categoryJson.areCompositeCodes()); categoryDb.setCodeLength(categoryJson.getCodeLength()); categoryDb.setCompositeCodePossitions(categoryJson.getCompositeCodePossitions()); categoryDb.setDescription(categoryJson.getDescription()); categoryDb.setMaxInstacesPerPerson(categoryJson.getMaxInstacesPerPerson()); categoryDb.setMaxNumberOfInstances(categoryJson.getMaxNumberOfInstances()); categoryDb.setName(categoryJson.getName()); categoryDb.setPlayerPositionAbove(categoryJson.getPlayerPositionAbove()); categoryDb.setPoints(categoryJson.getPoints()); categoryDb.setRank(categoryJson.getRank()); categoryDb.setRequiresPlayerLevel(categoryJson.getRequiresPlayerLevel()); categoryDb.setReusable(categoryJson.isReusable()); categoryDb.setSelfGeneratingInstances(categoryJson.isSelfGeneratingInstances()); categoryDb.setShortid(categoryJson.getShortid()); pce.updateEntity(categoryDb); } private void initSecretWords() { SessionExposedBasic seb = new SessionExposedBasic(); PointsCategoryExposed pce = new PointsCategoryExposed(); List<Session> allSessions = seb.allEntitiesRaw(); for (Session session : allSessions) { if(session.getSecretWord() != null && session.getSecretWord().length() > 0){ PointsCategory pc = new PointsCategory(); pc.setName("Secret word for Session: "+session.getName()); pc.setDescription("Secret word that has been guesed"); pc.setMaxInstacesPerPerson(1); pc.setAreCompositeCodes(false); pc.setCodeLength(-1); pc.setSelfGeneratingInstances(true); pc.setPoints(10); pce.createEntity(pc); } } } private void initQuestions(HttpServletRequest request, boolean merge){ Gson g = new Gson(); final BufferedReader readerQuestions = new BufferedReader(new InputStreamReader(request.getServletContext() .getResourceAsStream(QUESTIONS_JSON_LOCATION))); List<Question> questions = g.fromJson(readerQuestions, new TypeToken<List<Question>>(){}.getType()); QuestionExposed qe = new QuestionExposed(); for (Question question : questions) { if(merge){ Question q = qe.findQuestionById(question.getId()); if(q != null){ qe.updateEntity(q); continue; } } qe.createEntity(question); } } }