// $Id: ged2daml.java,v 1.11 2001/02/14 03:10:57 mdean Exp $


class ged2daml
{
    static boolean debug = false;

    static org.w3c.rdf.util.RDFFactory factory = new org.w3c.rdf.util.RDFFactoryImpl();
    static org.w3c.rdf.model.Model model = factory.createModel();

    static org.w3c.rdf.model.Statement addStatement(org.w3c.rdf.model.Model model,
						    org.w3c.rdf.model.Resource subject,
						    org.w3c.rdf.model.Resource predicate,
						    org.w3c.rdf.model.RDFNode object)
	throws Exception
    {
	org.w3c.rdf.model.Statement statement = model.getNodeFactory().createStatement(subject,
										       predicate,
										       object);
	model.add(statement);
	return statement;
    }

    static org.w3c.rdf.model.Statement addStatement(org.w3c.rdf.model.Model model,
						    org.w3c.rdf.model.Resource subject,
						    org.w3c.rdf.model.Resource predicate,
						    String object)
	throws Exception
    {
	return addStatement(model, subject, predicate, model.getNodeFactory().createLiteral(object));
    }

    static int eventCounter = 0;

    /**
     * add multiple statements representing the specified GEDCOM event.
     */
    static void addEvent(org.w3c.rdf.model.Model model,
			 org.w3c.rdf.model.Resource subject,
			 GEDCOM.Node node,
			 org.w3c.rdf.model.Resource eventType,
			 org.w3c.rdf.model.Resource eventPredicate)
	throws Exception
    {
	org.w3c.rdf.model.Resource uri = model.getNodeFactory().createResource("#event" + (eventCounter++));
	addStatement(model,
		     uri,
		     org.w3c.rdf.vocabulary.rdf_syntax_19990222.RDF.type,
		     eventType);
	addStatement(model,
		     subject,
		     eventPredicate,
		     uri);

	java.util.Iterator iterator = node.children.iterator();
	while (iterator.hasNext())
	    {
		GEDCOM.Node child = (GEDCOM.Node) iterator.next();

		if (child.tag.equals("DATE"))
		    {
			addStatement(model,
				     uri,
				     gedcom_200101.date,
				     child.value);
		    }
		else if (child.tag.equals("PLAC"))
		    {
			addStatement(model,
				     uri,
				     gedcom_200101.place,
				     child.value);
		    }
	    }
    }

    public static void usage()
    {
	System.err.println("Usage:  <file.ged> <file.daml>");
	System.exit(1);
    }

    public static void main(String args[])
	throws Exception
    {
	// parse arguments
	if (args.length != 2)
	    usage();
	String inFile = args[0];
	String outFile = args[1];

	// statistics
	long nindividuals = 0;
	long nfamilies = 0;

	GEDCOM gedcom = GEDCOM.parseFile(inFile);

	java.util.Iterator iterator = gedcom.keys.values().iterator();
	while (iterator.hasNext())
	    {
		GEDCOM.Node node = (GEDCOM.Node) iterator.next();
		
		if (debug)
		    node.print(0);

		if (node.tag.equals("INDI"))
		    {
			nindividuals++;
			org.w3c.rdf.model.Resource uri = model.getNodeFactory().createResource("#" + node.key);
			addStatement(model,
				     uri, 
				     org.w3c.rdf.vocabulary.rdf_syntax_19990222.RDF.type,
				     gedcom_200101.Individual);
			
			java.util.Iterator childIterator = node.children.iterator();
			while (childIterator.hasNext())
			    {
				GEDCOM.Node child = (GEDCOM.Node) childIterator.next();
				if (child.tag.equals("SEX"))
				    {
					addStatement(model,
						     uri,
						     gedcom_200101.sex,
						     child.value);
				    }
				else if (child.tag.equals("NAME"))
				    {
					java.util.Iterator nameIterator = child.children.iterator();
					boolean gotName = false;
					while (nameIterator.hasNext())
					    {
						GEDCOM.Node name = (GEDCOM.Node) nameIterator.next();
						if (name.tag.equals("GIVN"))
						    {
							gotName = true;
							addStatement(model,
								     uri,
								     gedcom_200101.givenName,
								     name.value);
						    }
						else if (name.tag.equals("SURN"))
						    {
							gotName = true;
							addStatement(model,
								     uri,
								     gedcom_200101.surname,
								     name.value);
						    }
						else if (name.tag.equals("NSFX"))
						    {
							// XXX
						    }
					    }

					// earlier GEDCOM files may not split up components
					if (! gotName)
					    addStatement(model,
							 uri,
							 gedcom_200101.name,
							 child.value);
				    }
				else if (child.tag.equals("BIRT"))
				    {
					addEvent(model,
						 uri,
						 child,
						 gedcom_200101.Birth,
						 gedcom_200101.birth);
				    }
				else if (child.tag.equals("DEAT"))
				    {
					addEvent(model,
						 uri,
						 child,
						 gedcom_200101.Death,
						 gedcom_200101.death);
				    }
				else if (child.tag.equals("FAMC"))
				    {
					addStatement(model,
						     uri,
						     gedcom_200101.childIn,
						     model.getNodeFactory().createResource("#" + child.value));
				    }
				else if (child.tag.equals("FAMS"))
				    {
					addStatement(model,
						     uri,
						     gedcom_200101.spouseIn,
						     model.getNodeFactory().createResource("#" + child.value));
				    }
				else if (child.tag.equals("AFN"))
				    {
					// LDS Ancestral File Number
					addStatement(model,
						     uri,
						     daml_oil.equivalentTo,
						     model.getNodeFactory().createResource("http://lds.org/afn/" + child.value));  // XXX - need standard URI
				    }
				else if (child.tag.equals("TITL"))
				    {
					addStatement(model,
						     uri,
						     gedcom_200101.title,
						     child.value);
				    }
			    }
		    }
		else if (node.tag.equals("FAM"))
		    {
			nfamilies++;
			org.w3c.rdf.model.Resource uri = model.getNodeFactory().createResource("#" + node.key);
			addStatement(model,
				     uri, 
				     org.w3c.rdf.vocabulary.rdf_syntax_19990222.RDF.type,
				     gedcom_200101.Family);
			
			java.util.Iterator childIterator = node.children.iterator();
			while (childIterator.hasNext())
			    {
				GEDCOM.Node child = (GEDCOM.Node) childIterator.next();
				if (child.tag.equals("MARR"))
				    {
					addEvent(model,
						 uri,
						 child,
						 gedcom_200101.Marriage,
						 gedcom_200101.marriage);
				    }
				else if ((child.tag.equals("DIV")
					  && (child.value.equals("Y"))))
				    {
					addEvent(model,
						 uri,
						 child,
						 gedcom_200101.Divorce,
						 gedcom_200101.divorce);
				    }
			    }
		    }
		else
		    {
			// XXX - nothing
		    }
	    }

	org.w3c.rdf.syntax.RDFSerializer serializer = factory.createSerializer();
	serializer.serialize(model,
			     new java.io.FileWriter(outFile));

	System.out.println(nindividuals + " individuals, " + nfamilies + " families, " + model.size() + " DAML statements");
    }
}
