Validating a MSSQL database connection

Validating a MSSQL database connection

Here is a very simple example for entering and validating a Microsoft SQL Server database connection (runnable as client on non-Windows OS also). Here are just the relevant parts without translations.

 

In the UserInputSpec.xml resource, define a panel containing the main input fields for a MSSQL database connection, containing several field validators to directly verify the user input of each single input field:

Resource userInputSpec.xml
<panel id="panel.mssql">    <field id="panel.mssql.title" txt="Microsoft SQL Server Connection" type="title"/>    <field type="text" variable="mssql.host">       <spec id="panel.mssql.host" size="30" txt="DB host name:"/>       <validator class="com.izforge.izpack.panels.userinput.validator.NotEmptyValidator" id="panel.mssql.host.error" txt="The host name must not be empty!"/>    </field>    <field type="space"/>    <field type="rule" variable="mssql.port">       <spec id="panel.mssql.port" layout="N:5:5" txt="Port:"/>       <validator class="com.izforge.izpack.panels.userinput.validator.NotEmptyValidator" id="panel.mssql.port.error" txt="The port must not be empty!"/>       <validator class="com.izforge.izpack.panels.userinput.validator.IsPortValidator" id="panel.mssql.port.error.invalid" txt="The port is invalid!"/>    </field>    <field type="space"/>    <field type="divider"/>    <field type="space"/>    <field type="text" variable="mssql.user">       <spec id="panel.mssql.user" size="20" txt="User name:"/>       <validator class="com.izforge.izpack.panels.userinput.validator.RegularExpressionValidator" id="panel.mssql.user.error" txt="The user name is invalid!">          <param name="pattern" value="[a-zA-Z0-9._-]+"/>       </validator>    </field>    <field type="space"/>    <field type="password" variable="mssql.password">       <spec>          <pwd id="panel.mssql.password" size="20" txt="Password:"/>       </spec>       <validator class="com.izforge.izpack.panels.userinput.validator.NotEmptyValidator" id="panel.mssql.password.error" txt="The password must not be empty!"/>    </field> </panel>

 

The installer descriptor contains elements like this containing a panel validator verifying the connection assembled from the values of all user input fields in summary if he/she presses Next:

 

install.xml
<resources <res id="userInputSpec.xml" src="@{izpack.build.directory}/userInputSpec.xml"/> </resources> ... <!-- Maven dependency after invoking dependency:properties in the POM --> <jar src="@{net.sourceforge.jtds:jtds:jar}" stage="install"/> <jar src="@{com.mysoft:validators:jar}" stage="install"/> ... <panel classname="UserInputPanel" id="panel.mssql">    <validator classname="com.mysoft.izpack.validators.MssqlConnectionValidator"/> </panel>

 

Last but not least there is one custom panel validator MssqlConnectionValidator:

com/mysoft/izpack/validators/MssqlConnectionValidator.java
package com.mysoft.izpack.validators; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import com.izforge.izpack.api.data.InstallData; import com.izforge.izpack.api.installer.DataValidator; public class MssqlConnectionValidator implements DataValidator {   private static final String STR_DEFAULT_ERROR_MESSAGE = "Cannot connect to the specified database.";   protected InstallData installData;   //Error and Warning Messages   protected String str_errorMsg;   protected String str_warningMsg = "";   @Override   public boolean getDefaultAnswer() {     return true;   }   @Override   public String getErrorMessageId() {     if (str_errorMsg != null) {       return str_errorMsg;     } else {       return STR_DEFAULT_ERROR_MESSAGE;     }   }   @Override   public String getWarningMessageId() {     return str_warningMsg;   }   @Override   public Status validateData(InstallData installData) {     this.installData = installData;     try {       Class.forName(getDriver());     } catch (ClassNotFoundException ex) {       str_errorMsg = "Problem during loading db-driver.";       return Status.ERROR;     }     //Test if Database is reachable     try {       Connection conn = null;       conn = DriverManager.getConnection(getUrl(), getUser(), getPassword());       Statement stmt = conn.createStatement();       ResultSet rs = stmt.executeQuery(getQuery());       rs.close();       conn.close();     } catch (Throwable ex) {       str_errorMsg = "Could not connect to database: \n\n" + ex.getLocalizedMessage();       return Status.ERROR;     }     return Status.OK;   }   public String getDriver()   {     return "net.sourceforge.jtds.jdbc.Driver";   }   public String getUrl()   {     StringBuffer url = new StringBuffer("jdbc:jtds:sqlserver://" + getHost());     String port = getPort();     String instance = getInstance();     if (port != null && !port.isEmpty()) {       url.append(":" + port);     }     if (instance != null && !instance.isEmpty()) {       url.append(";instance=" + instance);     }     return url.toString();   }   public String getHost()   {     return installData.getVariable("mssql.host");   }   public String getPort()   {     return installData.getVariable("mssql.port");   }   public String getInstance()   {     return installData.getVariable("mssql.instance");   }   public String getQuery()   {     return "SELECT 1";   }   public String getUser()   {     return installData.getVariable("mssql.user");   }   public String getPassword()   {     return installData.getVariable("mssql.password");   } }

 

You must add the proper JDBC driver to the classpath/dependencies to get this compiled and running. For the above case it is the JTDS driver for MSSQL and Sybase