Subversion Repositories Sites.tela-botanica.org

Rev

Rev 480 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * $Id: tapir.php 1953 2009-01-05 19:59:53Z rdg $
 * 
 * LICENSE INFORMATION
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details:
 * 
 * http://www.gnu.org/copyleft/gpl.html
 * 
 * 
 * @author Renato De Giovanni <renato [at] cria . org . br>
 * @author Dave Vieglais (Biodiversity Research Center, University of Kansas)
 * 
 * ACKNOWLEDGEMENTS
 * 
 * TapirLink has been generously funded by the Biodiversity 
 * Information Standards, TDWG, with resources from the Gordon and 
 * Betty Moore Foundation. The Global Biodiversity Information 
 * Facility, GBIF, has also been a major supporter of the TAPIR 
 * initiative since its very beginning and also collaborated to 
 * test this software.
 *
 * TapirLink was based on the DiGIR PHP provider, which was 
 * originally developed by Dave Vieglais from the Biodiversity 
 * Research Center, University of Kansas. The software is now being 
 * distributed under the GPL with permission from its original
 * author. The original copyright information is also 
 * reproduced below.
 * 
 * --------------------------------
 * 
 * Copyright (c) 2002 The University of Kansas Natural History 
 * Museum and Biodiversity Research Center. All rights reserved.
 * 
 * Permission is hereby granted, free of charge, to any person 
 * obtaining a copy of this software and associated documentation 
 * files (the "Software"), to deal with the Software without 
 * restriction, including without limitation the rights to use, 
 * copy, modify, merge, publish, distribute, sublicense, and/or 
 * sell copies of the Software, and to permit persons to whom the 
 * Software is furnished to do so, subject to the following 
 * conditions:
 * 
 * - Redistributions of source code must retain the above copyright 
 * notice, this list of conditions and the following disclaimers.
 * 
 * - Redistributions in binary form must reproduce the above 
 * copyright notice, this list of conditions and the following 
 * disclaimers in the documentation and/or other materials provided 
 * with the distribution.
 * 
 * - Neither the names of The University of Kansas Natural History 
 * Museum and Biodiversity Research Center, The University of Kansas 
 * at Lawrence, nor the names of its contributors may be used to 
 * endorse or promote products derived from this Software without 
 * specific prior written permission.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT 
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 * DEALINGS IN THE SOFTWARE.
 */

// Definition of this constant can be used to indicate that
// the Web Service (tapir.php) was called
define( 'TP_RUNNING_TAPIR', 1 );

require_once('tapir_globals.php');
require_once('TpUtils.php');
require_once('TpServiceUtils.php');
require_once('TpDiagnostics.php');
require_once('TpResources.php');
require_once('TpRequest.php');
require_once('TpResponse.php');

// Register a new error handler
$old_error_handler = set_error_handler( 'TapirErrorHandler' );

// Avoid HTML in errors
ini_set( 'html_errors', false );

// Store timestamp for profiling
define( 'INITIAL_TIMESTAMP', TpUtils::MicrotimeFloat() );

// Logs
TpUtils::InitializeLogs();

// Main logger
global $g_log;

// Debug logger
global $g_dlog;

$g_dlog->debug( '[Starting debug log]' );
$g_dlog->debug( 'TapirLink version: '.TP_VERSION.' (revision '.TP_REVISION.')' );

$request_uri = ( isset( $_SERVER['REQUEST_URI'] ) ) ? $_SERVER['REQUEST_URI'] : 'null';

$g_dlog->debug( 'Request URI: '.$request_uri );
$g_dlog->debug( 'Include path: '.ini_get( 'include_path' ) );

// Set the maximum script run time
// Note: if php set safe mode is on then this can't be set from here, 
// and will need to be set in php.ini file
// Définit à 120 par TapirLink mis à 60 globalement pour Sequoia car safe_mode actif
if (! ini_get('safe_mode') ) {
        set_time_limit( TP_MAX_RUNTIME );
}

// Debugging
if ( ! defined( '_DEBUG' ) )
{
    // Load the value from a request variable called "debug", default is false
    // for security reasons
    if ( TP_ALLOW_DEBUG )
    {
        define( '_DEBUG', (bool)TpUtils::GetVar( 'debug', false ) );
    }
    else
    {
        define( '_DEBUG', false );
    }
}

// Instantiate request object
$request = new TpRequest();

// If no resource was specified in the request URI, then dump some help information
if ( ! $request->ExtractResourceCode() )
{
   include_once( 'index.php' );
   die();
}

// Get resource code and check if it's valid
$resource_code = $request->GetResourceCode();

$r_resources =& TpResources::GetInstance();

$raise_errors = false;
$r_resource =& $r_resources->GetResource( $resource_code, $raise_errors );

if ( $r_resource == null )
{
    $response = new TpResponse( $request );
    $response->ReturnError( 'Resource "'.$resource_code.'" not found.' );
    die();
}

$r_resources->SetCurrentResourceCode( $resource_code );

if ( $r_resource->GetStatus() != 'active' )
{
    $response = new TpResponse( $request );
    $response->ReturnError( 'Resource "'.$resource_code.'" is not active.' );
    die();
}

// Check PHP version
$current_version = phpversion();

if ( version_compare( $current_version, '5.0', '<' ) > 0 )
{
    if ( version_compare( $current_version, TP_MIN_PHP_VERSION, '<' ) > 0 )
    {
        $msg = 'PHP Version '.TP_MIN_PHP_VERSION.' or later required. '.
               'Some features may not be available. Detected version '.$current_version;
        TpDiagnostics::Append( DC_VERSION_MISMATCH, $msg, DIAG_WARN );
    }
}
else if ( version_compare( $current_version, '6.0', '<' ) > 0 )
{
    if ( version_compare( $current_version, '5.0.3', '<' ) > 0 )
    {
        // Avoid bug in "xml_set_start_namespace_decl_handler"
        $msg = 'Provider error: Unsupported PHP version ('.$current_version.'). To '.
               'use PHP5 it is necessary to have at least version 5.0.3';

        $response = new TpResponse( $request );
        $response->ReturnError( $msg );
        die();
    }
}

// Get parameters
if ( ! $request->InitializeParameters() or 
     TpDiagnostics::Count( array( DIAG_ERROR, DIAG_FATAL ) ) )
{
    $response = new TpResponse( $request );
    $response->ReturnError( 'Failed to parse request' );
    die();
}

// By default, assume that the database encoding cannot be detected 
// by the mb_detect_encoding PHP function
global $g_encoding_can_be_detected;

$operation = $request->GetOperation();

if ( $operation == 'ping' )
{
    require_once('TpPingResponse.php');

    $response = new TpPingResponse( $request );
}
else if ( $operation == 'capabilities' )
{
    require_once('TpCapabilitiesResponse.php');

    $response = new TpCapabilitiesResponse( $request );
}
else if ( $operation == 'metadata' )
{
    require_once('TpMetadataResponse.php');

    $response = new TpMetadataResponse( $request );
}
else if ( $operation == 'inventory' )
{
    require_once('TpInventoryResponse.php');

    $response = new TpInventoryResponse( $request );
}
else if ( $operation == 'search' )
{
    require_once('TpSearchResponse.php');

    $response = new TpSearchResponse( $request );
}
else
{
    // Unknown operation 
    $response = new TpResponse( $request );
    $response->ReturnError( 'Unknown operation "'.$operation.'"' );
    die();
}

$response->Process();

exit();

?>