Author: solomax
Date: Thu Apr 19 06:58:47 2012
New Revision: 1327842

URL: http://svn.apache.org/viewvc?rev=1327842&view=rev
Log:
OPENMEETINGS-111 Cli Admin updated with optional options to set DB parameters

Added:
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/ConnectionPropertiesPatcher.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Db2Patcher.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/DerbyPatcher.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/MysqlPatcher.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OraclePatcher.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/PostgresPatcher.java
Modified:
    
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java

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=1327842&r1=1327841&r2=1327842&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java 
(original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Admin.java 
Thu Apr 19 06:58:47 2012
@@ -83,6 +83,13 @@ public class Admin {
                options.addOption(new OmOption("i", null, "email-use-tls", 
false, "Is secure e-mail connection [default: no]", true));
                options.addOption(new OmOption("i", null, "skip-default-rooms", 
false, "Do not create default rooms [created by default]", true));
                options.addOption(new OmOption("i", null, 
"disable-frontend-register", false, "Do not allow front end register [allowed 
by default]", true));
+
+               options.addOption(new OmOption("i", null, "db-type", true, "The 
type of the DB to be used", true));
+               options.addOption(new OmOption("i", null, "db-host", true, "DNS 
name or IP address of database", true));
+               options.addOption(new OmOption("i", null, "db-port", true, 
"Database port", true));
+               options.addOption(new OmOption("i", null, "db-name", true, "The 
name of Openmeetings database", true));
+               options.addOption(new OmOption("i", null, "db-user", true, 
"User with write access to the DB specified", true));
+               options.addOption(new OmOption("i", null, "db-pass", true, 
"Password of the user with write access to the DB specified", true));
                
                return options;
        }
@@ -292,6 +299,7 @@ public class Admin {
                                                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 
(!rfc2822.matcher(email).matches()) {
                                                    throw new 
AddressException("Invalid address");
@@ -314,6 +322,21 @@ public class Admin {
                                                        System.exit(1);
                                                }
                                        }
+                                       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");
+                                               File srcConf = new File(omHome, 
"WEB-INF/classes/META-INF/" + dbType + "_persistence.xml");
+                                               File destConf = new 
File(omHome, "WEB-INF/classes/META-INF/persistence.xml");
+                                               
ConnectionPropertiesPatcher.getPatcher(dbType).patch(
+                                                               srcConf
+                                                               , destConf
+                                                               , 
cmdl.getOptionValue("db-host", "localhost")
+                                                               , 
cmdl.getOptionValue("db-port", null)
+                                                               , 
cmdl.getOptionValue("db-name", null)
+                                                               , 
cmdl.getOptionValue("db-user", null)
+                                                               , 
cmdl.getOptionValue("db-pass", null)
+                                                               );
+                                       }
+
                                        ClassPathXmlApplicationContext ctx = 
getApplicationContext(ctxName);
                                        ImportInitvalues importInit = 
ctx.getBean(ImportInitvalues.class);
                                        importInit.loadAll(new File(omHome, 
ImportInitvalues.languageFolderName).getAbsolutePath(), cfg, login, pass, 
email, group, tz);

Added: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/ConnectionPropertiesPatcher.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/ConnectionPropertiesPatcher.java?rev=1327842&view=auto
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/ConnectionPropertiesPatcher.java
 (added)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/ConnectionPropertiesPatcher.java
 Thu Apr 19 06:58:47 2012
@@ -0,0 +1,102 @@
+package org.openmeetings.cli;
+
+import java.io.File;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public abstract class ConnectionPropertiesPatcher {
+       public enum PatcherType {
+               db2
+               , derby
+               , mysql
+               , oracle
+               , postgres
+       }
+       
+       static ConnectionPropertiesPatcher getPatcher(String _dbType) {
+               PatcherType dbType = PatcherType.valueOf(_dbType);
+               ConnectionPropertiesPatcher patcher = null;
+               switch (dbType) {
+                       case db2:
+                               patcher = new Db2Patcher();
+                               break;
+                       case mysql:
+                               patcher = new MysqlPatcher();
+                               break;
+                       case oracle:
+                               patcher = new OraclePatcher();
+                               break;
+                       case postgres:
+                               patcher = new PostgresPatcher();
+                               break;
+                       case derby:
+                       default:
+                               patcher = new DerbyPatcher();
+                               break;
+               }
+               return patcher;
+       }
+       
+       public void patch(File srcXml, File destXml, String host, String port, 
String db, String user, String pass) throws Exception {
+               DocumentBuilderFactory dbFactory = 
DocumentBuilderFactory.newInstance();
+               //dbFactory.setNamespaceAware(true);
+               DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+               Document doc = dBuilder.parse(srcXml);
+               
+               XPath xPath = XPathFactory.newInstance().newXPath();
+               XPathExpression expr = 
xPath.compile("/persistence/persistence-unit/properties/property[@name='openjpa.ConnectionProperties']");
+
+               Element element = (Element)expr.evaluate(doc, 
XPathConstants.NODE);
+               Attr val = element.getAttributeNode("value");
+               val = patchAttribute(val, host, port, db, user, pass);
+               
+               TransformerFactory transformerFactory = 
TransformerFactory.newInstance();
+               Transformer transformer = transformerFactory.newTransformer();
+               DOMSource source = new DOMSource(doc);
+               transformer.transform(source, new StreamResult(destXml));
+       }
+       
+       protected Attr patchAttribute(Attr attr, String host, String port, 
String db, String user, String pass) {
+               String[] tokens = attr.getValue().split(",");
+               patchUser(tokens, user, pass);
+               patchDb(tokens, host, port, db);
+               attr.setValue(StringUtils.join(tokens, ","));
+               return attr;
+       }
+
+       protected void patchProp(String[] tokens, int idx, String name, String 
value) {
+               String prop = tokens[idx].trim();
+               if (prop.startsWith(name)) {
+                       prop = name + "=" + StringEscapeUtils.escapeXml(value);
+                       tokens[idx] = prop;
+               }
+       }
+       
+       protected void patchUser(String[] tokens, String user, String pass) {
+               for (int i = 0; i < tokens.length; ++i) {
+                       if (user != null) {
+                               patchProp(tokens, i, "Username", user);
+                       }
+                       if (pass != null) {
+                               patchProp(tokens, i, "Password", pass);
+                       }
+               }
+       }
+       
+       protected abstract void patchDb(String[] tokens, String host, String 
port, String db);
+}

Added: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Db2Patcher.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Db2Patcher.java?rev=1327842&view=auto
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Db2Patcher.java
 (added)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/Db2Patcher.java
 Thu Apr 19 06:58:47 2012
@@ -0,0 +1,16 @@
+package org.openmeetings.cli;
+
+public class Db2Patcher extends ConnectionPropertiesPatcher {
+       @Override
+       protected void patchDb(String[] tokens, String host, String _port, 
String _db) {
+               String port = (_port == null) ? "50000" : _port;
+               String db = (_db == null) ? "openmeet" : _db;
+               for (int i = 0; i < tokens.length; ++i) {
+                       String prop = tokens[i].trim();
+                       if (prop.startsWith("Url")) {
+                               String url = "Url=jdbc:db2://" + host + ":" + 
port + "/" + db;
+                               tokens[i] = url;
+                       }
+               }
+       }
+}

Added: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/DerbyPatcher.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/DerbyPatcher.java?rev=1327842&view=auto
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/DerbyPatcher.java
 (added)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/DerbyPatcher.java
 Thu Apr 19 06:58:47 2012
@@ -0,0 +1,16 @@
+package org.openmeetings.cli;
+
+public class DerbyPatcher extends ConnectionPropertiesPatcher {
+       @Override
+       protected void patchDb(String[] tokens, String host, String _port, 
String _db) {
+               String db = (_db == null) ? "openmeetings" : _db;
+               for (int i = 0; i < tokens.length; ++i) {
+                       String prop = tokens[i].trim();
+                       if (prop.startsWith("Url")) {
+                               String suffix = 
prop.substring(prop.indexOf(';'));
+                               String url = "Url=jdbc:derby" + ":" + db + 
suffix;
+                               tokens[i] = url;
+                       }
+               }
+       }
+}

Added: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/MysqlPatcher.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/MysqlPatcher.java?rev=1327842&view=auto
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/MysqlPatcher.java
 (added)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/MysqlPatcher.java
 Thu Apr 19 06:58:47 2012
@@ -0,0 +1,17 @@
+package org.openmeetings.cli;
+
+public class MysqlPatcher extends ConnectionPropertiesPatcher {
+       @Override
+       protected void patchDb(String[] tokens, String host, String _port, 
String _db) {
+               String port = (_port == null) ? "3306" : _port;
+               String db = (_db == null) ? "openmeetings" : _db;
+               for (int i = 0; i < tokens.length; ++i) {
+                       String prop = tokens[i].trim();
+                       if (prop.startsWith("Url")) {
+                               String suffix = 
prop.substring(prop.indexOf('?'));
+                               String url = "Url=jdbc:mysql://" + host + ":" + 
port + "/" + db + suffix;
+                               tokens[i] = url;
+                       }
+               }
+       }
+}

Added: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OraclePatcher.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OraclePatcher.java?rev=1327842&view=auto
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OraclePatcher.java
 (added)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/OraclePatcher.java
 Thu Apr 19 06:58:47 2012
@@ -0,0 +1,16 @@
+package org.openmeetings.cli;
+
+public class OraclePatcher extends ConnectionPropertiesPatcher {
+       @Override
+       protected void patchDb(String[] tokens, String host, String _port, 
String _db) {
+               String port = (_port == null) ? "1521" : _port;
+               String db = (_db == null) ? "openmeetings" : _db;
+               for (int i = 0; i < tokens.length; ++i) {
+                       String prop = tokens[i].trim();
+                       if (prop.startsWith("Url")) {
+                               String url = "Url=jdbc:oracle:thin:@" + host + 
":" + port + ":" + db;
+                               tokens[i] = url;
+                       }
+               }
+       }
+}

Added: 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/PostgresPatcher.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/PostgresPatcher.java?rev=1327842&view=auto
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/PostgresPatcher.java
 (added)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/openmeetings/cli/PostgresPatcher.java
 Thu Apr 19 06:58:47 2012
@@ -0,0 +1,16 @@
+package org.openmeetings.cli;
+
+public class PostgresPatcher extends ConnectionPropertiesPatcher {
+       @Override
+       protected void patchDb(String[] tokens, String host, String _port, 
String _db) {
+               String port = (_port == null) ? "5432" : _port;
+               String db = (_db == null) ? "openmeetings" : _db;
+               for (int i = 0; i < tokens.length; ++i) {
+                       String prop = tokens[i].trim();
+                       if (prop.startsWith("Url")) {
+                               String url = "Url=jdbc:postgresql://" + host + 
":" + port + "/" + db;
+                               tokens[i] = url;
+                       }
+               }
+       }
+}


Reply via email to