From: <rd...@us...> - 2007-03-11 17:32:59
|
Revision: 284 http://digir.svn.sourceforge.net/digir/?rev=284&view=rev Author: rdg Date: 2007-03-11 10:32:48 -0700 (Sun, 11 Mar 2007) Log Message: ----------- Added support to new attribute "required" inside node mappings. Modified Paths: -------------- tapirlink/trunk/ChangeLog.txt tapirlink/trunk/classes/TpExpression.php tapirlink/trunk/classes/TpOutputModel.php tapirlink/trunk/classes/TpSchemaInspector.php tapirlink/trunk/classes/TpSearchResponse.php tapirlink/trunk/classes/TpXmlGenerator.php Modified: tapirlink/trunk/ChangeLog.txt =================================================================== --- tapirlink/trunk/ChangeLog.txt 2007-03-11 14:57:25 UTC (rev 283) +++ tapirlink/trunk/ChangeLog.txt 2007-03-11 17:32:48 UTC (rev 284) @@ -1,10 +1,12 @@ Release 0.2 (?) ------------------------ + * Added support to new attribute "required" inside node mappings. * Added namespace awareness to output model xpaths. * Added support to the new parameter omit-ns. * Added support to XML Schema import and ref. * Added support to all TAPIR environment variables. + * Created the idea of having XSLT skins for data navigation. Two skins available: default and darwin. Added new configuration option to specify a default skin. * Several bug fixes. Release 0.1 (2007-14-01) Modified: tapirlink/trunk/classes/TpExpression.php =================================================================== --- tapirlink/trunk/classes/TpExpression.php 2007-03-11 14:57:25 UTC (rev 283) +++ tapirlink/trunk/classes/TpExpression.php 2007-03-11 17:32:48 UTC (rev 284) @@ -31,11 +31,13 @@ // or a TpTransparentConcept object (base concept of local // filters) var $mHasWildcard = false; + var $mRequired; // Used only for output model mapping! - function TpExpression( $type, $reference ) + function TpExpression( $type, $reference, $required=false ) { $this->mType = $type; $this->mReference = $reference; + $this->mRequired = $required; } // end of member function TpExpression @@ -431,6 +433,12 @@ } // end of member function GetXml + function IsRequired( ) + { + return $this->mRequired; + + } // end of member function IsRequired + function Accept( $visitor, $args ) { return $visitor->VisitExpression( $this, $args ); @@ -444,7 +452,7 @@ */ function __sleep() { - return array( 'mType', 'mReference' ); + return array( 'mType', 'mReference', 'mRequired' ); } // end of member function __sleep Modified: tapirlink/trunk/classes/TpOutputModel.php =================================================================== --- tapirlink/trunk/classes/TpOutputModel.php 2007-03-11 14:57:25 UTC (rev 283) +++ tapirlink/trunk/classes/TpOutputModel.php 2007-03-11 17:32:48 UTC (rev 284) @@ -168,8 +168,17 @@ { if ( isset( $this->mCurrentMappingPath ) and isset( $attrs['id'] ) ) { + $required = false; + + if ( isset( $attrs['required'] ) and + ( strcmp( $attrs['required'], 'true' ) == 0 or + $attrs['required'] == '1' ) ) + { + $required = true; + } + array_push( $this->mMapping[$this->mCurrentMappingPath], - new TpExpression( EXP_CONCEPT, $attrs['id'] ) ); + new TpExpression( EXP_CONCEPT, $attrs['id'], $required ) ); } } else if ( strcasecmp( $name, 'literal' ) == 0 ) @@ -186,8 +195,17 @@ if ( isset( $this->mCurrentMappingPath ) and isset( $attrs['name'] ) ) { + $required = false; + + if ( isset( $attrs['required'] ) and + ( strcmp( $attrs['required'], 'true' ) == 0 or + $attrs['required'] == '1' ) ) + { + $required = true; + } + array_push( $this->mMapping[$this->mCurrentMappingPath], - new TpExpression( EXP_VARIABLE, $attrs['name'] ) ); + new TpExpression( EXP_VARIABLE, $attrs['name'], $required ) ); } } } Modified: tapirlink/trunk/classes/TpSchemaInspector.php =================================================================== --- tapirlink/trunk/classes/TpSchemaInspector.php 2007-03-11 14:57:25 UTC (rev 283) +++ tapirlink/trunk/classes/TpSchemaInspector.php 2007-03-11 17:32:48 UTC (rev 284) @@ -27,6 +27,7 @@ class TpSchemaInspector extends TpSchemaVisitor { + var $mrResource; var $mrOutputModel; var $mResponseStructure; var $mIndexingElement; @@ -40,8 +41,9 @@ var $mFoundIndexingElement = false; var $mGreedy = true; - function TpSchemaInspector( &$rOutputModel, &$rLocalMapping, $maxLevels, $partial ) + function TpSchemaInspector( &$rResource, &$rOutputModel, &$rLocalMapping, $maxLevels, $partial ) { + $this->mrResource =& $rResource; $this->mrOutputModel =& $rOutputModel; $this->mResponseStructure = $rOutputModel->GetResponseStructure(); $this->mIndexingElement = $rOutputModel->GetIndexingElement(); @@ -450,7 +452,7 @@ $obj->GetMinOccurs() > 1 and TpServiceUtils::Contains( $path, $this->mIndexingElement ) ) { - $msg = 'Node "'.$path.'" has incompatible cardinality '. + $msg = 'Node "'.$path.'" has incompatible value for "minOccurs" '. '(greater than one) for being inside the '. 'indexingElement and locally mapped to a concept'; @@ -474,9 +476,9 @@ { $msg = 'Node "'.$path.'" has an incompatible local '. 'mapping type for being outside the indexingElement '. - '(the mapping type is bound to the local database).'; + '(not using "fixed value mapping")'; - if ( $isMandatory ) + if ( $expression->IsRequired() ) { TpDiagnostics::Append( DC_UNSUPPORTED_OUTPUT_MODEL, $msg, DIAG_ERROR ); @@ -508,24 +510,48 @@ $msg = 'Concept "'.$concept_id.'" was not mapped '. 'to the local database.'; - if ( $isMandatory ) + // Note: optional nodes should also fall here to be + // automatically discarded later + if ( $expression->IsRequired() or ! $isMandatory ) { TpDiagnostics::Append( DC_UNSUPPORTED_OUTPUT_MODEL, $msg, DIAG_WARN ); - $this->mAbort = true; + // Only abort if expression is required + if ( $expression->IsRequired() ) + { + $this->mAbort = true; + } + + array_push( $this->mRejectedPaths, $path ); + + return false; } - else + } + } + else if ( $expression->GetType() == EXP_VARIABLE ) + { + if ( ! $this->mrResource->HasVariable( $reference ) ) + { + $msg = 'Variable "'.$reference.'" is not supported.'; + + // Note: optional nodes should also fall here to be + // automatically discarded later + if ( $expression->IsRequired() or ! $isMandatory) { - $msg .= ' It will be discarded.'; - - TpDiagnostics::Append( DC_TRUNCATED_RESPONSE, $msg, + TpDiagnostics::Append( DC_UNSUPPORTED_OUTPUT_MODEL, $msg, DIAG_WARN ); - } - array_push( $this->mRejectedPaths, $path ); + // Only abort if expression is required + if ( $expression->IsRequired() ) + { + $this->mAbort = true; + } - return false; + array_push( $this->mRejectedPaths, $path ); + + return false; + } } } } Modified: tapirlink/trunk/classes/TpSearchResponse.php =================================================================== --- tapirlink/trunk/classes/TpSearchResponse.php 2007-03-11 14:57:25 UTC (rev 283) +++ tapirlink/trunk/classes/TpSearchResponse.php 2007-03-11 17:32:48 UTC (rev 284) @@ -134,8 +134,9 @@ // For memory management and processing reasons, it is better to perform // a previous inspection in the response schema. The reason is that certain // checkings can be done per generic path instead of per node instance. - $schema_inspector = new TpSchemaInspector( $output_model, $r_local_mapping, - $max_levels, $partial ); + $schema_inspector = new TpSchemaInspector( $r_resource, $output_model, + $r_local_mapping, $max_levels, + $partial ); $schema_inspector->Inspect(); Modified: tapirlink/trunk/classes/TpXmlGenerator.php =================================================================== --- tapirlink/trunk/classes/TpXmlGenerator.php 2007-03-11 14:57:25 UTC (rev 283) +++ tapirlink/trunk/classes/TpXmlGenerator.php 2007-03-11 17:32:48 UTC (rev 284) @@ -581,7 +581,26 @@ } else if ( $expression->GetType() == EXP_VARIABLE ) { - $data .= TpUtils::EscapeXmlSpecialChars( $expression->GetValue( $this->mrResource, null, null, null ) ); + if ( ! $this->mrResource->HasVariable( $reference ) ) + { + // It may fall here if the variable is mandatory but not + // supported by the provider + + if ( $expression->IsRequired() ) + { + // NULLs can later raise errors or drop nodes if the node + // is mandatory or not + return null; + } + else + { + $data .= ''; + } + } + else + { + $data .= TpUtils::EscapeXmlSpecialChars( $expression->GetValue( $this->mrResource, null, null, null ) ); + } } else if ( $expression->GetType() == EXP_CONCEPT ) { @@ -599,24 +618,18 @@ } else { - if ( TP_LOG_DEBUG ) + // Note: column index will be -1 if the concept is not mapped + + if ( $expression->IsRequired() ) { - $g_dlog->debug( 'Not found when ResultSet content is:' ); - - if ( is_array( $this->mrResultSet->fields ) ) - { - foreach ( $this->mrResultSet->fields as $k => $v ) - { - $g_dlog->debug( "[$k] (type=".gettype($k).")= [$v]" ); - } - } - else - { - $g_dlog->debug( 'NULL' ); - } + // NULLs can later raise errors or drop nodes if the node + // is mandatory or not + return null; } - - return null; + else + { + $data .= ''; + } } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |