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}