All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ikasan.console.web.controller.WiretapEventsSearchFormController Maven / Gradle / Ivy

Go to download

The core functionality for the end user console of the Ikasan Enterprise Integration Platform

The newest version!
/*
 * $Id$
 * $URL$
 * 
 * ====================================================================
 * Ikasan Enterprise Integration Platform
 * 
 * Distributed under the Modified BSD License.
 * Copyright notice: The copyright for this software and a full listing 
 * of individual contributors are as shown in the packaged copyright.txt 
 * file. 
 * 
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer.
 *
 *  - Redistributions in binary form must reproduce the above copyright notice, 
 *    this list of conditions and the following disclaimer in the documentation 
 *    and/or other materials provided with the distribution.
 *
 *  - Neither the name of the ORGANIZATION 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 HOLDER 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.
 * ====================================================================
 */
package org.ikasan.console.web.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.ikasan.spec.flow.FlowEvent;
import org.ikasan.spec.management.PointToPointFlowProfile;
import org.ikasan.spec.search.PagedSearchResult;
import org.ikasan.spec.wiretap.WiretapEvent;
import org.ikasan.spec.wiretap.WiretapService;
import org.ikasan.console.module.Module;
import org.ikasan.console.module.service.ModuleService;
import org.ikasan.console.pointtopointflow.service.PointToPointFlowProfileService;
import org.ikasan.console.web.command.WiretapSearchCriteria;
import org.ikasan.console.web.command.WiretapSearchCriteriaValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Logger;

/**
 * This class is the Controller for the WiretapEvent Search Form
 * 
 * @author Ikasan Development Team
 */
@Controller
@RequestMapping("/events")
public class WiretapEventsSearchFormController
{
    /** The logger */
    private Logger logger = Logger.getLogger(WiretapEventsSearchFormController.class);

    /** The wiretap service */
    private WiretapService> wiretapService;

    /** The module service */
    private ModuleService moduleService;

    /** The point to point flow profile service */
    private PointToPointFlowProfileService pointToPointFlowProfileService;

    /** The search criteria validator to use */
    private WiretapSearchCriteriaValidator validator = new WiretapSearchCriteriaValidator();

    /**
     * Constructor
     * 
     * @param wiretapService - The wiretap service to use
     * @param moduleService - The module service to use
     * @param pointToPointFlowProfileService - The point to point flow profile
     *            container to use
     */
    @Autowired
    public WiretapEventsSearchFormController(WiretapService wiretapService, ModuleService moduleService,
            PointToPointFlowProfileService pointToPointFlowProfileService)
    {
        super();
        this.wiretapService = wiretapService;
        this.moduleService = moduleService;
        this.pointToPointFlowProfileService = pointToPointFlowProfileService;
    }

    /**
     * Get the modules
     * 
     * @return Set of modules
     */
    @ModelAttribute("modules")
    public Set getModules()
    {
        Set modules = this.moduleService.getAllModules();
        return modules;
    }

    /**
     * Get the point to point flow profiles
     * 
     * @return List of point to point flow profiles
     */
    @ModelAttribute("pointToPointFlowProfiles")
    public Set getPointToPointFlowProfiles()
    {
        Set pointToPointFlowProfiles = this.pointToPointFlowProfileService.getAllPointToPointFlowProfiles();
        return pointToPointFlowProfiles;
    }

    /**
     * Show the combined wiretap event search and search results view
     * 
     * @return wiretap events view
     */
    @RequestMapping("newSearch.htm")
    public String initialiseWiretapEventSearch()
    {
        return "redirect:list.htm?pointToPointFlowProfileSearch=true";
    }

