Java tutorial
/* * Copyright (c) 2002-2015, Mairie de Paris * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright notice * and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice * and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * License 1.0 */ package fr.paris.lutece.plugins.workflow.modules.ticketing.service.task; import fr.paris.lutece.plugins.genericattributes.business.Entry; import fr.paris.lutece.plugins.genericattributes.business.EntryHome; import fr.paris.lutece.plugins.genericattributes.business.Response; import fr.paris.lutece.plugins.genericattributes.business.ResponseHome; import fr.paris.lutece.plugins.ticketing.business.Ticket; import fr.paris.lutece.plugins.ticketing.business.TicketHome; import fr.paris.lutece.plugins.ticketing.service.TicketFormService; import fr.paris.lutece.plugins.workflow.modules.ticketing.business.config.MessageDirection; import fr.paris.lutece.plugins.workflow.modules.ticketing.business.config.TaskEditTicketConfig; import fr.paris.lutece.plugins.workflow.modules.ticketing.business.ticket.EditableTicket; import fr.paris.lutece.plugins.workflow.modules.ticketing.business.ticket.EditableTicketField; import fr.paris.lutece.plugins.workflow.modules.ticketing.service.authentication.EditTicketRequestAuthenticationService; import fr.paris.lutece.plugins.workflow.modules.ticketing.service.ticket.IEditableTicketService; import fr.paris.lutece.plugins.workflow.modules.ticketing.utils.TaskEditTicketConstants; import fr.paris.lutece.plugins.workflow.modules.ticketing.web.EditTicketXPage; import fr.paris.lutece.plugins.workflowcore.business.resource.ResourceHistory; import fr.paris.lutece.plugins.workflowcore.service.config.ITaskConfigService; import fr.paris.lutece.portal.service.content.XPageAppService; import fr.paris.lutece.portal.service.i18n.I18nService; import fr.paris.lutece.portal.service.message.AdminMessage; import fr.paris.lutece.portal.service.message.AdminMessageService; import fr.paris.lutece.portal.service.util.AppPathService; import fr.paris.lutece.util.url.UrlItem; import org.apache.commons.lang.StringUtils; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Locale; import javax.inject.Inject; import javax.inject.Named; import javax.servlet.http.HttpServletRequest; /** * This class represents a task to edit a ticket * */ public class TaskEditTicket extends AbstractTicketingTask { // Parameters private static final String PARAMETER_MESSAGE = "message"; private static final String PARAMETER_IDS_ENTRY = "ids_entry"; // Messages private static final String MESSAGE_EDIT_TICKET = "module.workflow.ticketing.task_edit_ticket.labelEditTicket"; private static final String MESSAGE_EDIT_TICKET_INFORMATION_VIEW_AGENT = "module.workflow.ticketing.task_edit_ticket.information.view.agent"; private static final String MESSAGE_EDIT_TICKET_INFORMATION_VIEW_AGENT_NO_FIELD_EDITED = "module.workflow.ticketing.task_edit_ticket.information.view.agent.noFieldEdited"; private static final String MESSAGE_EDIT_TICKET_INFORMATION_VIEW_USER = "module.workflow.ticketing.task_edit_ticket.information.view.user"; private static final String MESSAGE_EDIT_TICKET_INFORMATION_VIEW_USER_NO_FIELD_EDITED = "module.workflow.ticketing.task_edit_ticket.information.view.user.noFieldEdited"; private static final String MESSAGE_EDIT_TICKET_INFORMATION_NO_MESSAGE = "module.workflow.ticketing.task_edit_ticket.information.noMessage"; // Parameters private static final String PARAMETER_USER_MESSAGE = "user_message"; // Beans private static final String BEAN_EDIT_TICKET_CONFIG_SERVICE = "workflow-ticketing.taskEditTicketConfigService"; // Other constants private static final String UNDERSCORE = "_"; private static final String SEPARATOR = "; "; // Services @Inject private IEditableTicketService _editableTicketService; @Inject @Named(BEAN_EDIT_TICKET_CONFIG_SERVICE) private ITaskConfigService _taskEditableTicketConfigService; @Inject private TicketFormService _ticketFormService; @Override public String getTitle(Locale locale) { return I18nService.getLocalizedString(MESSAGE_EDIT_TICKET, locale); } @Override protected String processTicketingTask(int nIdResourceHistory, HttpServletRequest request, Locale locale) { String strTaskInformation = StringUtils.EMPTY; TaskEditTicketConfig config = _taskEditableTicketConfigService.findByPrimaryKey(getId()); if (config == null) { return AdminMessageService.getMessageUrl(request, TaskEditTicketConstants.MESSAGE_NO_CONFIGURATION, AdminMessage.TYPE_STOP); } MessageDirection messageDirection = config.getMessageDirection(); if (messageDirection == MessageDirection.AGENT_TO_USER) { strTaskInformation = processAgentTask(nIdResourceHistory, request, locale, config); } else { strTaskInformation = processUserTask(nIdResourceHistory, request, locale, config); } return strTaskInformation; } /** * Process the task for agent side * @param nIdResourceHistory the ResourceHistory id * @param request the request * @param locale the locale * @param config the task configuration * @return the information message to store */ private String processAgentTask(int nIdResourceHistory, HttpServletRequest request, Locale locale, TaskEditTicketConfig config) { String strTaskInformation = StringUtils.EMPTY; String strAgentMessage = request.getParameter(PARAMETER_MESSAGE + UNDERSCORE + getId()); String[] listIdsEntry = request.getParameterValues(PARAMETER_IDS_ENTRY + UNDERSCORE + getId()); // We get the ticket to modify Ticket ticket = getTicket(nIdResourceHistory); boolean bCreate = false; List<EditableTicketField> listEditableTicketFields = new ArrayList<EditableTicketField>(); EditableTicket editableTicket = _editableTicketService.find(nIdResourceHistory, getId()); if (editableTicket == null) { editableTicket = new EditableTicket(); editableTicket.setIdHistory(nIdResourceHistory); editableTicket.setIdTask(getId()); editableTicket.setIdTicket(ticket.getId()); bCreate = true; } StringBuilder sbEntries = new StringBuilder(); if (listIdsEntry != null) { for (String strIdEntry : listIdsEntry) { if (StringUtils.isNotBlank(strIdEntry) && StringUtils.isNumeric(strIdEntry)) { int nIdEntry = Integer.parseInt(strIdEntry); EditableTicketField editableTicketField = new EditableTicketField(); editableTicketField.setIdEntry(nIdEntry); listEditableTicketFields.add(editableTicketField); Entry entry = EntryHome.findByPrimaryKey(nIdEntry); sbEntries.append(entry.getTitle()).append(SEPARATOR); } } if (sbEntries.length() != 0) { sbEntries.delete(sbEntries.length() - SEPARATOR.length(), sbEntries.length()); } } editableTicket.setMessage(StringUtils.isNotBlank(strAgentMessage) ? strAgentMessage : StringUtils.EMPTY); editableTicket.setListEditableTicketFields(listEditableTicketFields); editableTicket.setIsEdited(false); if (bCreate) { _editableTicketService.create(editableTicket); } else { _editableTicketService.update(editableTicket); } if (ticket != null) { ticket.setUrl(buildEditUrl(request, nIdResourceHistory, getId(), config.getIdUserEditionAction())); TicketHome.update(ticket); } if (sbEntries.length() == 0) { strTaskInformation = MessageFormat.format(I18nService.getLocalizedString( MESSAGE_EDIT_TICKET_INFORMATION_VIEW_AGENT_NO_FIELD_EDITED, Locale.FRENCH), strAgentMessage); } else { strTaskInformation = MessageFormat.format( I18nService.getLocalizedString(MESSAGE_EDIT_TICKET_INFORMATION_VIEW_AGENT, Locale.FRENCH), sbEntries.toString(), strAgentMessage); } return strTaskInformation; } /** * Process the task for user side * @param nIdResourceHistory the ResourceHistory id * @param request the request * @param locale the locale * @param config the task configuration * @return the information message to store */ private String processUserTask(int nIdResourceHistory, HttpServletRequest request, Locale locale, TaskEditTicketConfig config) { String strTaskInformation = StringUtils.EMPTY; StringBuilder sbEntries = new StringBuilder(); String strUserMessage = request.getParameter(PARAMETER_USER_MESSAGE); // We get the ticket to modify Ticket ticket = getTicket(nIdResourceHistory); EditableTicket editableTicket = _editableTicketService.findByIdTicket(ticket.getId()); List<Entry> listEntriesToEdit = _editableTicketService.buildListEntriesToEdit(request, editableTicket.getListEditableTicketFields()); for (Entry entry : listEntriesToEdit) { Iterator<Response> iterator = ticket.getListResponse().iterator(); while (iterator.hasNext()) { Response response = iterator.next(); if (response.getEntry().getIdEntry() == entry.getIdEntry()) { iterator.remove(); } } _ticketFormService.getResponseEntry(request, entry.getIdEntry(), request.getLocale(), ticket); sbEntries.append(entry.getTitle()).append(SEPARATOR); } // remove and add generic attributes responses TicketHome.removeTicketResponse(ticket.getId()); if ((ticket.getListResponse() != null) && !ticket.getListResponse().isEmpty()) { for (Response response : ticket.getListResponse()) { ResponseHome.create(response); TicketHome.insertTicketResponse(ticket.getId(), response.getIdResponse()); } } if (sbEntries.length() != 0) { sbEntries.delete(sbEntries.length() - SEPARATOR.length(), sbEntries.length()); } ticket.setUserMessage(strUserMessage); TicketHome.update(ticket); editableTicket.setIsEdited(true); _editableTicketService.update(editableTicket); if (StringUtils.isEmpty(strUserMessage)) { strUserMessage = I18nService.getLocalizedString(MESSAGE_EDIT_TICKET_INFORMATION_NO_MESSAGE, Locale.FRENCH); } if (sbEntries.length() == 0) { strTaskInformation = MessageFormat.format(I18nService.getLocalizedString( MESSAGE_EDIT_TICKET_INFORMATION_VIEW_USER_NO_FIELD_EDITED, Locale.FRENCH), strUserMessage); } else { strTaskInformation = MessageFormat.format( I18nService.getLocalizedString(MESSAGE_EDIT_TICKET_INFORMATION_VIEW_USER, Locale.FRENCH), sbEntries.toString(), strUserMessage); } return strTaskInformation; } /** * Builds the URL to permit to the user to edit the ticket * @param request the request * @param nIdHistory the history id * @param nIdTask the task id * @param nIdAction the action id * @return the URL */ private String buildEditUrl(HttpServletRequest request, int nIdHistory, int nIdTask, int nIdAction) { String strInfo = StringUtils.EMPTY; ResourceHistory resourceHistory = _resourceHistoryService.findByPrimaryKey(nIdHistory); if (resourceHistory != null) { List<String> listElements = new ArrayList<String>(); listElements.add(Integer.toString(nIdHistory)); listElements.add(Integer.toString(nIdTask)); listElements.add(Integer.toString(nIdAction)); String strTimestamp = Long.toString(new Date().getTime()); String strSignature = EditTicketRequestAuthenticationService.getRequestAuthenticator() .buildSignature(listElements, strTimestamp); StringBuilder sbUrl = new StringBuilder(AppPathService.getBaseUrl(request)); UrlItem url = new UrlItem(sbUrl.toString() + AppPathService.getPortalUrl()); url.addParameter(XPageAppService.PARAM_XPAGE_APP, EditTicketXPage.XPAGE); url.addParameter(TaskEditTicketConstants.PARAMETER_ID_HISTORY, nIdHistory); url.addParameter(TaskEditTicketConstants.PARAMETER_ID_TASK, nIdTask); url.addParameter(TaskEditTicketConstants.PARAMETER_ID_ACTION, nIdAction); url.addParameter(TaskEditTicketConstants.PARAMETER_SIGNATURE, strSignature); url.addParameter(TaskEditTicketConstants.PARAMETER_TIMESTAMP, strTimestamp); strInfo = url.getUrl(); } return strInfo; } /** * {@inheritDoc} */ @Override public void doRemoveTaskInformation(int nIdHistory) { super.doRemoveTaskInformation(nIdHistory); _editableTicketService.removeByIdHistory(nIdHistory, getId()); } /** * {@inheritDoc} */ @Override public void doRemoveConfig() { super.doRemoveConfig(); _editableTicketService.removeByIdTask(getId()); _taskEditableTicketConfigService.remove(getId()); } }