001
014
015 package com.liferay.portal.setup;
016
017 import com.liferay.portal.NoSuchUserException;
018 import com.liferay.portal.dao.jdbc.util.DataSourceSwapper;
019 import com.liferay.portal.events.StartupAction;
020 import com.liferay.portal.kernel.cache.CacheRegistryUtil;
021 import com.liferay.portal.kernel.cache.MultiVMPoolUtil;
022 import com.liferay.portal.kernel.dao.jdbc.DataAccess;
023 import com.liferay.portal.kernel.dao.jdbc.DataSourceFactoryUtil;
024 import com.liferay.portal.kernel.language.LanguageUtil;
025 import com.liferay.portal.kernel.log.Log;
026 import com.liferay.portal.kernel.log.LogFactoryUtil;
027 import com.liferay.portal.kernel.util.CentralizedThreadLocal;
028 import com.liferay.portal.kernel.util.FileUtil;
029 import com.liferay.portal.kernel.util.ListUtil;
030 import com.liferay.portal.kernel.util.LocaleUtil;
031 import com.liferay.portal.kernel.util.ParamUtil;
032 import com.liferay.portal.kernel.util.PropertiesParamUtil;
033 import com.liferay.portal.kernel.util.PropertiesUtil;
034 import com.liferay.portal.kernel.util.PropsKeys;
035 import com.liferay.portal.kernel.util.StringPool;
036 import com.liferay.portal.kernel.util.UnicodeProperties;
037 import com.liferay.portal.kernel.webcache.WebCachePoolUtil;
038 import com.liferay.portal.model.User;
039 import com.liferay.portal.security.auth.FullNameGenerator;
040 import com.liferay.portal.security.auth.FullNameGeneratorFactory;
041 import com.liferay.portal.security.auth.ScreenNameGenerator;
042 import com.liferay.portal.security.auth.ScreenNameGeneratorFactory;
043 import com.liferay.portal.service.QuartzLocalServiceUtil;
044 import com.liferay.portal.service.UserLocalServiceUtil;
045 import com.liferay.portal.theme.ThemeDisplay;
046 import com.liferay.portal.util.PortalInstances;
047 import com.liferay.portal.util.PortalUtil;
048 import com.liferay.portal.util.PropsValues;
049 import com.liferay.portal.util.WebKeys;
050
051 import java.io.IOException;
052
053 import java.sql.Connection;
054
055 import java.util.List;
056 import java.util.Locale;
057 import java.util.Properties;
058
059 import javax.servlet.ServletContext;
060 import javax.servlet.http.HttpServletRequest;
061 import javax.servlet.http.HttpServletResponse;
062 import javax.servlet.http.HttpSession;
063
064 import javax.sql.DataSource;
065
066 import org.apache.struts.Globals;
067
068
073 public class SetupWizardUtil {
074
075 public static final String PROPERTIES_FILE_NAME =
076 "portal-setup-wizard.properties";
077
078 public static boolean isSetupFinished(HttpServletRequest request) {
079 if (!PropsValues.SETUP_WIZARD_ENABLED) {
080 return true;
081 }
082
083 HttpSession session = request.getSession();
084
085 ServletContext servletContext = session.getServletContext();
086
087 Boolean setupWizardFinished = (Boolean)servletContext.getAttribute(
088 WebKeys.SETUP_WIZARD_FINISHED);
089
090 if (setupWizardFinished != null) {
091 return setupWizardFinished;
092 }
093
094 return true;
095 }
096
097 public static void testDatabase(HttpServletRequest request)
098 throws Exception {
099
100 String driverClassName = _getParameter(
101 request, PropsKeys.JDBC_DEFAULT_DRIVER_CLASS_NAME,
102 PropsValues.JDBC_DEFAULT_DRIVER_CLASS_NAME);
103 String url = _getParameter(
104 request, PropsKeys.JDBC_DEFAULT_URL, null);
105 String userName = _getParameter(
106 request, PropsKeys.JDBC_DEFAULT_USERNAME, null);
107 String password = _getParameter(
108 request, PropsKeys.JDBC_DEFAULT_PASSWORD, null);
109
110 _testConnection(driverClassName, url, userName, password);
111 }
112
113 public static void updateLanguage(
114 HttpServletRequest request, HttpServletResponse response) {
115
116 String languageId = _getParameter(
117 request, PropsKeys.COMPANY_DEFAULT_LOCALE,
118 PropsValues.COMPANY_DEFAULT_LOCALE);
119
120 Locale locale = LocaleUtil.fromLanguageId(languageId);
121
122 List<Locale> availableLocales = ListUtil.fromArray(
123 LanguageUtil.getAvailableLocales());
124
125 if (!availableLocales.contains(locale)) {
126 return;
127 }
128
129 PropsValues.COMPANY_DEFAULT_LOCALE = languageId;
130
131 HttpSession session = request.getSession();
132
133 session.setAttribute(Globals.LOCALE_KEY, locale);
134 session.setAttribute(WebKeys.SETUP_WIZARD_DEFAULT_LOCALE, languageId);
135
136 LanguageUtil.updateCookie(request, response, locale);
137
138 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
139 WebKeys.THEME_DISPLAY);
140
141 themeDisplay.setLanguageId(languageId);
142 themeDisplay.setLocale(locale);
143 }
144
145 public static void updateSetup(
146 HttpServletRequest request, HttpServletResponse response)
147 throws Exception {
148
149 UnicodeProperties unicodeProperties =
150 PropertiesParamUtil.getProperties(request, _PROPERTIES_PREFIX);
151
152 boolean databaseConfigured = _isDatabaseConfigured(unicodeProperties);
153
154 _processAdminProperties(request, unicodeProperties);
155 _processDatabaseProperties(request, unicodeProperties);
156
157 updateLanguage(request, response);
158
159 unicodeProperties.put(
160 PropsKeys.SETUP_WIZARD_ENABLED, String.valueOf(false));
161
162 HttpSession session = request.getSession();
163
164 session.setAttribute(
165 WebKeys.SETUP_WIZARD_PROPERTIES, unicodeProperties);
166
167 boolean propertiesFileUpdated = _writePropertiesFile(unicodeProperties);
168
169 session.setAttribute(
170 WebKeys.SETUP_WIZARD_PROPERTIES_UPDATED, propertiesFileUpdated);
171
172 if (!databaseConfigured) {
173 _reloadServletContext(request, unicodeProperties);
174 }
175
176 _resetAdminPassword(request);
177 }
178
179 private static String _getParameter(
180 HttpServletRequest request, String name, String defaultValue) {
181
182 name = _PROPERTIES_PREFIX.concat(name).concat(StringPool.DOUBLE_DASH);
183
184 return ParamUtil.getString(request, name, defaultValue);
185 }
186
187 private static boolean _isDatabaseConfigured(
188 UnicodeProperties unicodeProperties) {
189
190 String defaultDriverClassName = unicodeProperties.get(
191 PropsKeys.JDBC_DEFAULT_DRIVER_CLASS_NAME);
192 String defaultPassword = unicodeProperties.get(
193 PropsKeys.JDBC_DEFAULT_PASSWORD);
194 String defaultURL = unicodeProperties.get(
195 PropsKeys.JDBC_DEFAULT_URL);
196 String defaultUsername = unicodeProperties.get(
197 PropsKeys.JDBC_DEFAULT_USERNAME);
198
199 if (PropsValues.JDBC_DEFAULT_DRIVER_CLASS_NAME.equals(
200 defaultDriverClassName) &&
201 PropsValues.JDBC_DEFAULT_PASSWORD.equals(defaultPassword) &&
202 PropsValues.JDBC_DEFAULT_URL.equals(defaultURL) &&
203 PropsValues.JDBC_DEFAULT_USERNAME.equals(defaultUsername) ) {
204
205 return true;
206 }
207
208 return false;
209 }
210
211 private static void _processAdminProperties(
212 HttpServletRequest request, UnicodeProperties unicodeProperties)
213 throws Exception {
214
215 String webId = _getParameter(
216 request, PropsKeys.COMPANY_DEFAULT_WEB_ID, "liferay.com");
217 PropsValues.COMPANY_DEFAULT_WEB_ID = webId;
218
219 FullNameGenerator fullNameGenerator =
220 FullNameGeneratorFactory.getInstance();
221
222 String firstName = _getParameter(
223 request, PropsKeys.DEFAULT_ADMIN_FIRST_NAME, "Test");
224
225 PropsValues.DEFAULT_ADMIN_FIRST_NAME = firstName;
226
227 String lastName = _getParameter(
228 request, PropsKeys.DEFAULT_ADMIN_LAST_NAME, "Test");
229
230 PropsValues.DEFAULT_ADMIN_LAST_NAME = lastName;
231
232 String adminEmailFromName = fullNameGenerator.getFullName(
233 firstName, null, lastName);
234
235 PropsValues.ADMIN_EMAIL_FROM_NAME = adminEmailFromName;
236
237 unicodeProperties.put(
238 PropsKeys.ADMIN_EMAIL_FROM_NAME, adminEmailFromName);
239
240 String defaultAdminEmailAddress = _getParameter(
241 request, PropsKeys.ADMIN_EMAIL_FROM_ADDRESS, "test@liferay.com");
242
243 unicodeProperties.put(
244 PropsKeys.DEFAULT_ADMIN_EMAIL_ADDRESS, defaultAdminEmailAddress);
245
246 PropsValues.DEFAULT_ADMIN_EMAIL_ADDRESS = defaultAdminEmailAddress;
247
248 ScreenNameGenerator screenNameGenerator =
249 ScreenNameGeneratorFactory.getInstance();
250
251 String defaultAdminScreenName = null;
252
253 try {
254 defaultAdminScreenName = screenNameGenerator.generate(
255 0, 0, defaultAdminEmailAddress);
256 }
257 catch (Exception e) {
258 defaultAdminScreenName = "test";
259 }
260
261 PropsValues.DEFAULT_ADMIN_SCREEN_NAME = defaultAdminScreenName;
262
263 unicodeProperties.put(
264 PropsKeys.DEFAULT_ADMIN_SCREEN_NAME, defaultAdminScreenName);
265 }
266
267 private static void _processDatabaseProperties(
268 HttpServletRequest request, UnicodeProperties unicodeProperties)
269 throws Exception {
270
271 boolean defaultDatabase = ParamUtil.getBoolean(
272 request, "defaultDatabase", true);
273
274 if (defaultDatabase) {
275 unicodeProperties.remove(PropsKeys.JDBC_DEFAULT_URL);
276 unicodeProperties.remove(PropsKeys.JDBC_DEFAULT_DRIVER_CLASS_NAME);
277 unicodeProperties.remove(PropsKeys.JDBC_DEFAULT_USERNAME);
278 unicodeProperties.remove(PropsKeys.JDBC_DEFAULT_PASSWORD);
279 }
280 }
281
282 private static void _reloadServletContext(
283 HttpServletRequest request, UnicodeProperties unicodeProperties)
284 throws Exception {
285
286
287
288 Properties jdbcProperties = new Properties();
289
290 jdbcProperties.putAll(unicodeProperties);
291
292 jdbcProperties = PropertiesUtil.getProperties(
293 jdbcProperties,"jdbc.default.",true);
294
295 DataSourceSwapper.swapCounterDataSource(jdbcProperties);
296 DataSourceSwapper.swapLiferayDataSource(jdbcProperties);
297
298
299
300 CacheRegistryUtil.clear();
301 MultiVMPoolUtil.clear();
302 WebCachePoolUtil.clear();
303 CentralizedThreadLocal.clearShortLivedThreadLocals();
304
305
306
307 QuartzLocalServiceUtil.checkQuartzTables();
308
309 StartupAction startupAction = new StartupAction();
310
311 startupAction.run(null);
312
313 HttpSession session = request.getSession();
314
315 PortalInstances.reload(session.getServletContext());
316 }
317
318 private static void _resetAdminPassword(HttpServletRequest request)
319 throws Exception {
320
321 String defaultAdminEmailAddress = _getParameter(
322 request, PropsKeys.ADMIN_EMAIL_FROM_ADDRESS, "test@liferay.com");
323
324 User user = null;
325
326 try {
327 user = UserLocalServiceUtil.getUserByEmailAddress(
328 PortalUtil.getDefaultCompanyId(), defaultAdminEmailAddress);
329 }
330 catch (NoSuchUserException nsue) {
331 user = UserLocalServiceUtil.getUserByEmailAddress(
332 PortalUtil.getDefaultCompanyId(), "test@liferay.com");
333
334 UserLocalServiceUtil.updateEmailAddress(
335 user.getUserId(), StringPool.BLANK,
336 defaultAdminEmailAddress, defaultAdminEmailAddress);
337 }
338
339 UserLocalServiceUtil.updatePasswordReset(user.getUserId(), true);
340
341 HttpSession session = request.getSession();
342
343 session.setAttribute(WebKeys.SETUP_WIZARD_PASSWORD_UPDATED, true);
344 }
345
346 private static void _testConnection(
347 String driverClassName, String url, String userName,
348 String password)
349 throws Exception {
350
351 Class.forName(driverClassName);
352
353 Connection connection = null;
354
355 try {
356 DataSource dataSource = DataSourceFactoryUtil.initDataSource(
357 driverClassName, url, userName, password);
358
359 connection = dataSource.getConnection();
360 }
361 finally {
362 DataAccess.cleanUp(connection);
363 }
364 }
365
366 private static boolean _writePropertiesFile(
367 UnicodeProperties unicodeProperties) {
368
369 try {
370 FileUtil.write(
371 PropsValues.LIFERAY_HOME, PROPERTIES_FILE_NAME,
372 unicodeProperties.toString());
373
374 return true;
375 }
376 catch (IOException ioe) {
377 _log.error(ioe, ioe);
378
379 return false;
380 }
381 }
382
383 private final static String _PROPERTIES_PREFIX = "properties--";
384
385 private static Log _log = LogFactoryUtil.getLog(SetupWizardUtil.class);
386
387 }