Porting Pleso framework Demo to Netbeans and MySQL Author: E. Ozkan Company: OzTech IT Consultants Email: [email protected] Date: 30-Jan-2009 1. Scope We are planning to use GWT to develop GUIs for a database application. Logically, we have focussed on CRUD applications. We identified a few candidates for our purpose and Pleso framework was one of them. Since we are using Netbeans and MySQL, we decided to port the demo application to our environment. This document summarizes our experience. 2. Environment • • • NetBeans IDE 6.5, Java 1.6.0 Update 11, MySQL Server 5.1, • • • GWT 1.5.3 Pleso Framework 0.2 beta Ibatis 2.3.3.720 It is also assumed that the gwt4nb plugin has been installed into the Netbeans IDE. 3. Migration Steps Select File->New Project … from the Netbeans main menu. Provide a project name “gwt_pleso_mysql_demo” and click on the Next button. Use defaults for server and settings and click on the Next button: Select “Google Web Toolkit” frameworks option and click on the Finish button: Create a new Java Package under Source Packages: Provide name of the java package: net.pleso.auth: Copy source files from the original demo package (drag-drop from windows explorer). There is a oneto-one mapping between folders containing source code and netbeans packages. For example, contents of the src\net\pleso\auth folder should be copied into the net.pleso.auth package. Repeat same procedure for the remaining packages net.pleso.demo (without folders), net.pleso.demo.server and net.pleso.demo.client. The files demo.html and style.css in the folder src\net\pleso\demo\public must be copied into the Web Pages: Edit the web.xml file in the Configuration Files and copy servlet definitions and mappings from the file web.xml in the folder src\net\pleso\demo: <servlet> <servlet-name>AuthService</servlet-name> <servlet -class>net.pleso.demo.server.auth.AuthServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>AuthService</servlet-name> <url-pattern>/auth</url-pattern> </servlet-mapping> <servlet> <servlet-name>BankService</servlet-name> <servlet-class>net.pleso.demo.server.bank.BankServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>BankService</servlet-name> <url-pattern>/bank</url-pattern> </servlet-mapping> <servlet> <servlet-name>OperationService</servlet-name> <servlet-class>net.pleso.demo.server.operation.OperationServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>OperationService</servlet-name> <url-pattern>/operation</url-pattern> </servlet-mapping> <servlet> <servlet-name>ClientService</servlet-name> <servlet-class>net.pleso.demo.server.client.ClientServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>ClientService</servlet-name> <url-pattern>/client</url-pattern> </servlet-mapping> Add Required Libraries Add libraries iBatis, Pleso framework UI & Core and MySQL Java Connector by using Add JAR/Folder … 4. Clean the Project Problem Delete two files which are not required any more: welcomeGWT.html and demoEntryPoint.java. Source Migrated Project Packages Web Pages net.pleso.demo.client Files welcomeGWT.html demoEntryPoint.java. Solution Locate files; right click and, then, select Delete. See the following figure. 5. Changes 5.1. Demo Package Issues These correspond to the issues that have been identified while migrating the Pleso demo: Problem GWT compiler does compile if there are single quotes in messages. Source gwt-pf-ui.jar Package net.pleso.framework.client.localization File messages.properties Solution Change all "can't" with "can not" (by using 7-zip). (Re)archive the library gwt-pf-ui.jar Problem There is no column named “is_confirmed” in the table “operation”. Source Demo Package (gwt-pf-demo1.tar.gz) Package Not Applicable File demo_sql.sql Solution MySQL database creation script contains this column. However, add a database column “is_confirmed” . 5.2. Netbeans Related Changes Problem There is no class named “AuthServiceImpl” which is referenced in the web.xml: <servlet-class>net.pleso.demo.server.auth.AuthServiceImpl </servlet-class> Source Netbeans migration Package Configuration Files File web.xml Solution Change AuthServiceImpl to DemoAuthServiceImpl: <servlet-class>net.pleso.demo.server.auth.DemoAuthServiceImpl </servlet-class> Problem URL pattern /auth, /bank, /operation and /client should be preceded by the GWT output directory (gwt.output.dir=/net.pleso.demo.demo). Source Netbeans migration Package Configuration Files File web.xml Solution Perhaps changing the GWT output directory is also a valid solution. However, I preferred to change four url patterns such as: <url-pattern>/auth</url-pattern> to <url-pattern>/net.pleso.demo.demo/auth</url-pattern> Problem Start web page should be demo.html (instead of welcomeGWT.html). Source Netbeans migration Package Configuration Files File web.xml Solution Change the welcome file to demo.html: Problem Refer to the java script created by GWT compiler in the start WEB page. Source Netbeans migration Package Web Pages File demo.html Solution Within the body tag of the demo.html; change <welcome-file-list> <welcome-file>demo.html</welcome-file> </welcome-file-list> <script language="javascript" src="gwt.js"> </script> to <script language="javascript" src="net.pleso.demo.demo/net.pleso.demo.demo.nocache.js"> </script> Problem GWT compiler gives an error message for Constants class: [ERROR] class net.pleso.demo.client.localization.Constants_ and Constants are both potential default classes for interface com.google.gwt.i18n.client.Constants. Source Netbeans migration Package net.pleso.demo.client.localization File Constants.java Solution Change Constants.java to AppConstants.java by using Refactor->Rename. Rename Constants.properties to AppConstants.properties. Problem Add GWT and Pleso inheritance. Source Netbeans migration Package net.pleso.demo File demo.gwt.xml Solution Replace <entry-point class="net.pleso.demo.client.demoEntryPoint"/> With <!-- Pleso auth library. --> <inherits name='net.pleso.auth.plesoauth'/> <!-- Pleso gwt framework library. --> <inherits name='net.pleso.framework.plesoframework'/> <!-- i18n. --> <inherits name="com.google.gwt.i18n.I18N" /> <!-- Specify the app entry point class. --> <entry-point class='net.pleso.demo.client.demo'/> Problem The database column is_confirmed can be null. Source Netbeans migration Package net.pleso.demo.server.operation File OperationServiceImpl.java Solution Comment out the following two lines in the method public void update(Operation operation) throws BaseException: //if (operation.getIs_confirmed().booleanValue()) // throw new BaseException("test"); 5.3. MySQL Related Changes Problem MySQL stored functions can not return a set or table. MySQL stored procedures can execute a query but they can not be called in the FROM clause of SELECT statement. Source Migrated Project - Ibatis Configuration Package net.pleso.demo.server.client File client.xml Solution Only feasible solution that I found is using dynamic queries within the sql mapping file (Please note that same solution applies to selectCountClient): <select id="selectClient" resultMap="ClientResult" parameterClass="SelectParams" > Select * From CLIENT_VIEW <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="searchRow.cl_id"> CL_ID = $searchRow.cl_id$ </isNotNull> <isNotNull prepend="AND" property="searchRow.cl_bank_id"> CL_BANK_ID = $searchRow.cl_bank_id$ </isNotNull> <isNotNull prepend="AND" property="searchRow.cl_name"> CL_NAME LIKE '%$searchRow.cl_name$%' </isNotNull> <isNotNull prepend="AND" property="searchRow.bank_name"> BANK_NAME LIKE '%$searchRow.bank_name$%' </isNotNull> <isNotNull prepend="AND" property="searchRow.cl_sex"> CL_SEX LIKE '%$searchRow.cl_sex$%' </isNotNull> <isNotNull prepend="AND" property="searchRow.cl_money_start"> CL_MONEY BETWEEN $searchRow.cl_money_start$ AND $searchRow.cl_money_end$ </isNotNull> <isNotNull prepend="AND" property="searchRow.cl_birthday_start"> ( CL_BIRTHDAY BETWEEN STR_TO_DATE('$searchRow.cl_birthday_start$', '%d-%m-%Y %H:%i') AND STR_TO_DATE('$searchRow.cl_birthday_end$', '%d-%m-%Y %H:%i') ) </isNotNull> </dynamic> <isNotEmpty property="orderByColumnName"> order by $orderByColumnName$ $orderByDirectionString$ </isNotEmpty> limit #limit# offset #offset# </select> Problem Database connection parameters should be adapted to MySQL server Source Migrated Project – database connection Package net.pleso.demo.server File connection.properties Solution Use the following parameters (typical parameters): host = localhost port = 3306 database = pfdemo Problem IBatis should use MySQL java connector. Source Migrated Project - Ibatis Configuration Package net.pleso.demo.server File SqlMapConfig.xml Solution Use the following for MySQL connection: <transactionManager type="JDBC" commitRequired="true"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/> <property name="JDBC.ConnectionURL" value="jdbc:mysql://$ {host}:${port}/${database}"/> <property name="JDBC.Username" value="${login}"/> <property name="JDBC.Password" value="${password}"/> </dataSource> </transactionManager> 6. Compilation Issues Problem GWT compiler gives out of memory while compiling the application. Source Migrated project Package Not Applicable File Not Applicable Solution If you get out of memory error from the GWT compiler, add maxmemory: <java classpath="${javac.classpath}:${src.dir}" failonerror="true" classname="com.google.gwt.dev.GWTCompiler" fork="true" maxmemory="256M"> 7. Create Demo Database Select Services tab; select your MySQL Server; use right mouse click and select Create Database...: Provide database name (e.g., pfdemo) and click on the OK button: Select connection created for new database; use right mouse click and select Connect...: Provide database user name and password and click on the OK button: Use right mouse click and select Execute Command …: Copy the content of the file demo_mysql.sql into the SQL command sheet and click on the “Run SQL” icon: After successful execution you should see four tables and one view: