// $Id: summarize.java,v 1.1 2002/03/06 01:35:54 mdean Exp $


class summarize
{
    /**
     * maps DAMLClass to Double
     */
    static java.util.Hashtable costs = new java.util.Hashtable();

    static void addCost(com.hp.hpl.jena.daml.DAMLClass cl,
			double cost)
	throws Exception
    {
	// don't include Restrictions
	if (cl.hasRDFType(com.hp.hpl.jena.vocabulary.DAML_OIL.Restriction))
	    return;

	Double oldCost = (Double) costs.get(cl);
	if (oldCost == null)
	    {
		oldCost = new Double(0);
	    }
	costs.put(cl,
		  new Double(oldCost.doubleValue() + cost));

	// recurse for any superclasses
	java.util.Iterator iterator = cl.getAll(com.hp.hpl.mesa.rdf.jena.vocabulary.RDFS.subClassOf, false);
	while (iterator.hasNext())
	    {
		com.hp.hpl.jena.daml.DAMLClass superClass = (com.hp.hpl.jena.daml.DAMLClass) iterator.next();
		addCost(superClass, cost);
	    }
    }

    public static void main(String args[])
	throws Exception
    {
	com.hp.hpl.jena.daml.DAMLModel model = new com.hp.hpl.jena.daml.common.DAMLModelImpl();

	for (int i = 0; i < args.length; i++)
	    {
		model.read(args[i]);
	    }

	java.util.Iterator instances = model.listDAMLInstances();
	while (instances.hasNext())
	    {
		com.hp.hpl.jena.daml.DAMLInstance item = (com.hp.hpl.jena.daml.DAMLInstance) instances.next();
		
		java.util.Iterator acquiredIterator = item.getAll(homeinv_ont.acquired, true);
		while (acquiredIterator.hasNext())
		    {
			com.hp.hpl.jena.daml.DAMLInstance acquired = (com.hp.hpl.jena.daml.DAMLInstance) acquiredIterator.next();
			java.util.Iterator costIterator = acquired.getAll(homeinv_ont.cost, true);
			while (costIterator.hasNext())
			    {
				String costString = costIterator.next().toString();
				double cost = Double.parseDouble(costString.replace('?', ' ').trim()); 

				java.util.Iterator typeIterator = item.getAll(com.hp.hpl.mesa.rdf.jena.vocabulary.RDF.type, true);
				while (typeIterator.hasNext())
				    {
					com.hp.hpl.jena.daml.DAMLClass type = (com.hp.hpl.jena.daml.DAMLClass) typeIterator.next();
					addCost(type, cost);
				    }
			    }
		    }
	    }

	// sort results
	final java.util.Vector classes = new java.util.Vector(costs.keySet());
	java.util.Collections.sort(classes, 
				   new java.util.Comparator()
				   {
				       public int compare(Object class1,
							  Object class2)
				       {
					   Double cost1 = (Double) costs.get(class1);
					   Double cost2 = (Double) costs.get(class2);
					   return cost2.compareTo(cost1); // highest first
				       }
				   });

	// print results
	java.util.Iterator classesIterator = classes.iterator();
	while (classesIterator.hasNext())
	    {
		Object cl = classesIterator.next();
		System.out.println(cl + " " + costs.get(cl));
	    }
    }
}
