Kawai Wiki

Rev

Rev 108 | Rev 129 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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