/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.users.admin.web.portlet.action; import com.liferay.expando.kernel.model.ExpandoBridge; import com.liferay.portal.kernel.bean.BeanPropertiesUtil; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.portlet.DynamicResourceRequest; import com.liferay.portal.kernel.portlet.LiferayPortletResponse; import com.liferay.portal.kernel.portlet.PortletResponseUtil; import com.liferay.portal.kernel.portlet.bridges.mvc.BaseMVCResourceCommand; import com.liferay.portal.kernel.portlet.bridges.mvc.MVCResourceCommand; import com.liferay.portal.kernel.search.Indexer; import com.liferay.portal.kernel.search.IndexerRegistryUtil; import com.liferay.portal.kernel.security.permission.ActionKeys; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.service.UserLocalService; import com.liferay.portal.kernel.service.permission.PortalPermissionUtil; import com.liferay.portal.kernel.service.permission.PortletPermissionUtil; import com.liferay.portal.kernel.servlet.SessionErrors; import com.liferay.portal.kernel.servlet.SessionMessages; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.CSVUtil; import com.liferay.portal.kernel.util.ContentTypes; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.Portal; import com.liferay.portal.kernel.util.ProgressTracker; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.util.PropsValues; import com.liferay.portlet.usersadmin.search.UserSearch; import com.liferay.portlet.usersadmin.search.UserSearchTerms; import com.liferay.users.admin.constants.UsersAdminPortletKeys; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import javax.portlet.PortletURL; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Brian Wing Shun Chan * @author Mika Koivisto */ @Component( immediate = true, property = { "javax.portlet.name=" + UsersAdminPortletKeys.USERS_ADMIN, "mvc.command.name=/users_admin/export_users" }, service = MVCResourceCommand.class ) public class ExportUsersMVCResourceCommand extends BaseMVCResourceCommand { @Override protected void doServeResource( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws Exception { try { SessionMessages.add( resourceRequest, _portal.getPortletId(resourceRequest) + SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE); String keywords = ParamUtil.getString(resourceRequest, "keywords"); if (Validator.isNotNull(keywords)) { DynamicResourceRequest dynamicResourceRequest = new DynamicResourceRequest(resourceRequest); dynamicResourceRequest.setParameter( "keywords", StringPool.BLANK); resourceRequest = dynamicResourceRequest; } String csv = getUsersCSV(resourceRequest, resourceResponse); PortletResponseUtil.sendFile( resourceRequest, resourceResponse, "users.csv", csv.getBytes(), ContentTypes.TEXT_CSV_UTF8); } catch (Exception e) { SessionErrors.add(resourceRequest, e.getClass()); _log.error(e, e); } } protected String getUserCSV(User user) { StringBundler sb = new StringBundler( PropsValues.USERS_EXPORT_CSV_FIELDS.length * 2); for (int i = 0; i < PropsValues.USERS_EXPORT_CSV_FIELDS.length; i++) { String field = PropsValues.USERS_EXPORT_CSV_FIELDS[i]; if (field.equals("fullName")) { sb.append(CSVUtil.encode(user.getFullName())); } else if (field.startsWith("expando:")) { String attributeName = field.substring(8); ExpandoBridge expandoBridge = user.getExpandoBridge(); sb.append( CSVUtil.encode(expandoBridge.getAttribute(attributeName))); } else { sb.append( CSVUtil.encode(BeanPropertiesUtil.getString(user, field))); } if ((i + 1) < PropsValues.USERS_EXPORT_CSV_FIELDS.length) { sb.append(StringPool.COMMA); } } sb.append(StringPool.NEW_LINE); return sb.toString(); } protected List<User> getUsers( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay)resourceRequest.getAttribute( WebKeys.THEME_DISPLAY); PermissionChecker permissionChecker = themeDisplay.getPermissionChecker(); boolean exportAllUsers = PortalPermissionUtil.contains( permissionChecker, ActionKeys.EXPORT_USER); if (!exportAllUsers && !PortletPermissionUtil.contains( permissionChecker, UsersAdminPortletKeys.USERS_ADMIN, ActionKeys.EXPORT_USER)) { return Collections.emptyList(); } LiferayPortletResponse liferayPortletResponse = (LiferayPortletResponse)resourceResponse; PortletURL portletURL = liferayPortletResponse.createRenderURL( UsersAdminPortletKeys.USERS_ADMIN); UserSearch userSearch = new UserSearch(resourceRequest, portletURL); UserSearchTerms searchTerms = (UserSearchTerms)userSearch.getSearchTerms(); LinkedHashMap<String, Object> params = new LinkedHashMap<>(); long organizationId = searchTerms.getOrganizationId(); if (organizationId > 0) { params.put("usersOrgs", Long.valueOf(organizationId)); } else if (!exportAllUsers) { User user = themeDisplay.getUser(); Long[] organizationIds = ArrayUtil.toArray( user.getOrganizationIds(true)); if (organizationIds.length > 0) { params.put("usersOrgs", organizationIds); } } long roleId = searchTerms.getRoleId(); if (roleId > 0) { params.put("usersRoles", Long.valueOf(roleId)); } long userGroupId = searchTerms.getUserGroupId(); if (userGroupId > 0) { params.put("usersUserGroups", Long.valueOf(userGroupId)); } Indexer<?> indexer = IndexerRegistryUtil.nullSafeGetIndexer(User.class); if (indexer.isIndexerEnabled() && PropsValues.USERS_SEARCH_WITH_INDEX) { params.put("expandoAttributes", searchTerms.getKeywords()); } if (searchTerms.isAdvancedSearch()) { return _userLocalService.search( themeDisplay.getCompanyId(), searchTerms.getFirstName(), searchTerms.getMiddleName(), searchTerms.getLastName(), searchTerms.getScreenName(), searchTerms.getEmailAddress(), searchTerms.getStatus(), params, searchTerms.isAndOperator(), QueryUtil.ALL_POS, QueryUtil.ALL_POS, (OrderByComparator<User>)null); } else { return _userLocalService.search( themeDisplay.getCompanyId(), searchTerms.getKeywords(), searchTerms.getStatus(), params, QueryUtil.ALL_POS, QueryUtil.ALL_POS, (OrderByComparator<User>)null); } } protected String getUsersCSV( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws Exception { List<User> users = getUsers(resourceRequest, resourceResponse); if (users.isEmpty()) { return StringPool.BLANK; } String exportProgressId = ParamUtil.getString( resourceRequest, "exportProgressId"); ProgressTracker progressTracker = new ProgressTracker(exportProgressId); progressTracker.start(resourceRequest); int percentage = 10; int total = users.size(); progressTracker.setPercent(percentage); StringBundler sb = new StringBundler(users.size()); for (int i = 0; i < users.size(); i++) { User user = users.get(i); sb.append(getUserCSV(user)); percentage = Math.min(10 + (i * 90) / total, 99); progressTracker.setPercent(percentage); } progressTracker.finish(resourceRequest); return sb.toString(); } @Reference(unbind = "-") protected void setUserLocalService(UserLocalService userLocalService) { _userLocalService = userLocalService; } private static final Log _log = LogFactoryUtil.getLog( ExportUsersMVCResourceCommand.class); @Reference private Portal _portal; private UserLocalService _userLocalService; }