001
014
015 package com.liferay.portlet.usersadmin.action;
016
017 import com.liferay.portal.kernel.bean.BeanPropertiesUtil;
018 import com.liferay.portal.kernel.dao.orm.QueryUtil;
019 import com.liferay.portal.kernel.search.Hits;
020 import com.liferay.portal.kernel.search.Sort;
021 import com.liferay.portal.kernel.servlet.ServletResponseUtil;
022 import com.liferay.portal.kernel.servlet.SessionErrors;
023 import com.liferay.portal.kernel.util.ArrayUtil;
024 import com.liferay.portal.kernel.util.CSVUtil;
025 import com.liferay.portal.kernel.util.ContentTypes;
026 import com.liferay.portal.kernel.util.OrderByComparator;
027 import com.liferay.portal.kernel.util.ParamUtil;
028 import com.liferay.portal.kernel.util.ProgressTracker;
029 import com.liferay.portal.kernel.util.StringBundler;
030 import com.liferay.portal.kernel.util.StringPool;
031 import com.liferay.portal.kernel.util.Tuple;
032 import com.liferay.portal.kernel.workflow.WorkflowConstants;
033 import com.liferay.portal.model.User;
034 import com.liferay.portal.security.permission.ActionKeys;
035 import com.liferay.portal.security.permission.PermissionChecker;
036 import com.liferay.portal.service.UserLocalServiceUtil;
037 import com.liferay.portal.service.permission.PortalPermissionUtil;
038 import com.liferay.portal.service.permission.PortletPermissionUtil;
039 import com.liferay.portal.struts.ActionConstants;
040 import com.liferay.portal.struts.PortletAction;
041 import com.liferay.portal.theme.ThemeDisplay;
042 import com.liferay.portal.util.PortalUtil;
043 import com.liferay.portal.util.PortletKeys;
044 import com.liferay.portal.util.PropsValues;
045 import com.liferay.portal.util.WebKeys;
046 import com.liferay.portlet.ActionResponseImpl;
047 import com.liferay.portlet.expando.model.ExpandoBridge;
048 import com.liferay.portlet.usersadmin.search.UserSearch;
049 import com.liferay.portlet.usersadmin.search.UserSearchTerms;
050 import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
051
052 import java.util.Collections;
053 import java.util.LinkedHashMap;
054 import java.util.List;
055
056 import javax.portlet.ActionRequest;
057 import javax.portlet.ActionResponse;
058 import javax.portlet.PortletConfig;
059 import javax.portlet.PortletURL;
060
061 import javax.servlet.http.HttpServletRequest;
062 import javax.servlet.http.HttpServletResponse;
063
064 import org.apache.struts.action.ActionForm;
065 import org.apache.struts.action.ActionMapping;
066
067
071 public class ExportUsersAction extends PortletAction {
072
073 @Override
074 public void processAction(
075 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
076 ActionRequest actionRequest, ActionResponse actionResponse)
077 throws Exception {
078
079 try {
080 String csv = getUsersCSV(actionRequest, actionResponse);
081
082 String fileName = "users.csv";
083 byte[] bytes = csv.getBytes();
084
085 HttpServletRequest request = PortalUtil.getHttpServletRequest(
086 actionRequest);
087 HttpServletResponse response = PortalUtil.getHttpServletResponse(
088 actionResponse);
089
090 ServletResponseUtil.sendFile(
091 request, response, fileName, bytes, ContentTypes.TEXT_CSV_UTF8);
092
093 setForward(actionRequest, ActionConstants.COMMON_NULL);
094 }
095 catch (Exception e) {
096 SessionErrors.add(actionRequest, e.getClass());
097
098 setForward(actionRequest, "portlet.users_admin.error");
099 }
100 }
101
102 protected String getUserCSV(User user) {
103 StringBundler sb = new StringBundler(
104 PropsValues.USERS_EXPORT_CSV_FIELDS.length * 2);
105
106 for (int i = 0; i < PropsValues.USERS_EXPORT_CSV_FIELDS.length; i++) {
107 String field = PropsValues.USERS_EXPORT_CSV_FIELDS[i];
108
109 if (field.equals("fullName")) {
110 sb.append(CSVUtil.encode(user.getFullName()));
111 }
112 else if (field.startsWith("expando:")) {
113 String attributeName = field.substring(8);
114
115 ExpandoBridge expandoBridge = user.getExpandoBridge();
116
117 sb.append(
118 CSVUtil.encode(expandoBridge.getAttribute(attributeName)));
119 }
120 else {
121 sb.append(
122 CSVUtil.encode(BeanPropertiesUtil.getString(user, field)));
123 }
124
125 if ((i + 1) < PropsValues.USERS_EXPORT_CSV_FIELDS.length) {
126 sb.append(StringPool.COMMA);
127 }
128 }
129
130 sb.append(StringPool.NEW_LINE);
131
132 return sb.toString();
133 }
134
135 protected List<User> getUsers(
136 ActionRequest actionRequest, ActionResponse actionResponse)
137 throws Exception {
138
139 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
140 WebKeys.THEME_DISPLAY);
141
142 PermissionChecker permissionChecker =
143 themeDisplay.getPermissionChecker();
144
145 boolean exportAllUsers = PortalPermissionUtil.contains(
146 permissionChecker, ActionKeys.EXPORT_USER);
147
148 if (!exportAllUsers &&
149 !PortletPermissionUtil.contains(
150 permissionChecker, PortletKeys.USERS_ADMIN,
151 ActionKeys.EXPORT_USER)) {
152
153 return Collections.emptyList();
154 }
155
156 PortletURL portletURL =
157 ((ActionResponseImpl)actionResponse).createRenderURL(
158 PortletKeys.USERS_ADMIN);
159
160 UserSearch userSearch = new UserSearch(actionRequest, portletURL);
161
162 UserSearchTerms searchTerms =
163 (UserSearchTerms)userSearch.getSearchTerms();
164
165 searchTerms.setStatus(WorkflowConstants.STATUS_APPROVED);
166
167 LinkedHashMap<String, Object> params =
168 new LinkedHashMap<String, Object>();
169
170 long organizationId = searchTerms.getOrganizationId();
171
172 if (organizationId > 0) {
173 params.put("usersOrgs", new Long(organizationId));
174 }
175 else if (!exportAllUsers) {
176 User user = themeDisplay.getUser();
177
178 Long[] organizationIds = ArrayUtil.toArray(
179 user.getOrganizationIds(true));
180
181 if (organizationIds.length > 0) {
182 params.put("usersOrgs", organizationIds);
183 }
184 }
185
186 long roleId = searchTerms.getRoleId();
187
188 if (roleId > 0) {
189 params.put("usersRoles", new Long(roleId));
190 }
191
192 long userGroupId = searchTerms.getUserGroupId();
193
194 if (userGroupId > 0) {
195 params.put("usersUserGroups", new Long(userGroupId));
196 }
197
198 if (PropsValues.USERS_INDEXER_ENABLED &&
199 PropsValues.USERS_SEARCH_WITH_INDEX) {
200
201 params.put("expandoAttributes", searchTerms.getKeywords());
202
203 Hits hits = null;
204
205 if (searchTerms.isAdvancedSearch()) {
206 hits = UserLocalServiceUtil.search(
207 themeDisplay.getCompanyId(), searchTerms.getFirstName(),
208 searchTerms.getMiddleName(), searchTerms.getLastName(),
209 searchTerms.getScreenName(), searchTerms.getEmailAddress(),
210 searchTerms.getStatus(), params,
211 searchTerms.isAndOperator(), QueryUtil.ALL_POS,
212 QueryUtil.ALL_POS, (Sort)null);
213 }
214 else {
215 hits = UserLocalServiceUtil.search(
216 themeDisplay.getCompanyId(), searchTerms.getKeywords(),
217 searchTerms.getStatus(), params, QueryUtil.ALL_POS,
218 QueryUtil.ALL_POS, (Sort)null);
219 }
220
221 Tuple tuple = UsersAdminUtil.getUsers(hits);
222
223 return (List<User>)tuple.getObject(0);
224 }
225 else {
226 if (searchTerms.isAdvancedSearch()) {
227 return UserLocalServiceUtil.search(
228 themeDisplay.getCompanyId(), searchTerms.getFirstName(),
229 searchTerms.getMiddleName(), searchTerms.getLastName(),
230 searchTerms.getScreenName(), searchTerms.getEmailAddress(),
231 searchTerms.getStatus(), params,
232 searchTerms.isAndOperator(), QueryUtil.ALL_POS,
233 QueryUtil.ALL_POS, (OrderByComparator)null);
234 }
235 else {
236 return UserLocalServiceUtil.search(
237 themeDisplay.getCompanyId(), searchTerms.getKeywords(),
238 searchTerms.getStatus(), params, QueryUtil.ALL_POS,
239 QueryUtil.ALL_POS, (OrderByComparator)null);
240 }
241 }
242 }
243
244 protected String getUsersCSV(
245 ActionRequest actionRequest, ActionResponse actionResponse)
246 throws Exception {
247
248 List<User> users = getUsers(actionRequest, actionResponse);
249
250 if (users.isEmpty()) {
251 return StringPool.BLANK;
252 }
253
254 String exportProgressId = ParamUtil.getString(
255 actionRequest, "exportProgressId");
256
257 ProgressTracker progressTracker = new ProgressTracker(
258 actionRequest, exportProgressId);
259
260 progressTracker.start();
261
262 int percentage = 10;
263 int total = users.size();
264
265 progressTracker.setPercent(percentage);
266
267 StringBundler sb = new StringBundler(users.size());
268
269 for (int i = 0; i < users.size(); i++ ) {
270 User user = users.get(i);
271
272 sb.append(getUserCSV(user));
273
274 percentage = Math.min(10 + (i * 90) / total, 99);
275
276 progressTracker.setPercent(percentage);
277 }
278
279 progressTracker.finish();
280
281 return sb.toString();
282 }
283
284 }