/*
 * RunFileDataListBuilder.java
 *
 * Created on October 17, 2007, 4:01 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package usda.weru.util.diff.listbuilders;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import usda.weru.util.diff.DiffEngine;
import usda.weru.util.diff.DiffNode;
import usda.weru.util.diff.IncomparableObjectsException;
import usda.weru.util.diff.ListBuilder;
import usda.weru.weps.RunFileData;

/**
 *
 * @author Joseph Levin
 */
public class RunFileDataListBuilder extends ObjectListBuilder implements ListBuilder {

    /** Creates a new instance of RunFileDataListBuilder */
    public RunFileDataListBuilder() {

    }

    /**
     *
     * @param engine
     * @param a
     * @param b
     * @return
     * @throws IncomparableObjectsException
     */
    @Override
    public DiffNode buildList(DiffEngine engine, Object a, Object b) throws IncomparableObjectsException {
        test(RunFileData.class, a, b);
        return applyExtras(buildList(engine, (RunFileData) a, (RunFileData) b));
    }

    private DiffNode buildList(DiffEngine engine, RunFileData runA, RunFileData runB) throws IncomparableObjectsException {
        DiffNode node = new DiffNode("Run File Data", runA, runB);

        if (runA != null) {
            node.setA(runA.fileObject.getName());
        }
        if (runB != null) {
            node.setB(runB.fileObject.getName());
        }

        if (runA == null || runB == null) {
            return node;
        }

        List<String> keys = new ArrayList<String>();
        keys.addAll(runA.keySet());
        for (String key : runB.keySet()) {
            if (!keys.contains(key)) {
                keys.add(key);
            }
        }

        Collections.sort(keys);

        for (Object key : keys) {
            Object valueA = runA.getData(key.toString());
            Object valueB = runB.getData(key.toString());
            node.addChild(key.toString(), valueA, valueB);
        }

        return node;
    }

}
