/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.portal.livetrace; import java.util.HashMap; import java.util.LinkedHashMap; class PageCacheUsagesResolver { static CacheUsages resolveCacheUsages( final PageRenderingTrace pageRenderingTrace ) { HashMap<String, WindowRenderingTrace> collection = new LinkedHashMap<String, WindowRenderingTrace>(); if ( pageRenderingTrace.getViewTransformationTrace() != null ) { collectWindowRenderingTracesInViewTransformationTrace( pageRenderingTrace.getViewTransformationTrace(), collection ); } if ( pageRenderingTrace.getWindowRenderingTraces() != null ) { collectWindowRenderingTraces( pageRenderingTrace.getWindowRenderingTraces(), collection ); } final CacheUsages resolvedCacheUsages = new CacheUsages(); resolvedCacheUsages.add( pageRenderingTrace.getCacheUsage() ); for ( WindowRenderingTrace trace : collection.values() ) { resolvedCacheUsages.add( trace.getCacheUsage() ); } return resolvedCacheUsages; } private static void collectWindowRenderingTraces( final Traces<WindowRenderingTrace> traces, final HashMap<String, WindowRenderingTrace> collection ) { for ( WindowRenderingTrace trace : traces ) { collectWindowRenderingTrace( trace, collection ); } } private static void collectWindowRenderingTracesInViewTransformationTrace( final ViewTransformationTrace viewTransformationTrace, final HashMap<String, WindowRenderingTrace> collection ) { if ( viewTransformationTrace.getViewFunctionTraces() != null ) { for ( ViewFunctionTrace viewFunctionTrace : viewTransformationTrace.getViewFunctionTraces() ) { final Traces<? extends Trace> traces = viewFunctionTrace.getTraces(); if ( traces != null ) { for ( Trace trace : traces ) { if ( trace instanceof WindowRenderingTrace ) { collectWindowRenderingTrace( (WindowRenderingTrace) trace, collection ); } } } } } } private static void collectWindowRenderingTrace( final WindowRenderingTrace windowRenderingTrace, final HashMap<String, WindowRenderingTrace> collection ) { final WindowRenderingTrace existingTrace = collection.get( windowRenderingTrace.getWindowKey() ); if ( existingTrace != null ) { if ( windowRenderingTrace.getCacheUsage().isWorseThan( existingTrace.getCacheUsage() ) ) { collection.put( windowRenderingTrace.getWindowKey(), windowRenderingTrace ); } } else { collection.put( windowRenderingTrace.getWindowKey(), windowRenderingTrace ); } } }