From: <rd...@us...> - 2007-03-04 23:55:23
|
Revision: 278 http://digir.svn.sourceforge.net/digir/?rev=278&view=rev Author: rdg Date: 2007-03-04 15:55:19 -0800 (Sun, 04 Mar 2007) Log Message: ----------- * Added support to new parameter "omit-ns". * Refactored namespace manager in preparation to support prefixes in node mapping. Modified Paths: -------------- tapirlink/trunk/classes/TpNamespaceManager.php tapirlink/trunk/classes/TpOutputModel.php tapirlink/trunk/classes/TpRequest.php tapirlink/trunk/classes/TpSearchResponse.php tapirlink/trunk/classes/TpXmlGenerator.php Added Paths: ----------- tapirlink/trunk/classes/TpNamespace.php Added: tapirlink/trunk/classes/TpNamespace.php =================================================================== --- tapirlink/trunk/classes/TpNamespace.php (rev 0) +++ tapirlink/trunk/classes/TpNamespace.php 2007-03-04 23:55:19 UTC (rev 278) @@ -0,0 +1,66 @@ +<?php +/** + * $Id$ + * + * 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> + */ + +class TpNamespace +{ + var $mPrefix = ''; + var $mUri; + var $mFlags = array(); + + function TpNamespace( $prefix, $uri, $flag=null ) + { + $this->mPrefix = $prefix; + $this->mUri = $uri; + + if ( ! is_null( $flag ) ) + { + $this->mFlags[0] = $flag; + } + + } // end of member function TpNamespace + + function GetUri( ) + { + return $this->mUri; + + } // end of member function GetUri + + function GetPrefix( ) + { + return $this->mPrefix; + + } // end of member function GetPrefix + + function HasFlag( $flag ) + { + return in_array( $flag, $this->mFlags ); + + } // end of member function HasFlag + + function RemoveFlag( $flag ) + { + unset( $this->mFlags[$flag] ); + + } // end of member function RemoveFlag + +} // end of TpNamespace +?> \ No newline at end of file Property changes on: tapirlink/trunk/classes/TpNamespace.php ___________________________________________________________________ Name: svn:keywords + Id Modified: tapirlink/trunk/classes/TpNamespaceManager.php =================================================================== --- tapirlink/trunk/classes/TpNamespaceManager.php 2007-02-28 12:20:02 UTC (rev 277) +++ tapirlink/trunk/classes/TpNamespaceManager.php 2007-03-04 23:55:19 UTC (rev 278) @@ -20,11 +20,12 @@ * @author Renato De Giovanni <renato [at] cria . org . br> */ +require_once('TpNamespace.php'); require_once('TpDiagnostics.php'); class TpNamespaceManager { - var $mData = array(); // parser obj => array( prefix => namespace ) + var $mNamespaces = array(); // parser obj => array( sequence => TpNamespace obj ) // No constructor - this class uses the singleton pattern // Use GetInstance instead @@ -42,39 +43,51 @@ } // end of member function GetInstance - function AddNamespace( $parser, $prefix, $uri ) + function AddNamespace( $parser, $prefix, $uri, $flag=null ) { if ( empty( $prefix ) ) { $prefix = 'default'; } - $this->mData[$parser][$prefix] = $uri; + $namespace = new TpNamespace( $prefix, $uri, $flag ); + $this->mData[$parser][] = $namespace; + } // end of member function AddNamespace function GetNamespace( $parser, $prefix ) { - if ( ! isset( $this->mData[$parser][$prefix] ) ) + $parser_namespaces = $this->mData[$parser]; + + for ( $i = count( $parser_namespaces ) - 1; $i >= 0; --$i ) { - $error = 'Could not find namespace declaration for prefix "'.$prefix.'"'; - TpDiagnostics::Append( DC_INVALID_REQUEST, $error, DIAG_ERROR ); - return null; + $ns = $parser_namespaces[$i]; + + if ( $ns->GetPrefix() == $prefix ) + { + return $ns->GetUri(); + } } - return $this->mData[$parser][$prefix]; + $error = 'Could not find namespace declaration for prefix "'.$prefix.'"'; + TpDiagnostics::Append( DC_INVALID_REQUEST, $error, DIAG_ERROR ); + return null; + } // end of member function GetNamespace function GetPrefix( $parser, $namespace ) { - $pairs = $this->mData[$parser]; + $parser_namespaces = $this->mData[$parser]; - foreach ( $pairs as $prefix => $ns ) + for ( $i = count( $parser_namespaces ) - 1; $i >= 0; --$i ) { - if ( $ns == $namespace ) + $ns = $parser_namespaces[$i]; + + if ( $ns->GetUri() == $namespace ) { - return $prefix; + return $ns->GetPrefix(); } } @@ -82,5 +95,36 @@ } // end of member function GetPrefix + function GetFlaggedNamespaces( $parser, $flag ) + { + $parser_namespaces = $this->mData[$parser]; + + $namespaces_to_return = array(); + + for ( $i = 0; $i < count( $parser_namespaces ); ++$i ) + { + $ns = $parser_namespaces[$i]; + + if ( $ns->HasFlag( $flag ) ) + { + array_push( $namespaces_to_return, $ns ); + } + } + + return $namespaces_to_return; + + } // end of member function GetFlaggedNamespaces + + function RemoveFlag( $parser, $flag ) + { + $r_parser_namespaces =& $this->mData[$parser]; + + for ( $i = 0; $i < count( $r_parser_namespaces ); ++$i ) + { + $r_parser_namespaces[$i]->RemoveFlag( 'm' ); + } + + } // end of member function RemoveFlag + } // end of TpNamespaceManager ?> \ No newline at end of file Modified: tapirlink/trunk/classes/TpOutputModel.php =================================================================== --- tapirlink/trunk/classes/TpOutputModel.php 2007-02-28 12:20:02 UTC (rev 277) +++ tapirlink/trunk/classes/TpOutputModel.php 2007-03-04 23:55:19 UTC (rev 278) @@ -37,6 +37,7 @@ var $mAutomapping = false; var $mCurrrentMappingPath; var $mResponseStructure; + var $mNamespaces = array(); // Possible namespaces declared in the output model element function TpOutputModel( ) { @@ -101,8 +102,16 @@ $depth = count( $this->mInTags ); + // <outputModel> + if ( strcasecmp( $name, 'outputmodel' ) == 0 ) + { + // Get possible prefix declarations + $r_namespace_manager =& TpNamespaceManager::GetInstance(); + + $this->mNamespaces = $r_namespace_manager->GetFlaggedNamespaces( $parser, 'm' ); + } // <structure> - if ( strcasecmp( $name, 'structure' ) == 0 ) + else if ( strcasecmp( $name, 'structure' ) == 0 ) { // nothing } @@ -237,9 +246,19 @@ function DeclareNamespace( $parser, $prefix, $uri ) { + $path = implode( '/', $this->mInTags ); + + $flag = null; + + if ( $path == '' ) + { + // Namespaces declared in output model. + $flag = 'm'; + } + $r_namespace_manager =& TpNamespaceManager::GetInstance(); - $r_namespace_manager->AddNamespace( $parser, $prefix, $uri ); + $r_namespace_manager->AddNamespace( $parser, $prefix, $uri, $flag ); } // end of member function DeclareNamespace Modified: tapirlink/trunk/classes/TpRequest.php =================================================================== --- tapirlink/trunk/classes/TpRequest.php 2007-02-28 12:20:02 UTC (rev 277) +++ tapirlink/trunk/classes/TpRequest.php 2007-03-04 23:55:19 UTC (rev 278) @@ -41,7 +41,8 @@ var $mCount = false; // only for search and inventory var $mStart = 0; // only for search and inventory var $mLimit = null; // only for search and inventory - var $mEnvelope = true; // only for search + var $mEnvelope = true; // only for search + var $mOmitNamespaces = false; // only for search var $mOperationParameters; var $mFoundTemplate = false; var $mLoadedTemplateFromCache = false; @@ -205,8 +206,13 @@ break; } - $this->mLogOnly = TpUtils::GetVar( 'log-only', false ); + $log_only = TpUtils::GetVar( 'log-only', false ); + if ( $log_only == 'true' or (int)$log_only == 1 ) + { + $this->mLogOnly = true; + } + if ( $this->mLogOnly ) { return true; @@ -279,6 +285,14 @@ { $this->mEnvelope = false; } + + // Omit namespaces + $omit_ns = TpUtils::GetVar( 'omit-ns', false ); + + if ( $omit_ns == 'true' or (int)$omit_ns == 1 ) + { + $this->mOmitNamespaces = true; + } } // Template @@ -493,6 +507,13 @@ { $this->mEnvelope = false; } + + $omit_ns = TpUtils::GetInArray( $attrs, 'omit-ns', false ); + + if ( strcmp( $omit_ns, 'true' ) == 0 or $omit_ns == '1' ) + { + $this->mOmitNamespaces = true; + } } } } @@ -507,6 +528,15 @@ if ( isset( $attrs['location'] ) ) { + // Remove possible namespaces that were flagged as being + // part of the output model element + if ( $this->mOperation == 'search' ) + { + $r_namespace_manager =& TpNamespaceManager::GetInstance(); + + $r_namespace_manager->RemoveFlag( $parser, 'm' ); + } + $this->LoadTemplate( $attrs['location'] ); } else @@ -521,6 +551,15 @@ // rest of the parsing take care of loading parameters if ( $this->mOperation == 'search' ) { + // Remove possible namespaces that were flagged as being + // part of the output model element + if ( strcasecmp( $name, 'searchtemplate' ) == 0 ) + { + $r_namespace_manager =& TpNamespaceManager::GetInstance(); + + $r_namespace_manager->RemoveFlag( $parser, 'm' ); + } + require_once('TpSearchParameters.php'); $this->mOperationParameters = new TpSearchParameters(); @@ -582,9 +621,21 @@ function DeclareNamespace( $parser, $prefix, $uri ) { + $path = implode( '/', $this->mInTags ); + + $flag = null; + + if ( strcasecmp( $path, '/request/search' ) == 0 ) + { + // Namespaces declared in output model or query template. + // This flag indicates a potential namespace declared in + // an output model element. + $flag = 'm'; + } + $r_namespace_manager =& TpNamespaceManager::GetInstance(); - $r_namespace_manager->AddNamespace( $parser, $prefix, $uri ); + $r_namespace_manager->AddNamespace( $parser, $prefix, $uri, $flag ); } // end of member function DeclareNamespace @@ -745,6 +796,12 @@ } // end of member function GetEnvelope + function GetOmitNamespaces( ) + { + return $this->mOmitNamespaces; + + } // end of member function GetOmitNamespaces + function GetOperationParameters() { return $this->mOperationParameters; Modified: tapirlink/trunk/classes/TpSearchResponse.php =================================================================== --- tapirlink/trunk/classes/TpSearchResponse.php 2007-02-28 12:20:02 UTC (rev 277) +++ tapirlink/trunk/classes/TpSearchResponse.php 2007-03-04 23:55:19 UTC (rev 278) @@ -347,7 +347,8 @@ $xml_generator = new TpXmlGenerator( $output_model, $rejected_paths, $sql_builder, $db_encoding, - $max_repetitions, $limit ); + $max_repetitions, $limit, + $this->mRequest->GetOmitNamespaces() ); $main_content = $xml_generator->Render( $result_set, $r_resource ); Modified: tapirlink/trunk/classes/TpXmlGenerator.php =================================================================== --- tapirlink/trunk/classes/TpXmlGenerator.php 2007-02-28 12:20:02 UTC (rev 277) +++ tapirlink/trunk/classes/TpXmlGenerator.php 2007-03-04 23:55:19 UTC (rev 278) @@ -43,8 +43,9 @@ var $mIgnorePaths; var $mNoContentSummary = array(); // path => number of times it was dropped var $mNamespaceStack = array(); + var $mOmitNamespaces; - function TpXmlGenerator( $outputModel, $ignorePaths, $sqlBuilder, $dbEncoding, $maxRepetitions, $limit ) + function TpXmlGenerator( $outputModel, $ignorePaths, $sqlBuilder, $dbEncoding, $maxRepetitions, $limit, $omitNamespaces ) { $this->mOutputModel = $outputModel; $this->mResponseStructure = $outputModel->GetResponseStructure(); @@ -54,6 +55,7 @@ $this->mDbEncoding = $dbEncoding; $this->mMaxRepetitions = $maxRepetitions; $this->mLimit = $limit; + $this->mOmitNamespaces = $omitNamespaces; } // end of member function TpXmlGenerator @@ -161,40 +163,43 @@ $prefix = ''; - $target_namespace = $this->mResponseStructure->GetTargetNamespace(); - - $element_namespace = $rXsElementDecl->GetTargetNamespace(); - $xmlns = ''; - if ( $is_root ) + if ( ! $this->mOmitNamespaces ) { - $xmlns = ' xmlns="'.$target_namespace.'"'; + $target_namespace = $this->mResponseStructure->GetTargetNamespace(); - $xmlns .= ' xmlns:'.TP_XSI_PREFIX.'="'.XMLSCHEMAINST.'"'; + $element_namespace = $rXsElementDecl->GetTargetNamespace(); - $imported_namespaces = $this->mResponseStructure->GetImportedNamespaces(); + if ( $is_root ) + { + $xmlns = ' xmlns="'.$target_namespace.'"'; - foreach ( $imported_namespaces as $pref => $ns ) - { - if ( ! empty( $pref ) ) + $xmlns .= ' xmlns:'.TP_XSI_PREFIX.'="'.XMLSCHEMAINST.'"'; + + $imported_namespaces = $this->mResponseStructure->GetImportedNamespaces(); + + foreach ( $imported_namespaces as $pref => $ns ) { - $xmlns .= ' xmlns:'.$pref.'="'.$ns.'"'; + if ( ! empty( $pref ) ) + { + $xmlns .= ' xmlns:'.$pref.'="'.$ns.'"'; + } } } - } - else - { - if ( $element_namespace != $target_namespace ) + else { - $prefix = $this->mResponseStructure->GetPrefix( $element_namespace ); + if ( $element_namespace != $target_namespace ) + { + $prefix = $this->mResponseStructure->GetPrefix( $element_namespace ); - $prefix .= ':'; + $prefix .= ':'; + } } + + array_push( $this->mNamespaceStack, $element_namespace ); } - array_push( $this->mNamespaceStack, $element_namespace ); - // Main loop for element instances while ( $num_attempts < $limit ) @@ -309,7 +314,7 @@ if ( $value == null ) { - if ( $rXsElementDecl->IsNillable() ) + if ( $rXsElementDecl->IsNillable() and ! $this->mOmitNamespaces ) { $open_tag .= ' '.TP_XSI_PREFIX.':nil="true">'; } @@ -360,7 +365,10 @@ } // end while - array_pop( $this->mNamespaceStack ); + if ( ! $this->mOmitNamespaces ) + { + array_pop( $this->mNamespaceStack ); + } if ( $num_instances < $min_occurs ) { @@ -403,21 +411,24 @@ $attribute_decl = $rXsAttributeUse->GetDecl(); - $attribute_namespace = $attribute_decl->GetTargetNamespace(); - $prefix = ''; - $ns_depth = count( $this->mNamespaceStack ); - - if ( $ns_depth > 0 ) + if ( ! $this->mOmitNamespaces ) { - $contextual_namespace = $this->mNamespaceStack[$ns_depth-1]; + $attribute_namespace = $attribute_decl->GetTargetNamespace(); - if ( $attribute_namespace != $contextual_namespace ) + $ns_depth = count( $this->mNamespaceStack ); + + if ( $ns_depth > 0 ) { - $prefix = $this->mResponseStructure->GetPrefix( $attribute_namespace ); + $contextual_namespace = $this->mNamespaceStack[$ns_depth-1]; + + if ( $attribute_namespace != $contextual_namespace ) + { + $prefix = $this->mResponseStructure->GetPrefix( $attribute_namespace ); - $prefix .= ':'; + $prefix .= ':'; + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |