/*
* This file or a portion of this file is licensed under the terms of
* the Globus Toolkit Public License, found in file ../GTPL, or at
* http://www.globus.org/toolkit/download/license.html. This notice must
* appear in redistributions of this file, with or without modification.
*
* Redistributions of this Software, with or without modification, must
* reproduce the GTPL in: (1) the Software, or (2) the Documentation or
* some other similar material which is provided with the Software (if
* any).
*
* Copyright 1999-2004 University of Chicago and The University of
* Southern California. All rights reserved.
*/
package org.griphyn.vdl.dbschema;
import edu.isi.pegasus.planner.invocation.InvocationRecord;
import java.sql.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Properties;
import java.io.*;
import java.lang.reflect.*;
import java.net.InetAddress;
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;
import javax.xml.transform.OutputKeys;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.DOMException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.InputSource;
import org.griphyn.vdl.util.ChimeraProperties;
import org.griphyn.vdl.util.Logging;
import org.griphyn.vdl.parser.*;
import edu.isi.pegasus.common.util.Separator;
import org.xml.sax.InputSource;
/**
* This class provides basic functionalities to interact with the
* backend database for invocation records, such as insertion, deletion,
* and search.
*
* @author Jens-S. Vöckler
* @author Yong Zhao
* @version $Revision$
*/
public class NXDInvSchema extends DatabaseSchema
implements PTC
{
private DocumentBuilderFactory m_factory;
private DocumentBuilder m_builder;
protected Collection m_db;
protected Collection m_ptc;
protected CollectionManagementService m_dbColService;
protected CollectionManagementService m_ptcColService;
protected XPathQueryService m_dbQrySvc;
protected XPathQueryService m_ptcQrySvc;
/**
* Default constructor for the provenance tracking.
*
* @param dbDriverName is the database driver name
*/
public NXDInvSchema( String dbDriverName )
throws ClassNotFoundException,
NoSuchMethodException, InstantiationException,
IllegalAccessException, InvocationTargetException,
SQLException, IOException, ParserConfigurationException
{
// load the driver from the properties
super(); // call minimalistic c'tor, no driver loading!
ChimeraProperties props = ChimeraProperties.instance();
m_dbschemaprops =
props.getDatabaseSchemaProperties( PROPERTY_PREFIX );
// extract those properties specific to the database driver.
// use default settings.
String driverPrefix = null;
String driverName = props.getDatabaseDriverName(driverPrefix);
Properties driverprops = props.getDatabaseDriverProperties(driverPrefix);
String url = props.getDatabaseURL(driverPrefix);
try {
m_factory = DocumentBuilderFactory.newInstance();
m_builder = m_factory.newDocumentBuilder();
Class cl = Class.forName(driverName);
Database database = (Database) cl.newInstance();
DatabaseManager.registerDatabase(database);
// get the collection
m_db = DatabaseManager.getCollection(url + "/db");
m_dbColService = (CollectionManagementService)
m_db.getService("CollectionManagementService", "1.0");
m_ptc = m_db.getChildCollection("ptc");
if(m_ptc == null) {
// collection does not exist, create
m_ptc = m_dbColService.createCollection("ptc");
}
m_ptc.setProperty(OutputKeys.INDENT, "no");
m_ptcColService = (CollectionManagementService)
m_ptc.getService("CollectionManagementService", "1.0");
m_dbQrySvc = (XPathQueryService) m_db.getService("XPathQueryService", "1.0");
m_ptcQrySvc = (XPathQueryService) m_ptc.getService("XPathQueryService", "1.0");
m_dbQrySvc.setProperty("indent", "no");
m_ptcQrySvc.setProperty("indent", "no");
} catch (XMLDBException e) {
throw new SQLException (e.getMessage());
}
}
/**
* Checks the existence of an invocation record in the database.
* The information is based on the (start,host,pid) tuple, although
* with private networks, cases may arise that have this tuple
* identical, yet are different.
*
* @param start is the start time of the grid launcher
* @param host is the address of the host it ran upon
* @param pid is the process id of the grid launcher itself.
* @return the id of the existing record, or -1
*/
public long
getInvocationID( java.util.Date start, InetAddress host, int pid )
throws SQLException
{
long result = -1;
Logging.instance().log("xaction", 1, "START select invocation id" );
String xquery = "/invocation[@start='" + start + "']";
xquery += "[@host='" + host.getHostAddress() + "']";
xquery += "[@pid=" + pid + "]";
try {
Logging.instance().log( "nxd", 2, xquery );
ResourceSet rs = m_dbQrySvc.query(xquery);
ResourceIterator i = rs.getIterator();
if (i.hasMoreResources()) {
result = 1;
} else {
result = -1;
}
} catch (XMLDBException e) {
throw new SQLException (e.getMessage());
}
Logging.instance().log("xaction", 1, "FINAL select invocation id" );
return result;
}
/**
* Inserts an invocation record into the database.
*
* @param ivr is the invocation record to store.
* @return true, if insertion was successful, false otherwise.
*/
public boolean
saveInvocation( InvocationRecord ivr )
throws SQLException
{
try {
StringWriter sw = new StringWriter();
ivr.toXML(sw, "", null);
// create new XMLResource; an id will be assigned to the new resource
XMLResource document = (XMLResource)m_ptc.createResource(null, "XMLResource");
document.setContent(sw.toString());
System.out.println(sw.toString());
m_ptc.storeResource(document);
return true;
} catch (Exception e) {
throw new SQLException (e.getMessage());
}
}
}