/*
* Copyright 2008-2017 by Emeric Vernat
*
* This file is part of Java Melody.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.bull.javamelody;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.bull.javamelody.Counter.CounterRequestContextComparator;
/**
* Données pour le tableau des requêtes courantes.
* @author Emeric Vernat
*/
class CounterRequestContextData {
private final List<Counter> counters;
private final JavaInformations javaInformations;
private final Map<Long, ThreadInformations> threadInformationsById;
private final List<CounterRequestContext> contexts;
private final List<CounterRequestContext> allContexts;
private final List<CounterRequest> allRequests;
private final Map<Counter, CounterRequestAggregation> aggregationsByCounter = new HashMap<>();
private final boolean stackTraceEnabled;
private final boolean childHitsDisplayed;
private final boolean remoteUserDisplayed;
CounterRequestContextData(List<Counter> counters, List<CounterRequestContext> currentRequests,
JavaInformations javaInformations) {
super();
this.counters = counters;
this.javaInformations = javaInformations;
this.contexts = currentRequests;
Collections.sort(contexts, Collections
.reverseOrder(new CounterRequestContextComparator(System.currentTimeMillis())));
this.threadInformationsById = new HashMap<>();
this.allContexts = new ArrayList<>();
this.allRequests = new ArrayList<>();
for (final ThreadInformations threadInformations : javaInformations
.getThreadInformationsList()) {
threadInformationsById.put(threadInformations.getId(), threadInformations);
}
for (final CounterRequestContext context : contexts) {
allContexts.add(context);
for (final CounterRequestContext childContext : context.getChildContexts()) {
allContexts.add(childContext);
}
}
final Map<String, CounterRequest> requestsById = mapAllRequestsById();
for (final CounterRequestContext context : allContexts) {
final String requestId = new CounterRequest(context.getRequestName(),
context.getParentCounter().getName()).getId();
final CounterRequest request = requestsById.get(requestId);
allRequests.add(request);
}
this.stackTraceEnabled = javaInformations.isStackTraceEnabled();
boolean myChildHitsDisplayed = false;
for (final CounterRequestContext rootCurrentContext : getRootContexts()) {
if (rootCurrentContext.hasChildHits()) {
// one root has child
myChildHitsDisplayed = true;
break;
}
}
this.childHitsDisplayed = myChildHitsDisplayed;
boolean myRemoteUserDisplayed = false;
for (final CounterRequestContext context : getRootContexts()) {
if (context.getRemoteUser() != null) {
myRemoteUserDisplayed = true;
break;
}
}
this.remoteUserDisplayed = myRemoteUserDisplayed;
}
private Map<String, CounterRequest> mapAllRequestsById() {
final Map<String, CounterRequest> result = new HashMap<>();
for (final Counter counter : counters) {
for (final CounterRequest counterRequest : counter.getRequests()) {
result.put(counterRequest.getId(), counterRequest);
}
}
return result;
}
CounterRequestAggregation getAggregationForCounter(Counter counter) {
CounterRequestAggregation aggregation = aggregationsByCounter.get(counter);
if (aggregation == null) {
aggregation = new CounterRequestAggregation(counter);
aggregationsByCounter.put(counter, aggregation);
}
return aggregation;
}
ThreadInformations getThreadInformationsByCounterRequestContext(
CounterRequestContext counterRequestContext) {
if (counterRequestContext.getParentContext() == null) {
// on affiche le thread que pour le contexte parent
return threadInformationsById.get(counterRequestContext.getThreadId());
}
return null;
}
boolean isStackTraceEnabled() {
return stackTraceEnabled;
}
boolean isChildHitsDisplayed() {
return childHitsDisplayed;
}
boolean isRemoteUserDisplayed() {
return remoteUserDisplayed;
}
List<CounterRequestContext> getRootContexts() {
return contexts;
}
List<CounterRequestContext> getAllContexts() {
return allContexts;
}
List<CounterRequest> getAllRequests() {
return allRequests;
}
JavaInformations getJavaInformations() {
return javaInformations;
}
}