// $Id: gendaml.java,v 1.5 2002/08/29 20:05:33 mdean Exp $


/**
 * generate DAML from the Universal Joint and Naval Task Lists included in Navy Instructional Input Program (NIIP) version 6.  Note that only UJTL tasks have conditions.
 */
class gendaml
{
    static String ujtlBase = "http://orlando.drc.com/daml/Artifact/UJTL/v4.0/3.2/UJTL";

    static com.hp.hpl.mesa.rdf.jena.model.Model conditions = new com.hp.hpl.mesa.rdf.jena.mem.ModelMem();
    static com.hp.hpl.mesa.rdf.jena.model.Model untl = new com.hp.hpl.mesa.rdf.jena.mem.ModelMem();
    static com.hp.hpl.mesa.rdf.jena.model.Model ujtl2cond = new com.hp.hpl.mesa.rdf.jena.mem.ModelMem();

    /**
     * return the URI for the specified resource
     */
    static com.hp.hpl.mesa.rdf.jena.model.Resource taskResource(String func_num)
	throws com.hp.hpl.mesa.rdf.jena.model.RDFException
    {
	if (func_num.charAt(0) == 'N') // UNTL
	    return untl.createResource("#TSK-" + func_num.replace(' ', '_'));
	else
	    return ujtl2cond.createResource(ujtlBase + "#" + func_num.replace(' ', '_'));
    }

    /**
     * lookup the URI used by Conditions-ont for the specified cond_id 
     */
    static com.hp.hpl.mesa.rdf.jena.model.Resource conditionResource(String cond_id)
	throws com.hp.hpl.mesa.rdf.jena.model.RDFException
    {
	com.hp.hpl.mesa.rdf.jena.model.ResIterator iterator = conditions.listSubjectsWithProperty(condition_ont.index, conditions.createLiteral(cond_id));
	if (iterator.hasNext())
	    {
		return iterator.next();
	    }
	else
	    {
		System.err.println("couldn't find Condition " + cond_id);
		return null;
	    }
    }

    static void writeModel(com.hp.hpl.mesa.rdf.jena.model.Model model,
			   String path)
	throws Exception
    {
	java.io.PrintWriter stream = new java.io.PrintWriter(new java.io.FileOutputStream(path));
	model.write(stream);
    }

    public static void main(String args[])
	throws Exception
    {
	// load conditions
	conditions.read(condition_ont.baseURI);

	// connect to database
	Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
	java.sql.Connection connection = java.sql.DriverManager.getConnection("jdbc:odbc:nllsson");
	java.sql.Statement statement = connection.createStatement();
	java.sql.ResultSet results;

	com.hp.hpl.mesa.rdf.jena.model.Resource untlResource = untl.createResource("#UNTL");
	untl.add(untlResource,
		 com.hp.hpl.mesa.rdf.jena.vocabulary.RDF.type,
		 tasklist_ont.TaskList);

	// tasks
	results = statement.executeQuery("select func_num, descriptor, words, par_num from ujtlt40");
	while (results.next())
	    {
		String func_num = results.getString("func_num");
		int space = func_num.indexOf(' ');
		String title = results.getString("descriptor");
		title = title.substring(title.indexOf(' ') + 1);
		title = title.substring(title.indexOf(' ') + 1).trim();

		// generate only Navy tasks
		if (func_num.charAt(0) != 'N')
		    continue;

		if (func_num.equals("NAVY"))
		    {
			untl.add(untlResource,
				 tasklist_ont.title,
				 title);
			continue;
		    }
		
		com.hp.hpl.mesa.rdf.jena.model.Resource taskResource = taskResource(func_num);
		untl.add(taskResource,
			 com.hp.hpl.mesa.rdf.jena.vocabulary.RDF.type,
			 tasklist_ont.Task);
		untl.add(taskResource,
			 tasklist_ont.categoryCode,
			 space == (-1) ? func_num : func_num.substring(0, space));
		if (space != (-1))
		    untl.add(taskResource,
			     tasklist_ont.index,
			     func_num.substring(space + 1));
		untl.add(taskResource,
			 tasklist_ont.title,
			 title);
		untl.add(taskResource,
			 com.hp.hpl.mesa.rdf.jena.vocabulary.RDFS.label,
			 title);
		untl.add(taskResource,
			 tasklist_ont.definition,
			 results.getString("words"));
		untl.add(taskResource,
			 tasklist_ont.status,
			 "EFFECTIVE"); // XXX
		untl.add(taskResource,
			 tasklist_ont.note,
			 "");	// XXX
		String par_num = results.getString("par_num");
		if (par_num != null)
		    {
			if (par_num.endsWith(".")) // occasional data irregularity
			    par_num = par_num.substring(0, par_num.length() -1);
			com.hp.hpl.mesa.rdf.jena.model.Resource parent = taskResource(par_num);
			if (par_num.equals("NAVY"))
			    {
				untl.add(untlResource,
					 tasklist_ont.hasTask,
					 taskResource);
			    }
			else
			    {
				untl.add(taskResource,
					 tasklist_ont.superTask,
					 parent);
				untl.add(parent,
					 tasklist_ont.subTask,
					 taskResource);
			    }
		    }
		// XXX - parse primary and supplemental sources?
	    }

	// link tasks to conditions
	results = statement.executeQuery("select func_num, cond_id from ujtll40");
	while (results.next())
	    {
		String cond_id = results.getString("cond_id");
		com.hp.hpl.mesa.rdf.jena.model.Resource condition = conditionResource(cond_id.substring(cond_id.indexOf(' ') + 1));
		if (condition != null)
		    ujtl2cond.add(taskResource(results.getString("func_num")),
				  condition_ont.condition,
				  condition);
	    }

	// store models
	writeModel(untl, "untl.daml");
	writeModel(ujtl2cond, "ujtl2cond.daml");
    }
}
