// Copyright 2004, FreeHEP.
package hep.graphics.heprep1.adapter.test;

import java.io.*;
import java.util.*;

import org.xml.sax.*;

import hep.graphics.heprep1.adapter.HepRepAdapterFactory;
import hep.graphics.heprep1.adapter.NumericalComparator;

import hep.graphics.heprep.HepRep;
import hep.graphics.heprep.HepRepFactory;
import hep.graphics.heprep.HepRepWriter;

import hep.graphics.heprep.HepRepInstanceTree;
import hep.graphics.heprep.HepRepTypeTree;

/**
 *
 * @author Mark Donszelmann
 * @version $Id: HepRep1toHepRep2Converter.java,v 1.3 2004/08/08 14:37:35 duns Exp $
 */
public class HepRep1toHepRep2Converter {


    public HepRep1toHepRep2Converter(String source, String dest) throws Exception {

        hep.graphics.heprep1.xml.XMLHepRepReader in = new hep.graphics.heprep1.xml.XMLHepRepReader(new FileInputStream(source));
        hep.graphics.heprep1.HepRep heprep1 = in.next();
        in.close();

        HepRepAdapterFactory factory = HepRepAdapterFactory.getFactory();        
        HepRep heprep = factory.createHepRep();
        List layers = new ArrayList();
        
        // FIXME, this should go somewhere else...
        // read geometry
/*
        WGF wgf = new WGF("/babargeometry");
        wgf.parse("babar.xml.gz");
        HepRep geometry = wgf.getHepRep();

        heprep.addTypeTree(geometry.getTypeTree("GeometryTypes", "1.0"));
        heprep.addInstanceTree(geometry.getInstanceTreeTop("BaBarGeometry", "1.0"));
        layers.addAll(geometry.getLayerOrder());
*/        
        // read event
        HepRep event = factory.createHepRep(heprep1);
                              
        // add to new heprep
        heprep.addTypeTree(event.getTypeTree("Types", "1.0"));        
        
        HepRepInstanceTree instanceTree = event.getInstanceTreeTop("Instances", "1.0");
        heprep.addInstanceTree(instanceTree);
        layers.addAll(event.getLayerOrder());

//        instanceTree.addInstanceTree(factory.createHepRepTreeID("BaBarGeometry", "1.0"));
        
        // merge layers
        Collections.sort(layers, new NumericalComparator());
        for (Iterator i=layers.iterator(); i.hasNext(); ) {
            heprep.addLayer((String)i.next());
        }
        
        HepRepWriter writer = factory.createHepRepWriter(new FileOutputStream(dest), false, false);
        writer.write(heprep, "Event");
        writer.close();
    }

    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.err.println("Usage: HepRep1toHepRep2Converter sourcefile destfile");
            System.exit(1);
        }
        
        try {
            new HepRep1toHepRep2Converter(args[0], args[1]);
        } catch (SAXParseException e) {
            System.out.println(e+" in "+args[0]+" at line: "+e.getLineNumber()+", col: "+e.getColumnNumber());
        } catch (SAXException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}