001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.setup;
016    
017    import com.liferay.portal.events.EventsProcessorUtil;
018    import com.liferay.portal.kernel.dao.jdbc.DataAccess;
019    import com.liferay.portal.kernel.dao.jdbc.DataSourceFactoryUtil;
020    import com.liferay.portal.kernel.language.LanguageUtil;
021    import com.liferay.portal.kernel.log.Log;
022    import com.liferay.portal.kernel.log.LogFactoryUtil;
023    import com.liferay.portal.kernel.model.Company;
024    import com.liferay.portal.kernel.model.User;
025    import com.liferay.portal.kernel.service.CompanyLocalServiceUtil;
026    import com.liferay.portal.kernel.theme.ThemeDisplay;
027    import com.liferay.portal.kernel.util.FileUtil;
028    import com.liferay.portal.kernel.util.LocaleUtil;
029    import com.liferay.portal.kernel.util.ParamUtil;
030    import com.liferay.portal.kernel.util.PropertiesParamUtil;
031    import com.liferay.portal.kernel.util.PropsKeys;
032    import com.liferay.portal.kernel.util.StringPool;
033    import com.liferay.portal.kernel.util.SystemProperties;
034    import com.liferay.portal.kernel.util.UnicodeProperties;
035    import com.liferay.portal.kernel.util.Validator;
036    import com.liferay.portal.kernel.util.WebKeys;
037    import com.liferay.portal.util.PortalInstances;
038    import com.liferay.portal.util.PropsValues;
039    
040    import java.io.IOException;
041    
042    import java.sql.Connection;
043    
044    import java.util.Locale;
045    
046    import javax.servlet.http.HttpServletRequest;
047    import javax.servlet.http.HttpServletResponse;
048    import javax.servlet.http.HttpSession;
049    
050    import javax.sql.DataSource;
051    
052    import org.apache.struts.Globals;
053    
054    /**
055     * @author Manuel de la Pe??a
056     * @author Julio Camarero
057     * @author Brian Wing Shun Chan
058     * @author Miguel Pastor
059     */
060    public class SetupWizardUtil {
061    
062            public static final String PROPERTIES_FILE_NAME =
063                    "portal-setup-wizard.properties";
064    
065            public static String getDefaultLanguageId() {
066                    Locale defaultLocale = LocaleUtil.getDefault();
067    
068                    return LocaleUtil.toLanguageId(defaultLocale);
069            }
070    
071            public static boolean isDefaultDatabase(HttpServletRequest request) {
072                    boolean hsqldb = ParamUtil.getBoolean(
073                            request, "defaultDatabase",
074                            PropsValues.JDBC_DEFAULT_URL.contains("hsqldb"));
075    
076                    boolean jndi = Validator.isNotNull(PropsValues.JDBC_DEFAULT_JNDI_NAME);
077    
078                    return hsqldb && !jndi;
079            }
080    
081            public static void testDatabase(HttpServletRequest request)
082                    throws Exception {
083    
084                    String driverClassName = _getParameter(
085                            request, PropsKeys.JDBC_DEFAULT_DRIVER_CLASS_NAME,
086                            PropsValues.JDBC_DEFAULT_DRIVER_CLASS_NAME);
087                    String url = _getParameter(request, PropsKeys.JDBC_DEFAULT_URL, null);
088                    String userName = _getParameter(
089                            request, PropsKeys.JDBC_DEFAULT_USERNAME, null);
090                    String password = _getParameter(
091                            request, PropsKeys.JDBC_DEFAULT_PASSWORD, null);
092    
093                    String jndiName = StringPool.BLANK;
094    
095                    if (Validator.isNotNull(PropsValues.JDBC_DEFAULT_JNDI_NAME)) {
096                            jndiName = PropsValues.JDBC_DEFAULT_JNDI_NAME;
097                    }
098    
099                    _testConnection(driverClassName, url, userName, password, jndiName);
100            }
101    
102            public static void updateLanguage(
103                    HttpServletRequest request, HttpServletResponse response) {
104    
105                    String languageId = ParamUtil.getString(
106                            request, "companyLocale", getDefaultLanguageId());
107    
108                    Locale locale = LocaleUtil.fromLanguageId(languageId);
109    
110                    if (!LanguageUtil.isAvailableLocale(locale)) {
111                            return;
112                    }
113    
114                    HttpSession session = request.getSession();
115    
116                    session.setAttribute(Globals.LOCALE_KEY, locale);
117                    session.setAttribute(WebKeys.SETUP_WIZARD_DEFAULT_LOCALE, languageId);
118    
119                    LanguageUtil.updateCookie(request, response, locale);
120    
121                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
122                            WebKeys.THEME_DISPLAY);
123    
124                    themeDisplay.setLanguageId(languageId);
125                    themeDisplay.setLocale(locale);
126            }
127    
128            public static void updateSetup(
129                            HttpServletRequest request, HttpServletResponse response)
130                    throws Exception {
131    
132                    UnicodeProperties unicodeProperties = PropertiesParamUtil.getProperties(
133                            request, _PROPERTIES_PREFIX);
134    
135                    unicodeProperties.setProperty(
136                            PropsKeys.LIFERAY_HOME,
137                            SystemProperties.get(PropsKeys.LIFERAY_HOME));
138    
139                    boolean databaseConfigured = _isDatabaseConfigured(unicodeProperties);
140    
141                    _processDatabaseProperties(
142                            request, unicodeProperties, databaseConfigured);
143    
144                    _processOtherProperties(request, unicodeProperties);
145    
146                    updateLanguage(request, response);
147    
148                    unicodeProperties.put(
149                            PropsKeys.SETUP_WIZARD_ENABLED, String.valueOf(false));
150    
151                    _updateCompany(request);
152    
153                    _updateAdminUser(request, response, unicodeProperties);
154    
155                    HttpSession session = request.getSession();
156    
157                    session.setAttribute(
158                            WebKeys.SETUP_WIZARD_PROPERTIES, unicodeProperties);
159                    session.setAttribute(
160                            WebKeys.SETUP_WIZARD_PROPERTIES_FILE_CREATED,
161                            _writePropertiesFile(unicodeProperties));
162            }
163    
164            private static String _getParameter(
165                    HttpServletRequest request, String name, String defaultValue) {
166    
167                    name = _PROPERTIES_PREFIX.concat(name).concat(StringPool.DOUBLE_DASH);
168    
169                    return ParamUtil.getString(request, name, defaultValue);
170            }
171    
172            private static boolean _isDatabaseConfigured(
173                    UnicodeProperties unicodeProperties) {
174    
175                    String defaultDriverClassName = unicodeProperties.get(
176                            PropsKeys.JDBC_DEFAULT_DRIVER_CLASS_NAME);
177                    String defaultPassword = unicodeProperties.get(
178                            PropsKeys.JDBC_DEFAULT_PASSWORD);
179                    String defaultURL = unicodeProperties.get(PropsKeys.JDBC_DEFAULT_URL);
180                    String defaultUsername = unicodeProperties.get(
181                            PropsKeys.JDBC_DEFAULT_USERNAME);
182    
183                    if (PropsValues.JDBC_DEFAULT_DRIVER_CLASS_NAME.equals(
184                                    defaultDriverClassName) &&
185                            PropsValues.JDBC_DEFAULT_PASSWORD.equals(defaultPassword) &&
186                            PropsValues.JDBC_DEFAULT_URL.equals(defaultURL) &&
187                            PropsValues.JDBC_DEFAULT_USERNAME.equals(defaultUsername)) {
188    
189                            return true;
190                    }
191    
192                    return false;
193            }
194    
195            private static void _processDatabaseProperties(
196                            HttpServletRequest request, UnicodeProperties unicodeProperties,
197                            boolean databaseConfigured)
198                    throws Exception {
199    
200                    boolean defaultDatabase = ParamUtil.getBoolean(
201                            request, "defaultDatabase", true);
202    
203                    if (defaultDatabase || databaseConfigured) {
204                            unicodeProperties.remove(PropsKeys.JDBC_DEFAULT_URL);
205                            unicodeProperties.remove(PropsKeys.JDBC_DEFAULT_DRIVER_CLASS_NAME);
206                            unicodeProperties.remove(PropsKeys.JDBC_DEFAULT_USERNAME);
207                            unicodeProperties.remove(PropsKeys.JDBC_DEFAULT_PASSWORD);
208                    }
209            }
210    
211            private static void _processOtherProperties(
212                            HttpServletRequest request, UnicodeProperties unicodeProperties)
213                    throws Exception {
214    
215                    _processProperty(
216                            request, unicodeProperties, "adminFirstName",
217                            PropsKeys.DEFAULT_ADMIN_FIRST_NAME,
218                            PropsValues.DEFAULT_ADMIN_FIRST_NAME);
219                    _processProperty(
220                            request, unicodeProperties, "adminLastName",
221                            PropsKeys.DEFAULT_ADMIN_LAST_NAME,
222                            PropsValues.DEFAULT_ADMIN_LAST_NAME);
223                    _processProperty(
224                            request, unicodeProperties, "companyName",
225                            PropsKeys.COMPANY_DEFAULT_NAME, PropsValues.COMPANY_DEFAULT_NAME);
226            }
227    
228            private static void _processProperty(
229                            HttpServletRequest request, UnicodeProperties unicodeProperties,
230                            String parameterName, String propertyKey, String defaultValue)
231                    throws Exception {
232    
233                    String value = ParamUtil.getString(
234                            request, parameterName, defaultValue);
235    
236                    if (!value.equals(defaultValue)) {
237                            unicodeProperties.put(propertyKey, value);
238                    }
239            }
240    
241            private static void _testConnection(
242                            String driverClassName, String url, String userName,
243                            String password, String jndiName)
244                    throws Exception {
245    
246                    if (Validator.isNull(jndiName)) {
247                            Class.forName(driverClassName);
248                    }
249    
250                    DataSource dataSource = null;
251                    Connection connection = null;
252    
253                    try {
254                            dataSource = DataSourceFactoryUtil.initDataSource(
255                                    driverClassName, url, userName, password, jndiName);
256    
257                            connection = dataSource.getConnection();
258                    }
259                    finally {
260                            DataAccess.cleanUp(connection);
261                            DataSourceFactoryUtil.destroyDataSource(dataSource);
262                    }
263            }
264    
265            private static void _updateAdminUser(
266                            HttpServletRequest request, HttpServletResponse response,
267                            UnicodeProperties unicodeProperties)
268                    throws Exception {
269    
270                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
271                            WebKeys.THEME_DISPLAY);
272    
273                    Company company = CompanyLocalServiceUtil.getCompanyById(
274                            themeDisplay.getCompanyId());
275    
276                    String emailAddress = ParamUtil.getString(
277                            request, "adminEmailAddress",
278                            PropsValues.DEFAULT_ADMIN_EMAIL_ADDRESS_PREFIX + StringPool.AT +
279                                    company.getMx());
280    
281                    PropsValues.ADMIN_EMAIL_FROM_ADDRESS = emailAddress;
282    
283                    unicodeProperties.put(PropsKeys.ADMIN_EMAIL_FROM_ADDRESS, emailAddress);
284    
285                    String firstName = ParamUtil.getString(
286                            request, "adminFirstName", PropsValues.DEFAULT_ADMIN_FIRST_NAME);
287                    String lastName = ParamUtil.getString(
288                            request, "adminLastName", PropsValues.DEFAULT_ADMIN_LAST_NAME);
289    
290                    User user = SetupWizardSampleDataUtil.updateAdminUser(
291                            company, themeDisplay.getLocale(), themeDisplay.getLanguageId(),
292                            emailAddress, firstName, lastName, true);
293    
294                    PropsValues.ADMIN_EMAIL_FROM_NAME = user.getFullName();
295    
296                    unicodeProperties.put(
297                            PropsKeys.ADMIN_EMAIL_FROM_NAME, user.getFullName());
298    
299                    HttpSession session = request.getSession();
300    
301                    session.setAttribute(WebKeys.EMAIL_ADDRESS, emailAddress);
302                    session.setAttribute(WebKeys.SETUP_WIZARD_PASSWORD_UPDATED, true);
303                    session.setAttribute(WebKeys.USER, user);
304                    session.setAttribute(WebKeys.USER_ID, user.getUserId());
305    
306                    EventsProcessorUtil.process(
307                            PropsKeys.LOGIN_EVENTS_POST, PropsValues.LOGIN_EVENTS_POST, request,
308                            response);
309            }
310    
311            private static void _updateCompany(HttpServletRequest request)
312                    throws Exception {
313    
314                    Company company = CompanyLocalServiceUtil.getCompanyById(
315                            PortalInstances.getDefaultCompanyId());
316    
317                    String languageId = ParamUtil.getString(
318                            request, "companyLocale", getDefaultLanguageId());
319    
320                    String companyName = ParamUtil.getString(
321                            request, "companyName", PropsValues.COMPANY_DEFAULT_NAME);
322    
323                    SetupWizardSampleDataUtil.updateCompany(
324                            company, companyName, languageId);
325    
326                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
327                            WebKeys.THEME_DISPLAY);
328    
329                    themeDisplay.setCompany(company);
330            }
331    
332            private static boolean _writePropertiesFile(
333                    UnicodeProperties unicodeProperties) {
334    
335                    try {
336                            FileUtil.write(
337                                    PropsValues.LIFERAY_HOME, PROPERTIES_FILE_NAME,
338                                    unicodeProperties.toString());
339    
340                            if (FileUtil.exists(
341                                            PropsValues.LIFERAY_HOME + StringPool.SLASH +
342                                                    PROPERTIES_FILE_NAME)) {
343    
344                                    return true;
345                            }
346                    }
347                    catch (IOException ioe) {
348                            _log.error(ioe, ioe);
349                    }
350    
351                    return false;
352            }
353    
354            private static final String _PROPERTIES_PREFIX = "properties--";
355    
356            private static final Log _log = LogFactoryUtil.getLog(
357                    SetupWizardUtil.class);
358    
359    }