package org.jblooming.waf.settings; import org.jblooming.scheduler.Scheduler; import org.jblooming.waf.configuration.LoaderSupport; import org.jblooming.waf.constants.Commands; import org.jblooming.waf.constants.Fields; import org.jblooming.waf.AccessControlFilter; import org.jblooming.system.ServerInfo; import org.jblooming.PlatformRuntimeException; import org.jblooming.utilities.JSP; import org.jblooming.persistence.hibernate.*; import org.hibernate.mapping.PersistentClass; import org.hibernate.persister.entity.SingleTableEntityPersister; import org.hibernate.type.Type; import org.hibernate.type.DateType; import org.hibernate.type.BooleanType; import org.hibernate.type.StringType; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.*; import java.sql.Statement; import java.sql.PreparedStatement; /** * @author Roberto Bicchierai rbicchierai@open-lab.com * Date: 11-lug-2008 : 12.19.52 */ public class AdminControllerAction { public static String perform(HttpServletRequest request, HttpServletResponse response) throws Exception { String message = ""; String command = request.getParameter(Commands.COMMAND); String psw = request.getParameter("psw"); String filterPrefix = request.getParameter("tableExcluded"); String focusedDb = request.getParameter("FOCUSED_DB"); PersistenceConfiguration pcf = null; PersistenceContext pc = null; if (focusedDb != null) { pcf = PersistenceConfiguration.persistenceConfigurations.get(focusedDb); pc = new PersistenceContext(pcf.name, null); } if (psw == null || psw.trim().length() == 0) return "<font color=\"red\"><big>NEED PASSWORD</big></font>"; if (!PlatformConfiguration.psw.equals(psw)) return ""; //in order to enable restart of session too if ("restart".equals(command)) { if (Scheduler.getInstance() != null) Scheduler.getInstance().stop(); request.getSession().invalidate(); PersistenceConfiguration.persistenceConfigurations = new LinkedHashMap(); LoaderSupport.implementor.newInstance().start(request.getSession().getServletContext()); message = "RESTARTED"; } else if ("do_version_update".equals(command)) { try { HibernateFactory.getSession(); PlatformSchemaUpdater.updateToLatestVersion(); HibernateFactory.checkPoint(); ApplicationState.applicationSettings.put("SETUP_DB_UPDATE_DONE", Fields.TRUE); ApplicationState.dumpApplicationSettings(); message = "Update to latest version done."; } catch (Exception e) { message = "Update was impossible:<br>" + PlatformRuntimeException.getStackTrace(e); } } else if ("server_info".equals(command)) { ServerInfo si = new ServerInfo(); message = "<b>system props</b><br>" + si.systemProps(false) + "<br><br>" + "<b>system state</b><br>" + si.systemState() + "<br><br><b>total threads</b><br>" + si.listThreadDump(); //... Add property list data to text area. Properties pr = System.getProperties(); TreeSet propKeys = new TreeSet(pr.keySet()); // TreeSet sorts keys for (Iterator it = propKeys.iterator(); it.hasNext();) { String key = (String) it.next(); message = message + key + "=" + pr.get(key) + "<br>"; } } else if ("dbInfo".equals(command)) { if (pcf == null) { return "<font color=\"red\"><big>PICK DB</big></font>"; } else { PlatformAnnotationConfiguration hibconfig = pcf.getHibernateConfiguration(); message = "<big>hibernate loaded:</big><br><b>hib props:</b><br>"; for (Object k : hibconfig.getProperties().keySet()) { String key = (String) k; if (key.startsWith("hibernate")) { message += "<small>" + key + ":" + hibconfig.getProperties().getProperty(key) + "</small><br>"; } } int npr = 0; message += "<b>hib classes:</b><br>"; Iterator i = hibconfig.getClassMappings(); while (i.hasNext()) { PersistentClass clazz = (PersistentClass) i.next(); message += "<small>" + clazz.getNodeName() + ":" + clazz.getTable().getName() + "  </small>"; npr++; if (npr == 3) { message += "<br>"; npr = 0; } } } } else if ("platform_info".equals(command)) { for (Application app : ApplicationState.platformConfiguration.applications.values()) { message += "<hr><big> application:" + app.getName() + "</big ><br ><b > props:</b ><br >"; message += "version: " + app.getVersion() + "<br >"; message += "<b > access, free folders:</b ><br >"; for (String ff : AccessControlFilter.freeFolders) { message += ff + "<br >"; } message += "<b > access, free files:</b ><br >"; for (String ff : AccessControlFilter.freeFiles) { message += ff + "<br >"; } message += "<b > application Parameters:</b ><br >"; for (String ff : ApplicationState.applicationParameters.keySet()) { message += ff + ApplicationState.applicationParameters.get(ff) + "<br >"; } } } else if ("gc".equals(command)) { System.gc(); } else if ("show_updates".equals(command)) { if (pcf == null) { return "<font color=\"red\"><big>PICK DB</big></font>"; } else { message += HibernateUtilities.generateSchema(true, true, false, filterPrefix, request, response, pc); } } else if ("update".equals(command)) { message += HibernateUtilities.generateSchema(false, true, false, filterPrefix, request, response, pc); } else if ("export".equals(command)) { message += HibernateUtilities.generateSchema(true, true, true, filterPrefix, request, response, pc); } else if ("rebuild".equals(command)) { message += HibernateUtilities.generateSchema(false, true, true, filterPrefix, request, response, pc); } else if ("fill".equals(command)) { // data update Statement stmt = pc.session.connection().createStatement(); Map acm = pcf.getSessionFactory().getAllClassMetadata(); Iterator it = acm.keySet().iterator(); while (it.hasNext()) { String claz = (String) it.next(); SingleTableEntityPersister ep = (SingleTableEntityPersister) acm.get(claz); String table = ep.getTableName(); if (table.startsWith(filterPrefix)) continue; String propNames[] = ep.getPropertyNames(); boolean[] nlbl = ep.getPropertyNullability(); for (int i = 0; i < nlbl.length; i++) { if (!nlbl[i]) { String column = ep.getPropertyColumnNames(i)[0]; String messageSQL = ""; Type type = ep.getPropertyType(propNames[i]); if (type instanceof StringType) { messageSQL = "UPDATE " + table + " SET " + column + " = ' ' WHERE " + column + " IS NULL"; stmt.executeUpdate(messageSQL); } else if (type instanceof BooleanType) { messageSQL = "UPDATE " + table + " SET " + column + " = 0 WHERE " + column + " IS NULL"; stmt.executeUpdate(messageSQL); } else if (type instanceof DateType) { messageSQL = "UPDATE " + table + " SET " + column + " = ? WHERE " + column + " IS NULL"; PreparedStatement ps = pc.session.connection().prepareStatement(messageSQL); ps.setDate(1, new java.sql.Date(new Date().getTime())); ps.execute(); } message += messageSQL; } } } // t.commit(); } else if (command.startsWith("force_release")) { String release = command.substring("force_release".length()); if (JSP.ex(release)) { message += "<hr>Forcing update to release: " + release + "<br><br>"; List<Release> releases = new ArrayList(PlatformSchemaUpdater.releases); for (Release r : PlatformSchemaUpdater.releases) { if (release.equals(r.releaseLabel)) { message += "Release found ...<br>"; String oldValue = ApplicationState.applicationSettings.get("SETUP_DB_UPDATE_DONE"); ApplicationState.applicationSettings.put("SETUP_DB_UPDATE_DONE", Fields.FALSE); PlatformSchemaUpdater.releases = new ArrayList(); PlatformSchemaUpdater.releases.add(r); PlatformSchemaUpdater.updateToLatestVersion(); ApplicationState.applicationSettings.put("SETUP_DB_UPDATE_DONE", oldValue); message += "Done. See messages in the logs.<br>"; } } PlatformSchemaUpdater.releases = releases; } } if (pc != null) pc.commitAndClose(); return message; } }