    /**
     * Show the combined wiretap event search and search results view
     * 
     * @param request - Standard HttpRequest
     * @param page - page index into the greater result set
     * @param orderBy - The field to order by
     * @param orderAsc - Ascending flag
     * @param pointToPointFlowProfileSearch - Flag to indicate what type of
     *            search
     * @param pointToPointFlowProfileSelectAll - Select all boolean for
     *            pointToPointFlowProfile based search
     * @param moduleSelectAll - Select all boolean for module based search
     * @param pageSize - Number of search results to display per page
     * @param moduleIds - Set of ids of modules to include in search - must
     *            contain at least one id
     * @param pointToPointFlowProfileIds - Set of ids of point to point flow
     *            profiles to include in search - must contain at least one
     *            pointToPointFlowProfileId
     * @param moduleFlow - The internal Flow of the Module to search on
     * @param componentName - The name of the component
     * @param eventId - The Event Id
     * @param payloadId - The Payload Id
     * @param fromDateString - Include only events after fromDate
     * @param fromTimeString - Include only events after fromDate
     * @param untilDateString - Include only events before untilDate
     * @param untilTimeString - Include only events before untilDate
     * @param payloadContent - The Payload content
     * @param model - The model (map)
     * 
     * @return wiretap events view
     */
    @RequestMapping("list.htm")
    public String listWiretapEvents(HttpServletRequest request, @RequestParam(required = false) Integer page, @RequestParam(required = false) String orderBy,
            @RequestParam(required = false) Boolean orderAsc, @RequestParam(required = false) String pointToPointFlowProfileSearch,
            @RequestParam(required = false) Boolean pointToPointFlowProfileSelectAll, @RequestParam(required = false) Boolean moduleSelectAll,
            @RequestParam(required = false) Integer pageSize, @RequestParam(required = false) Set moduleIds,
            @RequestParam(required = false) Set pointToPointFlowProfileIds, @RequestParam(required = false) String moduleFlow, 
            @RequestParam(required = false) String componentName, @RequestParam(required = false) String eventId, 
            @RequestParam(required = false) String payloadId, @RequestParam(required = false) String fromDateString, 
            @RequestParam(required = false) String fromTimeString, @RequestParam(required = false) String untilDateString, 
            @RequestParam(required = false) String untilTimeString, @RequestParam(required = false) String payloadContent, 
            ModelMap model)
    {
        Integer pageSizeToReturn = pageSize;
        Set moduleIdsToSearchOn = moduleIds;
        List errors = new ArrayList();
        boolean noErrors = true;
        // Execute a pointToPointFlowProfile based search, so get the module ids
        // from those.
        if (pointToPointFlowProfileSearch.equals("true"))
        {
            logger.debug("This is a PointToPointFlowProfile Based Search.");
            moduleIdsToSearchOn = getModuleIdsFromPointToPointFlowProfiles(pointToPointFlowProfileIds);
        }
        // If a search is executed from a page that has no search results
        // defined then the pageSize is null, we therefore default it to 10
        if (pageSize == null)
        {
            pageSizeToReturn = 10;
        }
        // Log the search criteria coming in
        // TODO Fix log4j config with Jboss in order to be able to log.debug
        if (logger.isDebugEnabled())
        {
            logger.debug("Form values that came in:");
            logSearch(page, orderBy, orderAsc, pointToPointFlowProfileSearch, pointToPointFlowProfileSelectAll, moduleSelectAll, pageSizeToReturn,
                moduleIdsToSearchOn, pointToPointFlowProfileIds, moduleFlow, componentName, eventId, payloadId, fromDateString, fromTimeString, untilDateString,
                untilTimeString, payloadContent);
        }
        // Set the search criteria from the values that came in and then
        // validate them
        WiretapSearchCriteria wiretapSearchCriteria = new WiretapSearchCriteria(moduleIdsToSearchOn);
        wiretapSearchCriteria.setModuleFlow(moduleFlow);
        wiretapSearchCriteria.setComponentName(componentName);
        wiretapSearchCriteria.setEventId(eventId);
        wiretapSearchCriteria.setPayloadId(payloadId);
        wiretapSearchCriteria.setFromDate(fromDateString);
        wiretapSearchCriteria.setFromTime(fromTimeString);
        wiretapSearchCriteria.setUntilDate(untilDateString);
        wiretapSearchCriteria.setUntilTime(untilTimeString);
        wiretapSearchCriteria.setPayloadContent(payloadContent);
        // Validate the criteria and add any errors to the model
        this.validator.validate(wiretapSearchCriteria, errors);
        model.addAttribute("errors", errors);
        if (!errors.isEmpty())
        {
            noErrors = false;
        }
        // Setup the generic search criteria
        int pageNo = MasterDetailControllerUtil.defaultZero(page);
        String orderByField = MasterDetailControllerUtil.resolveOrderBy(orderBy);
        boolean orderAscending = MasterDetailControllerUtil.defaultFalse(orderAsc);
        Date fromDate = wiretapSearchCriteria.getFromDateTime();
        Date untilDate = wiretapSearchCriteria.getUntilDateTime();
        // Log the search criteria we're sending down
        if (logger.isDebugEnabled())
        {
            logger.debug("Executing Search with:");
            logSearch(pageNo, orderByField, orderAscending, pointToPointFlowProfileSearch, pointToPointFlowProfileSelectAll, moduleSelectAll,
                pageSizeToReturn, moduleIdsToSearchOn, pointToPointFlowProfileIds, moduleFlow, componentName, eventId, payloadId, fromDateString, fromTimeString,
                untilDateString, untilTimeString, payloadContent);
            logger.debug("From Date/Time [" + fromDate + "]");
            logger.debug("Until Date/Time [" + untilDate + "]");
        }
        // Perform the paged search
        PagedSearchResult pagedResult = null;
        if (noErrors)
        {
            Set moduleNames = this.moduleService.getModuleNames(moduleIdsToSearchOn);
            pagedResult = this.wiretapService.findWiretapEvents(pageNo, pageSizeToReturn, orderByField, orderAscending, moduleNames,
                moduleFlow, componentName, eventId, payloadId, fromDate, untilDate, payloadContent);
//            pagedResult = this.wiretapService.findWiretapEvents(pageNo, pageSizeToReturn, orderByField, orderAscending, moduleNames, moduleFlow, componentName, eventId,
//                payloadId, fromDate, untilDate, payloadContent);
        }
        // Store the search parameters used
        Map searchParams = new HashMap();
        if (pointToPointFlowProfileSearch.equals("true"))
        {
            MasterDetailControllerUtil.addParam(searchParams, "pointToPointFlowProfileIds", pointToPointFlowProfileIds);
        }
        else
        {
            MasterDetailControllerUtil.addParam(searchParams, "moduleIds", moduleIdsToSearchOn);
        }
        MasterDetailControllerUtil.addParam(searchParams, "moduleFlow", moduleFlow);
        MasterDetailControllerUtil.addParam(searchParams, "componentName", componentName);
        MasterDetailControllerUtil.addParam(searchParams, "eventId", eventId);
        MasterDetailControllerUtil.addParam(searchParams, "payloadId", payloadId);
        MasterDetailControllerUtil.addParam(searchParams, "fromDateString", fromDateString);
        MasterDetailControllerUtil.addParam(searchParams, "fromTimeString", fromTimeString);
        MasterDetailControllerUtil.addParam(searchParams, "untilDateString", untilDateString);
        MasterDetailControllerUtil.addParam(searchParams, "untilTimeString", untilTimeString);
        MasterDetailControllerUtil.addParam(searchParams, "payloadContent", payloadContent);
        MasterDetailControllerUtil.addPagedModelAttributes(orderByField, orderAscending, pointToPointFlowProfileSearch, pointToPointFlowProfileSelectAll,
            moduleSelectAll, model, pageNo, pageSizeToReturn, pagedResult, request, searchParams);
        // Return back to the combined search / search results view
        return "events/wiretapEvents";
    }

