From: <rd...@us...> - 2007-09-09 23:51:04
|
Revision: 434 http://digir.svn.sourceforge.net/digir/?rev=434&view=rev Author: rdg Date: 2007-09-09 16:50:56 -0700 (Sun, 09 Sep 2007) Log Message: ----------- Configuration interface can now make use of existing equivalent mappings when clcking on the "automap" button. Modified Paths: -------------- tapirlink/trunk/ChangeLog.txt tapirlink/trunk/classes/CnsSchemaHandler_v1.php tapirlink/trunk/classes/TpLocalMapping.php tapirlink/trunk/classes/TpMappingForm.php tapirlink/trunk/classes/TpUtils.php tapirlink/trunk/www/localconfig_dist.php tapirlink/trunk/www/tapir_globals.php Modified: tapirlink/trunk/ChangeLog.txt =================================================================== --- tapirlink/trunk/ChangeLog.txt 2007-09-07 00:52:55 UTC (rev 433) +++ tapirlink/trunk/ChangeLog.txt 2007-09-09 23:50:56 UTC (rev 434) @@ -1,7 +1,9 @@ -Release 0.5 (2007-09-?) +Release 0.5 (2007-09-09) ------------------------ -(revision ?) +(revision 418) + * Configuration interface can now make use of existing equivalent mappings + when clcking on the "automap" button. * Added alias support for query templates. * Caching of query templates, output models and response structures is now activated by default (there were many bugfixes related with caching). Modified: tapirlink/trunk/classes/CnsSchemaHandler_v1.php =================================================================== --- tapirlink/trunk/classes/CnsSchemaHandler_v1.php 2007-09-07 00:52:55 UTC (rev 433) +++ tapirlink/trunk/classes/CnsSchemaHandler_v1.php 2007-09-09 23:50:56 UTC (rev 434) @@ -60,11 +60,8 @@ $file = $parts[0]; } + // there is nothing here... - -// there is nothing here... - - $lines = $this->ReadFile($file); foreach ( $lines as $line_number => $line ) @@ -205,14 +202,15 @@ * Returns the file as an array of lines * */ - function ReadFile($file){ - + function ReadFile( $file ) + { $lines = array(); // if we can transparently open URLs // or this is just a local file - if (ini_get('allow_url_fopen') || !TpUtils::IsUrl($file)){ - if ( !( $lines = file( $file ) ) ) + if ( ini_get('allow_url_fopen') || ! TpUtils::IsUrl( $file ) ) + { + if ( ! ( $lines = file( $file ) ) ) { $error = "Could not open remote file: $file"; TpDiagnostics::Append( DC_IO_ERROR, $error, DIAG_ERROR ); @@ -220,31 +218,31 @@ return false; } } - // this is a URL and we are not permitted to fopen urls // we must use cURL - else{ - + else + { $fp = tmpfile(); // open a temporary file to write to - $ch = curl_init($file); // open a curl session - curl_setopt($ch, CURLOPT_FILE, $fp); // tell the curl session to write results to the temp file - curl_exec($ch); // execute the curl session - curl_close($ch); // close it + $ch = curl_init( $file ); // open a curl session + curl_setopt( $ch, CURLOPT_FILE, $fp ); // tell the curl session to write results to the temp file + curl_exec( $ch ); // execute the curl session + curl_close( $ch ); // close it // read the temp file into an array - rewind($fp); + rewind( $fp ); $lines = array(); - while (!feof($fp)) { - $lines[] = fgets($fp); + + while ( ! feof( $fp ) ) + { + $lines[] = fgets( $fp ); } - fclose($fp); // close the temp file + fclose( $fp ); // close the temp file } return $lines; } // end member function ReadFile - } // end of CnsSchemaHandler_v1 ?> \ No newline at end of file Modified: tapirlink/trunk/classes/TpLocalMapping.php =================================================================== --- tapirlink/trunk/classes/TpLocalMapping.php 2007-09-07 00:52:55 UTC (rev 433) +++ tapirlink/trunk/classes/TpLocalMapping.php 2007-09-09 23:50:56 UTC (rev 434) @@ -474,9 +474,9 @@ { foreach ( $this->mMappedSchemas as $namespace => $schema ) { - $r_concepts =& $schema->GetConcepts(); + $concepts = $schema->GetConcepts(); - foreach ( $r_concepts as $id => $concept ) + foreach ( $concepts as $id => $concept ) { if ( $id == $conceptId ) { Modified: tapirlink/trunk/classes/TpMappingForm.php =================================================================== --- tapirlink/trunk/classes/TpMappingForm.php 2007-09-07 00:52:55 UTC (rev 433) +++ tapirlink/trunk/classes/TpMappingForm.php 2007-09-09 23:50:56 UTC (rev 434) @@ -32,10 +32,12 @@ { var $mStep = 5; var $mLabel = 'Mapping'; - var $mLocalMapping; var $mTablesAndColumns = array(); // array (table_name => array(column obj) ) var $mXpr; // XML parser to original data - var $mXpt; // XML parser to current data + var $mAutomapReferencesFiles; // will become array: namespace => references file + var $mLastNs = ''; // Last namespace parsed in the automapping index + var $mConceptsWithReferences; // will become array: concept id => array of concept ids + var $mBaseConceptId; // base concept id being parsed function TpMappingForm( ) { @@ -384,6 +386,15 @@ $parts = explode( '^', $_REQUEST['refresh'] ); $automap_namespace = $parts[0]; + + $this->_LoadIndexOfMappingReferences(); + + if ( isset( $this->mAutomapReferencesFiles[$automap_namespace] ) ) + { + $references_file = $this->mAutomapReferencesFiles[$automap_namespace]; + + $this->_LoadReferences( $references_file ); + } } $fill_namespace = ''; @@ -518,11 +529,39 @@ function GetAutoMapping( $concept ) { + // Note: This method assumes that _LoadIndexOfMappingReferences + // and _LoadReferences on the respective file were already called + + // Check if there's an equivalent mapping that can be reused + + $concept_id = $concept->GetId(); + + if ( is_array( $this->mConceptsWithReferences ) and + isset( $this->mConceptsWithReferences[$concept_id] ) ) + { + $references = $this->mConceptsWithReferences[$concept_id]; + + $local_mapping = $this->mResource->GetLocalMapping(); // work on a copy + + foreach ( $references as $reference ) // $reference is a concept id + { + $equivalent_concept = $local_mapping->GetConcept( $reference ); + + if ( ( ! is_null( $equivalent_concept ) ) and + $equivalent_concept->IsMapped() ) + { + return $equivalent_concept->GetMapping(); // get a copy, not reference + } + } + } + + // If could not find an existing reference concept, + // check local field names + $mapping = TpConceptMappingFactory::GetInstance( 'SingleColumnMapping' ); $mapping->SetTablesAndColumns( $this->mTablesAndColumns ); - // Auto mapping stuff - if ( count( $this->mTablesAndColumns == 1 ) ) + if ( count( $this->mTablesAndColumns == 1 ) ) // There is only one table { $tables = array_keys( $this->mTablesAndColumns ); @@ -530,6 +569,7 @@ foreach ( $this->mTablesAndColumns[$tables[0]] as $field_id => $field ) { + // If the table has a field with the same name of the concept if ( strcasecmp( $concept->GetName(), $field->name ) == 0 ) { $mapping->SetField( $field->name ); @@ -547,12 +587,140 @@ } // end of member function GetAutoMapping - function GetLocalMapping( ) + function _LoadIndexOfMappingReferences( ) { - return $this->mLocalMapping; + if ( is_array( $this->mAutomapReferencesFiles ) ) + { + return; + } - } // end of member function GetLocalMapping + // Initialize here (when the property is an array this will also + // indicate that the index file has been already loaded) + $this->mAutomapReferencesFiles = array(); + if ( defined( 'TP_INDEX_OF_MAPPING_REFERENCES' ) ) + { + $fp = TpUtils::GetFileHandle( TP_INDEX_OF_MAPPING_REFERENCES ); + + if ( $fp ) + { + $parser = xml_parser_create(); + xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0); + xml_set_object( $parser, $this ); + xml_set_element_handler( $parser, 'StartIndexElement', 'EndIndexElement' ); + + while ( $data = fread( $fp, 4096 ) ) + { + if ( ! xml_parse( $parser, $data, feof( $fp ) ) ) + { + $error = sprintf( "Error parsing references index file: %s at line %d", + xml_error_string( xml_get_error_code( $parser ) ), + xml_get_current_line_number( $parser ) ); + + TpDiagnostics::Append( DC_XML_PARSE_ERROR, $error, DIAG_ERROR ); + return false; + } + } + + fclose( $fp ); + + xml_parser_free( $parser ); + } + } + + } // end of member function _LoadIndexOfMappingReferences + + function StartIndexElement( $parser, $elementName, $attrs ) + { + if ( strcasecmp( $elementName, 'forSchema' ) == 0 ) + { + if ( isset( $attrs['namespace'] ) ) + { + $this->mLastNs = $attrs['namespace']; + } + } + else if ( strcasecmp( $elementName, 'ref' ) == 0 ) + { + if ( $this->mLastNs and isset( $attrs['location'] )) + { + $this->mAutomapReferencesFiles[$this->mLastNs] = $attrs['location']; + } + } + + } // end of member function StartIndexElement + + function EndIndexElement( $parser, $elementName ) + { + // Nothing so far + + } // end of member function EndIndexElement + + function _LoadReferences( $referencesFile ) + { + if ( ! is_null( $this->mConceptsWithReferences ) ) + { + return; + } + + // Initialize here (when the property is an array this will also + // indicate that the references file has been already loaded) + $this->mConceptsWithReferences = array(); + + $fp = TpUtils::GetFileHandle( $referencesFile ); + + if ( $fp ) + { + $parser = xml_parser_create(); + xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0); + xml_set_object( $parser, $this ); + xml_set_element_handler( $parser, 'StartRefElement', 'EndRefElement' ); + + while ( $data = fread( $fp, 4096 ) ) + { + if ( ! xml_parse( $parser, $data, feof( $fp ) ) ) + { + $error = sprintf( "Error parsing references file: %s at line %d", + xml_error_string( xml_get_error_code( $parser ) ), + xml_get_current_line_number( $parser ) ); + + TpDiagnostics::Append( DC_XML_PARSE_ERROR, $error, DIAG_ERROR ); + return false; + } + } + + fclose( $fp ); + + xml_parser_free( $parser ); + } + + } // end of member function _LoadReferences + + function StartRefElement( $parser, $elementName, $attrs ) + { + if ( strcasecmp( $elementName, 'baseConcept' ) == 0 ) + { + if ( isset( $attrs['id'] ) ) + { + $this->mBaseConceptId = $attrs['id']; + $this->mConceptsWithReferences[$this->mBaseConceptId] = array(); + } + } + else if ( strcasecmp( $elementName, 'concept' ) == 0 ) + { + if ( $this->mBaseConceptId and isset( $attrs['id'] )) + { + array_push( $this->mConceptsWithReferences[$this->mBaseConceptId], $attrs['id'] ); + } + } + + } // end of member function StartRefElement + + function EndRefElement( $parser, $elementName ) + { + // Nothing so far + + } // end of member function EndRefElement + function GetInputName( $concept, $suffix ) { return strtr( $concept->GetId() . '^' . $suffix, '.', '_' ); Modified: tapirlink/trunk/classes/TpUtils.php =================================================================== --- tapirlink/trunk/classes/TpUtils.php 2007-09-07 00:52:55 UTC (rev 433) +++ tapirlink/trunk/classes/TpUtils.php 2007-09-09 23:50:56 UTC (rev 434) @@ -482,5 +482,33 @@ } // end of DumpArray + function GetFileHandle( $location ) // Remember to close the file handle!! + { + if ( ini_get('allow_url_fopen') || ! TpUtils::IsUrl( $location ) ) + { + if ( !( $fp = fopen( $location, 'r' ) ) ) + { + $error = "Could not open file: $location"; + TpDiagnostics::Append( DC_IO_ERROR, $error, DIAG_ERROR ); + + return null; + } + } + else + { + // This is a URL and we are not permitted to fopen urls, so use cURL. + // Open a temporary file to write curl session results to. + $fp = tmpfile(); + $ch = curl_init( $location ); + curl_setopt( $ch, CURLOPT_FILE, $fp ); + curl_exec( $ch ); + curl_close( $ch ); + rewind( $fp ); + } + + return $fp; + + } // end of member function GetFileHandle + } // end of TpUtils ?> \ No newline at end of file Modified: tapirlink/trunk/www/localconfig_dist.php =================================================================== --- tapirlink/trunk/www/localconfig_dist.php 2007-09-07 00:52:55 UTC (rev 433) +++ tapirlink/trunk/www/localconfig_dist.php 2007-09-09 23:50:56 UTC (rev 434) @@ -200,6 +200,12 @@ //define( 'TP_LANG_OPTIONS', serialize( $langs ) ); /** +* File containing an index of files that have mapping references +* for a particular conceptual schema (to help on automapping). +*/ +//define('TP_INDEX_OF_MAPPING_REFERENCES', 'http://somehost/somefile.xml'); + +/** * Note that it is also possible to change some of your default PHP operational * parameters here. For example, you could change the include_path setting * to work with your system if you do not have access to the PHP.ini file. Modified: tapirlink/trunk/www/tapir_globals.php =================================================================== --- tapirlink/trunk/www/tapir_globals.php 2007-09-07 00:52:55 UTC (rev 433) +++ tapirlink/trunk/www/tapir_globals.php 2007-09-09 23:50:56 UTC (rev 434) @@ -241,6 +241,15 @@ } /** +* The file name of an XML file which contains an index of files that have +* mapping references for a particular conceptual schema (to help on automapping). +*/ +if ( ! defined( 'TP_INDEX_OF_MAPPING_REFERENCES') ) +{ + define ( 'TP_INDEX_OF_MAPPING_REFERENCES', 'http://rs.tdwg.org/tapir/cs/mappings/index.xml' ); +} + +/** * Indicates whether the caching system should be used. If you have a fast * system and like to see the CPU meter pegged, then it's probably ok to * turn caching off... @@ -497,7 +506,7 @@ define( 'TP_MIN_PHP_VERSION', '4.2.3' ); -define( 'TP_VERSION', '0.4' ); +define( 'TP_VERSION', '0.5' ); $revision = '$Revision$.'; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |