001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
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    /**
069     * @author Manuel de la Peña
070     * @author Julio Camarero
071     * @author Brian Wing Shun Chan
072     */
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                    // Data sources
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                    // Caches
299    
300                    CacheRegistryUtil.clear();
301                    MultiVMPoolUtil.clear();
302                    WebCachePoolUtil.clear();
303                    CentralizedThreadLocal.clearShortLivedThreadLocals();
304    
305                    // Startup
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    }