Java tutorial
/********************************************************************************* * The contents of this file are subject to the Common Public Attribution * License Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.openemm.org/cpal1.html. The License is based on the Mozilla * Public License Version 1.1 but Sections 14 and 15 have been added to cover * use of software over a computer network and provide for limited attribution * for the Original Developer. In addition, Exhibit A has been modified to be * consistent with Exhibit B. * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for * the specific language governing rights and limitations under the License. * * The Original Code is OpenEMM. * The Original Developer is the Initial Developer. * The Initial Developer of the Original Code is AGNITAS AG. All portions of * the code written by AGNITAS AG are Copyright (c) 2007 AGNITAS AG. All Rights * Reserved. * * Contributor(s): AGNITAS AG. ********************************************************************************/ package org.agnitas.web; import java.beans.IntrospectionException; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.AbstractMap; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.agnitas.beans.Admin; import org.agnitas.beans.AdminEntry; import org.agnitas.dao.AdminDao; import org.agnitas.service.UserActivityLogQueryWorker; import org.agnitas.service.UserActivityLogService; import org.agnitas.util.AgnUtils; import org.agnitas.web.forms.UserActivityLogForm; import org.apache.commons.lang.StringUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.displaytag.pagination.PaginatedList; import org.springframework.context.ApplicationContext; /** * @author Viktor Gema */ public class UserActivityLogAction extends StrutsActionBase { public static final String FUTURE_TASK = "USER_ACTIVITY_LOG_LIST"; private AdminDao adminDao; private ExecutorService workerExecutorService; private UserActivityLogService userActivityLogService; private AbstractMap<String, Future> futureHolder; /** * Process the specified HTTP request, and create the corresponding HTTP * response (or forward to another web component that will create it). * Return an <code>ActionForward</code> instance describing where and how * control should be forwarded, or <code>null</code> if the response has * already been completed. * <br> * calls a FutureHolder to get the list of entries.<br> * While FutureHolder is running, destination is "loading". <br> * After FutureHolder is finished destination is "list".<br> * Also loads lists of all users and users by company into form. * <br><br> * @param mapping The ActionMapping used to select this instance * @param form ActionForm object contains data for the action filled by the jsp * @param req HTTP request * @param res HTTP response * @return destination specified in struts-config.xml to forward to next jsp * @throws java.io.IOException if an input/output error occurs * @throws javax.servlet.ServletException if a servlet exception occurs */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { String futureKey = FUTURE_TASK + "@" + req.getSession(false).getId(); ApplicationContext aContext = this.getWebApplicationContext(); UserActivityLogForm aForm = null; ActionMessages errors = new ActionMessages(); ActionMessages messages = new ActionMessages(); ActionForward destination = null; DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Admin admin = AgnUtils.getAdmin(req); if (!AgnUtils.isUserLoggedIn(req)) { return mapping.findForward("logon"); } SimpleDateFormat localeFormat = getLocaleFormat(admin); if (form != null) { aForm = (UserActivityLogForm) form; if (StringUtils.isEmpty(aForm.getFromDate())) { aForm.setFromDate(localeFormat.format(new Date())); } if (StringUtils.isEmpty(aForm.getToDate())) { aForm.setToDate(localeFormat.format(new Date())); } if (StringUtils.isEmpty(aForm.getUsername())) { if (!allowed("adminlog.show", req) && !allowed("masterlog.show", req)) { aForm.setUsername(AgnUtils.getAdmin(req).getUsername()); } } } else { aForm = new UserActivityLogForm(); aForm.setFromDate(localeFormat.format(new Date())); aForm.setToDate(localeFormat.format(new Date())); if (!allowed("adminlog.show", req) && !allowed("masterlog.show", req)) { aForm.setUsername(AgnUtils.getAdmin(req).getUsername()); } } AgnUtils.logger().info("Action: " + aForm.getAction()); // switch (aForm.getAction()) { // case UserActivityLogAction.ACTION_LIST: // if ( aForm.getColumnwidthsList() == null) { // aForm.setColumnwidthsList(getInitializedColumnWidthList(5)); // } // if (allowed("userlog.show", req) || allowed("adminlog.show", req) || allowed("masterlog.show", req)) { // destination = mapping.findForward("list"); // } else { // errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.permissionDenied")); // } // break; // default: // aForm.setAction(UserActivityLogAction.ACTION_LIST); // } aForm.setAction(UserActivityLogAction.ACTION_LIST); if (aForm.getColumnwidthsList() == null) { aForm.setColumnwidthsList(getInitializedColumnWidthList(5)); } if (allowed("userlog.show", req) || allowed("adminlog.show", req) || allowed("masterlog.show", req)) { destination = mapping.findForward("list"); } else { errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.permissionDenied")); } if (destination != null && "list".equals(destination.getName())) { try { setNumberOfRows(req, aForm); destination = mapping.findForward("loading"); if (!futureHolder.containsKey(futureKey)) { // normalize dates by pattern "yyyy-MM-dd" try { Date fromDate = localeFormat.parse(aForm.getFromDate()); aForm.setFromDate(dateFormat.format(fromDate)); } catch (java.text.ParseException e) { } try { Date toDate = localeFormat.parse(aForm.getToDate()); aForm.setToDate(dateFormat.format(toDate)); } catch (java.text.ParseException e) { } futureHolder.put(futureKey, getRecipientListFuture(req, aContext, aForm)); } if (futureHolder.containsKey(futureKey) && futureHolder.get(futureKey).isDone()) { req.setAttribute("userActivitylogList", futureHolder.get(futureKey).get()); //req.getSession().setAttribute("recipientsInCurrentTable", futureHolder.get(futureKeyList).get()); destination = mapping.findForward("list"); aForm.setAll(((PaginatedList) futureHolder.get(futureKey).get()).getFullListSize()); futureHolder.remove(futureKey); aForm.setRefreshMillis(RecipientForm.DEFAULT_REFRESH_MILLIS); Date fromDate = dateFormat.parse(aForm.getFromDate()); aForm.setFromDate(localeFormat.format(fromDate)); Date toDate = dateFormat.parse(aForm.getToDate()); aForm.setToDate(localeFormat.format(toDate)); SimpleDateFormat localeTableFormat = getLocaleTableFormat(admin); req.setAttribute("localDatePattern", localeFormat.toPattern()); req.setAttribute("localeTablePattern", localeTableFormat.toPattern()); } else { if (aForm.getRefreshMillis() < 1000) { // raise the refresh time aForm.setRefreshMillis(aForm.getRefreshMillis() + 50); } aForm.setError(false); } //retrieve list of users aForm.setAdminList(adminDao.getAllAdmins()); aForm.setAdminByCompanyList(adminDao.getAllAdminsByCompanyId(aForm.getCompanyID(req))); } catch (Exception e) { AgnUtils.logger().error("useractivitylogList: " + e + "\n" + AgnUtils.getStackTrace(e)); errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.exception")); aForm.setError(true); // do not refresh when an error has been occurred } } // Report any errors we have discovered back to the original form if (!errors.isEmpty()) { saveErrors(req, errors); } // Report any message (non-errors) we have discovered if (!messages.isEmpty()) { saveMessages(req, messages); } return destination; } /** * Gets the list of user activity log entries according to given sorting parameters and filter conditions * (activity action of certain type, date/time logging period, activity of certain admin). * * @param request HTTP request * @param aContext application context * @param aForm UserActivityLogForm object * @return Future object contains the paginated list of user activity log entries * @throws NumberFormatException * @throws IllegalAccessException * @throws InstantiationException * @throws InterruptedException * @throws ExecutionException * @throws IntrospectionException * @throws InvocationTargetException */ public Future getRecipientListFuture(HttpServletRequest request, ApplicationContext aContext, UserActivityLogForm aForm) throws NumberFormatException, IllegalAccessException, InstantiationException, InterruptedException, ExecutionException, IntrospectionException, InvocationTargetException { String sort = getSort(request, aForm); String direction = request.getParameter("dir"); int rownums = aForm.getNumberofRows(); List<AdminEntry> admins = null; if (AgnUtils.allowed("masterlog.show", request)) { admins = adminDao.getAllAdmins(); } else { admins = adminDao.getAllAdminsByCompanyId(AgnUtils.getCompanyID(request)); } String pageStr = request.getParameter("page"); if (pageStr == null || "".equals(pageStr.trim())) { if (aForm.getPage() == null || "".equals(aForm.getPage().trim())) { aForm.setPage("1"); } pageStr = aForm.getPage(); } else { aForm.setPage(pageStr); } if (aForm.isNumberOfRowsChanged()) { aForm.setPage("1"); aForm.setNumberOfRowsChanged(false); pageStr = "1"; } Future future = workerExecutorService.submit( new UserActivityLogQueryWorker(userActivityLogService, AgnUtils.getAdmin(request).getAdminID(), Integer.parseInt(pageStr), rownums, aForm, sort, direction, admins)); return future; } /** * Gets date format according to current admin locale * @param admin current admin in session * @return SimpleDateFormat object */ protected SimpleDateFormat getLocaleFormat(Admin admin) { Locale locale = admin.getLocale(); return (SimpleDateFormat) SimpleDateFormat.getDateInstance(DateFormat.SHORT, locale); } /** * Gets format for date and time according to current admin locale * @param admin current admin in session * @return SimpleDateFormat object */ protected SimpleDateFormat getLocaleTableFormat(Admin admin) { Locale locale = admin.getLocale(); return (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale); } public AdminDao getAdminDao() { return adminDao; } public void setAdminDao(AdminDao adminDao) { this.adminDao = adminDao; } public ExecutorService getWorkerExecutorService() { return workerExecutorService; } public void setWorkerExecutorService(ExecutorService workerExecutorService) { this.workerExecutorService = workerExecutorService; } public UserActivityLogService getUserActivityLogService() { return userActivityLogService; } public void setUserActivityLogService(UserActivityLogService userActivityLogService) { this.userActivityLogService = userActivityLogService; } public AbstractMap<String, Future> getFutureHolder() { return futureHolder; } public void setFutureHolder(AbstractMap<String, Future> futureHolder) { this.futureHolder = futureHolder; } }