| /******************************************************************************* |
| * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Marc R. Hoffmann - initial API and implementation |
| * |
| *******************************************************************************/ |
| package org.jacoco.core.data; |
| |
| import static java.lang.Math.max; |
| import static java.lang.Math.min; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| /** |
| * Container to collect and merge session {@link SessionInfo} objects. A |
| * instance of this class is not thread safe. |
| */ |
| public class SessionInfoStore implements ISessionInfoVisitor { |
| |
| private final List<SessionInfo> infos = new ArrayList<SessionInfo>(); |
| |
| /** |
| * Tests whether the store is empty. |
| * |
| * @return <code>true</code> if the store is empty |
| */ |
| public boolean isEmpty() { |
| return infos.isEmpty(); |
| } |
| |
| /** |
| * Returns all {@link SessionInfo} objects currently contained in the store. |
| * The info objects are ordered by its natural ordering (i.e. by the dump |
| * time stamp). |
| * |
| * @return list of stored {@link SessionInfo} objects |
| */ |
| public List<SessionInfo> getInfos() { |
| final List<SessionInfo> copy = new ArrayList<SessionInfo>(infos); |
| Collections.sort(copy); |
| return copy; |
| } |
| |
| /** |
| * Returns a new session info with the given id that contains a merged |
| * version from all contained version. The start timestamp is the minimum of |
| * all contained sessions, the dump timestamp the maximum of all contained |
| * sessions. If no session is currently contained both timestamps are set to |
| * <code>0</code>. |
| * |
| * @param id |
| * identifier for the merged session info |
| * @return new {@link SessionInfo} object |
| * |
| */ |
| public SessionInfo getMerged(final String id) { |
| if (infos.isEmpty()) { |
| return new SessionInfo(id, 0, 0); |
| } |
| long start = Long.MAX_VALUE; |
| long dump = Long.MIN_VALUE; |
| for (final SessionInfo i : infos) { |
| start = min(start, i.getStartTimeStamp()); |
| dump = max(dump, i.getDumpTimeStamp()); |
| } |
| return new SessionInfo(id, start, dump); |
| } |
| |
| /** |
| * Writes all contained {@link SessionInfo} objects into the given visitor. |
| * The info objects are emitted in chronological order by dump timestamp. |
| * |
| * @param visitor |
| * visitor to emit {@link SessionInfo} objects to |
| */ |
| public void accept(final ISessionInfoVisitor visitor) { |
| for (final SessionInfo i : getInfos()) { |
| visitor.visitSessionInfo(i); |
| } |
| } |
| |
| // === ISessionInfoVisitor === |
| |
| public void visitSessionInfo(final SessionInfo info) { |
| infos.add(info); |
| } |
| |
| } |