/*
* Copyright (C) 2007 ETH Zurich
*
* This file is part of Fosstrak (www.fosstrak.org).
*
* Fosstrak is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* Fosstrak 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Fosstrak; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package org.fosstrak.ale.server.util;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReport;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReportGroup;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReportGroupListMember;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReportSpec;
import org.fosstrak.ale.xsd.epcglobal.EPC;
import org.springframework.stereotype.Service;
/**
* helper to compare ECReports by content.
*
* @author swieland
*
*/
@Service("ecReportsHelper")
public class ECReportsHelper {
/**
* compares the content of two ECReports and decides on the content whether they equal or not. the
* two reports must follow the same report spec.
* @param reportSpec the report spec of the report.
* @param newReport the newer report (or report1).
* @param oldReport the older report (or report2).
* @return true if equal by content, false otherwise.
*/
public boolean areReportsEqual(ECReportSpec reportSpec, ECReport newReport, ECReport oldReport) {
boolean equality = false;
Map<String, ECReportGroup> newGroupByName = new HashMap<String, ECReportGroup> ();
Map<String, ECReportGroup> oldGroupByName = new HashMap<String, ECReportGroup> ();
// compare the tags...
if (null != oldReport) {
List<ECReportGroup> oldGroup = oldReport.getGroup();
List<ECReportGroup> newGroup = newReport.getGroup();
if (oldGroup.size() == newGroup.size()) {
// equal amount of groups, so need to compare the groups...
for (ECReportGroup g : oldGroup) oldGroupByName.put(g.getGroupName(), g);
for (ECReportGroup g : newGroup) newGroupByName.put(g.getGroupName(), g);
for (String gName : oldGroupByName.keySet()) {
ECReportGroup og = oldGroupByName.get(gName);
ECReportGroup ng = newGroupByName.get(gName);
// now compare the two groups...
if ((null != og.getGroupList()) && (null != ng.getGroupList())) {
// need to check
boolean useEPC = reportSpec.getOutput().isIncludeEPC();
boolean useTag = reportSpec.getOutput().isIncludeTag();
boolean useHex = reportSpec.getOutput().isIncludeRawHex();
HashSet<String> hs = new HashSet<String>();
HashSet<String> hs2 = new HashSet<String>();
for (ECReportGroupListMember oMember : og.getGroupList().getMember()) {
boolean epcAdded = false;
// compare according the epc field
if (useEPC) epcAdded = addEPC(hs, oMember.getEpc());
if (!epcAdded && useTag) epcAdded = addEPC(hs, oMember.getTag());
if (!epcAdded && useHex) epcAdded = addEPC(hs, oMember.getRawHex());
if (!epcAdded) epcAdded = addEPC(hs, oMember.getRawDecimal());
}
for (ECReportGroupListMember oMember : ng.getGroupList().getMember()) {
boolean epcAdded = false;
// compare according the epc field
if (useEPC) epcAdded = addEPC(hs2, oMember.getEpc());
if (!epcAdded && useTag) epcAdded = addEPC(hs2, oMember.getTag());
if (!epcAdded && useHex) epcAdded = addEPC(hs2, oMember.getRawHex());
if (!epcAdded) epcAdded = addEPC(hs2, oMember.getRawDecimal());
}
// if intersection is not empty, the sets are not equal
if (hs.containsAll(hs2) && hs2.containsAll(hs)) {
// equal
equality = true;
} else {
equality = false;
break;
}
} else if ((null == og.getGroupList()) && (null == ng.getGroupList())) {
// the groups are equal
equality = true;
} else {
// not equal.
equality = false;
break;
}
}
}
}
return equality;
}
/**
* adds an epc value to the hashset.
* @param set the set where to add.
* @param epc the epc to get the value from.
* @return true if value could be obtained and added, false otherwise.
*/
public boolean addEPC(Set<String> set, EPC epc) {
if ((null == set) || (null == epc) || (null == epc.getValue())){
return false;
}
set.add(epc.getValue());
return true;
}
}