/*
* File : DbAdmin.java
* Created : 24-jan-2003 12:47
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 (see the LICENSE file).
*/
package edu.xtec.jclic.report.rp;
import edu.xtec.jclic.report.Reporter;
import edu.xtec.util.db.ConnectionBean;
import edu.xtec.util.db.ConnectionBeanProvider;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Map;
import java.util.ResourceBundle;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.16
*/
public class DbAdmin extends Basic {
public static String TITLE="db_admin_title";
public static String URL="dbAdmin";
public static final int MENU=0,
EDIT_SETTINGS=1, UPDATE_SETTINGS=2,
EDIT_PWD=3, UPDATE_PWD=4;
//public static final String EDIT_STR="edit", UPDATE_STR="update",
//EDIT_PWD_STR="editPwd", UPDATE_PWD_STR="updatePwd";
public static final String[] ACTIONS={"", "edit", "update",
"editPwd", "updatePwd"};
public static final String ALLOW_GROUP_CREATE="agc", ALLOW_USER_CREATE="auc",
SHOW_GROUP_LIST="shgl", SHOW_USER_LIST="shul", USER_TABLES="ut", TIME_LAP="lap";
public static final String[] DB_BOOL_KEYS={Reporter.ALLOW_CREATE_GROUPS,
Reporter.ALLOW_CREATE_USERS, Reporter.SHOW_GROUP_LIST, Reporter.SHOW_USER_LIST,
Reporter.USER_TABLES};
public static final String[] DB_BOOL_PARAMS={ALLOW_GROUP_CREATE, ALLOW_USER_CREATE,
SHOW_GROUP_LIST, SHOW_USER_LIST, USER_TABLES};
public static final String[] DB_LITERAL_KEYS={Reporter.TIME_LAP};
public static final String[] DB_LITERAL_PARAMS={TIME_LAP};
public static final int[] DB_LITERAL_PARAMS_LENGTH={4};
public static final String PW_FIELD="pw";
protected int page;
public String getTitle(ResourceBundle bundle){
return bundle.getString(TITLE);
}
public String getUrl(){
return urlParam(URL, LANG, lang);
}
public String getUrl(int action){
return urlParam(getUrl(), ACTION, ACTIONS[action]);
}
@Override
public boolean init() throws Exception{
if(!super.init())
return false;
page=getAction(ACTIONS, MENU);
switch(page){
case UPDATE_SETTINGS:
updateSettings();
break;
case UPDATE_PWD:
updatePwd();
break;
}
return true;
}
private void updateSettings() throws Exception{
Exception ex=null;
boolean[] bValues=new boolean[DB_BOOL_PARAMS.length];
for(int i=0; i<DB_BOOL_PARAMS.length; i++)
bValues[i]=getBoolParam(DB_BOOL_PARAMS[i], ON);
String[] sValues=new String[DB_LITERAL_PARAMS.length];
for(int i=0; i<DB_LITERAL_PARAMS.length; i++)
sValues[i]=getParam(DB_LITERAL_PARAMS[i]);
ConnectionBeanProvider cbp=bridge.getConnectionBeanProvider();
ConnectionBean cb=cbp.getConnectionBean();
PreparedStatement updateStmt=null;
PreparedStatement insertStmt=null;
try{
updateStmt = cb.getPreparedStatement(
"UPDATE "+bridge.getTableName("SETTINGS")+" SET SETTING_VALUE=? WHERE SETTING_KEY=?");
insertStmt = cb.getPreparedStatement(
"INSERT INTO "+bridge.getTableName("SETTINGS")+"(SETTING_KEY,SETTING_VALUE) VALUES(?,?)");
for (int i=0; i<DB_BOOL_PARAMS.length; i++){
updateItem(DB_BOOL_KEYS[i], bValues[i] ? "true" : "false", updateStmt, insertStmt);
}
for (int i=0; i<DB_LITERAL_PARAMS.length; i++){
updateItem(DB_LITERAL_KEYS[i], sValues[i], updateStmt, insertStmt);
}
} catch(Exception e){
ex=e;
} finally{
cb.closeStatement(updateStmt);
cb.closeStatement(insertStmt);
cbp.freeConnectionBean(cb);
if(ex!=null)
throw(ex);
}
}
private void updateItem(String sk, String sv, PreparedStatement updateStmt, PreparedStatement insertStmt) throws Exception{
updateStmt.setString(1, sv);
updateStmt.setString(2, sk);
int iRecords=updateStmt.executeUpdate();
if(iRecords!=1){
if(iRecords==0){
insertStmt.setString(1, sk);
insertStmt.setString(2, sv);
iRecords=insertStmt.executeUpdate();
}
if (iRecords!=1)
throw new Exception(bundle.getString("db_admin_settings_error"));
}
}
private void updatePwd() throws Exception{
Exception ex=null;
String newPwd=getParam(PW_FIELD);
String s=null;
ConnectionBeanProvider cbp=bridge.getConnectionBeanProvider();
ConnectionBean cb=cbp.getConnectionBean();
PreparedStatement stmt=null;
try{
stmt=cb.getPreparedStatement(
"SELECT count(*) FROM "+bridge.getTableName("SETTINGS")+" WHERE SETTING_KEY=?");
stmt.setString(1,"PASSWORD");
ResultSet rs=stmt.executeQuery();
if(rs.next()){
newPwd=(newPwd!=null)?edu.xtec.util.Encryption.Encrypt(newPwd):null;
int iCount=rs.getInt(1);
PreparedStatement stmt2;
if (iCount==0){ //No existeix encara el camp PASSWORD
stmt2=cb.getPreparedStatement(
"INSERT INTO "+bridge.getTableName("SETTINGS")+" (SETTING_KEY,SETTING_VALUE) VALUES(?,?)");
stmt2.setString(1, "PASSWORD");
stmt2.setString(2, newPwd);
}
else{
stmt2=cb.getPreparedStatement(
"UPDATE "+bridge.getTableName("SETTINGS")+" SET SETTING_VALUE=? WHERE SETTING_KEY=?");
stmt2.setString(1, newPwd);
stmt2.setString(2, "PASSWORD");
}
stmt2.executeUpdate();
cb.closeStatement(stmt2);
}
rs.close();
} catch(Exception e){
ex=e;
} finally{
cb.closeStatement(stmt);
cbp.freeConnectionBean(cb);
if(ex!=null)
throw(ex);
}
}
@Override
public void head(java.io.PrintWriter out) throws Exception{
super.head(out);
if(page==EDIT_PWD){
StringBuilder sb=new StringBuilder(500);
writeEditPwdScript(sb);
out.println(sb.substring(0));
}
}
@Override
public void body(java.io.PrintWriter out) throws Exception{
super.body(out);
String titleKey = (page==EDIT_SETTINGS ? "db_admin_edit_title" : page==EDIT_PWD ? "db_admin_pw_edit_title" : "db_admin_title");
StringBuilder sb=new StringBuilder(3000);
sb.append(linkTo(urlParam(Main.URL, LANG, lang), bundle.getString(Main.TITLE), null));
if(page!=MENU)
sb.append(" | ").append(linkTo(getUrl(), getTitle(bundle), null));
standardHeader(out, filter(getMsg(titleKey)), sb.substring(0));
sb.setLength(0);
switch(page){
case EDIT_SETTINGS:
sb.append("<form action=\"").append(getUrl(UPDATE_SETTINGS)).append("\" method=\"post\">\n");
sb.append("<div class=\"inputForm\">\n");
writeAdminFields(sb, true);
sb.append("<p><input type=\"submit\" value=\"").append(getMsg("submit")).append("\"></p>\n");
sb.append("</div>\n");
sb.append("</form>\n");
break;
case EDIT_PWD:
writeEditPwd(sb);
break;
default:
sb.append("<form>\n");
sb.append("<div class=\"inputForm\">\n");
writeAdminFields(sb, false);
sb.append("<p>").append(buttonTo(getUrl(EDIT_SETTINGS), bundle.getString("db_admin_edit_btn"), null));
sb.append(" ");
sb.append(buttonTo(getUrl(EDIT_PWD), bundle.getString("db_admin_pw_edit_btn"), null)).append("</p>");
sb.append("</div>\n");
sb.append("</form>\n");
}
out.println(sb.substring(0));
};
private void writeEditPwdScript(StringBuilder sb) throws Exception{
sb.append("<script language=\"JavaScript\" type=\"text/javascript\">\n");
sb.append("<!--\n");
sb.append(" function verifyPasswords(){\n");
sb.append(" if (document.forms[0].").append(PW_FIELD).append("2.value==document.forms[0].").append(PW_FIELD).append(".value) document.forms[0].submit();\n");
sb.append(" else{\n");
sb.append(" alert(\"").append(getMsg("db_admin_pw_noFit")).append("\");\n");
sb.append(" event.returnValue=false;\n");
sb.append(" }\n");
sb.append(" }\n");
sb.append("//-->\n");
sb.append("</script>\n");
}
private void writeEditPwd(StringBuilder sb) throws Exception{
sb.append("<form action=\"").append(urlParam(getUrl(), ACTION, ACTIONS[UPDATE_PWD])).append("\" method=\"post\" onSubmit=\"verifyPasswords();\">\n");
sb.append("<div class=\"inputForm\">\n");
sb.append("<p>").append(getMsg("db_admin_pw_newPwd")).append(": ");
sb.append("<input type=\"password\" length=\"40\" name=\"").append(PW_FIELD).append("\"></p>\n");
sb.append("<p>").append(getMsg("db_admin_pw_verifyPwd")).append(": ");
sb.append("<input type=\"password\" length=\"40\" name=\"").append(PW_FIELD).append("2\"></p>\n");
sb.append("<p><input type=\"submit\" value=\"").append(getMsg("submit")).append("\">\n");
sb.append("</div>\n");
sb.append("</form>\n");
}
private void writeAdminFields(StringBuilder sb, boolean edit) throws Exception{
Map<String, String> settings=bridge.getProperties();
for(int i=0; i<DB_BOOL_PARAMS.length; i++){
sb.append("<p>").append(filter(getMsg("db_admin_param_"+DB_BOOL_PARAMS[i])));
sb.append(" <input type=\"checkbox\" name=\"").append(DB_BOOL_PARAMS[i]).append("\" value=\"").append(ON).append("\"");
if(!edit)
sb.append(" disabled");
String s=(String)settings.get(DB_BOOL_KEYS[i]);
if(s!=null && s.trim().toLowerCase().equals("true"))
sb.append(" checked");
sb.append("></p>\n");
}
for(int i=0; i<DB_LITERAL_PARAMS.length; i++){
sb.append("<p>");
sb.append(filter(getMsg("db_admin_param_"+DB_LITERAL_PARAMS[i])));
sb.append(" <input name=\"").append(DB_LITERAL_PARAMS[i]).append("\"");
String s=(String)settings.get(DB_LITERAL_KEYS[i]);
if(s!=null)
sb.append(" value=\"").append(s).append("\"");
if(!edit)
sb.append(" disabled");
sb.append(" size=\"").append(DB_LITERAL_PARAMS_LENGTH[i]).append("\">");
sb.append("</p>\n");
}
}
}