/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.tools;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.enonic.cms.framework.cache.CacheManager;
import com.enonic.cms.core.portal.livetrace.LivePortalTraceJsonGenerator;
import com.enonic.cms.core.portal.livetrace.LivePortalTraceService;
import com.enonic.cms.core.portal.livetrace.PortalRequestTrace;
import com.enonic.cms.core.portal.livetrace.PortalRequestTraceRow;
import com.enonic.cms.core.portal.livetrace.systeminfo.SystemInfo;
import com.enonic.cms.core.portal.livetrace.systeminfo.SystemInfoFactory;
/**
* This class implements the connection info controller.
*/
public final class LivePortalTraceController
extends AbstractToolController
{
@Autowired
private SystemInfoFactory systemInfoFactory;
private LivePortalTraceService livePortalTraceService;
private CacheManager cacheManager;
@Autowired
private LivePortalTraceJsonGenerator livePortalTraceJsonGenerator;
public LivePortalTraceController()
{
setEnterpriseFeature( true );
}
@Override
protected void doPost( final HttpServletRequest req, final HttpServletResponse res )
throws Exception
{
final String command = req.getParameter( "command" );
if ( "clear-longestpagerequests".equals( command ) )
{
livePortalTraceService.clearLongestPageRequestsTraces();
}
else if ( "clear-longestattachmentrequests".equals( command ) )
{
livePortalTraceService.clearLongestAttachmentRequestTraces();
}
else if ( "clear-longestimagerequests".equals( command ) )
{
livePortalTraceService.clearLongestImageRequestTraces();
}
res.setStatus( HttpServletResponse.SC_NO_CONTENT );
}
@Override
protected void doGet( final HttpServletRequest req, final HttpServletResponse res )
throws Exception
{
final String systemInfo = req.getParameter( "system-info" );
final String window = req.getParameter( "window" );
final String history = req.getParameter( "history" );
final HashMap<String, Object> model = new HashMap<String, Object>();
model.put( "baseUrl", getBaseUrl( req ) );
if ( StringUtils.isNotBlank( systemInfo ) )
{
final SystemInfo systemInfoObject =
systemInfoFactory.createSystemInfo( livePortalTraceService.getNumberOfPortalRequestTracesInProgress(), cacheManager );
returnJson( livePortalTraceJsonGenerator.generate( systemInfoObject ), res );
}
else if ( "current".equals( window ) )
{
final List<PortalRequestTrace> traces = livePortalTraceService.getCurrentPortalRequestTraces();
returnJson( livePortalTraceJsonGenerator.generate( PortalRequestTraceRow.createRows( traces ) ), res );
}
else if ( "longestpagerequests".equals( window ) )
{
final List<PortalRequestTrace> traces = livePortalTraceService.getLongestTimePortalPageRequestTraces();
returnJson( livePortalTraceJsonGenerator.generate( PortalRequestTraceRow.createRows( traces ) ), res );
}
else if ( "longestattachmentrequests".equals( window ) )
{
final List<PortalRequestTrace> traces = livePortalTraceService.getLongestTimePortalAttachmentRequestTraces();
returnJson( livePortalTraceJsonGenerator.generate( PortalRequestTraceRow.createRows( traces ) ), res );
}
else if ( "longestimagerequests".equals( window ) )
{
final List<PortalRequestTrace> traces = livePortalTraceService.getLongestTimePortalImageRequestTraces();
returnJson( livePortalTraceJsonGenerator.generate( PortalRequestTraceRow.createRows( traces ) ), res );
}
else if ( history != null )
{
final String completedAfterStr = req.getParameter( "completed-after" );
final String countStr = req.getParameter( "count" );
final String completedBeforeStr = req.getParameter( "completed-before" );
Long completedAfter = null;
if ( !StringUtils.isEmpty( completedAfterStr ) )
{
completedAfter = Long.valueOf( completedAfterStr );
}
Integer count = null;
if ( !StringUtils.isEmpty( countStr ) )
{
count = Integer.valueOf( countStr );
}
Long completedBefore = null;
if ( !StringUtils.isEmpty( completedBeforeStr ) )
{
completedBefore = Long.valueOf( completedBeforeStr );
}
List<PortalRequestTrace> traces;
if ( completedBefore != null )
{
traces = livePortalTraceService.getCompletedBefore( completedBefore );
}
else
{
traces = livePortalTraceService.getCompletedAfter( completedAfter );
}
if ( count != null )
{
traces = traces.subList( 0, Math.min( count, traces.size() ) );
}
final String jsonString = livePortalTraceJsonGenerator.generate( PortalRequestTraceRow.createRows( traces ) );
returnJson( jsonString, res );
}
else
{
model.put( "livePortalTraceEnabled", isLivePortalTraceEnabled() ? 1 : 0 );
res.setHeader( "Content-Type", "text/html; charset=utf-8" );
renderView( req, res, model, "livePortalTracePage" );
}
}
private void returnJson( String json, HttpServletResponse res )
throws Exception
{
res.setHeader( "Content-Type", "application/json; charset=UTF-8" );
res.getWriter().println( json );
}
private boolean isLivePortalTraceEnabled()
{
return livePortalTraceService.tracingEnabled();
}
@Autowired
public void setLivePortalTraceService( LivePortalTraceService livePortalTraceService )
{
this.livePortalTraceService = livePortalTraceService;
}
@Autowired
public void setCacheManager( CacheManager cacheManager )
{
this.cacheManager = cacheManager;
}
}