Sposób stworzenia: - grails create-app GrailsRiaExample - utworzenie aplikacji - cd GrailsRiaExample - moduł CRUD - -- grails install-plugin http://grails400utils.googlecode.com/files/grails-systemitools-0.3.zip - instalacja pluginu zawierającego sterowniki dla bazy danych IBM DB2 for IBM i - -- grails compile - kompilacja, jesli potrzebna - -- grails create-domain-class info.ludera.grails.Unit - utworzenie klasy modelu - klasa ta mapowana będzie z tabeli z bazy danych Do poprawnej pracy potrzebna jest tabela o kolumnach analogicznych do poniższej definicji. Wymagane są kolumny id (primary key i bigint autoincrement), version (bigint z ustawioną domyślną wartością liczbową): CREATE TABLE UNIT ( ID BIGINT GENERATED ALWAYS AS IDENTITY ( START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE NO CYCLE NO ORDER CACHE 20 ) , NAME CHAR(30) NOT NULL , VERSION BIGINT DEFAULT NULL , -- wersjonowanie obiektow dla orm w grails PRIMARY KEY( ID ) ) ; - -- zmienić zawartość wygenerowanego pliku Unit.groovy na następującą: package info.ludera.grails class Unit { String name static mapping = { table ('unit') } } - -- grails create-controller info.ludera.grails.Unit - utworzenie kontrolera Unit - -- zmienić zawartość wygenerowanego pliku UnitController.groovy na następującą: package info.ludera.grails import grails.test.* class UnitControllerTests extends ControllerUnitTestCase { protected void setUp() { super.setUp() } protected void tearDown() { super.tearDown() } void testSomething() { } } - -- zmienić zawartość pliku DataSource.groovy - konfiguracja Hibernate dla bazy danych IBM DB2 dataSource { pooled = true driverClassName = "org.hsqldb.jdbcDriver" username = "sa" password = "" } hibernate { cache.use_second_level_cache=true cache.use_query_cache=true cache.provider_class='com.opensymphony.oscache.hibernate.OSCacheProvider' } // environment specific settings environments { development { dataSource { pooled = true url = "jdbc:as400://IP_TWOJEGO_AS400/mgrschm" driverClassName = "com.ibm.as400.access.AS400JDBCDriver" username = ";)" password = ";)" dialect = org.hibernate.dialect.DB2400Dialect.class } } test { dataSource { dbCreate = "update" url = "jdbc:hsqldb:mem:testDb" } } production { dataSource { dbCreate = "update" url = "jdbc:hsqldb:file:prodDb;shutdown=true" } } } - moduł JTOpen - -- grails install-plugin jtopen - instalacja biblioteki JTOpen - -- dodać na koniec pliku grails-app/conf/Config.groovy sekcję: grails.serverURL = [ jtopen.as400 = 'IP_TWOJEGO_AS400', jtopen.user = ';-)', jtopen.password = ';-)' ] - -- grails create-service info.ludera.Command - utworzenie serwisu Command - -- zmienić zawartość wygenerowanego pliku CommandService.groovy na następującą: package info.ludera import org.codehaus.groovy.grails.plugins.jtopen.types.* class CommandService { boolean transactional = false def ibmI def executeCommand(String command) { def cr = ibmI.call('QCMDEXC',[ new IChar(command), new IPacked(command.length(),15,5)] as Type[]) cr.success?:cr.messageList } } - -- grails create-controller info.ludera.SndMsg - utworzenie kontrolera SndMsg - -- zmienić zawartość wygenerowanego pliku SndMsgController.groovy na następującą: package info.ludera class SndMsgController { def commandService def create = { def result = commandService.executeCommand("SNDMSG MSG('${params.msg}') TOUSR(${params.user})") render result==true?"Message ${params.msg} has been sent to user ${params.user} ":result.inspect() } } Sposób uruchomienia aplikacji: - grails -Dserver.port=8090 run-app - w przypadku wystąpienia błędów wykonać grails clean a następnie grails -Dserver.port=8090 run-app - aplikacja działa pod adresem: http://localhost:8090/GrailsRiaExample/ - -- przykładowe parametry uruchomienia aplikacji JTOpen: http://localhost:8090/GrailsRiaExample/sndMsg/create?msg=test1&user=ludera