SessionInfoStore.java
1/*******************************************************************************
2 * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Marc R. Hoffmann - initial API and implementation
10 *
11 *******************************************************************************/
12package org.jacoco.core.data;
13
14import static java.lang.Math.max;
15import static java.lang.Math.min;
16
17import java.util.ArrayList;
18import java.util.Collections;
19import java.util.List;
20
21/**
22 * Container to collect and merge session {@link SessionInfo} objects. A
23 * instance of this class is not thread safe.
24 *
25 * @author Marc R. Hoffmann
26 * @version 0.4.1.20101007204400
27 */
28public class SessionInfoStore implements ISessionInfoVisitor {
29
30 private final List<SessionInfo> infos = new ArrayList<SessionInfo>();
31
32 /**
33 * Tests whether the store is empty.
34 *
35 * @return <code>true</code> if the store is empty
36 */
37 public boolean isEmpty() {
38 return infos.isEmpty();
39 }
40
41 /**
42 * Returns all {@link SessionInfo} objects currently contained in the store.
43 * The info objects are ordered by its natural ordering (i.e. by the dump
44 * time stamp).
45 *
46 * @return list of stored {@link SessionInfo} objects
47 */
48 public List<SessionInfo> getInfos() {
49 final List<SessionInfo> copy = new ArrayList<SessionInfo>(infos);
50 Collections.sort(copy);
51 return copy;
52 }
53
54 /**
55 * Returns a new session info with the given id that contains a merged
56 * version from all contained version. The start timestamp is the minimum of
57 * all contained sessions, the dump timestamp the maximum of all contained
58 * sessions. If no session is currently contained both timestamps are set to
59 * <code>0</code>.
60 *
61 * @param id
62 * identifier for the merged session info
63 * @return new {@link SessionInfo} object
64 *
65 */
66 public SessionInfo getMerged(final String id) {
67 if (infos.isEmpty()) {
68 return new SessionInfo(id, 0, 0);
69 }
70 long start = Long.MAX_VALUE;
71 long dump = Long.MIN_VALUE;
72 for (final SessionInfo i : infos) {
73 start = min(start, i.getStartTimeStamp());
74 dump = max(dump, i.getDumpTimeStamp());
75 }
76 return new SessionInfo(id, start, dump);
77 }
78
79 /**
80 * Writes all contained {@link SessionInfo} objects into the given visitor.
81 * The info objects are emitted in chronological order by dump timestamp.
82 *
83 * @param visitor
84 * visitor to emit {@link SessionInfo} objects to
85 */
86 public void accept(final ISessionInfoVisitor visitor) {
87 for (final SessionInfo i : getInfos()) {
88 visitor.visitSessionInfo(i);
89 }
90 }
91
92 // === ISessionInfoVisitor ===
93
94 public void visitSessionInfo(final SessionInfo info) {
95 infos.add(info);
96 }
97
98}