/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.whip.coveragedata; import java.io.Serializable; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * @author Shuyang Zhou */ public abstract class CoverageDataContainer <K, V extends CoverageData<V>, T extends CoverageDataContainer<K, V, T>> implements CoverageData<T>, Serializable { @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof CoverageDataContainer)) { return false; } CoverageDataContainer<K, V, T> coverageDataContainer = (CoverageDataContainer<K, V, T>)obj; return children.equals(coverageDataContainer.children); } @Override public double getBranchCoverageRate() { int numberOfCoveredBranches = 0; int numberOfValidBranches = 0; for (CoverageData<V> coverageData : children.values()) { numberOfCoveredBranches += coverageData.getNumberOfCoveredBranches(); numberOfValidBranches += coverageData.getNumberOfValidBranches(); } if (numberOfValidBranches == 0) { return 1D; } return (double)numberOfCoveredBranches / numberOfValidBranches; } @Override public double getLineCoverageRate() { int numberOfCoveredLines = 0; int numberOfValidLines = 0; for (CoverageData<V> coverageData : children.values()) { numberOfCoveredLines += coverageData.getNumberOfCoveredLines(); numberOfValidLines += coverageData.getNumberOfValidLines(); } if (numberOfValidLines == 0) { return 1D; } return (double)numberOfCoveredLines / numberOfValidLines; } @Override public int getNumberOfCoveredBranches() { int numberOfCoveredBranches = 0; for (CoverageData<V> coverageData : children.values()) { numberOfCoveredBranches += coverageData.getNumberOfCoveredBranches(); } return numberOfCoveredBranches; } @Override public int getNumberOfCoveredLines() { int numberOfCoveredLines = 0; for (CoverageData<V> coverageData : children.values()) { numberOfCoveredLines += coverageData.getNumberOfCoveredLines(); } return numberOfCoveredLines; } @Override public int getNumberOfValidBranches() { int numberOfValidBranches = 0; for (CoverageData<V> coverageData : children.values()) { numberOfValidBranches += coverageData.getNumberOfValidBranches(); } return numberOfValidBranches; } @Override public int getNumberOfValidLines() { int numberOfValidLines = 0; for (CoverageData<V> coverageData : children.values()) { numberOfValidLines += coverageData.getNumberOfValidLines(); } return numberOfValidLines; } @Override public int hashCode() { return children.hashCode(); } @Override public void merge(T otherCoverageDataContainer) { Map<K, V> otherChildren = otherCoverageDataContainer.children; for (Entry<K, V> entry : otherChildren.entrySet()) { V otherChildCoverageData = entry.getValue(); V myChildCoverageData = children.putIfAbsent( entry.getKey(), otherChildCoverageData); if (myChildCoverageData != null) { myChildCoverageData.merge(otherChildCoverageData); } } } protected final ConcurrentMap<K, V> children = new ConcurrentHashMap<>(); private static final long serialVersionUID = 1; }