org.fosstrak.ale.server.util.ECReportsHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.fosstrak.ale.server.util.ECReportsHelper.java

Source

/*
 * 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;
    }
}