Kawai Wiki

Rev

Rev 78 | Rev 87 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 78 Rev 79
1
package org.kawai;
1
package org.kawai;
2
2
3
import java.sql.Connection;
3
import java.sql.Connection;
4
4
5
import org.kawai.action.LoginAction;
5
import org.kawai.action.LoginAction;
6
import org.kawai.action.PageAction;
6
import org.kawai.action.PageAction;
7
import org.kawai.action.UserAction;
7
import org.kawai.action.UserAction;
8
import org.kawai.dao.jdbc.JdbcPageDAO;
8
import org.kawai.dao.jdbc.JdbcPageDAO;
9
import org.kawai.dao.jdbc.JdbcUserDAO;
9
import org.kawai.dao.jdbc.JdbcUserDAO;
10
import org.kawai.model.Language;
10
import org.kawai.model.Language;
11
import org.kawai.model.Page;
11
import org.kawai.model.Page;
12
import org.kawai.model.Preview;
12
import org.kawai.model.Preview;
13
import org.kawai.model.Revision;
13
import org.kawai.model.Revision;
14
import org.kawai.model.User;
14
import org.kawai.model.User;
15
import org.mentabean.DBTypes;
15
import org.mentabean.DBTypes;
16
import org.mentabean.util.SQLUtils;
16
import org.mentabean.util.SQLUtils;
17
import org.mentawai.action.LogoutAction;
17
import org.mentawai.action.LogoutAction;
18
import org.mentawai.ajax.renderer.JsonRenderer;
18
import org.mentawai.ajax.renderer.JsonRenderer;
19
import org.mentawai.ajax.renderer.ResultRenderer;
19
import org.mentawai.ajax.renderer.ResultRenderer;
20
import org.mentawai.core.ActionConfig;
20
import org.mentawai.core.ActionConfig;
21
import org.mentawai.core.ApplicationManager;
21
import org.mentawai.core.ApplicationManager;
22
import org.mentawai.core.Context;
22
import org.mentawai.core.Context;
23
import org.mentawai.core.Props;
23
import org.mentawai.core.Props;
24
import org.mentawai.db.C3P0ConnectionHandler;
24
import org.mentawai.db.C3P0ConnectionHandler;
25
import org.mentawai.db.ConnectionHandler;
25
import org.mentawai.db.ConnectionHandler;
26
import org.mentawai.filter.AuthenticationFilter;
26
import org.mentawai.filter.AuthenticationFilter;
27
import org.mentawai.filter.ExceptionFilter;
27
import org.mentawai.filter.ExceptionFilter;
28
import org.mentawai.filter.MentaContainerFilter;
28
import org.mentawai.filter.MentaContainerFilter;
29
import org.mentawai.filter.RedirectAfterLoginFilter;
29
import org.mentawai.filter.RedirectAfterLoginFilter;
30
import org.mentawai.filter.TransactionFilter;
30
import org.mentawai.filter.TransactionFilter;
31
import org.mentawai.filter.ValidationFilter;
31
import org.mentawai.filter.ValidationFilter;
32
import org.mentawai.mail.Email;
32
import org.mentawai.mail.Email;
33
import org.mentawai.transaction.JdbcTransaction;
33
import org.mentawai.transaction.JdbcTransaction;
34
34
35
public class AppManager extends ApplicationManager {
35
public class AppManager extends ApplicationManager {
36
36
37
        private Props props;
37
        private Props props;
38
       
38
       
39
        private ConnectionHandler connHandler;
39
        private ConnectionHandler connHandler;
40
       
40
       
41
        public ConnectionHandler getConnHandler() {
41
        public ConnectionHandler getConnHandler() {
42
               
42
               
43
                return connHandler;
43
                return connHandler;
44
        }
44
        }
45
       
45
       
46
        @Override
46
        @Override
47
        public void init(Context application) {
47
        public void init(Context application) {
48
               
48
               
49
                this.props = getProps();
49
                this.props = getProps();
50
               
50
               
51
                ////////////////////////////////////////////
51
                ////////////////////////////////////////////
52
                // TURN ON/OFF DEBUG MODE
52
                // TURN ON/OFF DEBUG MODE
53
                ////////////////////////////////////////////
53
                ////////////////////////////////////////////
54
                setDebugMode(props.getBoolean("debug_mode"), true);
54
                setDebugMode(props.getBoolean("debug_mode"), true);
55
               
55
               
56
                ///////////////////////////////////////////////////
56
                ///////////////////////////////////////////////////
57
                // TURN ON/OFF APP MANAGER AUTO-REDEPLOY FEATURE
57
                // TURN ON/OFF APP MANAGER AUTO-REDEPLOY FEATURE
58
        // OBS: Requires http://www.javarebel.com to work
58
        // OBS: Requires http://www.javarebel.com to work
59
                ///////////////////////////////////////////////////
59
                ///////////////////////////////////////////////////
60
                setReloadable(props.getBoolean("auto_reload"));
60
                setReloadable(props.getBoolean("auto_reload"));
61
               
61
               
62
                //////////////////////////////////////////
62
                //////////////////////////////////////////
63
                // FOR SENDING EMAIL
63
                // FOR SENDING EMAIL
64
                //////////////////////////////////////////
64
                //////////////////////////////////////////
65
                if (!props.getBoolean("email.send_email")) {
65
                if (!props.getBoolean("email.send_email")) {
66
                       
66
                       
67
                        Email.setSendEmail(false);
67
                        Email.setSendEmail(false);
68
                       
68
                       
69
                } else {
69
                } else {
70
               
70
               
71
                        Email.setDefaultHostName(props.getString("email.host"));
71
                        Email.setDefaultHostName(props.getString("email.host"));
72
                       
72
                       
73
                        Email.setDefaultSslConnection( props.getBoolean("email.ssl") );
73
                        Email.setDefaultSslConnection( props.getBoolean("email.ssl") );
74
                       
74
                       
75
                        Email.setDefaultPort( props.getInt("email.port") );
75
                        Email.setDefaultPort( props.getInt("email.port") );
76
76
77
                        if (props.getBoolean("email.use_authentication")) {
77
                        if (props.getBoolean("email.use_authentication")) {
78
                               
78
                               
79
                                Email.setDefaultAuthentication(props.getString("email.user"), props.getString("email.pass"));
79
                                Email.setDefaultAuthentication(props.getString("email.user"), props.getString("email.pass"));
80
                        }
80
                        }
81
                       
81
                       
82
                        Email.setDefaultFrom(props.getString("email.from_email"), props.getString("email.from_name"));
82
                        Email.setDefaultFrom(props.getString("email.from_email"), props.getString("email.from_name"));
83
                }
83
                }
84
        }
84
        }
85
85
86
        @Override
86
        @Override
87
        public void setupDB() {
87
        public void setupDB() {
88
               
88
               
89
                String driver = props.getString("jdbc.driver");
89
                String driver = props.getString("jdbc.driver");
90
                String url = props.getString("jdbc.url");
90
                String url = props.getString("jdbc.url");
91
                String user = props.getString("jdbc.user");
91
                String user = props.getString("jdbc.user");
92
                String pass = props.getString("jdbc.pass");
92
                String pass = props.getString("jdbc.pass");
93
               
93
               
94
                this.connHandler = new C3P0ConnectionHandler(driver, url, user, pass);
94
                this.connHandler = new C3P0ConnectionHandler(driver, url, user, pass);
95
95
96
                initDatabaseIfNeeded(connHandler);
96
                initDatabaseIfNeeded(connHandler);
97
        }
97
        }
98
       
98
       
99
        @Override
99
        @Override
100
        public void loadBeans() {
100
        public void loadBeans() {
101
       
101
       
102
                bean(User.class, "Users")
102
                bean(User.class, "Users")
103
                        .pk("id", DBTypes.AUTOINCREMENT)
103
                        .pk("id", DBTypes.AUTOINCREMENT)
104
                        .field("username", DBTypes.STRING)
104
                        .field("username", DBTypes.STRING)
105
                        .field("password", DBTypes.STRING)
105
                        .field("password", DBTypes.STRING)
106
                        .field("email", DBTypes.STRING)
106
                        .field("email", DBTypes.STRING)
107
                        .field("groupId", "group_id", DBTypes.INTEGER);
107
                        .field("groupId", "group_id", DBTypes.INTEGER);
108
               
108
               
109
                bean(Page.class, "Pages")
109
                bean(Page.class, "Pages")
110
                        .pk("id", DBTypes.AUTOINCREMENT)
110
                        .pk("id", DBTypes.AUTOINCREMENT)
111
                        .field("name", DBTypes.STRING)
111
                        .field("name", DBTypes.STRING)
112
                        .field("title", DBTypes.STRING)
112
                        .field("title", DBTypes.STRING)
113
                        .field("body", DBTypes.STRING)
113
                        .field("body", DBTypes.STRING)
114
                        .field("languageId", "language_id", DBTypes.INTEGER)
114
                        .field("languageId", "language_id", DBTypes.INTEGER)
115
                        .field("systemPage", "system_page", DBTypes.BOOLEANSTRING)
115
                        .field("systemPage", "system_page", DBTypes.BOOLEANSTRING)
116
                        .field("frontPage", "front_page", DBTypes.BOOLEANSTRING)
116
                        .field("frontPage", "front_page", DBTypes.BOOLEANSTRING)
117
                        .field("modifiedById", "modified_by", DBTypes.INTEGER)
117
                        .field("modifiedById", "modified_by", DBTypes.INTEGER)
118
                        .field("modifiedOn", "modified_on", DBTypes.NOW_ON_UPDATE_TIMESTAMP)
118
                        .field("modifiedOn", "modified_on", DBTypes.NOW_ON_UPDATE_TIMESTAMP)
119
                        .field("createdById", "created_by", DBTypes.INTEGER)
119
                        .field("createdById", "created_by", DBTypes.INTEGER)
120
                        .field("createdOn", "created_on", DBTypes.NOW_ON_INSERT_TIMESTAMP)
120
                        .field("createdOn", "created_on", DBTypes.NOW_ON_INSERT_TIMESTAMP)
121
                        .field("deleted", DBTypes.BOOLEANSTRING);
121
                        .field("deleted", DBTypes.BOOLEANSTRING);
122
               
122
               
123
                bean(Preview.class, "Previews")
123
                bean(Preview.class, "Previews")
124
                        .pk("id", DBTypes.AUTOINCREMENT)
124
                        .pk("id", DBTypes.AUTOINCREMENT)
125
                        .field("userId", "user_id", DBTypes.INTEGER)
125
                        .field("userId", "user_id", DBTypes.INTEGER)
126
                        .field("title", DBTypes.STRING)
126
                        .field("title", DBTypes.STRING)
127
                        .field("body", DBTypes.STRING)
127
                        .field("body", DBTypes.STRING)
128
                        .field("createdOn", "created_on", DBTypes.NOW_ON_INSERT_TIMESTAMP)
128
                        .field("createdOn", "created_on", DBTypes.NOW_ON_INSERT_TIMESTAMP)
129
                        .field("name", DBTypes.STRING)
129
                        .field("name", DBTypes.STRING)
130
                        .field("languageId", "language_id", DBTypes.INTEGER);
130
                        .field("languageId", "language_id", DBTypes.INTEGER);
131
               
131
               
132
                bean(Revision.class, "Revisions")
132
                bean(Revision.class, "Revisions")
133
                .pk("id", DBTypes.AUTOINCREMENT)
133
                .pk("id", DBTypes.AUTOINCREMENT)
134
                .field("userId", "user_id", DBTypes.INTEGER)
134
                .field("userId", "user_id", DBTypes.INTEGER)
135
                .field("newTitle", "new_title", DBTypes.STRING)
135
                .field("newTitle", "new_title", DBTypes.STRING)
136
                .field("newBody", "new_body", DBTypes.STRING)
136
                .field("newBody", "new_body", DBTypes.STRING)
137
                .field("oldTitle", "old_title", DBTypes.STRING)
137
                .field("oldTitle", "old_title", DBTypes.STRING)
138
                .field("oldBody", "old_body", DBTypes.STRING)          
138
                .field("oldBody", "old_body", DBTypes.STRING)          
139
                .field("createdOn", "created_on", DBTypes.AUTOTIMESTAMP)
139
                .field("createdOn", "created_on", DBTypes.AUTOTIMESTAMP)
140
                .field("name", DBTypes.STRING)
140
                .field("name", DBTypes.STRING)
141
                .field("languageId", "language_id", DBTypes.INTEGER)
141
                .field("languageId", "language_id", DBTypes.INTEGER)
142
                .field("revision", DBTypes.INTEGER);
142
                .field("revision", DBTypes.INTEGER);
143
143
144
        }
144
        }
145
       
145
       
146
    @Override
146
    @Override
147
    public void loadLists() {
147
    public void loadLists() {
148
                addLocalizedLists(connHandler, "groups", "languages");
148
                addLocalizedLists(connHandler, "groups", "languages");
149
        }
149
        }
150
       
150
       
151
        @Override
151
        @Override
152
        public void loadLocales() {
152
        public void loadLocales() {
153
                addLocale(Language.ENGLISH.getLocale());
153
                addLocale(Language.ENGLISH.getLocale());
154
                addLocale(Language.PORTUGUESE.getLocale());
154
                addLocale(Language.PORTUGUESE.getLocale());
155
        }
155
        }
156
       
156
       
157
        @Override
157
        @Override
158
        public void loadFilters() {
158
        public void loadFilters() {
159
               
159
               
160
                /////////////////////////////////////////////
160
                /////////////////////////////////////////////
161
                // GLOBAL FILTERS
161
                // GLOBAL FILTERS
162
                /////////////////////////////////////////////
162
                /////////////////////////////////////////////
163
               
163
               
164
                filter(new ExceptionFilter());
164
                filter(new ExceptionFilter());
165
                on(EXCEPTION, fwd("/jsp/error.jsp"));
165
                on(EXCEPTION, fwd("/jsp/error.jsp"));
166
               
166
               
167
                filter(new MentaContainerFilter());
167
                filter(new MentaContainerFilter());
168
               
168
               
169
                //////////////////////////////////////////////////////////
169
                //////////////////////////////////////////////////////////
170
                // AUTHENTICATION: ALL ACTIONS THAT DO NOT IMPLEMENT
170
                // AUTHENTICATION: ALL ACTIONS THAT DO NOT IMPLEMENT
171
                // THE AuthenticationFree INTERFACE WILL REQUIRE
171
                // THE AuthenticationFree INTERFACE WILL REQUIRE
172
                // AUTHENTICATION
172
                // AUTHENTICATION
173
                //////////////////////////////////////////////////////////
173
                //////////////////////////////////////////////////////////
174
                filter(new AuthenticationFilter());
174
                filter(new AuthenticationFilter());
175
                on(LOGIN, redir("/jsp/login.jsp"));
175
                on(LOGIN, redir("/jsp/login.jsp"));
176
               
176
               
177
                filter(new RedirectAfterLoginFilter());
177
                filter(new RedirectAfterLoginFilter());
178
                on(REDIR, redir());
178
                on(REDIR, redir());
179
179
180
                filter(new ValidationFilter());
180
                filter(new ValidationFilter());
181
               
181
               
182
                filter(new TransactionFilter("transaction"));
182
                filter(new TransactionFilter("transaction"));
183
        }
183
        }
184
       
184
       
185
        @Override
185
        @Override
186
        public void setupIoC() {
186
        public void setupIoC() {
187
187
188
                ////////////////////////////////////////////////////////
188
                ////////////////////////////////////////////////////////
189
                // INVERSION OF CONTROL: SET UP YOUR REPOSITORIES OR 
189
                // INVERSION OF CONTROL: SET UP YOUR REPOSITORIES OR 
190
                // ANY OTHER OBJECT IMPLEMENTATION YOU WANT TO MAKE 
190
                // ANY OTHER OBJECT IMPLEMENTATION YOU WANT TO MAKE 
191
                // AVAILABLE THROUGH IOC (INVERSION OF CONTROL)
191
                // AVAILABLE THROUGH IOC (INVERSION OF CONTROL)
192
                ////////////////////////////////////////////////////////
192
                ////////////////////////////////////////////////////////
193
               
193
               
194
                ioc("conn", connHandler);
194
                ioc("conn", connHandler);
195
                ioc("beanManager", getBeanManager()); // always return the same instance...
195
                ioc("beanManager", getBeanManager()); // always return the same instance...
196
                ioc("userDAO", JdbcUserDAO.class);
196
                ioc("userDAO", JdbcUserDAO.class);
197
                ioc("pageDAO", JdbcPageDAO.class);
197
                ioc("pageDAO", JdbcPageDAO.class);
198
                ioc("beanSession", props.getClass("mentabean.dialect"));
198
                ioc("beanSession", props.getClass("mentabean.dialect"));
199
                ioc("transaction", JdbcTransaction.class);
199
                ioc("transaction", JdbcTransaction.class);
200
        }
200
        }
201
       
201
       
202
        @Override
202
        @Override
203
        public void loadActions() {
203
        public void loadActions() {
204
               
204
               
205
                on(AJAX, ajax(new JsonRenderer()));
205
                on(AJAX, ajax(new JsonRenderer()));
206
               
206
               
207
                ActionConfig mainAction = action("/Page", PageAction.class)
207
                ActionConfig mainAction = action("/Page", PageAction.class)
208
                        .on(SUCCESS, fwd("/show_page.jsp"));
208
                        .on(SUCCESS, fwd("/show_page.jsp"));
209
               
209
               
210
                on(INDEX, redir(mainAction));
210
                on(INDEX, redir(mainAction));
211
                on(UPDATED, redir(mainAction,  true));
211
                on(UPDATED, redir(mainAction,  true));
212
               
212
               
213
                action("/User", UserAction.class, "add")
213
                action("/User", UserAction.class, "add")
214
                        .on(ERROR, fwd("/jsp/user/add.jsp"))
214
                        .on(ERROR, fwd("/jsp/user/add.jsp"))
215
                        .on(CREATED, fwd("/frontpage.jsp"));
215
                        .on(CREATED, fwd("/frontpage.jsp"));
216
               
216
               
217
                action("/User", UserAction.class, "edit")
217
                action("/User", UserAction.class, "edit")
218
                        .on(ERROR, fwd("/jsp/user/edit.jsp"))
218
                        .on(ERROR, fwd("/jsp/user/edit.jsp"))
219
                        .on(SHOW, fwd("/jsp/user/edit.jsp"))
219
                        .on(SHOW, fwd("/jsp/user/edit.jsp"))
220
                        .on(UPDATED, fwd("/frontpage.jsp"));
220
                        .on(UPDATED, fwd("/frontpage.jsp"));
221
               
221
               
222
                action("/User", UserAction.class, "check")
222
                action("/User", UserAction.class, "check")
223
                        .all(ajax(new ResultRenderer()));
223
                        .all(ajax(new ResultRenderer()));
224
       
224
       
225
                action("/Login", LoginAction.class)
225
                action("/Login", LoginAction.class)
226
                        .on(ERROR, chain(mainAction))
226
                        .on(ERROR, chain(mainAction))
227
                        .on(SUCCESS, redir(mainAction, true));
227
                        .on(SUCCESS, redir(mainAction, true));
228
               
228
               
229
                action("/Logout", LogoutAction.class)
229
                action("/Logout", LogoutAction.class)
230
                        .on(SUCCESS, redir(mainAction));
230
                        .on(SUCCESS, redir(mainAction));
231
               
231
               
232
                action("/Page", PageAction.class, "get");
232
                action("/Page", PageAction.class, "get");
233
                action("/Page", PageAction.class, "getPreview");
233
                action("/Page", PageAction.class, "getPreview");
-
 
234
                action("/Page", PageAction.class, "getRevisions");
234
               
235
               
235
                action("/Page", PageAction.class, "add")
236
                action("/Page", PageAction.class, "add")
236
                        .on(ERROR, chain(mainAction))
237
                        .on(ERROR, chain(mainAction))
237
                        .on(CREATED, redir(mainAction, true));
238
                        .on(CREATED, redir(mainAction, true));
238
               
239
               
239
                action("/Page", PageAction.class, "setFrontPage");
240
                action("/Page", PageAction.class, "setFrontPage");
240
                action("/Page", PageAction.class, "delete");
241
                action("/Page", PageAction.class, "delete");
241
                action("/Page", PageAction.class, "edit");
242
                action("/Page", PageAction.class, "edit");
242
243
243
                action("/Page", PageAction.class, "list");
244
                action("/Page", PageAction.class, "list");
244
               
245
               
245
                action("/Page", PageAction.class, "discardPreview")
246
                action("/Page", PageAction.class, "discardPreview")
246
                        .on(REMOVED, redir(mainAction, true));
247
                        .on(REMOVED, redir(mainAction, true));
247
               
248
               
248
                action("/Page", PageAction.class, "savePreview")
249
                action("/Page", PageAction.class, "savePreview")
249
                        .on(SUCCESS, redir(mainAction, true));
250
                        .on(SUCCESS, redir(mainAction, true));
250
               
251
               
251
                action("/GenerateCSS", PageAction.class, "getCSS")
252
                action("/GenerateCSS", PageAction.class, "getCSS")
252
                        .on(SUCCESS, fwd("/generate_css.jsp"));
253
                        .on(SUCCESS, fwd("/generate_css.jsp"));
253
               
254
               
254
                action("/GenerateCSS", PageAction.class, "getPrintCSS")
255
                action("/GenerateCSS", PageAction.class, "getPrintCSS")
255
                        .on(SUCCESS, fwd("/generate_css.jsp"));
256
                        .on(SUCCESS, fwd("/generate_css.jsp"));
256
               
257
               
257
        }
258
        }
258
       
259
       
259
        ////////////////////////////////////////////////////////////////////////////////
260
        ////////////////////////////////////////////////////////////////////////////////
260
        // Database initialization so this app does not require any database setup
261
        // Database initialization so this app does not require any database setup
261
        //
262
        //
262
        // NOTE: It is not necessary to do this if your database is already initialized
263
        // NOTE: It is not necessary to do this if your database is already initialized
263
        ////////////////////////////////////////////////////////////////////////////////
264
        ////////////////////////////////////////////////////////////////////////////////
264
       
265
       
265
        private void initDatabaseIfNeeded(ConnectionHandler connHandler) {
266
        private void initDatabaseIfNeeded(ConnectionHandler connHandler) {
266
               
267
               
267
                connHandler.exec(new ConnectionHandler.Exec() {
268
                connHandler.exec(new ConnectionHandler.Exec() {
268
               
269
               
269
                        @Override
270
                        @Override
270
                        public void exec(Connection conn) {
271
                        public void exec(Connection conn) {
271
                                initDatabaseIfNeeded(conn);
272
                                initDatabaseIfNeeded(conn);
272
                        }
273
                        }
273
                });
274
                });
274
        }
275
        }
275
       
276
       
276
        protected void initDatabaseIfNeeded(Connection conn) {
277
        protected void initDatabaseIfNeeded(Connection conn) {
277
               
278
               
278
                if (SQLUtils.checkIfTableExists(conn, "users")) return;
279
                if (SQLUtils.checkIfTableExists(conn, "users")) return;
279
               
280
               
280
                try {
281
                try {
281
                        String file = props.getAbsolutePath("db.script");
282
                        String file = props.getAbsolutePath("db.script");
282
                        SQLUtils.executeScript(conn, file, "UTF-8");
283
                        SQLUtils.executeScript(conn, file, "UTF-8");
283
                } catch(Exception e) {
284
                } catch(Exception e) {
284
                        e.printStackTrace();
285
                        e.printStackTrace();
285
                }
286
                }
286
287
287
                if (!SQLUtils.checkIfTableExists(conn, "users")) throw new RuntimeException("Failed to initialize db!");
288
                if (!SQLUtils.checkIfTableExists(conn, "users")) throw new RuntimeException("Failed to initialize db!");
288
        }
289
        }
289
}
290
}