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.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.language.LanguageUtil;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.model.Account;
022    import com.liferay.portal.kernel.model.Company;
023    import com.liferay.portal.kernel.model.Contact;
024    import com.liferay.portal.kernel.model.Layout;
025    import com.liferay.portal.kernel.model.LayoutConstants;
026    import com.liferay.portal.kernel.model.ListTypeConstants;
027    import com.liferay.portal.kernel.model.Organization;
028    import com.liferay.portal.kernel.model.OrganizationConstants;
029    import com.liferay.portal.kernel.model.User;
030    import com.liferay.portal.kernel.security.auth.FullNameGenerator;
031    import com.liferay.portal.kernel.security.auth.FullNameGeneratorFactory;
032    import com.liferay.portal.kernel.security.auth.ScreenNameGenerator;
033    import com.liferay.portal.kernel.service.AccountLocalServiceUtil;
034    import com.liferay.portal.kernel.service.CompanyLocalServiceUtil;
035    import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
036    import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
037    import com.liferay.portal.kernel.service.OrganizationLocalServiceUtil;
038    import com.liferay.portal.kernel.service.ServiceContext;
039    import com.liferay.portal.kernel.service.UserLocalServiceUtil;
040    import com.liferay.portal.kernel.util.CalendarFactoryUtil;
041    import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil;
042    import com.liferay.portal.kernel.util.GetterUtil;
043    import com.liferay.portal.kernel.util.LocaleUtil;
044    import com.liferay.portal.kernel.util.StringBundler;
045    import com.liferay.portal.kernel.util.StringPool;
046    import com.liferay.portal.kernel.workflow.WorkflowConstants;
047    import com.liferay.portal.security.auth.ScreenNameGeneratorFactory;
048    import com.liferay.portal.util.PropsValues;
049    
050    import java.util.Calendar;
051    import java.util.Locale;
052    
053    import org.apache.commons.lang.time.StopWatch;
054    
055    /**
056     * @author Shinn Lok
057     */
058    public class SetupWizardSampleDataUtil {
059    
060            public static void addSampleData(long companyId) throws Exception {
061                    addSampleData(
062                            companyId, PropsValues.COMPANY_DEFAULT_NAME,
063                            PropsValues.DEFAULT_ADMIN_FIRST_NAME,
064                            PropsValues.DEFAULT_ADMIN_LAST_NAME,
065                            PropsValues.ADMIN_EMAIL_FROM_NAME, false);
066            }
067    
068            public static void addSampleData(
069                            long companyId, String companyName, String adminUserFirstName,
070                            String adminUserLastName, String adminUserEmailAddress,
071                            boolean resetPassword)
072                    throws Exception {
073    
074                    StopWatch stopWatch = new StopWatch();
075    
076                    stopWatch.start();
077    
078                    if (_log.isInfoEnabled()) {
079                            _log.info("Adding sample data");
080                    }
081    
082                    Company company = updateCompany(
083                            CompanyLocalServiceUtil.getCompanyById(companyId), companyName,
084                            LocaleUtil.toLanguageId(LocaleUtil.getDefault()));
085    
086                    User adminUser = updateAdminUser(
087                            company, LocaleUtil.getDefault(),
088                            LocaleUtil.toLanguageId(LocaleUtil.getDefault()),
089                            adminUserEmailAddress, adminUserFirstName, adminUserLastName,
090                            resetPassword);
091    
092                    User defaultUser = company.getDefaultUser();
093    
094                    Account account = company.getAccount();
095    
096                    Organization organization =
097                            OrganizationLocalServiceUtil.addOrganization(
098                                    defaultUser.getUserId(),
099                                    OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID,
100                                    account.getLegalName(), true);
101    
102                    GroupLocalServiceUtil.updateFriendlyURL(
103                            organization.getGroupId(), "/main");
104    
105                    Layout extranetLayout = LayoutLocalServiceUtil.addLayout(
106                            defaultUser.getUserId(), organization.getGroupId(), false,
107                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID,
108                            account.getLegalName() + " Extranet", null, null,
109                            LayoutConstants.TYPE_PORTLET, false, "/extranet",
110                            new ServiceContext());
111    
112                    LayoutLocalServiceUtil.updateLayout(
113                            extranetLayout.getGroupId(), false, extranetLayout.getLayoutId(),
114                            extranetLayout.getTypeSettings());
115    
116                    Layout intranetLayout = LayoutLocalServiceUtil.addLayout(
117                            defaultUser.getUserId(), organization.getGroupId(), true,
118                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID,
119                            account.getLegalName() + " Intranet", null, null,
120                            LayoutConstants.TYPE_PORTLET, false, "/intranet",
121                            new ServiceContext());
122    
123                    LayoutLocalServiceUtil.updateLayout(
124                            intranetLayout.getGroupId(), true, intranetLayout.getLayoutId(),
125                            intranetLayout.getTypeSettings());
126    
127                    OrganizationLocalServiceUtil.addUserOrganization(
128                            adminUser.getUserId(), organization);
129    
130                    addOrganizations(companyName, defaultUser, organization);
131    
132                    if (_log.isInfoEnabled()) {
133                            _log.info("Finished adding data in " + stopWatch.getTime() + " ms");
134                    }
135            }
136    
137            public static User updateAdminUser(
138                            Company company, Locale locale, String languageId,
139                            String emailAddress, String firstName, String lastName,
140                            boolean resetPassword)
141                    throws PortalException {
142    
143                    ScreenNameGenerator screenNameGenerator =
144                            ScreenNameGeneratorFactory.getInstance();
145    
146                    String screenName = GetterUtil.getString(
147                            PropsValues.DEFAULT_ADMIN_EMAIL_ADDRESS_PREFIX, "test");
148    
149                    try {
150                            screenName = screenNameGenerator.generate(0, 0, emailAddress);
151                    }
152                    catch (Exception e) {
153                    }
154    
155                    User adminUser = UserLocalServiceUtil.fetchUserByEmailAddress(
156                            company.getCompanyId(), emailAddress);
157    
158                    if (adminUser != null) {
159                            FullNameGenerator fullNameGenerator =
160                                    FullNameGeneratorFactory.getInstance();
161    
162                            String fullName = fullNameGenerator.getFullName(
163                                    firstName, null, lastName);
164    
165                            String greeting = LanguageUtil.format(
166                                    locale, "welcome-x", fullName, false);
167    
168                            Contact contact = adminUser.getContact();
169    
170                            Calendar birthdayCal = CalendarFactoryUtil.getCalendar();
171    
172                            birthdayCal.setTime(contact.getBirthday());
173    
174                            int birthdayMonth = birthdayCal.get(Calendar.MONTH);
175                            int birthdayDay = birthdayCal.get(Calendar.DAY_OF_MONTH);
176                            int birthdayYear = birthdayCal.get(Calendar.YEAR);
177    
178                            adminUser = UserLocalServiceUtil.updateUser(
179                                    adminUser.getUserId(), StringPool.BLANK, StringPool.BLANK,
180                                    StringPool.BLANK, false, adminUser.getReminderQueryQuestion(),
181                                    adminUser.getReminderQueryAnswer(), screenName, emailAddress,
182                                    adminUser.getFacebookId(), adminUser.getOpenId(), false, null,
183                                    languageId, adminUser.getTimeZoneId(), greeting,
184                                    adminUser.getComments(), firstName, adminUser.getMiddleName(),
185                                    lastName, contact.getPrefixId(), contact.getSuffixId(),
186                                    contact.isMale(), birthdayMonth, birthdayDay, birthdayYear,
187                                    contact.getSmsSn(), contact.getFacebookSn(),
188                                    contact.getJabberSn(), contact.getSkypeSn(),
189                                    contact.getTwitterSn(), contact.getJobTitle(), null, null, null,
190                                    null, null, new ServiceContext());
191                    }
192                    else {
193                            UserLocalServiceUtil.addDefaultAdminUser(
194                                    company.getCompanyId(), screenName, emailAddress, locale,
195                                    firstName, StringPool.BLANK, lastName);
196    
197                            adminUser = UserLocalServiceUtil.getUserByEmailAddress(
198                                    company.getCompanyId(), emailAddress);
199    
200                            String defaultAdminEmailAddress =
201                                    PropsValues.DEFAULT_ADMIN_EMAIL_ADDRESS_PREFIX + "@" +
202                                            PropsValues.COMPANY_DEFAULT_WEB_ID;
203    
204                            if (!emailAddress.equals(defaultAdminEmailAddress)) {
205                                    User user = UserLocalServiceUtil.fetchUserByEmailAddress(
206                                            company.getCompanyId(), defaultAdminEmailAddress);
207    
208                                    if (user != null) {
209                                            UserLocalServiceUtil.updateStatus(
210                                                    user.getUserId(), WorkflowConstants.STATUS_INACTIVE,
211                                                    new ServiceContext());
212                                    }
213                            }
214                    }
215    
216                    return UserLocalServiceUtil.updatePasswordReset(
217                            adminUser.getUserId(), resetPassword);
218            }
219    
220            public static Company updateCompany(
221                            Company company, String companyName, String languageId)
222                    throws Exception {
223    
224                    Account account = company.getAccount();
225    
226                    account.setName(companyName);
227                    account.setLegalName(companyName + ", Inc.");
228    
229                    AccountLocalServiceUtil.updateAccount(account);
230    
231                    User defaultUser = company.getDefaultUser();
232    
233                    defaultUser.setLanguageId(languageId);
234    
235                    UserLocalServiceUtil.updateUser(defaultUser);
236    
237                    return company;
238            }
239    
240            protected static void addOrganizations(
241                            String companyName, User defaultUser,
242                            Organization parentOrganization)
243                    throws Exception {
244    
245                    for (Object[] organizationArray : _ORGANIZATION_ARRAYS) {
246                            String name = companyName + organizationArray[0];
247                            long regionId = (Long)organizationArray[1];
248                            long countryId = (Long)organizationArray[2];
249                            String type = (String)organizationArray[3];
250    
251                            Organization organization =
252                                    OrganizationLocalServiceUtil.addOrganization(
253                                            defaultUser.getUserId(),
254                                            parentOrganization.getOrganizationId(), name, type,
255                                            regionId, countryId,
256                                            ListTypeConstants.ORGANIZATION_STATUS_DEFAULT,
257                                            StringPool.BLANK, true, null);
258    
259                            GroupLocalServiceUtil.updateFriendlyURL(
260                                    organization.getGroupId(),
261                                    FriendlyURLNormalizerUtil.normalize(
262                                            StringPool.SLASH + organizationArray[0]));
263    
264                            if (organizationArray.length <= 4) {
265                                    continue;
266                            }
267    
268                            String organizationPrefix = (String)organizationArray[4];
269    
270                            long[] groupIds = {organization.getGroupId()};
271                            long[] organizationIds = {
272                                    parentOrganization.getOrganizationId(),
273                                    organization.getOrganizationId()
274                            };
275    
276                            for (int i = 1; i <= 10; i++) {
277                                    StringBundler sb = new StringBundler(5);
278    
279                                    String defaultUserEmailAddress = defaultUser.getEmailAddress();
280    
281                                    String[] defaultUserEmailAddressParts =
282                                            defaultUserEmailAddress.split(StringPool.AT);
283    
284                                    sb.append(defaultUserEmailAddressParts[0]);
285    
286                                    sb.append(StringPool.PERIOD);
287                                    sb.append(organizationPrefix);
288                                    sb.append(StringPool.PERIOD);
289                                    sb.append(i);
290    
291                                    String screenName = sb.toString();
292    
293                                    String emailAddress =
294                                            screenName + defaultUserEmailAddressParts[1];
295    
296                                    String lastName = organizationPrefix + StringPool.SPACE + i;
297    
298                                    User user = UserLocalServiceUtil.addUser(
299                                            0, defaultUser.getCompanyId(), false, "test", "test", false,
300                                            screenName, emailAddress, 0, null, LocaleUtil.getDefault(),
301                                            "Test", null, lastName, 0, 0, true, Calendar.JANUARY, 1,
302                                            1970, null, groupIds, organizationIds, null, null, false,
303                                            new ServiceContext());
304    
305                                    user.setPasswordReset(false);
306                                    user.setAgreedToTermsOfUse(true);
307    
308                                    UserLocalServiceUtil.updateUser(user);
309                            }
310                    }
311            }
312    
313            private static final Object[][] _ORGANIZATION_ARRAYS = {
314                    {
315                            "Chicago", 19014L, 19L, OrganizationConstants.TYPE_ORGANIZATION,
316                            "ORD"
317                    },
318                    {"Consulting", 19005L, 19L, OrganizationConstants.TYPE_ORGANIZATION},
319                    {"Dalian", 0L, 2L, OrganizationConstants.TYPE_ORGANIZATION, "DLC"},
320                    {"Engineering", 19005L, 19L, OrganizationConstants.TYPE_ORGANIZATION},
321                    {"Frankfurt", 0L, 4L, OrganizationConstants.TYPE_ORGANIZATION, "FRA"},
322                    {"Hong Kong", 0L, 2L, OrganizationConstants.TYPE_ORGANIZATION, "HKG"},
323                    {
324                            "Kuala Lumpur", 0L, 135L, OrganizationConstants.TYPE_ORGANIZATION,
325                            "KUL"
326                    },
327                    {
328                            "Los Angeles", 19005L, 19L, OrganizationConstants.TYPE_ORGANIZATION,
329                            "LAX"
330                    },
331                    {"Madrid", 0L, 15L, OrganizationConstants.TYPE_ORGANIZATION, "MAD"},
332                    {"Marketing", 19005L, 19L, OrganizationConstants.TYPE_ORGANIZATION},
333                    {
334                            "New York", 19033L, 19L, OrganizationConstants.TYPE_ORGANIZATION,
335                            "NYC"
336                    },
337                    {
338                            "Saint Paulo", 0L, 48L, OrganizationConstants.TYPE_ORGANIZATION,
339                            "GRU"
340                    },
341                    {"Sales", 19005L, 19L, OrganizationConstants.TYPE_ORGANIZATION},
342                    {
343                            "San Francisco", 19005L, 19L,
344                            OrganizationConstants.TYPE_ORGANIZATION, "SFO"
345                    },
346                    {"Support", 19005L, 19L, OrganizationConstants.TYPE_ORGANIZATION}
347            };
348    
349            private static final Log _log = LogFactoryUtil.getLog(
350                    SetupWizardSampleDataUtil.class);
351    
352    }