Hi Maxim, I don't think this will work. I thought you would use the field "ical" for matching the given timezone to the user input?
I was not able to use the CLI installer to accept any of my input, neither "Berlin", nor "Europe/Berlin". What should be the input that I have to give Also as error / options you list then all available timezone name's as options. There are two times the name GMT+1, so how should the user understand what is the different between GMT+1 and GMT+1 ? Sebastian 2012/4/25 <[email protected]>: > Author: solomax > Date: Wed Apr 25 10:35:08 2012 > New Revision: 1330188 > > URL: http://svn.apache.org/viewvc?rev=1330188&view=rev > Log: > OPENMEETINGS-111 tz issues was fixed; options to install OM from backup > provided is added. > > Modified: > > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/installation/ImportInitvalues.java > > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java > > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/servlet/outputhandler/Install.java > > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/utils/ImportHelper.java > > Modified: > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/installation/ImportInitvalues.java > URL: > http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/installation/ImportInitvalues.java?rev=1330188&r1=1330187&r2=1330188&view=diff > ============================================================================== > --- > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/installation/ImportInitvalues.java > (original) > +++ > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/app/installation/ImportInitvalues.java > Wed Apr 25 10:35:08 2012 > @@ -768,8 +768,7 @@ public class ImportInitvalues { > List<OmTimeZone> omTimeZones = new LinkedList<OmTimeZone>(); > > SAXReader reader = new SAXReader(); > - Document document = reader.read(filePath > - + ImportInitvalues.nameOfTimeZoneFile); > + Document document = reader.read(new File(filePath, > ImportInitvalues.nameOfTimeZoneFile)); > > Element root = document.getRootElement(); > > @@ -960,8 +959,7 @@ public class ImportInitvalues { > } > // > ------------------------------------------------------------------------------ > > - public void loadAll(String filePath, InstallationConfig cfg, String > username, > - String userpass, String useremail, String groupame, > String timeZone) throws Exception { > + public void loadSystem(String filePath, InstallationConfig cfg) > throws Exception { > loadMainMenu(); > loadErrorMappingsFromXML(filePath); > loadInitLanguages(filePath); > @@ -974,7 +972,12 @@ public class ImportInitvalues { > loadPollTypes(); > > loadConfiguration(cfg); > + } > + > + public void loadAll(String filePath, InstallationConfig cfg, String > username, > + String userpass, String useremail, String groupame, > String timeZone) throws Exception { > > + loadSystem(filePath, cfg); > loadInitUserAndOrganisation(username, > userpass, useremail, groupame, timeZone, > cfg.defaultLangId); > > > Modified: > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java > URL: > http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java?rev=1330188&r1=1330187&r2=1330188&view=diff > ============================================================================== > --- > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java > (original) > +++ > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java > Wed Apr 25 10:35:08 2012 > @@ -9,6 +9,7 @@ import java.net.MalformedURLException; > import java.net.URL; > import java.util.Date; > import java.util.Enumeration; > +import java.util.Map; > import java.util.Set; > > import javax.mail.internet.AddressException; > @@ -27,15 +28,14 @@ import org.apache.commons.cli.Parser; > import org.apache.commons.cli.PosixParser; > import org.apache.openjpa.jdbc.meta.MappingTool; > import org.openmeetings.app.OpenmeetingsVariables; > -import org.openmeetings.app.data.basic.dao.OmTimeZoneDaoImpl; > import org.openmeetings.app.data.file.FileUtils; > import org.openmeetings.app.documents.InstallationDocumentHandler; > import org.openmeetings.app.installation.ImportInitvalues; > import org.openmeetings.app.installation.InstallationConfig; > -import org.openmeetings.app.persistence.beans.basic.OmTimeZone; > import org.openmeetings.app.remote.red5.ScopeApplicationAdapter; > import org.openmeetings.servlet.outputhandler.BackupExport; > import org.openmeetings.servlet.outputhandler.BackupImportController; > +import org.openmeetings.utils.ImportHelper; > import org.openmeetings.utils.OMContextListener; > import org.openmeetings.utils.mail.MailUtil; > import org.openmeetings.utils.math.CalendarPatterns; > @@ -49,6 +49,8 @@ public class Admin { > private boolean verbose = false; > private InstallationConfig cfg = null; > private Options opts = null; > + private CommandLine cmdl = null; > + File omHome = null; > > private Admin() { > cfg = new InstallationConfig(); > @@ -69,12 +71,12 @@ public class Admin { > options.addOption(new OmOption(null, "v", "verbose", false, > "verbose error messages")); > //backup/restore > options.addOption(new OmOption("b", null, "exclude-files", > false, "should backup exclude files [default: include]", true)); > - options.addOption(new OmOption("b,r", "file", null, true, > "file used for backup/restore", "b")); > + options.addOption(new OmOption("b,r,i", "file", null, true, > "file used for backup/restore/install", "b")); > //install > - options.addOption(new OmOption("i", "user", null, true, > "Login name of the default user, minimum " + > InstallationConfig.USER_LOGIN_MINIMUM_LENGTH + " characters")); > - options.addOption(new OmOption("i", "email", null, true, > "Email of the default user")); > - options.addOption(new OmOption("i", "group", null, true, "The > name of the default user group")); > - options.addOption(new OmOption("i", "tz", null, true, > "Default server time zone, and time zone for the selected user [for ex: > 'GMT+10', '-2', 'Chicago']")); > + options.addOption(new OmOption("i", "user", null, true, > "Login name of the default user, minimum " + > InstallationConfig.USER_LOGIN_MINIMUM_LENGTH + " characters (mutually > exclusive with 'file')")); > + options.addOption(new OmOption("i", "email", null, true, > "Email of the default user (mutually exclusive with 'file')")); > + options.addOption(new OmOption("i", "group", null, true, "The > name of the default user group (mutually exclusive with 'file')")); > + options.addOption(new OmOption("i", "tz", null, true, > "Default server time zone, and time zone for the selected user (mutually > exclusive with 'file')")); > options.addOption(new OmOption("i", null, "password", true, > "Password of the default user, minimum " + > InstallationConfig.USER_LOGIN_MINIMUM_LENGTH + " characters (will be prompted > if not set)", true)); > options.addOption(new OmOption("i", null, > "system-email-address", true, "System e-mail address [default: " + > cfg.mailReferer + "]", true)); > options.addOption(new OmOption("i", null, "smtp-server", true, > "SMTP server for outgoing e-mails [default: " + cfg.smtpServer + "]", true)); > @@ -242,11 +244,10 @@ public class Admin { > private void process(String[] args) { > String ctxName = System.getProperty("context", "openmeetings"); > File home = new File(System.getenv("RED5_HOME")); > - File omHome = new File(new File(home, "webapps"), ctxName); > + omHome = new File(new File(home, "webapps"), ctxName); > File omUploadTemp = new File(omHome, > OpenmeetingsVariables.UPLOAD_TEMP_DIR); > > Parser parser = new PosixParser(); > - CommandLine cmdl = null; > try { > cmdl = parser.parse(opts, args); > } catch (ParseException e) { > @@ -271,9 +272,10 @@ public class Admin { > switch(cmd) { > case install: > try { > - String login = > cmdl.getOptionValue("user"); > - String email = > cmdl.getOptionValue("email"); > - String group = > cmdl.getOptionValue("group"); > + if (cmdl.hasOption("file") && > (cmdl.hasOption("user") || cmdl.hasOption("email") || > cmdl.hasOption("group"))) { > + System.out.println("Please > specify even 'file' option or 'admin user'."); > + System.exit(1); > + } > //TODO commented for now, since not in > use boolean force = cmdl.hasOption("force"); > if > (cmdl.hasOption("skip-default-rooms")) { > cfg.createDefaultRooms = "0"; > @@ -299,33 +301,7 @@ public class Admin { > if (cmdl.hasOption("email-use-tls")) { > cfg.mailUseTls = "1"; > } > - if (login == null || login.length() < > InstallationConfig.USER_LOGIN_MINIMUM_LENGTH) { > - System.out.println("User > login was not provided, or too short, should be at least " + > InstallationConfig.USER_LOGIN_MINIMUM_LENGTH + " character long."); > - System.exit(1); > - } > - > - try { > - if (!MailUtil.matches(email)) > { > - throw new > AddressException("Invalid address"); > - } > - new InternetAddress(email, > true); > - } catch (AddressException ae) { > - System.out.println("Please > provide non-empty valid email: '" + email + "' is not valid."); > - System.exit(1); > - } > - if (group == null || login.length() < > 1) { > - System.out.println("User > group was not provided, or too short, should be at least 1 character long."); > - System.exit(1); > - } > - String pass = > cmdl.getOptionValue("password"); > - if (pass == null || pass.length() < > InstallationConfig.USER_PASSWORD_MINIMUM_LENGTH) { > - System.out.print("Please > enter password:"); > - pass = new BufferedReader(new > InputStreamReader(System.in)).readLine(); > - if (pass == null || > pass.length() < InstallationConfig.USER_PASSWORD_MINIMUM_LENGTH) { > - > System.out.println("Password was not provided, or too short, should be at > least " + InstallationConfig.USER_PASSWORD_MINIMUM_LENGTH + " character > long."); > - System.exit(1); > - } > - } > + String langPath = new File(omHome, > ImportInitvalues.languageFolderName).getAbsolutePath(); //FIXME need to be > moved to helper > ConnectionProperties > connectionProperties = new ConnectionProperties(); > if (cmdl.hasOption("db-type") || > cmdl.hasOption("db-host") || cmdl.hasOption("db-port") || > cmdl.hasOption("db-name") || cmdl.hasOption("db-user") || > cmdl.hasOption("db-pass")) { > String dbType = > cmdl.getOptionValue("db-type", "derby"); > @@ -342,30 +318,18 @@ public class Admin { > , > connectionProperties > ); > } > - > - if(cmdl.hasOption("drop")) { > - String[] mappingToolArgs = > {"-sa", "drop", "-p", omHome.getPath() + > "/WEB-INF/classes/META-INF/persistence.xml", > - > "-connectionDriverName", connectionProperties.getDriverName(), > "-connectionURL", connectionProperties.getConnectionURL(), > - > "-connectionUserName", connectionProperties.getConnectionLogin(), > "-connectionPassword", connectionProperties.getConnectionPass()}; > - > MappingTool.main(mappingToolArgs); > - } > - > ClassPathXmlApplicationContext ctx = > getApplicationContext(ctxName); > - OmTimeZoneDaoImpl tzDao = > ctx.getBean(OmTimeZoneDaoImpl.class); > - String tz = null; > - if (cmdl.hasOption("tz")) { > - tz = > cmdl.getOptionValue("tz"); > - tz = tzDao.getOmTimeZone(tz) > == null ? null : tz; > - } > - if (tz == null) { > - System.out.println("Please > enter timezone, Possible timezones are:"); > - for (OmTimeZone omTz : > tzDao.getOmTimeZones()) { > - > System.out.println(omTz.getJname()); > - } > - System.exit(1); > - } > ImportInitvalues importInit = > ctx.getBean(ImportInitvalues.class); > - importInit.loadAll(new File(omHome, > ImportInitvalues.languageFolderName).getAbsolutePath(), cfg, login, pass, > email, group, tz); > + if (cmdl.hasOption("file")) { > + File backup = > checkRestoreFile(file); > + dropDB(connectionProperties); > + > importInit.loadSystem(langPath, cfg); > + restoreOm(ctxName, backup); > + } else { > + AdminUserDetails admin = > checkAdminDetails(importInit, langPath); > + dropDB(connectionProperties); > + importInit.loadAll(langPath, > cfg, admin.login, admin.pass, admin.email, admin.group, admin.tz); > + } > > File installerFile = new File(new > File(home, ScopeApplicationAdapter.configDirName), > InstallationDocumentHandler.installFileName); > > InstallationDocumentHandler.getInstance().createDocument(installerFile.getAbsolutePath(), > 1); > @@ -392,19 +356,7 @@ public class Admin { > } > break; > case restore: > - try { > - File backup = new File(file); > - if (!cmdl.hasOption("file") || > !backup.exists() || !backup.isFile()) { > - System.out.println("File > should be specified, and point the existent zip file"); > - usage(); > - System.exit(1); > - } > - > - BackupImportController importCtrl = > getApplicationContext(ctxName).getBean(BackupImportController.class); > - importCtrl.performImport(new > FileInputStream(backup), omHome.getAbsolutePath()); > - } catch (Exception e) { > - handleError("Restore failed", e); > - } > + restoreOm(ctxName, checkRestoreFile(file)); > break; > case files: > try { > @@ -451,6 +403,95 @@ public class Admin { > System.exit(0); > } > > + private class AdminUserDetails { > + String login = null; > + String email = null; > + String group = null; > + String pass = null; > + String tz = null; > + } > + > + private AdminUserDetails checkAdminDetails(ImportInitvalues > importInit, String langPath) throws Exception { > + AdminUserDetails admin = new AdminUserDetails(); > + admin.login = cmdl.getOptionValue("user"); > + admin.email = cmdl.getOptionValue("email"); > + admin.group = cmdl.getOptionValue("group"); > + if (admin.login == null || admin.login.length() < > InstallationConfig.USER_LOGIN_MINIMUM_LENGTH) { > + System.out.println("User login was not provided, or > too short, should be at least " + > InstallationConfig.USER_LOGIN_MINIMUM_LENGTH + " character long."); > + System.exit(1); > + } > + > + try { > + if (!MailUtil.matches(admin.email)) { > + throw new AddressException("Invalid address"); > + } > + new InternetAddress(admin.email, true); > + } catch (AddressException ae) { > + System.out.println("Please provide non-empty valid > email: '" + admin.email + "' is not valid."); > + System.exit(1); > + } > + if (admin.group == null || admin.group.length() < 1) { > + System.out.println("User group was not provided, or > too short, should be at least 1 character long: " + admin.group); > + System.exit(1); > + } > + admin.pass = cmdl.getOptionValue("password"); > + if (checkPassword(admin.pass)) { > + System.out.print("Please enter password:"); > + admin.pass = new BufferedReader(new > InputStreamReader(System.in)).readLine(); > + if (checkPassword(admin.pass)) { > + System.out.println("Password was not > provided, or too short, should be at least " + > InstallationConfig.USER_PASSWORD_MINIMUM_LENGTH + " character long."); > + System.exit(1); > + } > + } > + Map<String, String> tzMap = > ImportHelper.getAllTimeZones(importInit.getTimeZones(langPath)); > + admin.tz = null; > + if (cmdl.hasOption("tz")) { > + admin.tz = cmdl.getOptionValue("tz"); > + admin.tz = tzMap.containsKey(admin.tz) ? admin.tz : > null; > + } > + if (admin.tz == null) { > + System.out.println("Please enter timezone, Possible > timezones are:"); > + for (String tzJname : tzMap.keySet()) { > + System.out.println(tzJname); > + } > + System.exit(1); > + } > + return admin; > + } > + > + private boolean checkPassword(String pass) { > + return (pass == null || pass.length() < > InstallationConfig.USER_PASSWORD_MINIMUM_LENGTH); > + } > + > + private void dropDB(ConnectionProperties props) throws Exception { > + if(cmdl.hasOption("drop")) { > + String[] mappingToolArgs = {"-sa", "drop", "-p", > omHome.getAbsolutePath() + "/WEB-INF/classes/META-INF/persistence.xml", > + "-connectionDriverName", > props.getDriverName(), "-connectionURL", props.getConnectionURL(), > + "-connectionUserName", > props.getConnectionLogin(), "-connectionPassword", props.getConnectionPass()}; > + MappingTool.main(mappingToolArgs); > + } > + } > + > + private File checkRestoreFile(String file) { > + File backup = new File(file); > + if (!cmdl.hasOption("file") || !backup.exists() || > !backup.isFile()) { > + System.out.println("File should be specified, and > point the existent zip file"); > + usage(); > + System.exit(1); > + } > + > + return backup; > + } > + > + private void restoreOm(String ctxName, File backup) { > + try { > + BackupImportController importCtrl = > getApplicationContext(ctxName).getBean(BackupImportController.class); > + importCtrl.performImport(new FileInputStream(backup), > omHome.getAbsolutePath()); > + } catch (Exception e) { > + handleError("Restore failed", e); > + } > + } > + > public static void main(String[] args) { > new Admin().process(args); > } > > Modified: > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/servlet/outputhandler/Install.java > URL: > http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/servlet/outputhandler/Install.java?rev=1330188&r1=1330187&r2=1330188&view=diff > ============================================================================== > --- > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/servlet/outputhandler/Install.java > (original) > +++ > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/servlet/outputhandler/Install.java > Wed Apr 25 10:35:08 2012 > @@ -38,6 +38,7 @@ import org.openmeetings.app.installation > import org.openmeetings.app.installation.InstallationConfig; > import org.openmeetings.app.persistence.beans.basic.OmTimeZone; > import org.openmeetings.app.remote.red5.ScopeApplicationAdapter; > +import org.openmeetings.utils.ImportHelper; > import org.red5.logging.Red5LoggerFactory; > import org.slf4j.Logger; > import org.springframework.context.ApplicationContext; > @@ -117,22 +118,14 @@ public class Install extends VelocityVie > allFonts.put("Verdana", "Verdana"); > allFonts.put("Arial", "Arial"); > > - LinkedHashMap<String, String> allTimeZones = new > LinkedHashMap<String, String>(); > List<OmTimeZone> omTimeZoneList = getImportInitvalues() > .getTimeZones(filePath); > - log.debug("omTimeZoneList :: " + omTimeZoneList.size()); > - for (OmTimeZone omTimeZone : omTimeZoneList) { > - String labelName = omTimeZone.getJname() + " (" > - + omTimeZone.getLabel() + ")"; > - log.debug("labelName :: " + labelName); > - allTimeZones.put(omTimeZone.getJname(), labelName); > - } > > Template tpl = super.getTemplate("install_step1_" > + lang + ".vm"); > ctx.put("allLanguages", allLanguages); > ctx.put("allFonts", allFonts); > - ctx.put("allTimeZones", allTimeZones); > + ctx.put("allTimeZones", > ImportHelper.getAllTimeZones(omTimeZoneList)); > StringWriter writer = new StringWriter(); > tpl.merge(ctx, writer); > > > Modified: > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/utils/ImportHelper.java > URL: > http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/utils/ImportHelper.java?rev=1330188&r1=1330187&r2=1330188&view=diff > ============================================================================== > --- > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/utils/ImportHelper.java > (original) > +++ > incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/utils/ImportHelper.java > Wed Apr 25 10:35:08 2012 > @@ -18,9 +18,13 @@ > */ > package org.openmeetings.utils; > > +import java.util.LinkedHashMap; > +import java.util.List; > +import java.util.Map; > + > import org.openmeetings.app.OpenmeetingsVariables; > import org.openmeetings.app.data.basic.Configurationmanagement; > -import org.openmeetings.app.persistence.beans.basic.Configuration; > +import org.openmeetings.app.persistence.beans.basic.OmTimeZone; > import org.red5.logging.Red5LoggerFactory; > import org.slf4j.Logger; > > @@ -31,22 +35,27 @@ public class ImportHelper { > > public static final int getMaxUploadSize( > Configurationmanagement cfgManagement) { > - return getMaxUploadSize(cfgManagement, 3L); > - } > - > - public static final int getMaxUploadSize( > - Configurationmanagement cfgManagement, Long > userLevel) { > - Configuration cfg = cfgManagement.getConfKey(userLevel, > - "DEFAULT_MAX_UPLOAD_SIZE"); > int result = DEFAULT_MAX_UPLOAD_SIZE; > - if (cfg != null) { > - String val = cfg.getConf_value(); > - try { > - result = (int) Math.min(Long.parseLong(val), > Integer.MAX_VALUE); > - } catch (Exception e) { > - log.error("Invalid value saved for > maxUploadSize: " + val, e); > - } > + String maxSize = > cfgManagement.getConfValue("DEFAULT_MAX_UPLOAD_SIZE", String.class, "" + > result); > + try { > + result = (int) Math.min(Long.parseLong(maxSize), > Integer.MAX_VALUE); > + } catch (Exception e) { > + log.error("Invalid value saved for maxUploadSize: " + > maxSize, e); > + } > + return result; > + } > + > + public static Map<String, String> getAllTimeZones(List<OmTimeZone> > tzList) { > + Map<String, String> result = new LinkedHashMap<String, > String>(); > + > + log.debug("omTimeZoneList :: " + tzList.size()); > + for (OmTimeZone omTimeZone : tzList) { > + String labelName = omTimeZone.getJname() + " (" > + + omTimeZone.getLabel() + ")"; > + log.debug("labelName :: " + labelName); > + result.put(omTimeZone.getJname(), labelName); > } > + > return result; > } > } > > -- Sebastian Wagner https://twitter.com/#!/dead_lock http://www.openmeetings.de http://www.webbase-design.de http://www.wagner-sebastian.com [email protected]
