JMadModelSeqElementOnNameComparator.java

/**
 * Copyright (c) 2015 European Organisation for Nuclear Research (CERN), All Rights Reserved.
 */

package cern.accsoft.steering.jmad.service;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cern.accsoft.steering.jmad.domain.elem.Element;
import cern.accsoft.steering.jmad.domain.machine.Range;
import cern.accsoft.steering.jmad.model.JMadModel;

public class JMadModelSeqElementOnNameComparator implements JMadModelComparator {
    /** The logger for the class */
    protected static final Logger LOGGER = LoggerFactory.getLogger(JMadModelSeqElementOnNameComparator.class);

    @Override
    public List<Element> getCommonSequenceElements(JMadModel model1, JMadModel model2, SequenceElementFilter filter) {

        List<Element> toReturn = new ArrayList<Element>();
        Range activeRange1 = model1.getActiveRange();
        Range activeRange2 = model2.getActiveRange();
        if (!activeRange1.getName().equals(activeRange2)) {
            LOGGER.warn("Comparing two models [" + model1.getName() + " vs. " + model2.getName()
                    + " with different RANGES selected [" + activeRange1.getName() + " vs " + activeRange2.getName()
                    + "]. Result may differ in multiple entries!");
        }
        for (Element oneElementModel1 : getFilteredElements(activeRange1.getElements(), filter)) {
            for (Element oneElementModel2 : getFilteredElements(activeRange2.getElements(), filter)) {
                if (oneElementModel1.getName().equals(oneElementModel2.getName())) {
                    toReturn.add(oneElementModel1);
                    break;
                }
            }
        }
        return toReturn;
    }

    /**
     * returns the sublist of given elements list that match the given filter.
     * 
     * @param elements
     * @param filter
     * @return
     */
    public static List<Element> getFilteredElements(List<Element> elements, SequenceElementFilter filter) {
        List<Element> toReturn = new ArrayList<Element>();
        for (Element one : elements) {
            if (filter.accepts(one)) {
                toReturn.add(one);
            }
        }
        return toReturn;
    }

}