Kawai Wiki

Rev

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