    /**
     * Get a Set of module ids from the list of given pointToPointFlowProfileIds
     * 
     * @param pointToPointFlowProfileIds - The list of
     *            pointToPointFlowProfileIds to get the Module Ids from
     * @return Set of module ids
     */
    private Set getModuleIdsFromPointToPointFlowProfiles(Set pointToPointFlowProfileIds)
    {
        Set moduleIds = pointToPointFlowProfileService.getModuleIdsFromPointToPointFlowProfiles(pointToPointFlowProfileIds);
        return moduleIds;
    }

    /**
     * View a specified WiretapEvent
     * 
     * @param wiretapEventId The id of the wiretapped event to get
     * @param searchResultsUrl The Search Results Page we came from
     * @param modelMap The model
     * @return The model and view representing the wiretap event
     */
    @RequestMapping("viewEvent.htm")
    public ModelAndView viewEvent(@RequestParam("wiretapEventId") long wiretapEventId, @RequestParam(required = false) String searchResultsUrl, ModelMap modelMap)
    {
        this.logger.debug("inside viewEvent, wiretapEventId=[" + wiretapEventId + "]");
        WiretapEvent wiretapEvent = this.wiretapService.getWiretapEvent(new Long(wiretapEventId));
        String payloadContent = wiretapEvent.getEvent().toString();
        String prettyXMLContent = "";
        if (payloadContentIsXML(payloadContent))
        {
            // Escape the HTML
            prettyXMLContent = StringEscapeUtils.escapeHtml(payloadContent);
            // Then add 
instead of newline prettyXMLContent = prettyXMLContent.replaceAll(System.getProperty("line.separator"), "
"); // Then add   instead of ' ' prettyXMLContent = prettyXMLContent.replaceAll(" ", " "); payloadContent = prettyXMLContent; } modelMap.addAttribute("wiretapEvent", this.wiretapService.getWiretapEvent(new Long(wiretapEventId))); modelMap.addAttribute("payloadContent", payloadContent); modelMap.addAttribute("searchResultsUrl", searchResultsUrl); return new ModelAndView("events/viewWiretapEvent", modelMap); } /** * Helper method to determine if payload content is XML * * @param payloadContent - The content to check * @return true of the content is XML */ private boolean payloadContentIsXML(String payloadContent) { if (payloadContent.startsWith(" moduleIds, Set pointToPointFlowProfileIds, String moduleFlow, String componentName, String eventId, String payloadId, String fromDateString, String fromTimeString, String untilDateString, String untilTimeString, String payloadContent) { logger.debug("Page [" + page + "]"); logger.debug("Order By [" + orderBy + "]"); logger.debug("Order Ascending Flag [" + orderAsc + "]"); logger.debug("Point To Point Flow Profile Search Flag [" + pointToPointFlowProfileSearch + "]"); logger.debug("Point To Point Flow Profile Select All Flag [" + pointToPointFlowProfileSelectAll + "]"); logger.debug("Module Select All Flag [" + moduleSelectAll + "]"); logger.debug("Number of search results per page [" + pageSize + "]"); logger.debug("Module Ids [" + moduleIds + "]"); logger.debug("PointToPointFlowProfile Ids [" + pointToPointFlowProfileIds + "]"); logger.debug("Module Flow [" + moduleFlow + "]"); logger.debug("Component Name [" + componentName + "]"); logger.debug("Event Id [" + eventId + "]"); logger.debug("Payload Id [" + payloadId + "]"); logger.debug("From Date String [" + fromDateString + "]"); logger.debug("From Time String [" + fromTimeString + "]"); logger.debug("Until Date String [" + untilDateString + "]"); logger.debug("Until Time String [" + untilTimeString + "]"); logger.debug("Payload Content [" + payloadContent + "]"); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy