Kawai Wiki

Rev

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