/* * 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.util; import java.io.IOException; import java.io.File; import java.util.*; import edu.isi.pegasus.common.util.Currently; import edu.isi.pegasus.common.util.CommonProperties; import org.griphyn.vdl.util.Logging; /** * A Central Properties class that keeps track of all the properties * used by Chimera. All other classes access the methods in this class * to get the value of the property. It access the CommonProperties class * to read the property file. * * @author Jens-S. Vöckler * @author Yong Zhao * @version $Revision$ * * @see org.griphyn.common.util.CommonProperties */ public class ChimeraProperties { /** * Default values for schema locations. */ public static final String VDL_SCHEMA_LOCATION = "http://www.griphyn.org/chimera/vdl-1.24.xsd"; public static final String DAX_SCHEMA_LOCATION = "http://pegasus.isi.edu/schema/dax-4.0.xsd"; public static final String IVR_SCHEMA_LOCATION = "http://pegasus.isi.edu/schema/iv-2.1.xsd"; public static final String DB_ALL_PREFIX = "pegasus.catalog.*.db"; public static final String DBDRIVER_ALL_PREFIX = "pegasus.catalog.*.db.driver"; /** * Implements the Singleton access. */ private static ChimeraProperties m_instance = null; /** * The value of the PEGASUS_HOME environment variable. */ private String m_home; /** * The object holding all the properties pertaining * to the VDS system. */ private CommonProperties m_props; /** * To get a reference to the the object. */ public static ChimeraProperties instance() throws IOException, MissingResourceException { if (m_instance == null) { m_instance = new ChimeraProperties(); } return m_instance; } /** * Constructor that is called only once, when creating the * Singleton instance. */ private ChimeraProperties() throws IOException, MissingResourceException { m_props = getVDSPropertiesInstance(); m_home = m_props.getBinDir() + "/.."; } /** * Gets the handle to the property file. */ private CommonProperties getVDSPropertiesInstance() throws IOException, MissingResourceException { return CommonProperties.instance(); } /** * Set up logging */ public void setupLogging(Logging logger) { for ( Enumeration e = m_props.propertyNames(); e.hasMoreElements(); ) { String key = (String) e.nextElement(); if ( key.equals("pegasus.timestamp.format") ) { Currently c = new Currently( this.m_props.getProperty(key) ); logger.setDateFormat( c ); } else if ( key.startsWith("pegasus.log.") ) { String subkey = key.substring(8); logger.log( "default", 2, "found \"" + key + "\" -> " + subkey ); logger.register( subkey, this.m_props.getProperty(key) ); } else if ( key.startsWith( "pegasus.verbose" ) ) { int verbose = Integer.parseInt(this.m_props.getProperty(key)); logger.log( "default", 2, "verbosity mode = " + verbose ); logger.setVerbose(verbose); } } } /** * Accessor to $PEGASUS_HOME/etc. The files in this directory have a low * change frequency, are effectively read-only, they reside on a * per-machine basis, and they are valid usually for a single user. * * @return the "etc" directory of the VDS runtime system. */ public File getSysConfDir() { return m_props.getSysConfDir(); } /** * Accessor: Obtains the root directory of the VDS/Chimera runtime * system. * * @return the root directory of the VDS runtime system, as initially * set from the system properties. */ public String getVDSHome() { return m_home; } /** * Accessor to $PEGASUS_HOME/share. The files in this directory have a low * change frequency, are effectively read-only, can be shared via a * networked FS, and they are valid for multiple users. * * @return the "share" directory of the VDS runtime system. */ public File getDataDir() { return m_props.getSharedStateDir(); } /** * Get the fully qualified class name of the VDC-implementing * database schema. If no properties are configured, it returns * the file-based VDC-schema implementation. * * @return the fully-qualified name of the class which implements * the VDC according to properties. * @see org.griphyn.vdl.dbschema.SingleFileSchema */ public String getVDCSchemaName() { // load the default schema name - default is to use the file based // schema. String schemaName = m_props.getProperty( "pegasus.db.vdc.schema", "SingleFileSchema" ); if ( schemaName.indexOf('.') == -1 ) schemaName = "org.griphyn.vdl.dbschema." + schemaName; // always returns something return schemaName; } /** * Obtains the fully qualified class name of the PTC-implementing * database schema. * * @return the fully-qualified name of the class which implements * the PTC according to properties, or <code>null</code>, if no * such class exists. */ public String getPTCSchemaName() { // load the default schema name - default is to use the file based // schema. //this should not have a default value because if this property is not set // the invocation records should not be populated to DB. String schemaName = m_props.getProperty( "pegasus.catalog.provenance"); if ( schemaName != null && schemaName.indexOf('.') == -1 ) schemaName = "org.griphyn.vdl.dbschema." + schemaName; // may return null return schemaName; } /** * Obtains the fully qualified class name of the WF-implementing * database schema. * * @return the fully-qualified name of the class which implements the * WF according to properties, or <code>null</code>, if no such class * exists. */ public String getWFSchemaName() { // load the default schema name String schemaName = m_props.getProperty( "pegasus.db.wf.schema" ); if ( schemaName != null && schemaName.indexOf('.') == -1 ) schemaName = "org.griphyn.vdl.dbschema." + schemaName; // may return null return schemaName; } /** * Gets the location the VDLx XML schema from properties, if available. * Please note that the schema location URL in the instance document * is only a hint, and may be overriden by the findings of this method. * * @return a location pointing to a definition document of the XML * schema that can read VDLx. Result may be null, if such a document * is unknown or unspecified. * @see org.griphyn.vdl.parser.VDLxParser#VDLxParser( String ) */ public String getVDLSchemaLocation() { // treat URI as File, yes, I know - I need the basename File uri = new File( VDL_SCHEMA_LOCATION ); File vdlx = // create a pointer to the default local position new File( this.m_props.getSysConfDir(), uri.getName() ); // Nota bene: pegasus.schema.vdl may be a networked URI... return m_props.getProperty( "pegasus.schema.vdl", vdlx.getAbsolutePath() ); } /** * Gets the location of the DAX XML schema from properties, if available. * Please note that the schema location URL in the instance document * is only a hint, and may be overriden by the findings of this method. * * @return a location pointing to a definition document of the XML * schema that can read DAX. Result may be null, if such a document * is unknown or unspecified. * @see org.griphyn.vdl.parser.DAXParser#DAXParser( String ) */ public String getDAXSchemaLocation() { // treat URI as File, yes, I know - I need the basename File uri = new File( DAX_SCHEMA_LOCATION ); File dax = // create a pointer to the default local position new File( m_props.getSysConfDir(), uri.getName() ); // Nota bene: pegasus.schema.dax may be a networked URI... return m_props.getProperty( "pegasus.schema.dax", dax.getAbsolutePath() ); } /** * Helps the load database to locate the invocation record XML schema, * if available. Please note that the schema location URL in the * instance document is only a hint, and may be overriden by the * findings of this method. * * @return a location pointing to a definition document of the XML * schema that can read DAX. Result may be null, if such a document * is unknown or unspecified. * @see org.griphyn.vdl.parser.InvocationParser#InvocationParser( String ) */ public String getPTCSchemaLocation() { // treat URI as File, yes, I know - I need the basename File uri = new File( IVR_SCHEMA_LOCATION ); File ptc = // create a pointer to the default local position new File( m_props.getSysConfDir(), uri.getName() ); // Nota bene: pegasus.schema.ptc may be a networked URI... return m_props.getProperty( "pegasus.catalog.provenance", ptc.getAbsolutePath() ); } /** * Get the rc.data file location, which is used by shell planner * */ public String getRCLocation() { File rcFile = new File( m_props.getSysConfDir(), "rc.data" ); return m_props.getProperty( "pegasus.db.rc", rcFile.getAbsolutePath() ); } /** * Get the tc.data file location, which is used by shell planner * */ public String getTCLocation() { File tcFile = new File( m_props.getSysConfDir(), "tc.data" ); return m_props.getProperty( "pegasus.db.tc", tcFile.getAbsolutePath() ); } /** * Gets the name of the database schema name from the properties. * * @param dbSchemaPrefix is the database schema key name in the * properties file, which happens to be the pointer to the class * to load. * @return the database schema name, result may be null, if such * property is not specified. */ public String getDatabaseSchemaName( String dbSchemaPrefix ) { return m_props.getProperty( dbSchemaPrefix ); } /** * Gets then name of the database driver from the properties. * A specific match is preferred over the any match. * * @param dbDriverPrefix is the database schema key name in the * properties file, which happens to be the pointer to the class * to load. * @return the database driver name, result may be null, if such * property is not specified. */ public String getDatabaseDriverName( String dbDriverPrefix ) { return ( dbDriverPrefix == null ? m_props.getProperty( DBDRIVER_ALL_PREFIX ) : m_props.getProperty( dbDriverPrefix, m_props.getProperty(DBDRIVER_ALL_PREFIX) ) ); } /** * Gets the Database URL from Properties file, the URL is a contact * string to the database. The URL contact string is removed from the * regular properties which are passed to the JDBC driver. * * @param dbDriverPrefix is the database schema key name. * @return the database url, result may be <code>null</code>, if the * driver URL is not specified. * @see #getDatabaseDriverProperties( String ) */ public String getDatabaseURL( String dbDriverPrefix ) { return ( dbDriverPrefix == null ? //pick pegasus.catalog.*.db.url m_props.getProperty( DB_ALL_PREFIX + ".url" ) : m_props.getProperty( dbDriverPrefix + ".url", //default value pegasus.catalog.*.db.url m_props.getProperty( DB_ALL_PREFIX + ".url" ) ) ); } /** * Extracts a specific property key subset from the known properties. * The prefix is removed from the keys in the resulting dictionary. * * @param prefix is the key prefix to filter the properties by. * @return a property dictionary matching the filter key. May be * an empty dictionary, if no prefix matches were found. */ public Properties matchingSubset( String prefix ) { return m_props.matchingSubset( prefix, false ); } /** * Obtains database driver specific properties. * * @param dbDriverPrefix is the database driver property key prefix * for which to obtain properties. * @return a property set to be filled with driver specific * properties. May be null if no such properties specified. */ public Properties getDatabaseDriverProperties( String dbDriverPrefix ) { Properties result = new Properties( matchingSubset(DB_ALL_PREFIX) ); if (dbDriverPrefix != null) result.putAll( matchingSubset( dbDriverPrefix ) ); result.remove("url"); // must not be passed to the JDBC driver return result; } /** * Obtains the database schema specific properties. * * @param dbSchemaPrefix is the database schema key name in the * properties file * @return a property set to be filled with schema specific * properties. May be null if no such properties specified. */ public Properties getDatabaseSchemaProperties( String dbSchemaPrefix ) { return matchingSubset( dbSchemaPrefix ); } /** * Gets the name of the replica catalog implementating class from the * properties. * * @param dbReplicaPrefix is the replica catalog class name in the * properties file. * @return the replica catalog implementing class name, result may be * null, if such property is not specified. */ public String getReplicaCatalogName( String dbReplicaPrefix ) { return m_props.getProperty( dbReplicaPrefix ); } /** * Obtains all properties to handle the experimental replica catalog * interface. * @param dbReplicaPrefix is the prefix for the replica catalog's * implementation configuration. * @return all properties, excluding the prefix itself, for the RC. */ public Properties getReplicaCatalogProperties( String dbReplicaPrefix ) { return matchingSubset( dbReplicaPrefix ); } }