// $Id: Search.java,v 1.2 2002/04/11 00:04:38 mdean Exp $


package org.daml.wordsearch;


public class Search
{
    static void usage()
    {
	System.err.println("Usage:  word");
	System.exit(1);
    }

    static java.sql.Statement sqlStatement;
    static long rdfType;

    static void addStatement(org.daml.grappa.DynamicViewer viewer,
			     com.hp.hpl.mesa.rdf.jena.model.Resource subject,
			     com.hp.hpl.mesa.rdf.jena.model.Property predicate,
			     Object object)
	throws Exception
    {
	org.daml.jena.DynamicModel model = viewer.getModel();
	com.hp.hpl.mesa.rdf.jena.model.Statement statement;
	if (object instanceof com.hp.hpl.mesa.rdf.jena.model.Resource)
	    statement = model.createStatement(subject, predicate, (com.hp.hpl.mesa.rdf.jena.model.Resource) object);
	else
	    statement = model.createStatement(subject, predicate, object);
	model.add(statement);
	viewer.addStatement(statement);
    }

    static void getWord(java.awt.Frame frame)
    {
	try {
	    String word = javax.swing.JOptionPane.showInputDialog(frame, "Search for Word");
	    if (word != null)
		doWord(word);
	} catch (Exception e) {
	    javax.swing.JOptionPane.showMessageDialog(frame, e, "Search for Word", javax.swing.JOptionPane.ERROR_MESSAGE);
	}
    }

    static public void doWord(String word)
	throws Exception
    {
	org.daml.grappa.DynamicViewer viewer = new org.daml.grappa.DynamicViewer("DAML Word Search:  " + word);
	viewer.tidyLiterals = true;
	org.daml.jena.DynamicModel model = viewer.getModel();

	// add menu item
	javax.swing.JMenuBar menubar = viewer.getJMenuBar();
	// javax.wing.JMenu search = new javax.swing.JMenu("Search");
	// menubar.add(search);
	javax.swing.JMenuItem search = new javax.swing.JMenuItem("Search");
	menubar.add(search);
	search.addActionListener(new java.awt.event.ActionListener()
	    {
		public void actionPerformed(java.awt.event.ActionEvent event)
		{
		    getWord(null);
		}
	    });

	java.sql.ResultSet results = sqlStatement.executeQuery("select id from word where word = '" + word + "'");
	while (results.next())
	    {
		long object = results.getLong("id");
		System.out.println(object); // XXX
		for (long statement = org.daml.damldb.DAMLDB.firstObject(object);
		     statement != org.daml.damldb.DAMLDB.NULL_STATEMENT_ID;
		     statement = org.daml.damldb.DAMLDB.nextObject(statement))
		    {
			long subject = org.daml.damldb.DAMLDB.subject(statement);
			long predicate = org.daml.damldb.DAMLDB.predicate(statement);
			java.util.Vector types = new java.util.Vector();
			for (long subjectStatement = org.daml.damldb.DAMLDB.firstSubject(subject);
			     subjectStatement != org.daml.damldb.DAMLDB.NULL_STATEMENT_ID;
			     subjectStatement = org.daml.damldb.DAMLDB.nextSubject(subjectStatement))
			    {
				if (org.daml.damldb.DAMLDB.predicate(subjectStatement) == rdfType)
				    {
					types.add(org.daml.damldb.DAMLDB.toString(org.daml.damldb.DAMLDB.object(subjectStatement)));
				    }
			    }

			String objectString = org.daml.damldb.DAMLDB.toString(object);
			String subjectString = org.daml.damldb.DAMLDB.toString(subject);
			String predicateString = org.daml.damldb.DAMLDB.toString(predicate);
			com.hp.hpl.mesa.rdf.jena.model.Resource subjectResource= model.createResource(subjectString);
			com.hp.hpl.mesa.rdf.jena.model.Property predicateResource = model.createProperty(predicateString);
			addStatement(viewer,
				     subjectResource,
				     predicateResource,
				     objectString);

			java.util.Iterator iterator = types.iterator();
			while (iterator.hasNext())
			    {
				String type = (String) iterator.next();
				System.out.println(objectString + " is " + predicateString + " for " + type + " " + subjectString);
				addStatement(viewer,
					     subjectResource,
					     com.hp.hpl.mesa.rdf.jena.vocabulary.RDF.type,
					     model.createResource(type));
			    }

			// viewer.addSubject(subjectString);
		    }
	    }

	viewer.initialDisplay();
    }

    public static void main(String args[])
	throws Exception
    {
	// connect to database
	Class.forName("org.gjt.mm.mysql.Driver").newInstance();
	java.sql.Connection connection = java.sql.DriverManager.getConnection("jdbc:mysql://localhost/wordsearch");
	sqlStatement = connection.createStatement();

	rdfType = org.daml.damldb.DAMLDB.toLong("http://www.w3.org/1999/02/22-rdf-syntax-ns#type");

	if (args.length == 0)
	    getWord(null);
	for (int i = 0; i < args.length; i++)
	    doWord(args[i]);
    }
}
